distance + relay node



  • Hello, I'm trying to aggregate 2 sketches : distance and relay actuator node ...

    But I think I'm going the wrong way because it doesn't work ...

    Here is my code :

    // Sketch pour commander un relai en mode impultionnel. 
    
    #include <MySensor.h>
    #include <SPI.h>
    #include <NewPing.h>
    // relais
    #define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
    #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
    int node_id = 9;
    
    // distance
    #define CHILD_ID 1
    #define TRIGGER_PIN  6  // Arduino pin tied to trigger pin on the ultrasonic sensor.
    #define ECHO_PIN     5  // Arduino pin tied to echo pin on the ultrasonic sensor.
    #define MAX_DISTANCE 300 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
    unsigned long SLEEP_TIME = 5000; // Sleep time between reads (in milliseconds)
    
    MySensor gw;
    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
    MyMessage msg(CHILD_ID, V_DISTANCE);
    int lastDist;
    boolean metric = true; 
    
    void setup()  
    {   
      // Initialize library and add callback for incoming messages
      //gw.begin(incomingMessage, AUTO, true);
      gw.begin(NULL, node_id);
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("RelaisPulDist", "1.1");
    
      // Fetch relay status
        // Register all sensors to gw (they will be created as child devices)
        gw.present(RELAY_1, S_LIGHT);
    
        gw.present(CHILD_ID, S_DISTANCE);
        boolean metric = gw.getConfig().isMetric;
        
        // Then set relay pins in output mode
        pinMode(RELAY_1, OUTPUT);   
        // Set relay to last known state (using eeprom storage) 
        digitalWrite(RELAY_1, RELAY_OFF);
    
    }
    
    void loop() 
    {
      // Alway process incoming messages whenever possible
      gw.process();
    
       int dist = metric?sonar.ping_cm():sonar.ping_in();
      Serial.print("Ping: ");
      Serial.print(dist); // Convert ping time to distance in cm and print result (0 = outside set distance range)
      Serial.println(metric?" cm":" in");
    
      if (dist != lastDist) {
          send(msg.set(dist));
          lastDist = dist;
      }
    }
    
    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(RELAY_1, RELAY_ON);
        delay(500);  
        digitalWrite(RELAY_1, RELAY_OFF);
       } 
    
      }
    
       
    }
    
    
    

    Can you see what's going wrong ?
    thanls !


  • Mod

    Could you share any details on "it doesn't work"?



  • @mfalkvidd said:

    Could you share any details on "it doesn't work"?

    The distance stays at 0 cm on my controller, and the relay actuator isn't triggered when I click it on my controller (I use my sensors with Jeedom)


  • Hardware Contributor

    @carmelo24 this is my motion and distance sketch:
    https://github.com/sundberg84/MySensors-2.0/blob/master/Padd13/MotionDistNoSleepAs.ino

    Note its for 2.0 and not using sleep()

    0 distance is (for me) an error value or fail to read the distance, i have used

    if (dist == 0){
        return;
      }
    

    To force the distance senor to do a new calculation and it works for me.
    It could be a issue with your sensor, power or hardware if you get it all the time.

    Look at your serial output and see for the node.



  • So this is my sketch right now. The relay works ok, but I have only 0cm or 1cm with for the distance (and I can hear a sound coming from the distance sensor ...) :

    // Sketch pour commander un relai en mode impultionnel. 
    
    #include <MySensor.h>
    #include <SPI.h>
    #include <NewPing.h>
    
    #define node_id 66
    #define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
    #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
    #define CHILD_ID 1
    #define TRIGGER_PIN  6  // Arduino pin tied to trigger pin on the ultrasonic sensor.
    #define ECHO_PIN     5  // Arduino pin tied to echo pin on the ultrasonic sensor.
    #define MAX_DISTANCE 300 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
    unsigned long SLEEP_TIME = 5000; // Sleep time between reads (in milliseconds)
    MySensor gw;
    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
    MyMessage msg(CHILD_ID, V_DISTANCE);
    //int lastDist;
    boolean metric = true; 
    
    
    void setup()  
    {   
      // Initialize library and add callback for incoming messages
      gw.begin(incomingMessage, node_id, true);
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("RelayDistance", "1.1");
    
      // Fetch relay status
        // Register all sensors to gw (they will be created as child devices)
        gw.present(RELAY_1, S_LIGHT);
        gw.present(CHILD_ID, S_DISTANCE);
        boolean metric = gw.getConfig().isMetric;
        // Then set relay pins in output mode
        pinMode(RELAY_1, OUTPUT);   
        // Set relay to last known state (using eeprom storage) 
        digitalWrite(RELAY_1, RELAY_OFF);
    
    }
    
    void loop() 
    {
      // Alway process incoming messages whenever possible
      gw.process();
    
        int dist = metric?sonar.ping_cm():sonar.ping_in();
      Serial.print("Ping: ");
      Serial.print(dist); // Convert ping time to distance in cm and print result (0 = outside set distance range)
      Serial.println(metric?" cm":" in");
    
     // if (dist != lastDist) {
       //   gw.send(msg.set(dist));
        //  lastDist = dist;
    //  }
      
    }
    
    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(RELAY_1, RELAY_ON);
        delay(100);  
        digitalWrite(RELAY_1, RELAY_OFF);
         delay(100); 
        digitalWrite(RELAY_1, RELAY_ON);
        delay(100);  
        digitalWrite(RELAY_1, RELAY_OFF);
         delay(100); 
        digitalWrite(RELAY_1, RELAY_ON);
        delay(100);  
        digitalWrite(RELAY_1, RELAY_OFF);
         delay(100); 
        digitalWrite(RELAY_1, RELAY_ON);
        delay(100);  
        digitalWrite(RELAY_1, RELAY_OFF);
        
       } 
    }
    
    


  • @carmelo24 it's ok now :)

    here is my sketch :

    // Sketch pour commander un relai en mode impultionnel. 
    
    #include <MySensor.h>
    #include <SPI.h>
    #include <NewPing.h>
    
    #define node_id 66
    #define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
    #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
    #define CHILD_ID 1
    #define TRIGGER_PIN  6  // Arduino pin tied to trigger pin on the ultrasonic sensor.
    #define ECHO_PIN     5  // Arduino pin tied to echo pin on the ultrasonic sensor.
    #define MAX_DISTANCE 300 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
    unsigned long SLEEP_TIME = 500; // Sleep time between reads (in milliseconds)
    MySensor gw;
    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
    MyMessage msg(CHILD_ID, V_DISTANCE);
    boolean metric = true; 
    long temps;
    
    void setup()  
    {   
      // Initialize library and add callback for incoming messages
      gw.begin(incomingMessage, node_id, true);
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("RelayDistance", "1.1");
    
      // Fetch relay status
        // Register all sensors to gw (they will be created as child devices)
        gw.present(RELAY_1, S_LIGHT);
        gw.present(CHILD_ID, S_DISTANCE);
        boolean metric = gw.getConfig().isMetric;
        // Then set relay pins in output mode
        pinMode(RELAY_1, OUTPUT);   
        // Set relay to last known state (using eeprom storage) 
        digitalWrite(RELAY_1, RELAY_OFF);
        temps = millis();
    
    }
    
    void loop() 
    {
      // Alway process incoming messages whenever possible
      gw.process();
    
     
    // mesure de la distance si ça fait plus de 10 secondes qu'on ne l'a pas fait
     if((millis() - temps) > 10000) {
           int dist = metric?sonar.ping_cm():sonar.ping_in();
           gw.send(msg.set(dist));
           Serial.print(dist);
           Serial.print("toto");
              
     
     temps = millis();
     
      }
    }
    
    
    void incomingMessage(const MyMessage &message) {
    // action du relais (avec impulsion, pour action comme un bouton poussoir)
      if (message.type==V_LIGHT) {
         // Change relay state
        digitalWrite(RELAY_1, RELAY_ON);
        delay(100);  
        digitalWrite(RELAY_1, RELAY_OFF);
         delay(100); 
        
        
       } 
    }
    
    

Log in to reply
 

Looks like your connection to MySensors Forum was lost, please wait while we try to reconnect.