Start/stop sequence
-
Hi,
I have an Arduino which controls a relay with 8 channels. The channels are switching on and off one after another. Just like this, very simple:
digitalWrite(RELAY1,LOW); delay(2000); digitalWrite(RELAY1,HIGH); digitalWrite(RELAY2,LOW); delay(2000); digitalWrite(RELAY2,HIGH);Now I want to control this application over RF/MySensors so that I can send a signal over RF to the Arduino to start or stop the sequence.
My first idea was just to extend the RelayActuator-code by an if-loop. I used gw.loadState to check whether the sequence should start or not, but this is truly wrong..#include <MySigningNone.h> #include <MyTransportNRF24.h> #include <MyTransportRFM69.h> #include <MyHwATMega328.h> #include <MySensor.h> #include <SPI.h> #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 // NRFRF24L01 radio driver (set low transmit power by default) MyTransportNRF24 radio(RF24_CE_PIN, RF24_CS_PIN, RF24_PA_LEVEL_GW); //MyTransportRFM69 radio; // Message signing driver (none default) //MySigningNone signer; // Select AtMega328 hardware profile MyHwATMega328 hw; // Construct MySensors library MySensor gw(radio, hw); void setup() { // Initialize library and add callback for incoming messages gw.begin(incomingMessage, AUTO, true); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Relay", "1.0"); // 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); } } void loop() { // Alway process incoming messages whenever possible gw.process(); if (gw.loadState(1)==1) { Serial.println("on"); digitalWrite(RELAY_1,LOW); } if (gw.loadState(1)==0) { Serial.println("off"); digitalWrite(RELAY_1,HIGH); } delay(100); } 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()); } }Any idea how I get this working?
Thanks!
-
I dont have access to test your code now but what I see that could be wrong is using delay in your code. Delay will stop executing of the code for 100 ms. This is a lot.
Search for non blocking delay examplew that uses timers to implement a delay. I guess also that there is a library for that which i saw in one of the examples of mysensors library.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login