Advertisement
Guest User

RS485 MySensors

a guest
Jan 23rd, 2024
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. // Dimmer
  3. // The below includes 2 x LED dimmers
  4. // Dimmer
  5.  
  6. // Button
  7. // The below includes 4 buttons using code examples from here:  https://forum.mysensors.org/topic/9538/multiple-switch-inputs/8
  8. // Button
  9.  
  10. // Relay
  11. // The below includes 2 relays from https://www.mysensors.org/build/relay
  12. // https://forum.mysensors.org/topic/5906/relay-actuator-with-momentary-pulse-action/2
  13. // Relay
  14.  
  15. // Enable debug prints to serial monitor
  16. #define MY_DEBUG
  17.  
  18. // Enable and select radio type attached
  19. //#define MY_RADIO_RF24
  20. //#define MY_RADIO_NRF5_ESB
  21. //#define MY_RADIO_RFM69
  22. //#define MY_RADIO_RFM95
  23. // Enable RS485 transport layer
  24. #define MY_RS485
  25.  
  26. // Define this to enables DE-pin management on defined pin
  27. #define MY_RS485_DE_PIN 2
  28.  
  29. // Set RS485 baud rate to use
  30. #define MY_RS485_BAUD_RATE 9600
  31.  
  32. #define MY_NODE_ID 12
  33.  
  34. #include <SPI.h>
  35. #include <MySensors.h>
  36.  
  37. // Button
  38. #include <Bounce2.h>
  39. //
  40.  
  41. #define SN "N012"
  42. #define SV "1.0"
  43.  
  44. // Dimmer
  45. #define noLEDs 4
  46. const int LED_Pin[] = {3,5,6,11};
  47.  
  48. #define FADE_DELAY 10  // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
  49.  
  50. static int currentLevel1 = 0;  // Current dim level...
  51. static int currentLevel2 = 0;  // Current dim level...
  52. static int currentLevel3 = 0;
  53. static int currentLevel4 = 0;
  54.  
  55. MyMessage dimmer1Msg(1, V_DIMMER);
  56. MyMessage light1Msg(1, V_LIGHT);
  57. MyMessage dimmer2Msg(2, V_DIMMER);
  58. MyMessage light2Msg(2, V_LIGHT);
  59. MyMessage dimmer3Msg(3, V_DIMMER);
  60. MyMessage light3Msg(3, V_LIGHT);
  61. MyMessage dimmer4Msg(4, V_DIMMER);
  62. MyMessage light4Msg(4, V_LIGHT);
  63. // Dimmer
  64.  
  65. // Button
  66. #define FIRST_BUTTON_ID 5
  67. #define MAX_BUTTON 8
  68. const uint8_t buttonPin[] = {A1, A2, A3, 4, 7, 10, 12, 13};   //  switch around pins to your desire
  69. Bounce debouncer[MAX_BUTTON];
  70. MyMessage buttonMsg(0, V_TRIPPED);
  71. bool oldButton[MAX_BUTTON] = {false};
  72. // Button
  73.  
  74. // Relay
  75. #define FIRST_RELAY_ID 13
  76. #define MAX_RELAY 4
  77. const uint8_t relayPin[] = {A4, A5, A6, A7};  // Pins of relays
  78.  
  79. MyMessage relayMsg(0, V_STATUS);
  80.  
  81. #define RELAY_ON 1
  82. #define RELAY_OFF 0
  83. // Relay
  84.  
  85. void before()
  86. {
  87.  
  88. }
  89.  
  90. /***
  91.  * Dimmable LED initialization method
  92.  */
  93. void setup()  
  94. {
  95.   // LEDS
  96.   // Pull the gateway's current dim level - restore light level upon sendor node power-up
  97. for (int sensor=1; sensor<=noLEDs; sensor++){
  98.   request( sensor, V_DIMMER );
  99.  }
  100.  
  101. // Button
  102. for (uint8_t i = 0; i < MAX_BUTTON; i++) {
  103.     debouncer[i] = Bounce();                        // initialize debouncer
  104.     debouncer[i].attach(buttonPin[i], INPUT_PULLUP);
  105.     debouncer[i].interval(5);
  106.     oldButton[i] =  debouncer[i].read();
  107.   }
  108. // Button
  109.  
  110. // Relay
  111. for (uint8_t i = 0; i < MAX_RELAY; i++) {
  112.   pinMode(relayPin[i], OUTPUT);
  113.   //digitalWrite(relayPin, loadState(i)?RELAY_ON:RELAY_OFF);
  114.     }
  115. // Relay
  116.  
  117. }
  118.  
  119. void presentation() {
  120.   // Register the LED Dimmable Light with the gateway
  121.  for (int sensor=1; sensor<=noLEDs; sensor++){
  122.  present(sensor, S_DIMMER);
  123.  wait(2);
  124.  }
  125.  
  126. // Button
  127.  for (int i = 0; i < MAX_BUTTON; i++) { //i < numSensors &&
  128.     present(FIRST_BUTTON_ID + i, S_DOOR);
  129.   }
  130.  // Button
  131.  
  132. // Relay
  133. for (int i = 0; i < MAX_RELAY; i++)   {
  134.   present(FIRST_RELAY_ID + i, S_BINARY);
  135. }
  136. // Relay
  137.  
  138.   sendSketchInfo(SN, SV);
  139. }
  140.  
  141. /***
  142.  *  Dimmable LED main processing loop
  143.  */
  144. void loop()
  145. {
  146.  
  147. // Button
  148.   bool button[MAX_BUTTON];
  149.   for (uint8_t i = 0; i < MAX_BUTTON; i++) {
  150.     debouncer[i].update();
  151.     button[i] = debouncer[i].read();
  152.     if (button[i] != oldButton[i]) {
  153.       send(buttonMsg.setSensor(FIRST_BUTTON_ID + i).set( button[i])); // Send tripped value to gw
  154.       oldButton[i] = button[i];
  155.     }
  156.   }
  157.   // Button
  158.  
  159. }
  160.  
  161.  
  162.  
  163. /***
  164.  *  This method provides a graceful fade up/down effect
  165.  */
  166.  
  167.  
  168.  
  169. void fadeToLevel1( int toLevel1, int ledid1 ) {
  170.  
  171.   int delta1 = ( toLevel1 - currentLevel1 ) < 0 ? -1 : 1;
  172.  
  173.   while ( currentLevel1 != toLevel1 ) {
  174.     currentLevel1 += delta1;
  175.     analogWrite(LED_Pin[ledid1-1], (int)(currentLevel1 / 100. * 255) );
  176.     wait( FADE_DELAY );
  177.   }
  178. }
  179.  
  180. void fadeToLevel2( int toLevel2, int ledid2 ) {
  181.  
  182.   int delta2 = ( toLevel2 - currentLevel2 ) < 0 ? -1 : 1;
  183.  
  184.   while ( currentLevel2 != toLevel2 ) {
  185.     currentLevel2 += delta2;
  186.     analogWrite(LED_Pin[ledid2-1], (int)(currentLevel2 / 100. * 255) );
  187.     wait( FADE_DELAY );
  188.   }
  189. }
  190.  
  191. void fadeToLevel3( int toLevel3, int ledid3 ) {
  192.  
  193.   int delta3 = ( toLevel3 - currentLevel3 ) < 0 ? -1 : 1;
  194.  
  195.   while ( currentLevel3 != toLevel3 ) {
  196.     currentLevel3 += delta3;
  197.     analogWrite(LED_Pin[ledid3-1], (int)(currentLevel3 / 100. * 255) );
  198.     wait( FADE_DELAY );
  199.   }
  200. }
  201.  
  202. void fadeToLevel4( int toLevel4, int ledid4 ) {
  203.  
  204.   int delta4 = ( toLevel4 - currentLevel4 ) < 0 ? -1 : 1;
  205.  
  206.   while ( currentLevel4 != toLevel4 ) {
  207.     currentLevel4 += delta4;
  208.     analogWrite(LED_Pin[ledid4-1], (int)(currentLevel4 / 100. * 255) );
  209.     wait( FADE_DELAY );
  210.   }
  211. }
  212.  
  213.  
  214.  
  215. void receive(const MyMessage &message) {
  216.   if (message.type == V_LIGHT || message.type == V_DIMMER) {
  217.  
  218.     if (message.sensor == 1) {
  219.  
  220.      //  Retrieve the power or dim level from the incoming request message
  221.     int requestedLevel1 = atoi( message.data );
  222.    
  223.     // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
  224.     requestedLevel1 *= ( message.type == V_LIGHT ? 100 : 1 );
  225.    
  226.     // Clip incoming level to valid range of 0 to 100
  227.     requestedLevel1 = requestedLevel1 > 100 ? 100 : requestedLevel1;
  228.     requestedLevel1 = requestedLevel1 < 0   ? 0   : requestedLevel1;
  229.  
  230.      
  231.      fadeToLevel1( requestedLevel1, message.sensor );
  232.     send(light1Msg.set(currentLevel1 > 0 ? 1 : 0));
  233.     send(dimmer1Msg.set(currentLevel1) );}
  234.    
  235.    
  236.    
  237.      
  238.    if (message.sensor == 2) {
  239.    //  Retrieve the power or dim level from the incoming request message
  240.     int requestedLevel2 = atoi( message.data );
  241.    
  242.     // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
  243.     requestedLevel2 *= ( message.type == V_LIGHT ? 100 : 1 );
  244.    
  245.     // Clip incoming level to valid range of 0 to 100
  246.     requestedLevel2 = requestedLevel2 > 100 ? 100 : requestedLevel2;
  247.     requestedLevel2 = requestedLevel2 < 0   ? 0   : requestedLevel2;
  248.    
  249.     fadeToLevel2( requestedLevel2, message.sensor );
  250.     send(light2Msg.set(currentLevel2 > 0 ? 1 : 0));
  251.     send(dimmer2Msg.set(currentLevel2) );}
  252.      
  253.  
  254.    
  255.  
  256.   if (message.sensor == 3) {
  257.    //  Retrieve the power or dim level from the incoming request message
  258.     int requestedLevel3 = atoi( message.data );
  259.    
  260.     // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
  261.     requestedLevel3 *= ( message.type == V_LIGHT ? 100 : 1 );
  262.    
  263.     // Clip incoming level to valid range of 0 to 100
  264.     requestedLevel3 = requestedLevel3 > 100 ? 100 : requestedLevel3;
  265.     requestedLevel3 = requestedLevel3 < 0   ? 0   : requestedLevel3;
  266.    
  267.     fadeToLevel3( requestedLevel3, message.sensor );
  268.     send(light3Msg.set(currentLevel3 > 0 ? 1 : 0));
  269.     send(dimmer3Msg.set(currentLevel3) );}
  270.      
  271.  
  272.    
  273.  
  274.  
  275.     if (message.sensor == 4) {
  276.    //  Retrieve the power or dim level from the incoming request message
  277.     int requestedLevel4 = atoi( message.data );
  278.    
  279.     // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
  280.     requestedLevel4 *= ( message.type == V_LIGHT ? 100 : 1 );
  281.    
  282.     // Clip incoming level to valid range of 0 to 100
  283.     requestedLevel4 = requestedLevel4 > 100 ? 100 : requestedLevel4;
  284.     requestedLevel4 = requestedLevel4 < 0   ? 0   : requestedLevel4;
  285.    
  286.     fadeToLevel4( requestedLevel4, message.sensor );
  287.     send(light4Msg.set(currentLevel4 > 0 ? 1 : 0));
  288.     send(dimmer4Msg.set(currentLevel4) );}
  289.      
  290.  
  291.     }
  292. // Relay
  293.   if (message.type == V_STATUS) {
  294.  
  295.  
  296.     if (message.sensor == 13)  {
  297.       digitalWrite(relayPin[message.getSensor()-13], message.getBool()?RELAY_ON:RELAY_OFF);
  298.       saveState(message.getSensor()-13, message.getBool());  
  299.     }
  300.    
  301.    
  302.  
  303.     if (message.sensor == 14)  {
  304.       digitalWrite(relayPin[message.getSensor()-13], message.getBool()?RELAY_ON:RELAY_OFF);
  305.       saveState(message.getSensor()-13, message.getBool());  
  306.     }
  307.  
  308.  
  309.     if (message.sensor == 15)  {
  310.       digitalWrite(relayPin[message.getSensor()-13], message.getBool()?RELAY_ON:RELAY_OFF);
  311.       saveState(message.getSensor()-13, message.getBool());  
  312.     }
  313.  
  314.  
  315.  
  316.     if (message.sensor == 16)  {
  317.       digitalWrite(relayPin[message.getSensor()-13], message.getBool()?RELAY_ON:RELAY_OFF);
  318.       saveState(message.getSensor()-13, message.getBool());  
  319.     }
  320.  
  321.    
  322.   }
  323. // Relay  
  324. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement