Why can't I assign a static NODE_ID in one sketch; but not the other?



  • Hi,

    I'm trying to assign a static NODE_ID to the standard Motion Sensor Example sketch, but I am getting compile errors. The code I am using is

    /**
     * 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-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/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.
     *
     *******************************
     *
     * REVISION HISTORY
     * Version 1.0 - Henrik Ekblad
     * 
     * DESCRIPTION
     * Motion Sensor example using HC-SR501 
     * http://www.mysensors.org/build/motion
     *
     */
    
    
    #include <MySensor.h>  
    #include <SPI.h>
    
    unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds)
    #define NODE_ID 6
    #define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
    #define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
    #define CHILD_ID 1   // Id of the sensor child
    
    MySensor gw;
    // Initialize motion message
    MyMessage msg(CHILD_ID, V_TRIPPED);
    
    void setup()  
    {  
      gw.begin (msg, NODE_ID) ;
    
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Motion Sensor", "1.0");
    
      pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID, S_MOTION);
      
    }
    
    void loop()     
    {     
      // Read digital motion value
      boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; 
            
      Serial.println(tripped);
      gw.send(msg.set(tripped?"1":"0"));  // Send tripped value to gw 
     
      // Sleep until interrupt comes in on motion sensor. Send update every two minute. 
      gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
    }
    
    

    What I don't understand about all of this is, I have another sketch that I can and have manually set the NODE_ID for, and it is not that much different from what I have. The code for the working node I have with a set manual ID is:

    /**
     * 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-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/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.
     *
     *******************************
     *
     * REVISION HISTORY
     * Version 1.0 - 6-December-2015, Derrick Rockwell
     *
     * DESCRIPTION
     *This sketch uses two 30 bulb, 3mm LED holiday light strings. These
     *can usually be found in most dollar stores/hardware stores and are 
     *battery powered. This sketch uses digital pins 3 and 4 to power two 
     *a string of lights each. Ex, one can control white lights the other
     *could control multi-colour lights. 
     */
    
    #define SN "HolidayLEDDeskLights"
    #define SV "1.0"
    
    #include <MySensor.h> 
    #include <SPI.h>
    
    #define MLED_PIN 3      // Pin Multi-Coloured LED's will attached to
    #define WLED_PIN 5      // Pin White-Coloured LED's will attached to
    #define FADE_DELAY 10  // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
    #define NODE_ID 4
    #define CHILD_ID0 0
    #define CHILD_ID1 1
    
    MySensor gw;
    
    static int currentLevelM = 0;  // Current dim level...
    static int currentLevelW = 0;  // Current dim level...
    
    MyMessage dimmerMsgM(MLED_PIN, V_DIMMER);
    MyMessage lightMsgM(MLED_PIN, V_LIGHT);
    MyMessage dimmerMsgW(WLED_PIN, V_DIMMER);
    MyMessage lightMsgW(WLED_PIN, V_LIGHT);
    
    /***
     * Dimmable LED initialization method
     */
    void setup()  
    { 
      Serial.println( SN ); 
      Serial.println( SV );
      gw.begin( incomingMessage, NODE_ID );
      
      // Register the LED Dimmable Light with the gateway
      gw.present( MLED_PIN, S_DIMMER );
      gw.present( WLED_PIN, S_DIMMER );
      
      gw.sendSketchInfo(SN, SV);
      // Pull the gateway's current dim level - restore light level upon sendor node power-up
      gw.request( MLED_PIN, V_DIMMER );
      gw.request( WLED_PIN, V_DIMMER );
    }
    
    /***
     *  Dimmable LED main processing loop 
     */
    void loop() 
    {
      gw.process();
    }
    
    //For Multi Coloured Lights
    void incomingMessage(const MyMessage &message) {
    if (message.type == V_LIGHT || message.type == V_DIMMER) {
          // if (message.sensor <= 2)
          {
              //0: All Dimmers
              //1: LED 1
              //2: LED 2
              //  Retrieve the power or dim level from the incoming request message
              int requestedLevel = atoi( message.data );
              
              // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
              requestedLevel *= ( message.type == V_LIGHT ? 100 : 1 );
              
              if ((message.sensor == CHILD_ID0) || (message.sensor == 0)){
                fadeToLevel ( requestedLevel, MLED_PIN, &currentLevelM );
                // Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value...
                gw.send(lightMsgM.set(requestedLevel > 0 ? 1 : 0));
                gw.send(dimmerMsgM.set(requestedLevel) );
              }
              if ((message.sensor == CHILD_ID1) || (message.sensor == 0)){
                fadeToLevel( requestedLevel, WLED_PIN, &currentLevelW );
                // Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value...
                gw.send(lightMsgW.set(requestedLevel > 0 ? 1 : 0));
                gw.send(dimmerMsgW.set(requestedLevel) );
              }
            }
    }
    }
    
    /***
     *  This method provides a graceful fade up/down effect
     */
     // For Multi Coloured Lights
    void fadeToLevel( int toLevel, int pin, int *currentLevel ) {
      int delta = ( toLevel - (*currentLevel) ) < 0 ? -1 : 1;
      while ( (*currentLevel) != toLevel ) {
        (*currentLevel) += delta;
        analogWrite( pin, (int)((*currentLevel) / 100. * 255) );
        delay( FADE_DELAY );
      }
    }
    

    can anyone help me? I checked out the API page when starting the library, but i'm still drawing blanks.



  • what is your error?



  • Hi @dakky

    This is the error I get from Arduino IDE:

    exit status 1
    invalid conversion from 'int' to 'void (*)(const MyMessage&)' [-fpermissive]


  • Mod

    You are sending a message (msg) instead of a function (incomingMessage) to gw.begin.



  • In the first sketch change

    gw.begin (msg, NODE_ID) ;
    

    to

    gw.begin (NULL, NODE_ID) ;


  • Hi @ericvdb

    That did the trick, thanks. Just now to figure out the why.


  • Mod

    In your first sketch, the node accepts incoming messages.

    The second sketch does not have a function for incoming messages, so you have no function to give gw.begin as argument. You tried giving ge.begin a message instead, but that's not what gw.begin expects so you got a warning.

    When you don't want to use incoming messages you simply give NULL to gw.begin, as ericvdb suggested.


 

278
Online

7.5k
Users

8.4k
Topics

90.4k
Posts