Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Dimmer
- // The below includes 2 x LED dimmers
- // Dimmer
- // Button
- // The below includes 4 buttons using code examples from here: https://forum.mysensors.org/topic/9538/multiple-switch-inputs/8
- // Button
- // Relay
- // The below includes 2 relays from https://www.mysensors.org/build/relay
- // https://forum.mysensors.org/topic/5906/relay-actuator-with-momentary-pulse-action/2
- // Relay
- // 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 RS485 transport layer
- #define MY_RS485
- // Define this to enables DE-pin management on defined pin
- #define MY_RS485_DE_PIN 2
- // Set RS485 baud rate to use
- #define MY_RS485_BAUD_RATE 9600
- #define MY_NODE_ID 12
- #include <SPI.h>
- #include <MySensors.h>
- // Button
- #include <Bounce2.h>
- //
- #define SN "N012"
- #define SV "1.0"
- // Dimmer
- #define noLEDs 4
- const int LED_Pin[] = {3,5,6,11};
- #define FADE_DELAY 10 // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
- static int currentLevel1 = 0; // Current dim level...
- static int currentLevel2 = 0; // Current dim level...
- static int currentLevel3 = 0;
- static int currentLevel4 = 0;
- MyMessage dimmer1Msg(1, V_DIMMER);
- MyMessage light1Msg(1, V_LIGHT);
- MyMessage dimmer2Msg(2, V_DIMMER);
- MyMessage light2Msg(2, V_LIGHT);
- MyMessage dimmer3Msg(3, V_DIMMER);
- MyMessage light3Msg(3, V_LIGHT);
- MyMessage dimmer4Msg(4, V_DIMMER);
- MyMessage light4Msg(4, V_LIGHT);
- // Dimmer
- // Button
- #define FIRST_BUTTON_ID 5
- #define MAX_BUTTON 8
- const uint8_t buttonPin[] = {A1, A2, A3, 4, 7, 10, 12, 13}; // switch around pins to your desire
- Bounce debouncer[MAX_BUTTON];
- MyMessage buttonMsg(0, V_TRIPPED);
- bool oldButton[MAX_BUTTON] = {false};
- // Button
- // Relay
- #define FIRST_RELAY_ID 13
- #define MAX_RELAY 4
- const uint8_t relayPin[] = {A4, A5, A6, A7}; // Pins of relays
- MyMessage relayMsg(0, V_STATUS);
- #define RELAY_ON 1
- #define RELAY_OFF 0
- // Relay
- void before()
- {
- }
- /***
- * Dimmable LED initialization method
- */
- void setup()
- {
- // LEDS
- // Pull the gateway's current dim level - restore light level upon sendor node power-up
- for (int sensor=1; sensor<=noLEDs; sensor++){
- request( sensor, V_DIMMER );
- }
- // Button
- for (uint8_t i = 0; i < MAX_BUTTON; i++) {
- debouncer[i] = Bounce(); // initialize debouncer
- debouncer[i].attach(buttonPin[i], INPUT_PULLUP);
- debouncer[i].interval(5);
- oldButton[i] = debouncer[i].read();
- }
- // Button
- // Relay
- for (uint8_t i = 0; i < MAX_RELAY; i++) {
- pinMode(relayPin[i], OUTPUT);
- //digitalWrite(relayPin, loadState(i)?RELAY_ON:RELAY_OFF);
- }
- // Relay
- }
- void presentation() {
- // Register the LED Dimmable Light with the gateway
- for (int sensor=1; sensor<=noLEDs; sensor++){
- present(sensor, S_DIMMER);
- wait(2);
- }
- // Button
- for (int i = 0; i < MAX_BUTTON; i++) { //i < numSensors &&
- present(FIRST_BUTTON_ID + i, S_DOOR);
- }
- // Button
- // Relay
- for (int i = 0; i < MAX_RELAY; i++) {
- present(FIRST_RELAY_ID + i, S_BINARY);
- }
- // Relay
- sendSketchInfo(SN, SV);
- }
- /***
- * Dimmable LED main processing loop
- */
- void loop()
- {
- // Button
- bool button[MAX_BUTTON];
- for (uint8_t i = 0; i < MAX_BUTTON; i++) {
- debouncer[i].update();
- button[i] = debouncer[i].read();
- if (button[i] != oldButton[i]) {
- send(buttonMsg.setSensor(FIRST_BUTTON_ID + i).set( button[i])); // Send tripped value to gw
- oldButton[i] = button[i];
- }
- }
- // Button
- }
- /***
- * This method provides a graceful fade up/down effect
- */
- void fadeToLevel1( int toLevel1, int ledid1 ) {
- int delta1 = ( toLevel1 - currentLevel1 ) < 0 ? -1 : 1;
- while ( currentLevel1 != toLevel1 ) {
- currentLevel1 += delta1;
- analogWrite(LED_Pin[ledid1-1], (int)(currentLevel1 / 100. * 255) );
- wait( FADE_DELAY );
- }
- }
- void fadeToLevel2( int toLevel2, int ledid2 ) {
- int delta2 = ( toLevel2 - currentLevel2 ) < 0 ? -1 : 1;
- while ( currentLevel2 != toLevel2 ) {
- currentLevel2 += delta2;
- analogWrite(LED_Pin[ledid2-1], (int)(currentLevel2 / 100. * 255) );
- wait( FADE_DELAY );
- }
- }
- void fadeToLevel3( int toLevel3, int ledid3 ) {
- int delta3 = ( toLevel3 - currentLevel3 ) < 0 ? -1 : 1;
- while ( currentLevel3 != toLevel3 ) {
- currentLevel3 += delta3;
- analogWrite(LED_Pin[ledid3-1], (int)(currentLevel3 / 100. * 255) );
- wait( FADE_DELAY );
- }
- }
- void fadeToLevel4( int toLevel4, int ledid4 ) {
- int delta4 = ( toLevel4 - currentLevel4 ) < 0 ? -1 : 1;
- while ( currentLevel4 != toLevel4 ) {
- currentLevel4 += delta4;
- analogWrite(LED_Pin[ledid4-1], (int)(currentLevel4 / 100. * 255) );
- wait( FADE_DELAY );
- }
- }
- void receive(const MyMessage &message) {
- if (message.type == V_LIGHT || message.type == V_DIMMER) {
- if (message.sensor == 1) {
- // Retrieve the power or dim level from the incoming request message
- int requestedLevel1 = atoi( message.data );
- // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
- requestedLevel1 *= ( message.type == V_LIGHT ? 100 : 1 );
- // Clip incoming level to valid range of 0 to 100
- requestedLevel1 = requestedLevel1 > 100 ? 100 : requestedLevel1;
- requestedLevel1 = requestedLevel1 < 0 ? 0 : requestedLevel1;
- fadeToLevel1( requestedLevel1, message.sensor );
- send(light1Msg.set(currentLevel1 > 0 ? 1 : 0));
- send(dimmer1Msg.set(currentLevel1) );}
- if (message.sensor == 2) {
- // Retrieve the power or dim level from the incoming request message
- int requestedLevel2 = atoi( message.data );
- // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
- requestedLevel2 *= ( message.type == V_LIGHT ? 100 : 1 );
- // Clip incoming level to valid range of 0 to 100
- requestedLevel2 = requestedLevel2 > 100 ? 100 : requestedLevel2;
- requestedLevel2 = requestedLevel2 < 0 ? 0 : requestedLevel2;
- fadeToLevel2( requestedLevel2, message.sensor );
- send(light2Msg.set(currentLevel2 > 0 ? 1 : 0));
- send(dimmer2Msg.set(currentLevel2) );}
- if (message.sensor == 3) {
- // Retrieve the power or dim level from the incoming request message
- int requestedLevel3 = atoi( message.data );
- // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
- requestedLevel3 *= ( message.type == V_LIGHT ? 100 : 1 );
- // Clip incoming level to valid range of 0 to 100
- requestedLevel3 = requestedLevel3 > 100 ? 100 : requestedLevel3;
- requestedLevel3 = requestedLevel3 < 0 ? 0 : requestedLevel3;
- fadeToLevel3( requestedLevel3, message.sensor );
- send(light3Msg.set(currentLevel3 > 0 ? 1 : 0));
- send(dimmer3Msg.set(currentLevel3) );}
- if (message.sensor == 4) {
- // Retrieve the power or dim level from the incoming request message
- int requestedLevel4 = atoi( message.data );
- // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
- requestedLevel4 *= ( message.type == V_LIGHT ? 100 : 1 );
- // Clip incoming level to valid range of 0 to 100
- requestedLevel4 = requestedLevel4 > 100 ? 100 : requestedLevel4;
- requestedLevel4 = requestedLevel4 < 0 ? 0 : requestedLevel4;
- fadeToLevel4( requestedLevel4, message.sensor );
- send(light4Msg.set(currentLevel4 > 0 ? 1 : 0));
- send(dimmer4Msg.set(currentLevel4) );}
- }
- // Relay
- if (message.type == V_STATUS) {
- if (message.sensor == 13) {
- digitalWrite(relayPin[message.getSensor()-13], message.getBool()?RELAY_ON:RELAY_OFF);
- saveState(message.getSensor()-13, message.getBool());
- }
- if (message.sensor == 14) {
- digitalWrite(relayPin[message.getSensor()-13], message.getBool()?RELAY_ON:RELAY_OFF);
- saveState(message.getSensor()-13, message.getBool());
- }
- if (message.sensor == 15) {
- digitalWrite(relayPin[message.getSensor()-13], message.getBool()?RELAY_ON:RELAY_OFF);
- saveState(message.getSensor()-13, message.getBool());
- }
- if (message.sensor == 16) {
- digitalWrite(relayPin[message.getSensor()-13], message.getBool()?RELAY_ON:RELAY_OFF);
- saveState(message.getSensor()-13, message.getBool());
- }
- }
- // Relay
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement