Node 1 Relay mode to 2x Relay + DS18b20

Post Reply
piokuc
Posts: 289
Joined: Sunday 07 February 2016 14:31
Target OS: Raspberry Pi
Domoticz version: 3.6328
Contact:

Node 1 Relay mode to 2x Relay + DS18b20

Post by piokuc » Wednesday 31 January 2018 19:06

Hi all
I have and sketch with support 1x relay. Can you help me with modify this sketch to support 2x Relay or more with also temperature from DS18B20 ?
Please help me...
This is my sketch for 1xrelay

Code: Select all

/*
   Relay with button sketch
   modified to work with no uplink
   to gateway and try to maintain sync to controller
*/


#define MY_DEBUG                               // Enable debug prints to serial monitor

#define MY_RADIO_RFM69
#define MY_IS_RFM69HW
#define RFM69_868MH
#define MY_RFM69_NEW_DRIVER

//#define MY_NODE_ID 203                       // Node id defaults to AUTO (tries to fetch id from controller) 

#define MY_TRANSPORT_WAIT_READY_MS 5000        //set how long to wait for transport ready in milliseconds

#define MY_REPEATER_FEATURE                    // Enabled repeater feature for this node

#include <MySensors.h>
#include <Bounce2.h>

#define RELAY_PIN  5      // Arduino Digital I/O pin number for relay 
#define BUTTON_PIN  3     // Arduino Digital I/O pin number for button 
#define CHILD_ID 1        // Id of the sensor child
#define RELAY_ON 1
#define RELAY_OFF 0

Bounce debouncer = Bounce();
int oldValue = 0;
bool uplinkAvailable = true;
bool state = false;
bool requestState;
bool firstStart = true;
unsigned long uplinkCheckTime ;                // holder for uplink checks
unsigned long uplinkCheckPeriod = 30*1000;     // time between checks for uplink in milliseconds
unsigned long returnWait = 1000;               // how long to wait for return from controller in milliseconds.. adjust as needed
unsigned long oldTime = 0;
unsigned long newTime = 0;
MyMessage msg(CHILD_ID, V_STATUS);

void setup(){
  pinMode(BUTTON_PIN, INPUT_PULLUP);           // Setup the button pin, Activate internal pull-up
  
  debouncer.attach(BUTTON_PIN);                // After setting up the button, setup debouncer
  debouncer.interval(5);

  pinMode(RELAY_PIN, OUTPUT);                 // set relay pin in output mode
  digitalWrite(RELAY_PIN, RELAY_OFF);         // Make sure relay is off when starting up
}

void presentation()  {
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("1xRelay & Button", "2.2.0");

  // Register all sensors to gw (they will be created as child devices)
  present(CHILD_ID, S_BINARY);
}


void loop(){
  if (firstStart) {                            // this code is only run once at startup
    Serial.println("First run started");
    requestTime();                             // get time from controller
    wait (returnWait);                         // delay to allow time to return
    if (oldTime == 0){                         // check to see if there was a return from the time request
      Serial.println("uplink not available");
      uplinkAvailable = false;                 // no uplink established
      uplinkCheckTime = millis();
    }
     else{
      Serial.println("uplink available");
      request( CHILD_ID, V_STATUS);            // get status of switch on controller
      wait (returnWait);                       //wait needed to allow request to return from controller
      Serial.print("controller state --- ");
      Serial.println(requestState);
      if (requestState != state) {             // check that controller is corectly showing the current relay state
        send(msg.set(state), false);           // notify controller of current state
      } 
     }   
  firstStart = false;                                          // set firstStart flag false to prevent code from running again
 }

  debouncer.update();
  int value = debouncer.read();                               // Get the update value
  if (value != oldValue && value == 0) {                      // check for new button push
    state =  !state;                                          // Toggle the state
    digitalWrite(RELAY_PIN, state ? RELAY_ON : RELAY_OFF);    // switch the relay to the new state
    requestTime();
    wait (returnWait);                                               // delay to allow time to return
    if (oldTime != newTime){                                  // if times are different then uplink is available
      send(msg.set(state), false);
      oldTime = newTime;
    }
    else{                                                    // if times are the same no uplink is available
     Serial.println("uplink not available");
      uplinkAvailable = false;                                // no uplink available, set flag false
      uplinkCheckTime = millis();                             // start the timer from now
    }

  }
  oldValue = value;
 
  if (!uplinkAvailable && (millis() - uplinkCheckTime > uplinkCheckPeriod) ) {       // test to see if function should be called
    uplinkCheck();                                                                  // call uplink checking function
  }

}

/*-------------------start of functions--------------------------*/

void receive(const MyMessage &message) {
  if (message.type == V_STATUS) {                                   // check to see if incoming message is for a switch
    switch (message.getCommand()) {                                 // message.getCommand will give us the command type of the incomming message
      case C_SET:                                                   //message is a set command  from controller to update relay state
        state = message.getBool();                                  // get the new state
        digitalWrite(RELAY_PIN, state ? RELAY_ON : RELAY_OFF);      // switch relay to new state
        uplinkAvailable = true;                                     //  uplink established
        /*---- Write some debug info----*/
        Serial.print("Incoming change for sensor:");
        Serial.print(message.sensor);
        Serial.print(", New status: ");
        Serial.println(message.getBool());
        break;
      case C_REQ:                                               // message is a returning request from controller
        requestState = message.getBool();                       // update requestState with returning state
        break;
    }
  }
}

void uplinkCheck() {
    requestTime();
    wait (returnWait);                       // wait for time return.. this may need to be varied for your system
   if (oldTime != newTime){
     Serial.println("uplink re-established");
     request( CHILD_ID, V_STATUS);
     wait (returnWait);                        //wait needed to allow request to return from controller
    if (requestState != state) {              // check that controller is corectly showing the current relay state
      send(msg.set(state), false);            // notify controller of current state no ack
      uplinkAvailable = true;                 //  uplink established
      oldTime = newTime;
    }
  }
  uplinkCheckTime = millis();                // reset the checktime
  Serial.println("uplinkchecktime reset");
}


void receiveTime(unsigned long time)
{
  if (firstStart){
    oldTime = time;
    newTime = time;
  }
  else{
  newTime = time;
}
  Serial.print("time received---- " );
  Serial.println(time);
}

gerardvs
Posts: 125
Joined: Sunday 04 January 2015 1:01
Target OS: Raspberry Pi
Domoticz version: latest-1
Location: /dev/null
Contact:

Re: Node 1 Relay mode to 2x Relay + DS18b20

Post by gerardvs » Saturday 10 February 2018 23:36

Although I could easily create the code you asked for I think it is better for you to try it yourself. On the mysensors website all the examples are there so with a little copy/paste you have want you want.
I suggest you first add a second relay by selecting a pin to use, present a new child_id and in the receive callback routine, check the received child_id and switch on or off the requested relay.
If that works well, then add the temp sensor. Also all examples are there.

Good luck,
--Gerard

piokuc
Posts: 289
Joined: Sunday 07 February 2016 14:31
Target OS: Raspberry Pi
Domoticz version: 3.6328
Contact:

Re: Node 1 Relay mode to 2x Relay + DS18b20

Post by piokuc » Monday 12 February 2018 23:19

Hi
If i know how i dont ask for help.

SweetPants
Posts: 2297
Joined: Friday 12 July 2013 21:24
Target OS: Linux
Domoticz version: V4.10085
Location: The Netherlands
Contact:

Re: Node 1 Relay mode to 2x Relay + DS18b20

Post by SweetPants » Monday 12 February 2018 23:45

I agree with gerardvs, I already send you some MySensor code, (never heard if it worked or not). Also this is a MySensors only question, better ask support on their forum.
Ubuntu 16.04.5 LTS, Intel NUC, MySensors 2.3.0-alpha, Pro Mini 3.3/8M RFM69(HW), ESP8266 (SDK2.2.0), Sonoff, RFLink, RFXcom, MQTT, NodeRed, Domoticz Beta (from source)

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest