MySensors – Ogólny poradnik z przykładami.
Długo zastanawiałem się jaki wpis na blogu zrobić na temat MySensors. Ponieważ jest to oddzielna odnoga tak jak google home, node red itd. Zdecydowałem, że zrobię wszystko w jednym poście, bo ja w sumie będę potrzebował tylko dwóch efektów, ale przygotuje po to oddzielna kategorie i gdy nie będę miał co omawiać, lub wy będziecie mieli pytania, to będę uzupełniał, albo ten wpis, albo będę robił nowe wpisy.
MySensors dla mnie to połączenie arduino razem z raspberry pi. Programujemy MySensors w środowisku arduino, więc jeżeli ktoś już miał styczność z arduino to będzie mu na pewno prościej. MySensors to również środowisko dosyć specyficzne, ale dające dużo możliwości, bo nie ogranicza nas soft, bo w końcu go sami tworzymy. Korzystamy oczywiście z gotowych rozwiązań, ale możemy w kod wplatać własne wstawki.
Przejdźmy do podstaw, czyli musimy pobrać arduino:
– Link do pobrania arduino
Cały poradnik postaram się uprościć, więc będzie mocne spłycanie tematów, więć jeżeli Twoja wiedza jest ponad podstawę, to nic nowego nie dowiesz się z tego poradnika, ale jeżeli dopiero zaczynasz, to poradnik okaże się pomocny.
Arduino opiera się na „bilbliotekach”, czyli przykładowych kodach, ale w skład tego wchodzą również pliki, które są wysyłane do arduino bez konieczności ich edycji. W praktyce to bez tych plików nie zadziała nasz sketch.
#include <MySensors.h>
Powyżej widzimy przykład takiego pliku i nie mamy go w zakładkach, więc przepisanie całego kodu, ale nie posiadając tego pliku, nie pozwoli nam uruchomić prawidłowo sketch, żeby prawidłowo kod działał.
W Arduino otwieramy Szkic>>Dołącz bibliotekę>>Zarządzaj bibliotekami:
Wyszukujemy bibliotekę MySensors i instalujemy. Poniższe zdjęcie ma wyszarzony przycisk instaluj, bo tę bibliotekę mam już zainstalowaną.
Po zainstalowaniu możemy od razu przejść do przykładów MySensors. W moim projekcie będę potrzebował sterowanie pinami w arduino mega i obsługą tego w domoticzu. Użyjemy do tego dwóch przykładów:
Wchodzimy Plik >> Przykłady >> MySensors >> RelayActuator
Dostajemy w Arduino kod, który będzie wymagał poprawek:
/* The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2019 Sensnology AB * Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * DESCRIPTION * The ArduinoGateway prints data received from sensors on the serial link. * The gateway accepts input on serial which will be sent out on radio network. * * The GW code is designed for Arduino Nano 328p / 16MHz * * Wire connections (OPTIONAL): * - Inclusion button should be connected between digital pin 3 and GND * - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series * * LEDs (OPTIONAL): * - To use the feature, uncomment any of the MY_DEFAULT_xx_LED_PINs * - RX (green) - blink fast on radio message received. In inclusion mode will blink fast only on presentation received * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - ERR (red) - fast blink on error during transmission error or receive crc error */
// Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_RF24 //#define MY_RADIO_NRF5_ESB //#define MY_RADIO_RFM69 //#define MY_RADIO_RFM95 // Enable repeater functionality for this node #define MY_REPEATER_FEATURE #include <MySensors.h> #define RELAY_PIN 4 // 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 void before() { for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF); } } void setup() { } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Relay", "1.0"); for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) present(sensor, S_BINARY); } } void loop() { } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.getType()==V_STATUS) { // Change relay state digitalWrite(message.getSensor()-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF); // Store state in eeprom saveState(message.getSensor(), message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.getSensor()); Serial.print(", New status: "); Serial.println(message.getBool()); } }
W kodzie znajdziemy linijkę odpowiadającą za łączność RF433
#define MY_RADIO_RF24
Zmieniamy na:
//#define MY_RADIO_RF24
Dodanie dwóch ukośników powoduje, że funkcja nie będzie wykonywana.
S_BINARY
Zmieniamy na:
S_LIGHT
Najważniejszy fragment kodu spolszczyłem:
#define RELAY_PIN 4 // Numer pinu Arduino Digital I/O dla pierwszego przekaźnika
#define NUMBER_OF_RELAYS 3 // Całkowita liczba podłączonych przekaźników.
#define RELAY_ON 1 // Wartość GPIO, aby włączyć przekaźnik
#define RELAY_OFF 0 // Wartość GPIO, aby wyłączyć przekaźnik
Nie jest on zbyt jasny więc wyjaśnię mamy tutaj RELAY_PIN 4 jest to pin startowy, od którego będziemy liczyć piny. Następnie mamy NUMBER_OF_RELAYS 3 wartość 3 określa ilość pinów po GPIO 4, czyli mamy GPIO 5, GPIO 6. Łącznie daje nam to 3 GPIO, czyli zgodnie z tym co określimy.
W powyższy sposób mamy obsługę wychodzących naszych pinów z arduino mega, ale brakuje nam komunikacji przez USB, więc skorzystajmy z przykładu:
GatewaySerial:
/* The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2019 Sensnology AB * Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * DESCRIPTION * The ArduinoGateway prints data received from sensors on the serial link. * The gateway accepts input on serial which will be sent out on radio network. * * The GW code is designed for Arduino Nano 328p / 16MHz * * Wire connections (OPTIONAL): * - Inclusion button should be connected between digital pin 3 and GND * - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series * * LEDs (OPTIONAL): * - To use the feature, uncomment any of the MY_DEFAULT_xx_LED_PINs * - RX (green) - blink fast on radio message received. In inclusion mode will blink fast only on presentation received * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - ERR (red) - fast blink on error during transmission error or receive crc error * *//* * The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2019 Sensnology AB * Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * DESCRIPTION * The ArduinoGateway prints data received from sensors on the serial link. * The gateway accepts input on serial which will be sent out on radio network. * * The GW code is designed for Arduino Nano 328p / 16MHz * * Wire connections (OPTIONAL): * - Inclusion button should be connected between digital pin 3 and GND * - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series * * LEDs (OPTIONAL): * - To use the feature, uncomment any of the MY_DEFAULT_xx_LED_PINs * - RX (green) - blink fast on radio message received. In inclusion mode will blink fast only on presentation received * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - ERR (red) - fast blink on error during transmission error or receive crc error * */
// Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_RF24 //#define MY_RADIO_NRF5_ESB //#define MY_RADIO_RFM69 //#define MY_RADIO_RFM95 // Set LOW transmit power level as default, if you have an amplified NRF-module and // power your radio separately with a good regulator you can turn up PA level. #define MY_RF24_PA_LEVEL RF24_PA_LOW // Enable serial gateway #define MY_GATEWAY_SERIAL // Define a lower baud rate for Arduinos running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender) #if F_CPU == 8000000L #define MY_BAUD_RATE 38400 #endif // Enable inclusion mode #define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway //#define MY_INCLUSION_BUTTON_FEATURE // Inverses behavior of inclusion button (if using external pullup) //#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP // Set inclusion mode duration (in seconds) #define MY_INCLUSION_MODE_DURATION 60 // Digital pin used for inclusion mode button //#define MY_INCLUSION_MODE_BUTTON_PIN 3 // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Inverses the behavior of leds //#define MY_WITH_LEDS_BLINKING_INVERSE // Flash leds on rx/tx/err // Uncomment to override default HW configurations //#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin //#define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin //#define MY_DEFAULT_TX_LED_PIN 5 // the PCB, on board LED #include <MySensors.h> void setup() { // Setup locally attached sensors } void presentation() { // Present locally attached sensors } void loop() { // Send locally attached sensor data here }
Powyższy kod służy do komunikacji przez USB, ale połączymy sobie komunikacje razem z przełącznikami Relay i mamy:
/* The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2019 Sensnology AB * Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * DESCRIPTION * The ArduinoGateway prints data received from sensors on the serial link. * The gateway accepts input on serial which will be sent out on radio network. * * The GW code is designed for Arduino Nano 328p / 16MHz * * Wire connections (OPTIONAL): * - Inclusion button should be connected between digital pin 3 and GND * - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series * * LEDs (OPTIONAL): * - To use the feature, uncomment any of the MY_DEFAULT_xx_LED_PINs * - RX (green) - blink fast on radio message received. In inclusion mode will blink fast only on presentation received * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - ERR (red) - fast blink on error during transmission error or receive crc error * */
// Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached //#define MY_RADIO_RF24 //#define MY_RADIO_NRF5_ESB //#define MY_RADIO_RFM69 //#define MY_RADIO_RFM95 // Set LOW transmit power level as default, if you have an amplified NRF-module and // power your radio separately with a good regulator you can turn up PA level. #define MY_RF24_PA_LEVEL RF24_PA_LOW // Enable serial gateway #define MY_GATEWAY_SERIAL // Define a lower baud rate for Arduinos running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender) #if F_CPU == 8000000L #define MY_BAUD_RATE 38400 #endif // Enable inclusion mode //#define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway //#define MY_INCLUSION_BUTTON_FEATURE // Inverses behavior of inclusion button (if using external pullup) //#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP // Set inclusion mode duration (in seconds) #define MY_INCLUSION_MODE_DURATION 60 // Digital pin used for inclusion mode button //#define MY_INCLUSION_MODE_BUTTON_PIN 3 // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Inverses the behavior of leds //#define MY_WITH_LEDS_BLINKING_INVERSE // Flash leds on rx/tx/err // Uncomment to override default HW configurations //#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin //#define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin //#define MY_DEFAULT_TX_LED_PIN 5 // the PCB, on board LED #include <MySensors.h> #define RELAY_PIN 22 // Arduino Digital I/O pin number for first relay (second on pin+1 etc) #define NUMBER_OF_RELAYS 9 // 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 void before() { for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF); } } void setup() { } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Relay", "1.0"); for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) present(sensor, S_LIGHT); } } void loop() { } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.getType()==V_STATUS) { // Change relay state digitalWrite(message.getSensor()-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF); // Store state in eeprom saveState(message.getSensor(), message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.getSensor()); Serial.print(", New status: "); Serial.println(message.getBool()); } }
Wygląda wszystko super, bo mamy połączoną komunikacje usb pomiędzy arduino mega a raspberry Pi. Pozostała nam jeszcze podłączenie pod USB w domoticzu naszej płytki arduino Mega i sprawdzenie, czy działa.
Dodajemy najpierw obsługe, czyli wchodzimy Konfiguracja >> Sprzęt i z listy na dole szukamy „MySensors Gateway USB” po wybraniu wybieramy z listy port szeregowy port do którego jest podłączone nasze arduino i dodajemy własną nazwę w polu Nazwa.
Wchodzimy Konfiguracja >> Urządzenia i segregujemy po IDX. Teraz widzimy wszystkie przekaźniki, które zostały dodane licząć od GPIO 22 do GPIO 30, czyli łącznie 9. Od tej chwili możemy włączać dane wyjścia w naszym arduino za pośrednictwem Domoticza.
Dodawanie przycisków button od zmiany statusu ON/OFF
Zacznijmy od tego, że będziemy potrzebowali nową bibliotekę
Po zainstalowaniu otwórzmy sobie przykład bounce>>more >> Change:
// This example toggles the debug LED (pin 13) on or off // when a button on pin 2 is pressed. // Include the Bounce2 library found here : // https://github.com/thomasfredericks/Bounce2 #include <Bounce2.h> #define BUTTON_PIN 2 #define LED_PIN 13 int ledState = LOW; Bounce debouncer = Bounce(); // Instantiate a Bounce object void setup() { debouncer.attach(BUTTON_PIN,INPUT_PULLUP); // Attach the debouncer to a pin with INPUT_PULLUP mode debouncer.interval(25); // Use a debounce interval of 25 milliseconds pinMode(LED_PIN,OUTPUT); // Setup the LED digitalWrite(LED_PIN,ledState); } void loop() { debouncer.update(); // Update the Bounce instance if ( debouncer.fell() ) { // Call code if button transitions from HIGH to LOW ledState = !ledState; // Toggle LED state digitalWrite(LED_PIN,ledState); // Apply new LED state } }
Po uzupełeniu naszego projektu o przycisk button:
// Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached //#define MY_RADIO_RF24 //#define MY_RADIO_NRF5_ESB //#define MY_RADIO_RFM69 //#define MY_RADIO_RFM95 // Set LOW transmit power level as default, if you have an amplified NRF-module and // power your radio separately with a good regulator you can turn up PA level. #define MY_RF24_PA_LEVEL RF24_PA_LOW // Enable serial gateway #define MY_GATEWAY_SERIAL // Define a lower baud rate for Arduinos running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender) #if F_CPU == 8000000L #define MY_BAUD_RATE 38400 #endif // Enable inclusion mode //#define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway //#define MY_INCLUSION_BUTTON_FEATURE // Inverses behavior of inclusion button (if using external pullup) //#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP // Set inclusion mode duration (in seconds) #define MY_INCLUSION_MODE_DURATION 60 // Digital pin used for inclusion mode button //#define MY_INCLUSION_MODE_BUTTON_PIN 3 // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Inverses the behavior of leds //#define MY_WITH_LEDS_BLINKING_INVERSE // Flash leds on rx/tx/err // Uncomment to override default HW configurations //#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin //#define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin //#define MY_DEFAULT_TX_LED_PIN 5 // the PCB, on board LED #include <MySensors.h> #define RELAY_PIN 22 // Arduino Digital I/O pin number for first relay (second on pin+1 etc) #define NUMBER_OF_RELAYS 9 // 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 #include <Bounce2.h> #define BUTTON_PIN 1 #define LED_PIN 30 int ledState = LOW; Bounce debouncer = Bounce(); // Instantiate a Bounce object MyMessage msg(1,V_LIGHT); void before() { for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF); } } void setup() { debouncer.attach(BUTTON_PIN,INPUT_PULLUP); // Attach the debouncer to a pin with INPUT_PULLUP mode debouncer.interval(5); // Use a debounce interval of 25 milliseconds } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Relay", "1.0"); for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) present(sensor, S_LIGHT); } } void loop() { debouncer.update(); // Update the Bounce instance if ( debouncer.fell() ) { // Call code if button transitions from HIGH to LOW ledState = !ledState; // Toggle LED state saveState(1,ledState); digitalWrite(LED_PIN,ledState); // Apply new LED state send(msg.set(ledState)); } } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.getType()==V_STATUS) { // Change relay state digitalWrite(message.getSensor()-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF); // Store state in eeprom saveState(message.getSensor(), message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.getSensor()); Serial.print(", New status: "); Serial.println(message.getBool()); } }
Powyższy kod obsługuje jeden przycisk monstabilny oraz relay w MySensors.
#define MY_DEBUG // Enable and select radio type attached //#define MY_RADIO_RF24 //#define MY_RADIO_NRF5_ESB //#define MY_RADIO_RFM69 //#define MY_RADIO_RFM95 // Set LOW transmit power level as default, if you have an amplified NRF-module and // power your radio separately with a good regulator you can turn up PA level. #define MY_RF24_PA_LEVEL RF24_PA_LOW // Enable serial gateway #define MY_GATEWAY_SERIAL // Define a lower baud rate for Arduinos running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender) #if F_CPU == 8000000L #define MY_BAUD_RATE 38400 #endif // Enable inclusion mode //#define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway //#define MY_INCLUSION_BUTTON_FEATURE // Inverses behavior of inclusion button (if using external pullup) //#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP // Set inclusion mode duration (in seconds) #define MY_INCLUSION_MODE_DURATION 60 // Digital pin used for inclusion mode button //#define MY_INCLUSION_MODE_BUTTON_PIN 3 // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Inverses the behavior of leds //#define MY_WITH_LEDS_BLINKING_INVERSE // Flash leds on rx/tx/err // Uncomment to override default HW configurations //#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin //#define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin //#define MY_DEFAULT_TX_LED_PIN 5 // the PCB, on board LED #include <SPI.h> #include <MySensors.h> #include <Bounce2.h> #define RELAY_PIN0 30 // Arduino Digital I/O pin number for relay #define RELAY_PIN1 29 #define RELAY_PIN2 28 #define RELAY_PIN3 27 #define BUTTON_PIN0 1 // Arduino Digital I/O pin number for button #define BUTTON_PIN1 2 // Arduino Digital I/O pin number for button #define BUTTON_PIN2 3 // Arduino Digital I/O pin number for button #define BUTTON_PIN3 4 // Arduino Digital I/O pin number for button #define CHILD0_ID 100 // Id of the sensor child #define CHILD1_ID 101 // Id of the sensor child #define CHILD2_ID 102 // Id of the sensor child #define CHILD3_ID 103 // Id of the sensor child #define RELAY_ON 1 #define RELAY_OFF 0 Bounce debouncerA = Bounce(); Bounce debouncerB = Bounce(); Bounce debouncerC = Bounce(); Bounce debouncerD = Bounce(); int oldValueA = 0; int oldValueB = 0; int oldValueC = 0; int oldValueD = 0; bool stateA; bool stateB; bool stateC; bool stateD; MyMessage msgA(CHILD0_ID, V_LIGHT); MyMessage msgB(CHILD1_ID, V_LIGHT); MyMessage msgC(CHILD2_ID, V_LIGHT); MyMessage msgD(CHILD3_ID, V_LIGHT); void setup() { // Setup the button pinMode(BUTTON_PIN0, INPUT_PULLUP); pinMode(BUTTON_PIN1, INPUT_PULLUP); pinMode(BUTTON_PIN2, INPUT_PULLUP); pinMode(BUTTON_PIN3, INPUT_PULLUP); // After setting up the button, setup debouncer debouncerA.attach(BUTTON_PIN0); debouncerA.interval(5); debouncerB.attach(BUTTON_PIN1); debouncerB.interval(5); debouncerC.attach(BUTTON_PIN2); debouncerC.interval(5); debouncerD.attach(BUTTON_PIN3); debouncerD.interval(5); // Make sure relays are off when starting up digitalWrite(RELAY_PIN0, RELAY_OFF); digitalWrite(RELAY_PIN1, RELAY_OFF); digitalWrite(RELAY_PIN2, RELAY_OFF); digitalWrite(RELAY_PIN3, RELAY_OFF); // Then set relay pins in output mode pinMode(RELAY_PIN0, OUTPUT); pinMode(RELAY_PIN1, OUTPUT); pinMode(RELAY_PIN2, OUTPUT); pinMode(RELAY_PIN3, OUTPUT); // Set relay to last known state (using eeprom storage) stateA = loadState(CHILD0_ID); digitalWrite(RELAY_PIN0, stateA ? RELAY_ON : RELAY_OFF); stateB = loadState(CHILD1_ID); digitalWrite(RELAY_PIN1, stateB ? RELAY_ON : RELAY_OFF); stateC = loadState(CHILD2_ID); digitalWrite(RELAY_PIN2, stateC ? RELAY_ON : RELAY_OFF); stateD = loadState(CHILD3_ID); digitalWrite(RELAY_PIN3, stateD ? RELAY_ON : RELAY_OFF); } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("4 Relay & button", "1.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD0_ID, S_LIGHT); present(CHILD1_ID, S_LIGHT); present(CHILD2_ID, S_LIGHT); present(CHILD3_ID, S_LIGHT); } /* Example on how to asynchronously check for new messages from gw */ void loop() { debouncerA.update(); // Get the update value int valueA = debouncerA.read(); if (valueA != oldValueA && valueA == 0) { send(msgA.set(stateA ? false : true), true); // Send new state and request ack back } oldValueA = valueA; debouncerB.update(); // Get the update value int valueB = debouncerB.read(); if (valueB != oldValueB && valueB == 0) { send(msgB.set(stateB ? false : true), true); // Send new state and request ack back } oldValueB = valueB; debouncerC.update(); // Get the update value int valueC = debouncerC.read(); if (valueC != oldValueC && valueC == 0) { send(msgC.set(stateC ? false : true), true); // Send new state and request ack back } oldValueC = valueC; debouncerD.update(); // Get the update value int valueD = debouncerD.read(); if (valueD != oldValueD && valueD == 0) { send(msgD.set(stateD ? false : true), true); // Send new state and request ack back } oldValueD = valueD; } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type == V_LIGHT) { switch (message.sensor) { case CHILD0_ID: stateA = message.getBool(); digitalWrite(RELAY_PIN0, stateA ? RELAY_ON : RELAY_OFF); saveState(CHILD0_ID, stateA); break; case CHILD1_ID: stateB = message.getBool(); digitalWrite(RELAY_PIN1, stateB ? RELAY_ON : RELAY_OFF); saveState(CHILD1_ID, stateB); break; case CHILD2_ID: stateC = message.getBool(); digitalWrite(RELAY_PIN2, stateC ? RELAY_ON : RELAY_OFF); saveState(CHILD2_ID, stateC); break; case CHILD3_ID: stateD = message.getBool(); digitalWrite(RELAY_PIN3, stateD ? RELAY_ON : RELAY_OFF); saveState(CHILD3_ID, stateD); break; } // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } }
Powyższy kod obsługuje cztery przyciski Monostabilne oraz Relay w MySensors
#define MY_DEBUG // Enable and select radio type attached //#define MY_RADIO_RF24 //#define MY_RADIO_NRF5_ESB //#define MY_RADIO_RFM69 //#define MY_RADIO_RFM95 // Set LOW transmit power level as default, if you have an amplified NRF-module and // power your radio separately with a good regulator you can turn up PA level. #define MY_RF24_PA_LEVEL RF24_PA_LOW // Enable serial gateway #define MY_GATEWAY_SERIAL // Define a lower baud rate for Arduinos running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender) #if F_CPU == 8000000L #define MY_BAUD_RATE 38400 #endif // Enable inclusion mode //#define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway //#define MY_INCLUSION_BUTTON_FEATURE // Inverses behavior of inclusion button (if using external pullup) //#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP // Set inclusion mode duration (in seconds) #define MY_INCLUSION_MODE_DURATION 60 // Digital pin used for inclusion mode button //#define MY_INCLUSION_MODE_BUTTON_PIN 3 // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Inverses the behavior of leds //#define MY_WITH_LEDS_BLINKING_INVERSE // Flash leds on rx/tx/err // Uncomment to override default HW configurations //#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin //#define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin //#define MY_DEFAULT_TX_LED_PIN 5 // the PCB, on board LED #include <SPI.h> #include <MySensors.h> #include <Bounce2.h> #define RELAY_PIN0 30 // Arduino Digital I/O pin number for relay #define RELAY_PIN1 29 #define RELAY_PIN2 28 #define RELAY_PIN3 27 #define BUTTON_PIN0 1 // Arduino Digital I/O pin number for button #define BUTTON_PIN1 2 // Arduino Digital I/O pin number for button #define BUTTON_PIN2 3 // Arduino Digital I/O pin number for button #define BUTTON_PIN3 4 // Arduino Digital I/O pin number for button #define CHILD0_ID 100 // Id of the sensor child #define CHILD1_ID 101 // Id of the sensor child #define CHILD2_ID 102 // Id of the sensor child #define CHILD3_ID 103 // Id of the sensor child #define RELAY_ON 1 #define RELAY_OFF 0 Bounce debouncerA = Bounce(); Bounce debouncerB = Bounce(); Bounce debouncerC = Bounce(); Bounce debouncerD = Bounce(); int oldValueA = 0; int oldValueB = 0; int oldValueC = 0; int oldValueD = 0; bool stateA = false; bool stateB = false; bool stateC = false; bool stateD = false; MyMessage msgA(CHILD0_ID, V_LIGHT); MyMessage msgB(CHILD1_ID, V_LIGHT); MyMessage msgC(CHILD2_ID, V_LIGHT); MyMessage msgD(CHILD3_ID, V_LIGHT); void setup() { // Setup the button pinMode(BUTTON_PIN0, INPUT_PULLUP); pinMode(BUTTON_PIN1, INPUT_PULLUP); pinMode(BUTTON_PIN2, INPUT_PULLUP); pinMode(BUTTON_PIN3, INPUT_PULLUP); // After setting up the button, setup debouncer debouncerA.attach(BUTTON_PIN0); debouncerA.interval(5); debouncerB.attach(BUTTON_PIN1); debouncerB.interval(5); debouncerC.attach(BUTTON_PIN2); debouncerC.interval(5); debouncerD.attach(BUTTON_PIN3); debouncerD.interval(5); // Make sure relays are off when starting up digitalWrite(RELAY_PIN0, RELAY_OFF); digitalWrite(RELAY_PIN1, RELAY_OFF); digitalWrite(RELAY_PIN2, RELAY_OFF); digitalWrite(RELAY_PIN3, RELAY_OFF); // Then set relay pins in output mode pinMode(RELAY_PIN0, OUTPUT); pinMode(RELAY_PIN1, OUTPUT); pinMode(RELAY_PIN2, OUTPUT); pinMode(RELAY_PIN3, OUTPUT); } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("4 Relay & button", "1.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD0_ID, S_LIGHT); present(CHILD1_ID, S_LIGHT); present(CHILD2_ID, S_LIGHT); present(CHILD3_ID, S_LIGHT); } /* Example on how to asynchronously check for new messages from gw */ void loop() { debouncerA.update(); // Get the update value int valueA = debouncerA.read(); if (valueA != oldValueA) { send(msgA.set(stateA ? false : true), false); // Send new state and request ack back stateA = stateA ? false : true; digitalWrite(RELAY_PIN0, stateA ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueA = valueA; debouncerB.update(); // Get the update value int valueB = debouncerB.read(); if (valueB != oldValueB) { send(msgB.set(stateB ? false : true), false); // Send new state and request ack back stateB = stateB ? false : true; digitalWrite(RELAY_PIN1, stateB ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueB = valueB; debouncerC.update(); // Get the update value int valueC = debouncerC.read(); if (valueC != oldValueC) { send(msgC.set(stateC ? false : true), false); // Send new state and request ack back stateC = stateC ? false : true; digitalWrite(RELAY_PIN2, stateC ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueC = valueC; debouncerD.update(); // Get the update value int valueD = debouncerD.read(); if (valueD != oldValueD) { send(msgD.set(stateD ? false : true), false); // Send new state and request ack back stateD = stateD ? false : true; digitalWrite(RELAY_PIN3, stateD ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueD = valueD; } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type == V_LIGHT) { switch (message.sensor) { case CHILD0_ID: stateA = message.getBool(); digitalWrite(RELAY_PIN0, stateA ? RELAY_ON : RELAY_OFF); saveState(CHILD0_ID, stateA); break; case CHILD1_ID: stateB = message.getBool(); digitalWrite(RELAY_PIN1, stateB ? RELAY_ON : RELAY_OFF); saveState(CHILD1_ID, stateB); break; case CHILD2_ID: stateC = message.getBool(); digitalWrite(RELAY_PIN2, stateC ? RELAY_ON : RELAY_OFF); saveState(CHILD2_ID, stateC); break; case CHILD3_ID: stateD = message.getBool(); digitalWrite(RELAY_PIN3, stateD ? RELAY_ON : RELAY_OFF); saveState(CHILD3_ID, stateD); break; } // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } }
Powyższy kod obsługuje cztery przyciski Bistabilne oraz Relay w MySensors
#define MY_DEBUG // Enable and select radio type attached //#define MY_RADIO_RF24 //#define MY_RADIO_NRF5_ESB //#define MY_RADIO_RFM69 //#define MY_RADIO_RFM95 // Set LOW transmit power level as default, if you have an amplified NRF-module and // power your radio separately with a good regulator you can turn up PA level. #define MY_RF24_PA_LEVEL RF24_PA_LOW // Enable serial gateway #define MY_GATEWAY_SERIAL // Define a lower baud rate for Arduinos running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender) #if F_CPU == 8000000L #define MY_BAUD_RATE 38400 #endif // Enable inclusion mode //#define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway //#define MY_INCLUSION_BUTTON_FEATURE // Inverses behavior of inclusion button (if using external pullup) //#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP // Set inclusion mode duration (in seconds) #define MY_INCLUSION_MODE_DURATION 60 // Digital pin used for inclusion mode button //#define MY_INCLUSION_MODE_BUTTON_PIN 3 // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Inverses the behavior of leds //#define MY_WITH_LEDS_BLINKING_INVERSE // Flash leds on rx/tx/err // Uncomment to override default HW configurations //#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin //#define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin //#define MY_DEFAULT_TX_LED_PIN 5 // the PCB, on board LED #include <SPI.h> #include <MySensors.h> #include <Bounce2.h> #define RELAY_PIN0 22 // Arduino Digital I/O pin number for relay #define RELAY_PIN1 23 #define RELAY_PIN2 24 #define RELAY_PIN3 25 #define RELAY_PIN4 26 // Arduino Digital I/O pin number for relay #define RELAY_PIN5 27 #define RELAY_PIN6 28 #define RELAY_PIN7 29 #define RELAY_PIN8 30 // Arduino Digital I/O pin number for relay #define RELAY_PIN9 31 #define RELAY_PIN10 32 #define RELAY_PIN11 33 #define RELAY_PIN12 34 // Arduino Digital I/O pin number for relay #define RELAY_PIN13 35 #define RELAY_PIN14 36 #define RELAY_PIN15 37 #define RELAY_PIN16 38 #define RELAY_PIN17 39 // Arduino Digital I/O pin number for relay #define RELAY_PIN18 40 #define RELAY_PIN19 41 #define RELAY_PIN20 42 #define BUTTON_PIN0 A0 // Arduino Digital I/O pin number for button #define BUTTON_PIN1 A1 // Arduino Digital I/O pin number for button #define BUTTON_PIN2 A2 // Arduino Digital I/O pin number for button #define BUTTON_PIN3 A3 // Arduino Digital I/O pin number for button #define BUTTON_PIN4 A4 // Arduino Digital I/O pin number for button #define BUTTON_PIN5 A5 // Arduino Digital I/O pin number for button #define BUTTON_PIN6 A6 // Arduino Digital I/O pin number for button #define BUTTON_PIN7 A7 // Arduino Digital I/O pin number for button #define BUTTON_PIN8 A8 // Arduino Digital I/O pin number for button #define BUTTON_PIN9 A9 // Arduino Digital I/O pin number for button #define BUTTON_PIN10 A10 // Arduino Digital I/O pin number for button #define BUTTON_PIN11 A11 // Arduino Digital I/O pin number for button #define BUTTON_PIN12 A12 // Arduino Digital I/O pin number for button #define BUTTON_PIN13 A13 // Arduino Digital I/O pin number for button #define BUTTON_PIN14 A14 // Arduino Digital I/O pin number for button #define BUTTON_PIN15 53 // Arduino Digital I/O pin number for button #define BUTTON_PIN16 52 // Arduino Digital I/O pin number for button #define BUTTON_PIN17 51 // Arduino Digital I/O pin number for button #define BUTTON_PIN18 50 // Arduino Digital I/O pin number for button #define BUTTON_PIN19 49 // Arduino Digital I/O pin number for button #define BUTTON_PIN20 48 // Arduino Digital I/O pin number for button #define CHILD0_ID 100 // Id of the sensor child #define CHILD1_ID 101 // Id of the sensor child #define CHILD2_ID 102 // Id of the sensor child #define CHILD3_ID 103 // Id of the sensor child #define CHILD4_ID 104 // Id of the sensor child #define CHILD5_ID 105 // Id of the sensor child #define CHILD6_ID 106 // Id of the sensor child #define CHILD7_ID 107 // Id of the sensor child #define CHILD8_ID 108 // Id of the sensor child #define CHILD9_ID 109 // Id of the sensor child #define CHILD10_ID 110 // Id of the sensor child #define CHILD11_ID 111 // Id of the sensor child #define CHILD12_ID 112 // Id of the sensor child #define CHILD13_ID 113 // Id of the sensor child #define CHILD14_ID 114 // Id of the sensor child #define CHILD15_ID 115 // Id of the sensor child #define CHILD16_ID 116 // Id of the sensor child #define CHILD17_ID 117 // Id of the sensor child #define CHILD18_ID 118 // Id of the sensor child #define CHILD19_ID 119 // Id of the sensor child #define CHILD20_ID 120 // Id of the sensor child #define RELAY_ON 1 #define RELAY_OFF 0 //A B C D E F G H I J K L M N O P R S T W X Bounce debouncerA = Bounce(); //1 Bounce debouncerB = Bounce(); Bounce debouncerC = Bounce(); Bounce debouncerD = Bounce(); Bounce debouncerE = Bounce(); //5 Bounce debouncerF = Bounce(); Bounce debouncerG = Bounce(); Bounce debouncerH = Bounce(); Bounce debouncerI = Bounce(); Bounce debouncerJ = Bounce(); //10 Bounce debouncerK = Bounce(); Bounce debouncerL = Bounce(); Bounce debouncerM = Bounce(); Bounce debouncerN = Bounce(); Bounce debouncerO = Bounce(); //15 Bounce debouncerP = Bounce(); Bounce debouncerR = Bounce(); Bounce debouncerS = Bounce(); Bounce debouncerT = Bounce(); Bounce debouncerW = Bounce(); //20 Bounce debouncerX = Bounce(); //A B C D E F G H I J K L M N O P R S T W X int oldValueA = 0; //1 int oldValueB = 0; int oldValueC = 0; int oldValueD = 0; int oldValueE = 0; //5 int oldValueF = 0; int oldValueG = 0; int oldValueH = 0; int oldValueI = 0; int oldValueJ = 0; //10 int oldValueK = 0; int oldValueL = 0; int oldValueM = 0; int oldValueN = 0; int oldValueO = 0; //15 int oldValueP = 0; int oldValueR = 0; int oldValueS = 0; int oldValueT = 0; int oldValueW = 0; //20 int oldValueX = 0; //A B C D E F G H I J K L M N O P R S T W X bool stateA = false; //1 bool stateB = false; bool stateC = false; bool stateD = false; bool stateE = false; //5 bool stateF = false; bool stateG = false; bool stateH = false; bool stateI = false; bool stateJ = false; //10 bool stateK = false; bool stateL = false; bool stateM = false; bool stateN = false; bool stateO = false; //15 bool stateP = false; bool stateR = false; bool stateS = false; bool stateT = false; bool stateW = false; //20 bool stateX = false; //A B C D E F G H I J K L M N O P R S T W X MyMessage msgA(CHILD0_ID, V_LIGHT); //1 MyMessage msgB(CHILD1_ID, V_LIGHT); MyMessage msgC(CHILD2_ID, V_LIGHT); MyMessage msgD(CHILD3_ID, V_LIGHT); MyMessage msgE(CHILD4_ID, V_LIGHT); //5 MyMessage msgF(CHILD5_ID, V_LIGHT); MyMessage msgG(CHILD6_ID, V_LIGHT); MyMessage msgH(CHILD7_ID, V_LIGHT); MyMessage msgI(CHILD8_ID, V_LIGHT); MyMessage msgJ(CHILD9_ID, V_LIGHT); //10 MyMessage msgK(CHILD10_ID, V_LIGHT); MyMessage msgL(CHILD11_ID, V_LIGHT); MyMessage msgM(CHILD12_ID, V_LIGHT); MyMessage msgN(CHILD13_ID, V_LIGHT); MyMessage msgO(CHILD14_ID, V_LIGHT); //15 MyMessage msgP(CHILD15_ID, V_LIGHT); MyMessage msgR(CHILD16_ID, V_LIGHT); MyMessage msgS(CHILD17_ID, V_LIGHT); MyMessage msgT(CHILD18_ID, V_LIGHT); MyMessage msgW(CHILD19_ID, V_LIGHT); //20 MyMessage msgX(CHILD20_ID, V_LIGHT); void setup() { // Setup the button pinMode(BUTTON_PIN0, INPUT_PULLUP); //1 pinMode(BUTTON_PIN1, INPUT_PULLUP); pinMode(BUTTON_PIN2, INPUT_PULLUP); pinMode(BUTTON_PIN3, INPUT_PULLUP); pinMode(BUTTON_PIN4, INPUT_PULLUP); //5 pinMode(BUTTON_PIN5, INPUT_PULLUP); pinMode(BUTTON_PIN6, INPUT_PULLUP); pinMode(BUTTON_PIN7, INPUT_PULLUP); pinMode(BUTTON_PIN8, INPUT_PULLUP); pinMode(BUTTON_PIN9, INPUT_PULLUP); //10 pinMode(BUTTON_PIN10, INPUT_PULLUP); pinMode(BUTTON_PIN11, INPUT_PULLUP); pinMode(BUTTON_PIN12, INPUT_PULLUP); pinMode(BUTTON_PIN13, INPUT_PULLUP); pinMode(BUTTON_PIN14, INPUT_PULLUP); //15 pinMode(BUTTON_PIN15, INPUT_PULLUP); pinMode(BUTTON_PIN16, INPUT_PULLUP); pinMode(BUTTON_PIN17, INPUT_PULLUP); pinMode(BUTTON_PIN18, INPUT_PULLUP); pinMode(BUTTON_PIN19, INPUT_PULLUP); //20 pinMode(BUTTON_PIN20, INPUT_PULLUP); // After setting up the button, setup debouncer debouncerA.attach(BUTTON_PIN0); //1 debouncerA.interval(5); debouncerB.attach(BUTTON_PIN1); debouncerB.interval(5); debouncerC.attach(BUTTON_PIN2); debouncerC.interval(5); debouncerD.attach(BUTTON_PIN3); debouncerD.interval(5); debouncerE.attach(BUTTON_PIN4); //5 debouncerE.interval(5); debouncerF.attach(BUTTON_PIN5); debouncerF.interval(5); debouncerG.attach(BUTTON_PIN6); debouncerG.interval(5); debouncerH.attach(BUTTON_PIN7); debouncerH.interval(5); debouncerI.attach(BUTTON_PIN8); debouncerI.interval(5); debouncerJ.attach(BUTTON_PIN9); //10 debouncerJ.interval(5); debouncerK.attach(BUTTON_PIN10); debouncerK.interval(5); debouncerL.attach(BUTTON_PIN11); debouncerL.interval(5); debouncerM.attach(BUTTON_PIN12); debouncerM.interval(5); debouncerN.attach(BUTTON_PIN13); debouncerN.interval(5); debouncerO.attach(BUTTON_PIN14); //15 debouncerO.interval(5); debouncerP.attach(BUTTON_PIN15); debouncerP.interval(5); debouncerR.attach(BUTTON_PIN16); debouncerR.interval(5); debouncerS.attach(BUTTON_PIN17); debouncerS.interval(5); debouncerT.attach(BUTTON_PIN18); debouncerT.interval(5); debouncerW.attach(BUTTON_PIN19); //20 debouncerW.interval(5); debouncerX.attach(BUTTON_PIN20); debouncerX.interval(5); // Make sure relays are off when starting up digitalWrite(RELAY_PIN0, RELAY_OFF); //1 digitalWrite(RELAY_PIN1, RELAY_OFF); digitalWrite(RELAY_PIN2, RELAY_OFF); digitalWrite(RELAY_PIN3, RELAY_OFF); digitalWrite(RELAY_PIN4, RELAY_OFF); //5 digitalWrite(RELAY_PIN5, RELAY_OFF); digitalWrite(RELAY_PIN6, RELAY_OFF); digitalWrite(RELAY_PIN7, RELAY_OFF); digitalWrite(RELAY_PIN8, RELAY_OFF); digitalWrite(RELAY_PIN9, RELAY_OFF); //10 digitalWrite(RELAY_PIN10, RELAY_OFF); digitalWrite(RELAY_PIN11, RELAY_OFF); digitalWrite(RELAY_PIN12, RELAY_OFF); digitalWrite(RELAY_PIN13, RELAY_OFF); digitalWrite(RELAY_PIN14, RELAY_OFF); //15 digitalWrite(RELAY_PIN15, RELAY_OFF); digitalWrite(RELAY_PIN16, RELAY_OFF); digitalWrite(RELAY_PIN17, RELAY_OFF); digitalWrite(RELAY_PIN18, RELAY_OFF); digitalWrite(RELAY_PIN19, RELAY_OFF); //20 digitalWrite(RELAY_PIN20, RELAY_OFF); // Then set relay pins in output mode pinMode(RELAY_PIN0, OUTPUT); //1 pinMode(RELAY_PIN1, OUTPUT); pinMode(RELAY_PIN2, OUTPUT); pinMode(RELAY_PIN3, OUTPUT); pinMode(RELAY_PIN4, OUTPUT); //5 pinMode(RELAY_PIN5, OUTPUT); pinMode(RELAY_PIN6, OUTPUT); pinMode(RELAY_PIN7, OUTPUT); pinMode(RELAY_PIN8, OUTPUT); pinMode(RELAY_PIN9, OUTPUT); //10 pinMode(RELAY_PIN10, OUTPUT); pinMode(RELAY_PIN11, OUTPUT); pinMode(RELAY_PIN12, OUTPUT); pinMode(RELAY_PIN13, OUTPUT); pinMode(RELAY_PIN14, OUTPUT); //15 pinMode(RELAY_PIN15, OUTPUT); pinMode(RELAY_PIN16, OUTPUT); pinMode(RELAY_PIN17, OUTPUT); pinMode(RELAY_PIN18, OUTPUT); pinMode(RELAY_PIN19, OUTPUT); //20 pinMode(RELAY_PIN20, OUTPUT); } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("21 Relay & button", "2.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD0_ID, S_LIGHT); present(CHILD1_ID, S_LIGHT); present(CHILD2_ID, S_LIGHT); present(CHILD3_ID, S_LIGHT); present(CHILD4_ID, S_LIGHT); //5 present(CHILD5_ID, S_LIGHT); present(CHILD6_ID, S_LIGHT); present(CHILD7_ID, S_LIGHT); present(CHILD8_ID, S_LIGHT); present(CHILD9_ID, S_LIGHT); //10 present(CHILD10_ID, S_LIGHT); present(CHILD11_ID, S_LIGHT); present(CHILD12_ID, S_LIGHT); present(CHILD13_ID, S_LIGHT); present(CHILD14_ID, S_LIGHT); //15 present(CHILD15_ID, S_LIGHT); present(CHILD16_ID, S_LIGHT); present(CHILD17_ID, S_LIGHT); present(CHILD18_ID, S_LIGHT); present(CHILD19_ID, S_LIGHT); //20 present(CHILD20_ID, S_LIGHT); } /* Example on how to asynchronously check for new messages from gw */ void loop() { debouncerA.update(); // Get the update value int valueA = debouncerA.read(); if (valueA != oldValueA) { send(msgA.set(stateA ? false : true), false); // Send new state and request ack back stateA = stateA ? false : true; digitalWrite(RELAY_PIN0, stateA ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueA = valueA; debouncerB.update(); // Get the update value int valueB = debouncerB.read(); if (valueB != oldValueB) { send(msgB.set(stateB ? false : true), false); // Send new state and request ack back stateB = stateB ? false : true; digitalWrite(RELAY_PIN1, stateB ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueB = valueB; debouncerC.update(); // Get the update value int valueC = debouncerC.read(); if (valueC != oldValueC) { send(msgC.set(stateC ? false : true), false); // Send new state and request ack back stateC = stateC ? false : true; digitalWrite(RELAY_PIN2, stateC ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueC = valueC; debouncerD.update(); // Get the update value int valueD = debouncerD.read(); if (valueD != oldValueD) { send(msgD.set(stateD ? false : true), false); // Send new state and request ack back stateD = stateD ? false : true; digitalWrite(RELAY_PIN3, stateD ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueD = valueD; debouncerE.update(); // Get the update value int valueE = debouncerE.read(); if (valueE != oldValueE) { send(msgE.set(stateE ? false : true), false); // Send new state and request ack back stateE = stateE ? false : true; digitalWrite(RELAY_PIN4, stateE ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueE = valueE; //5 debouncerF.update(); // Get the update value int valueF = debouncerF.read(); if (valueF != oldValueF) { send(msgF.set(stateF ? false : true), false); // Send new state and request ack back stateF = stateF ? false : true; digitalWrite(RELAY_PIN5, stateF ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueF = valueF; debouncerG.update(); // Get the update value int valueG = debouncerG.read(); if (valueG != oldValueG) { send(msgG.set(stateG ? false : true), false); // Send new state and request ack back stateG = stateG ? false : true; digitalWrite(RELAY_PIN6, stateG ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueG = valueG; debouncerH.update(); // Get the update value int valueH = debouncerH.read(); if (valueH != oldValueH) { send(msgH.set(stateH ? false : true), false); // Send new state and request ack back stateH = stateH ? false : true; digitalWrite(RELAY_PIN7, stateH ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueH = valueH; debouncerI.update(); // Get the update value int valueI = debouncerI.read(); if (valueI != oldValueI) { send(msgI.set(stateI ? false : true), false); // Send new state and request ack back stateI = stateI ? false : true; digitalWrite(RELAY_PIN8, stateI ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueI = valueI; debouncerJ.update(); // Get the update value int valueJ = debouncerJ.read(); if (valueJ != oldValueJ) { send(msgJ.set(stateJ ? false : true), false); // Send new state and request ack back stateJ = stateJ ? false : true; digitalWrite(RELAY_PIN9, stateJ ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueJ = valueJ; //10 debouncerK.update(); // Get the update value int valueK = debouncerK.read(); if (valueK != oldValueK) { send(msgK.set(stateK ? false : true), false); // Send new state and request ack back stateK = stateK ? false : true; digitalWrite(RELAY_PIN10, stateK ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueK = valueK; debouncerL.update(); // Get the update value int valueL = debouncerL.read(); if (valueL != oldValueL) { send(msgL.set(stateL ? false : true), false); // Send new state and request ack back stateL = stateL ? false : true; digitalWrite(RELAY_PIN11, stateL ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueL = valueL; debouncerM.update(); // Get the update value int valueM = debouncerM.read(); if (valueM != oldValueM) { send(msgM.set(stateM ? false : true), false); // Send new state and request ack back stateM = stateM ? false : true; digitalWrite(RELAY_PIN12, stateM ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueM = valueM; debouncerN.update(); // Get the update value int valueN = debouncerN.read(); if (valueN != oldValueN) { send(msgN.set(stateN ? false : true), false); // Send new state and request ack back stateN = stateN ? false : true; digitalWrite(RELAY_PIN13, stateN ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueN = valueN; debouncerO.update(); // Get the update value int valueO = debouncerO.read(); if (valueO != oldValueO) { send(msgO.set(stateO ? false : true), false); // Send new state and request ack back stateO = stateO ? false : true; digitalWrite(RELAY_PIN14, stateO ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueO = valueO; //15 debouncerP.update(); // Get the update value int valueP = debouncerP.read(); if (valueP != oldValueP) { send(msgP.set(stateP ? false : true), false); // Send new state and request ack back stateP = stateP ? false : true; digitalWrite(RELAY_PIN15, stateP ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueP = valueP; debouncerR.update(); // Get the update value int valueR = debouncerR.read(); if (valueR != oldValueR) { send(msgR.set(stateR ? false : true), false); // Send new state and request ack back stateR = stateR ? false : true; digitalWrite(RELAY_PIN16, stateR ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueR = valueR; debouncerS.update(); // Get the update value int valueS = debouncerS.read(); if (valueS != oldValueS) { send(msgS.set(stateS ? false : true), false); // Send new state and request ack back stateS = stateS ? false : true; digitalWrite(RELAY_PIN17, stateS ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueS = valueS; debouncerT.update(); // Get the update value int valueT = debouncerT.read(); if (valueT != oldValueT) { send(msgT.set(stateT ? false : true), false); // Send new state and request ack back stateT = stateT ? false : true; digitalWrite(RELAY_PIN18, stateT ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueT = valueT; debouncerW.update(); // Get the update value int valueW = debouncerW.read(); if (valueW != oldValueW) { send(msgW.set(stateW ? false : true), false); // Send new state and request ack back stateW = stateW ? false : true; digitalWrite(RELAY_PIN19, stateW ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueW = valueW; //20 debouncerX.update(); // Get the update value int valueX = debouncerX.read(); if (valueX != oldValueX) { send(msgX.set(stateX ? false : true), false); // Send new state and request ack back stateX = stateX ? false : true; digitalWrite(RELAY_PIN20, stateX ? RELAY_ON : RELAY_OFF); // toggle the relay } oldValueX = valueX; } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type == V_LIGHT) { switch (message.sensor) { case CHILD0_ID: stateA = message.getBool(); digitalWrite(RELAY_PIN0, stateA ? RELAY_ON : RELAY_OFF); saveState(CHILD0_ID, stateA); break; case CHILD1_ID: stateB = message.getBool(); digitalWrite(RELAY_PIN1, stateB ? RELAY_ON : RELAY_OFF); saveState(CHILD1_ID, stateB); break; case CHILD2_ID: stateC = message.getBool(); digitalWrite(RELAY_PIN2, stateC ? RELAY_ON : RELAY_OFF); saveState(CHILD2_ID, stateC); break; case CHILD3_ID: stateD = message.getBool(); digitalWrite(RELAY_PIN3, stateD ? RELAY_ON : RELAY_OFF); saveState(CHILD3_ID, stateD); break; case CHILD4_ID: stateE = message.getBool(); digitalWrite(RELAY_PIN4, stateE ? RELAY_ON : RELAY_OFF); saveState(CHILD4_ID, stateE); break; //5 case CHILD5_ID: stateF = message.getBool(); digitalWrite(RELAY_PIN5, stateF ? RELAY_ON : RELAY_OFF); saveState(CHILD5_ID, stateF); break; case CHILD6_ID: stateG = message.getBool(); digitalWrite(RELAY_PIN6, stateG ? RELAY_ON : RELAY_OFF); saveState(CHILD6_ID, stateG); break; case CHILD7_ID: stateH = message.getBool(); digitalWrite(RELAY_PIN7, stateH ? RELAY_ON : RELAY_OFF); saveState(CHILD7_ID, stateH); break; case CHILD8_ID: stateI = message.getBool(); digitalWrite(RELAY_PIN8, stateI ? RELAY_ON : RELAY_OFF); saveState(CHILD8_ID, stateI); break; case CHILD9_ID: stateJ = message.getBool(); digitalWrite(RELAY_PIN9, stateJ ? RELAY_ON : RELAY_OFF); saveState(CHILD9_ID, stateJ); break; //10 case CHILD10_ID: stateK = message.getBool(); digitalWrite(RELAY_PIN10, stateK ? RELAY_ON : RELAY_OFF); saveState(CHILD10_ID, stateK); break; case CHILD11_ID: stateL = message.getBool(); digitalWrite(RELAY_PIN11, stateL ? RELAY_ON : RELAY_OFF); saveState(CHILD11_ID, stateL); break; case CHILD12_ID: stateM = message.getBool(); digitalWrite(RELAY_PIN12, stateM ? RELAY_ON : RELAY_OFF); saveState(CHILD12_ID, stateM); break; case CHILD13_ID: stateN = message.getBool(); digitalWrite(RELAY_PIN13, stateN ? RELAY_ON : RELAY_OFF); saveState(CHILD13_ID, stateN); break; case CHILD14_ID: stateO = message.getBool(); digitalWrite(RELAY_PIN14, stateO ? RELAY_ON : RELAY_OFF); saveState(CHILD14_ID, stateO); break; //15 case CHILD15_ID: stateP = message.getBool(); digitalWrite(RELAY_PIN15, stateP ? RELAY_ON : RELAY_OFF); saveState(CHILD15_ID, stateP); break; case CHILD16_ID: stateR = message.getBool(); digitalWrite(RELAY_PIN16, stateR ? RELAY_ON : RELAY_OFF); saveState(CHILD16_ID, stateR); break; case CHILD17_ID: stateS = message.getBool(); digitalWrite(RELAY_PIN17, stateS ? RELAY_ON : RELAY_OFF); saveState(CHILD17_ID, stateS); break; case CHILD18_ID: stateT = message.getBool(); digitalWrite(RELAY_PIN18, stateT ? RELAY_ON : RELAY_OFF); saveState(CHILD18_ID, stateT); break; case CHILD19_ID: stateW = message.getBool(); digitalWrite(RELAY_PIN19, stateW ? RELAY_ON : RELAY_OFF); saveState(CHILD19_ID, stateW); break; //20 case CHILD20_ID: stateX = message.getBool(); digitalWrite(RELAY_PIN20, stateX ? RELAY_ON : RELAY_OFF); saveState(CHILD20_ID, stateX); break; } // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } }
Powyższy kod obsługuje 21 sterowników Bistabilnych oraz przełączników.