Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define stop 4 // Stop relay (to HAMAL terminal 21)
- #define sensor 5 // IR scope sensor (optional, clarify if needed)
- #define close 6 // Close relay (to HAMAL terminal 24)
- #define open 7 // Open relay (to HAMAL terminal 23)
- // Input sensors
- #define opened 11 // Roof open sensor
- #define closed 12 // Roof closed sensor
- #define safe 13 // Scope safety sensor
- int led = 10; // Scope safe LED
- unsigned long end_time;
- bool lost = false; // Roof not reporting state
- String serialin; // Incoming serial data
- String str; // Store state of sensors
- void setup() {
- end_time = millis() + 60000; // Roof lost timer (~60s)
- // Initialize serial communication
- Serial.begin(9600);
- // Set relay pins as OUTPUT
- pinMode(open, OUTPUT);
- pinMode(close, OUTPUT);
- pinMode(stop, OUTPUT);
- pinMode(sensor, OUTPUT);
- // Set sensor pins as INPUT with pull-up
- pinMode(closed, INPUT_PULLUP);
- pinMode(opened, INPUT_PULLUP);
- pinMode(safe, INPUT_PULLUP);
- // Initialize relay states (LOW = inactive)
- digitalWrite(open, LOW);
- digitalWrite(close, LOW);
- digitalWrite(stop, LOW);
- digitalWrite(sensor, LOW);
- Serial.println("RRCI#"); // Init string
- }
- void loop() {
- Timer();
- // Update safe LED based on safe sensor
- digitalWrite(led, digitalRead(safe) == LOW ? HIGH : LOW);
- // Process serial commands
- while (Serial.available() > 0) {
- serialin = Serial.readStringUntil('#');
- serialin.trim(); // Remove whitespace
- if (serialin == "on") { // Turn scope sensor on
- digitalWrite(sensor, HIGH);
- }
- else if (serialin == "off") { // Turn scope sensor off
- digitalWrite(sensor, LOW);
- }
- else if (serialin == "open") {
- if (digitalRead(sensor) == LOW) { // Turn on IR scope sensor
- digitalWrite(sensor, HIGH);
- }
- delay(1000);
- if (digitalRead(safe) == LOW) { // Open only if scope safe
- digitalWrite(open, HIGH); // Pulse OPEN
- delay(200); // 200ms pulse (adjust if needed)
- digitalWrite(open, LOW);
- digitalWrite(sensor, LOW);
- }
- }
- else if (serialin == "close") {
- if (digitalRead(sensor) == LOW) { // Turn on IR scope sensor
- digitalWrite(sensor, HIGH);
- }
- delay(1000);
- if (digitalRead(safe) == LOW) { // Close only if scope safe
- digitalWrite(close, HIGH); // Pulse CLOSE
- delay(200); // 200ms pulse (adjust if needed)
- digitalWrite(close, LOW);
- digitalWrite(sensor, LOW);
- }
- }
- else if (serialin == "stop") { // Stop command
- digitalWrite(stop, HIGH); // Pulse STOP
- delay(200);
- digitalWrite(stop, LOW);
- }
- else if (serialin == "Parkstatus") {
- Serial.println("0#");
- serialin = "";
- }
- else if (serialin == "get") {
- // Build status string
- if (digitalRead(opened) == LOW) {
- str += "opened,";
- }
- else if (digitalRead(closed) == LOW) {
- str += "closed,";
- }
- else {
- str += "unknown,";
- }
- str += (digitalRead(safe) == LOW) ? "safe," : "unsafe,";
- if (digitalRead(closed) == HIGH && digitalRead(opened) == LOW && !lost) {
- str += "not_moving_o#";
- end_time = millis() + 60000;
- }
- else if (digitalRead(closed) == LOW && digitalRead(opened) == HIGH && !lost) {
- str += "not_moving_c#";
- end_time = millis() + 60000;
- }
- else if (digitalRead(closed) == HIGH && digitalRead(opened) == HIGH && !lost) {
- str += "moving#";
- }
- else if (digitalRead(closed) == HIGH && digitalRead(opened) == HIGH && lost) {
- str += "unknown#";
- }
- if (str.endsWith(",")) {
- str += "unknown#";
- }
- Serial.println(str);
- serialin = "";
- str = "";
- }
- else if (serialin == "Status") {
- Serial.println("RoofOpen#");
- }
- serialin = "";
- }
- // Stop relays when limits are reached
- if (digitalRead(closed) == LOW && digitalRead(close) == HIGH) {
- digitalWrite(close, LOW);
- }
- if (digitalRead(opened) == LOW && digitalWrite(open) == HIGH) {
- digitalWrite(open, LOW);
- }
- }
- void Timer() {
- if (millis() >= end_time) {
- if (digitalRead(closed) == HIGH && digitalRead(opened) == HIGH) {
- lost = true; // Roof position unknown
- }
- }
- if (digitalRead(closed) == LOW || digitalRead(opened) == LOW) {
- lost = false; // Roof state known
- end_time = millis() + 60000; // Reset timer
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment