Help!!! Binary & Relay Compilation Not Working
-
REVISED!!!
Compiles but not working
// Simple binary switch example // Connect button or door/window reed switch between // digitial I/O pin 3 (BUTTON_PIN below) and GND. #include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #include <Time.h> //http://playground.arduino.cc/Code/Time #include <TimeAlarms.h> //http://playground.arduino.cc/Code/Time MySensor gw; #define RADIO_ID 12 #define noReeds 3 const int BUTTON_PIN[] = {4,5,6}; // Arduino Digital I/O pin for button/reed switch, A0 - A4 boolean reedState[] = {HIGH, HIGH, HIGH}; #define RELAY_1 3 // Arduino Digital I/O pin number for first relay (second on pin+1 etc) #define NUMBER_OF_RELAYS 1 // Total number of attached relays #define RELAY_ON 1 // GPIO value to write to turn on attached relay #define RELAY_OFF 0 // GPIO value to write to turn off attached relay Bounce debouncer[noReeds]; MyMessage msg[noReeds]; void setup(){ gw.begin(NULL, RADIO_ID, true); //stattc RADIO_ID an enable repeater Alarm.delay(250); gw.sendSketchInfo("Relay", "1.0"); gw.sendSketchInfo("Alarm Pannel", "1.0"); Alarm.delay(250); gw.requestTime(receiveTime); // initialize Relays with corresponding buttons for (int i = 0; i < noReeds; i++){ msg[i].sensor = i; // initialize messages msg[i].type = V_TRIPPED; debouncer[i] = Bounce(); // initialize debouncer debouncer[i].attach(BUTTON_PIN[i]); debouncer[i].interval(5); // Setup the button pinMode(BUTTON_PIN[i],INPUT); // Activate internal pull-up digitalWrite(BUTTON_PIN[i],HIGH); gw.present(i, S_DOOR); // present sensor to gateway Serial.print("setup for switch: "); Serial.print(BUTTON_PIN[i]); Serial.println(" complete" ); Alarm.timerRepeat(720, updateState); // update relay status every 2 hrs Alarm.delay(250); } // Fetch relay status for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) gw.present(sensor, S_LIGHT); // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) digitalWrite(pin, gw.loadState(sensor)?RELAY_ON:RELAY_OFF); } } // Check if digital input has changed and send in new value void loop() { gw.process(); } void incomingMessage(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type==V_LIGHT) { // Change relay state digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF); // Store state in eeprom gw.saveState(message.sensor, message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } for (int i = 0; i < noReeds; i++){ debouncer[i].update(); // Get the update value int value = debouncer[i].read(); if (value != reedState[i]) { // Send in the new value gw.send(msg[i].set(value==HIGH ? 1 : 0), false); reedState[i] = value; Serial.print("updating state for swicth: "); Serial.print(BUTTON_PIN[i]); Serial.print(" state: "); Serial.println(reedState[i]); } } } void updateState(){ Serial.println("Start state info"); for (int i = 0; i < noReeds; i++) { Serial.print("sending update for switch: "); Serial.println(BUTTON_PIN[i]); gw.present(i, S_DOOR); Alarm.delay(250); //MyMessage msg(relayPin[pin],V_LIGHT); gw.send(msg[i].set(reedState[i]), false); // Send last state from eprom to GW Alarm.delay(250); } } // This is called when a new time value was received void receiveTime(unsigned long time) { setTime(time); }```
-
On of the error might be the last line "}```)
remove so its only }Br
-
your example compiles for me.
Consider removing TimeAlarms.h library and use
gw.wait(250);
instead ofAlarm.delay(250);
gw.wait()
executesgw.process()
over and over again during the delay time; so it is essentially non-blocking.
-
My bad. I copied the wrong sketch to this chat. I have revised the sketch and it complies but it's not working... Please see sketch above.
-
This is the serial message I get
repeater started, id 12
send: 12-12-0-0 s=255,c=0,t=18,pt=0,l=5,st=ok:1.4.1
send: 12-12-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
read: 0-0-12 s=255,c=3,t=6,pt=0,l=1:M
send: 12-12-0-0 s=255,c=3,t=11,pt=0,l=5,st=ok:Relay
send: 12-12-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
send: 12-12-0-0 s=255,c=3,t=11,pt=0,l=12,st=ok:Alarm Pannel
send: 12-12-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
send: 12-12-0-0 s=255,c=3,t=1,pt=0,l=3,st=ok:1.0
send: 12-12-0-0 s=0,c=0,t=0,pt=0,l=5,st=ok:1.4.1
setup for switch: 5 complete
send: 12-12-0-0 s=1,c=0,t=3,pt=0,l=5,st=ok:1.4.1
read: 0-0-12 s=255,c=3,t=1,pt=0,l=10:1435918408
-
fyi, just pick one name...
gw.sendSketchInfo("Relay", "1.0");
gw.sendSketchInfo("Alarm Pannel", "1.0");What is this supposed to be doing? it looks like:
reporting the state of three reed switches
actuating a relayWhy are you using the dalays? time?
hard to really understand what you are trying to do here...
-
@BulldogLowell
Essentially, I will like to combine Array Binary and Relay Actuator in one sketch.
-
three binary switches and a single relay?
-
yes sir !
-
Any ideas how I can get this to work?
-
@jeylites it looks like you are overwriting i somewhere inside the loop. can you try to add prints of the value of i at several strategic points to see when it becomes 5? I would suggest to add one (and also print BUTTON_PIN[i]) before "msg[i].sensor = i;", one after "// Setup the button" and print i with the BUTTON_PIN[i].
-
I'm going to try fix it as suggested. But the thing is it complies....
-
@jeylites Alas compiling is not a guarantee against memory overwrites....as button_pin should have shown 4 and not 5 i assume that either the index (i) got corrupt or the button_pin array.
-
I think this is what you want. I cannot test it right now, but it does compile:
#include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #define NUMBER_OF_REEDS 3 const int relayPin = 3; const int reedPin[NUMBER_OF_REEDS] = {4, 5, 6}; int reedState[NUMBER_OF_REEDS]; Bounce debouncer[NUMBER_OF_REEDS] = Bounce(); MySensor gw; MyMessage msg[NUMBER_OF_REEDS]; void setup() { gw.begin(incomingMessage, AUTO, true); gw.sendSketchInfo("Test", "1.0a"); gw.present(0, S_LIGHT); pinMode(relayPin, OUTPUT); digitalWrite(relayPin, gw.loadState(0)); for (int i = 0; i < NUMBER_OF_REEDS; i++) { debouncer[i].attach(reedPin[i]); debouncer[i].interval(5); pinMode(reedPin[i], INPUT_PULLUP); gw.present(i, S_DOOR); gw.wait(250); } } void loop() { gw.process(); for (int i = 0; i < NUMBER_OF_REEDS; i++) { debouncer[i].update(); int value = debouncer[i].read(); if (value != reedState[i]) { gw.send(msg[i+1].set(value), false); // device number mismatch here because of the array reedState[i] = value; Serial.print("updating state for switch: "); Serial.print(reedPin[i]); Serial.print(" state: "); Serial.println(reedState[i]); } } } void incomingMessage(const MyMessage &message) { if (message.type == V_LIGHT) { int newState = message.getBool(); digitalWrite(relayPin, newState); gw.saveState(0, newState); Serial.print(F("Incoming change for relay, New state: ")); Serial.println(newState); } }
EDIT: Updated to correct debounce class errors
-
to turn relay off automatically after two minutes (and send the updated "off status" to controller... try something like this untested code:
#include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #define NUMBER_OF_REEDS 3 const int relayPin = 3; const int reedPin[NUMBER_OF_REEDS] = {4, 5, 6}; int reedState[NUMBER_OF_REEDS]; Bounce debouncer[NUMBER_OF_REEDS] = Bounce(); unsigned long relayTimer; MySensor gw; MyMessage msg[NUMBER_OF_REEDS]; MyMessage relayMessage(0,V_LIGHT); void setup() { gw.begin(incomingMessage, AUTO, true); gw.sendSketchInfo("Test", "1.0a"); gw.present(0, S_LIGHT); pinMode(relayPin, OUTPUT); digitalWrite(relayPin, gw.loadState(0)); for (int i = 0; i < NUMBER_OF_REEDS; i++) { debouncer[i].attach(reedPin[i]); debouncer[i].interval(5); pinMode(reedPin[i], INPUT_PULLUP); gw.present(i, S_DOOR); gw.wait(250); } } void loop() { gw.process(); for (int i = 0; i < NUMBER_OF_REEDS; i++) { debouncer[i].update(); int value = debouncer[i].read(); if (value != reedState[i]) { gw.send(msg[i+1].set(value), false); // device number mismatch here because of the array reedState[i] = value; Serial.print("updating state for switch: "); Serial.print(reedPin[i]); Serial.print(" state: "); Serial.println(reedState[i]); } } if (millis() - relayTimer > 2 * 60 * 1000UL && digitalRead(relayPin)) // two minute timer { digitalWrite(relayPin, LOW); gw.saveState(0, false); gw.send(relayMessage.set(false), true); } } void incomingMessage(const MyMessage &message) { if (message.type == V_LIGHT) { int newState = message.getBool(); digitalWrite(relayPin, newState); gw.saveState(0, newState); if (newState) { relayTimer = millis(); } Serial.print(F("Incoming change for relay, New state: ")); Serial.println(newState); } }