Guest User

Arduino Uno Dome

a guest
Aug 25th, 2025
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.51 KB | None | 0 0
  1. #define stop 4 // Stop relay (to HAMAL terminal 21)
  2. #define sensor 5 // IR scope sensor (optional, clarify if needed)
  3. #define close 6 // Close relay (to HAMAL terminal 24)
  4. #define open 7 // Open relay (to HAMAL terminal 23)
  5.  
  6. // Input sensors
  7. #define opened 11 // Roof open sensor
  8. #define closed 12 // Roof closed sensor
  9. #define safe 13 // Scope safety sensor
  10.  
  11. int led = 10; // Scope safe LED
  12. unsigned long end_time;
  13. bool lost = false; // Roof not reporting state
  14. String serialin; // Incoming serial data
  15. String str; // Store state of sensors
  16.  
  17. void setup() {
  18. end_time = millis() + 60000; // Roof lost timer (~60s)
  19.  
  20. // Initialize serial communication
  21. Serial.begin(9600);
  22.  
  23. // Set relay pins as OUTPUT
  24. pinMode(open, OUTPUT);
  25. pinMode(close, OUTPUT);
  26. pinMode(stop, OUTPUT);
  27. pinMode(sensor, OUTPUT);
  28.  
  29. // Set sensor pins as INPUT with pull-up
  30. pinMode(closed, INPUT_PULLUP);
  31. pinMode(opened, INPUT_PULLUP);
  32. pinMode(safe, INPUT_PULLUP);
  33.  
  34. // Initialize relay states (LOW = inactive)
  35. digitalWrite(open, LOW);
  36. digitalWrite(close, LOW);
  37. digitalWrite(stop, LOW);
  38. digitalWrite(sensor, LOW);
  39.  
  40. Serial.println("RRCI#"); // Init string
  41. }
  42.  
  43. void loop() {
  44. Timer();
  45.  
  46. // Update safe LED based on safe sensor
  47. digitalWrite(led, digitalRead(safe) == LOW ? HIGH : LOW);
  48.  
  49. // Process serial commands
  50. while (Serial.available() > 0) {
  51. serialin = Serial.readStringUntil('#');
  52. serialin.trim(); // Remove whitespace
  53.  
  54. if (serialin == "on") { // Turn scope sensor on
  55. digitalWrite(sensor, HIGH);
  56. }
  57. else if (serialin == "off") { // Turn scope sensor off
  58. digitalWrite(sensor, LOW);
  59. }
  60. else if (serialin == "open") {
  61. if (digitalRead(sensor) == LOW) { // Turn on IR scope sensor
  62. digitalWrite(sensor, HIGH);
  63. }
  64. delay(1000);
  65. if (digitalRead(safe) == LOW) { // Open only if scope safe
  66. digitalWrite(open, HIGH); // Pulse OPEN
  67. delay(200); // 200ms pulse (adjust if needed)
  68. digitalWrite(open, LOW);
  69. digitalWrite(sensor, LOW);
  70. }
  71. }
  72. else if (serialin == "close") {
  73. if (digitalRead(sensor) == LOW) { // Turn on IR scope sensor
  74. digitalWrite(sensor, HIGH);
  75. }
  76. delay(1000);
  77. if (digitalRead(safe) == LOW) { // Close only if scope safe
  78. digitalWrite(close, HIGH); // Pulse CLOSE
  79. delay(200); // 200ms pulse (adjust if needed)
  80. digitalWrite(close, LOW);
  81. digitalWrite(sensor, LOW);
  82. }
  83. }
  84. else if (serialin == "stop") { // Stop command
  85. digitalWrite(stop, HIGH); // Pulse STOP
  86. delay(200);
  87. digitalWrite(stop, LOW);
  88. }
  89. else if (serialin == "Parkstatus") {
  90. Serial.println("0#");
  91. serialin = "";
  92. }
  93. else if (serialin == "get") {
  94. // Build status string
  95. if (digitalRead(opened) == LOW) {
  96. str += "opened,";
  97. }
  98. else if (digitalRead(closed) == LOW) {
  99. str += "closed,";
  100. }
  101. else {
  102. str += "unknown,";
  103. }
  104.  
  105. str += (digitalRead(safe) == LOW) ? "safe," : "unsafe,";
  106.  
  107. if (digitalRead(closed) == HIGH && digitalRead(opened) == LOW && !lost) {
  108. str += "not_moving_o#";
  109. end_time = millis() + 60000;
  110. }
  111. else if (digitalRead(closed) == LOW && digitalRead(opened) == HIGH && !lost) {
  112. str += "not_moving_c#";
  113. end_time = millis() + 60000;
  114. }
  115. else if (digitalRead(closed) == HIGH && digitalRead(opened) == HIGH && !lost) {
  116. str += "moving#";
  117. }
  118. else if (digitalRead(closed) == HIGH && digitalRead(opened) == HIGH && lost) {
  119. str += "unknown#";
  120. }
  121.  
  122. if (str.endsWith(",")) {
  123. str += "unknown#";
  124. }
  125.  
  126. Serial.println(str);
  127. serialin = "";
  128. str = "";
  129. }
  130. else if (serialin == "Status") {
  131. Serial.println("RoofOpen#");
  132. }
  133.  
  134. serialin = "";
  135. }
  136.  
  137. // Stop relays when limits are reached
  138. if (digitalRead(closed) == LOW && digitalRead(close) == HIGH) {
  139. digitalWrite(close, LOW);
  140. }
  141. if (digitalRead(opened) == LOW && digitalWrite(open) == HIGH) {
  142. digitalWrite(open, LOW);
  143. }
  144. }
  145.  
  146. void Timer() {
  147. if (millis() >= end_time) {
  148. if (digitalRead(closed) == HIGH && digitalRead(opened) == HIGH) {
  149. lost = true; // Roof position unknown
  150. }
  151. }
  152. if (digitalRead(closed) == LOW || digitalRead(opened) == LOW) {
  153. lost = false; // Roof state known
  154. end_time = millis() + 60000; // Reset timer
  155. }
  156. }
Advertisement
Add Comment
Please, Sign In to add comment