Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Troubleshooting
  3. Node do not wake up

Node do not wake up

Scheduled Pinned Locked Moved Troubleshooting
5 Posts 4 Posters 1.7k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • fifipil909F Offline
    fifipil909F Offline
    fifipil909
    wrote on last edited by fifipil909
    #1

    Hi guys.
    First of all, happy new year to all the team from France. all the best for this year guys.
    And congratulation for the new web page. We will find good hardware platform here for sure.

    Quick question, I have multiple battery powered node with the same sensor (temp, hum, motion, light) and exactly the same sketch.

    Everything seems to work well except that sometimes, for some reason, one of the node (always the same one) seems to not wake up when the Sleep function should be finish (I would say it append twice a week).
    The only things that makes it wake up it's when the motion sensor trigger the interrupt. (but need to be hard-reset to prevent this things append again)

    It's very sporadic, and can't find the reason.
    I already switch radio module, but same things.

    Any clue ?
    I copy the sketch below but nothing exotic in there.
    Thanks in advance.

    /**
     * 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.
     *
     */
    
    //#################
    // INCLUDE
    //#################
    #include <SPI.h>
    #include <MySensor.h>
    #include <DHT.h>
    
    //#################
    // OPTION
    //#################
    
    unsigned long SLEEP_TIME = 60000; // Sleep time between reads (in milliseconds)
    //#define DEBUG
    
    
    //#################
    // CHILD ID
    //#################
    #define CHILD_ID_HUM 0
    #define CHILD_ID_TEMP 1
    #define CHILD_ID_MOTION 2
    #define CHILD_ID_LIGHT 3
    #define CHILD_ID_BATTLVL 4
    
    
    //#################
    // PIN DEF
    //#################
    #define LIGHT_SENSOR_ANALOG_PIN A3
    #define MOTION_SENSOR_DIGITAL_PIN 2
    #define INTERRUPT MOTION_SENSOR_DIGITAL_PIN
    #define HUMIDITY_SENSOR_DIGITAL_PIN 4
    
    
    //#################
    // VAR
    //#################
    MySensor gw;
    DHT dht;
    float lastTemp;
    float lastHum;
    float lastbattvoltage;
    boolean metric = true;
    int lastLightLevel;
    char lasttripped;
    int lastBatteryPcnt;
    int updateAll = 60;
    int updateCount = 0;
    uint8_t backup;
    
    //#################
    // Messsage Settings
    //#################
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    MyMessage msg(CHILD_ID_MOTION, V_TRIPPED);
    MyMessage msglight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
    MyMessage msgvoltage(CHILD_ID_BATTLVL, V_VOLTAGE);
    
    
    void setup()
    {
      backup = ADCSRA ;
      gw.begin(NULL, AUTO, false);
      dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
    
      pinMode(MOTION_SENSOR_DIGITAL_PIN, INPUT);
      attachInterrupt(digitalPinToInterrupt(MOTION_SENSOR_DIGITAL_PIN), loop, CHANGE);
    
    //#################
    // Info
    //#################
      gw.sendSketchInfo("Sensor Pack", "1.5");
    
      
    //#################
    // Send Presentation
    //#################
      gw.present(CHILD_ID_HUM, S_HUM);
      gw.present(CHILD_ID_TEMP, S_TEMP);
      gw.present(CHILD_ID_MOTION, S_MOTION);
      gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
      gw.present(CHILD_ID_BATTLVL, S_POWER);
    
    }
    
    void loop()
    {
    
      updateCount += 1;
          if (updateCount == updateAll) {
            lastTemp = -1;
            lastHum = -1;
            lastLightLevel = -1;
            lastBatteryPcnt = -1;
            lasttripped = -1;
            lastbattvoltage = -1;
            updateCount = 0;
          }
      
      ADCSRA = backup ;
    
      // Motion Sensor
      boolean tripped = digitalRead(MOTION_SENSOR_DIGITAL_PIN) == HIGH;
          #if defined(DEBUG)
          Serial.print("Motion : ");
          Serial.println(tripped);
        #endif
      if (tripped != lasttripped)
      {
        gw.send(msg.set(tripped ? "1" : "0")); // Send tripped value to gw
        lasttripped = tripped;
      }
    
      // DHT sensor for Humidity and temperature
      delay(dht.getMinimumSamplingPeriod());
      float temperature = dht.getTemperature();
      if (isnan(temperature)) {
        
        #if defined(DEBUG)
          Serial.println("Failed reading temperature from DHT");
          Serial.println(dht.getTemperature());
        #endif
        
      } else if (temperature != lastTemp) {
        lastTemp = temperature;
        gw.send(msgTemp.set(temperature, 1));
        
        #if defined(DEBUG)
          Serial.print("Temperature : ");
          Serial.println(temperature);
        #endif
      }
    
      float humidity = dht.getHumidity();
      if (isnan(humidity)) {
        #if defined(DEBUG)
          Serial.println("Failed reading humidity from DHT");
          Serial.println(dht.getHumidity());
        #endif
      } else if (humidity != lastHum) {
        lastHum = humidity;
        gw.send(msgHum.set(humidity, 1));
        #if defined(DEBUG)
          Serial.print("Humidity: ");
          Serial.println(humidity);
        #endif
      }
    
     // Light Sensor
      int anaread = analogRead(LIGHT_SENSOR_ANALOG_PIN);
      int lightLevel = (1023 - anaread) / 10.23;
      #if defined(DEBUG)
          Serial.print("Light : ");
          Serial.println(lightLevel);
          Serial.print("Analog Value : ");
          Serial.println(anaread);
        #endif
      if (lightLevel != lastLightLevel) {  
        gw.send(msglight.set(lightLevel));
        lastLightLevel = lightLevel;
      }
    
    
    
    
      // Batt
    
     float sensorValue = readVcc() - 2600;
     sensorValue = sensorValue / 6.0;  //(Tension 3.2V à 2.6V min. Soit 0.6V d'amplitude. 0.6 / 100 = 6mV par %)
     long batteryPcnt = sensorValue;
        #if defined(DEBUG)
          Serial.print("Battery percent: ");
          Serial.print(batteryPcnt);
          Serial.println(" %");
        #endif
      if (lastBatteryPcnt != batteryPcnt) {
        gw.sendBatteryLevel(batteryPcnt);
        lastBatteryPcnt = batteryPcnt;
      }
    
    
      float Battvoltage = readVcc() / 1000.0;
          #if defined(DEBUG)
            Serial.print("Battery volt: ");
            Serial.print(Battvoltage);
            Serial.println(" Volt");
          #endif
        if(Battvoltage!=lastbattvoltage)
        {
          gw.send(msgvoltage.set(Battvoltage,2));
          lastbattvoltage = Battvoltage;
        }
        
     gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
    
    }
    
    
    martinhjelmareM 1 Reply Last reply
    0
    • mfalkviddM Online
      mfalkviddM Online
      mfalkvidd
      Mod
      wrote on last edited by mfalkvidd
      #2

      I don't think you can use the loop as interrupt service routine. An interrupt service routine is supposed to be very short/quick, not use any timers and not go to sleep. The loop fails all three of those.

      Create a new function, see https://www.arduino.cc/en/Reference/AttachInterrupt for an example.

      1 Reply Last reply
      0
      • fifipil909F fifipil909

        Hi guys.
        First of all, happy new year to all the team from France. all the best for this year guys.
        And congratulation for the new web page. We will find good hardware platform here for sure.

        Quick question, I have multiple battery powered node with the same sensor (temp, hum, motion, light) and exactly the same sketch.

        Everything seems to work well except that sometimes, for some reason, one of the node (always the same one) seems to not wake up when the Sleep function should be finish (I would say it append twice a week).
        The only things that makes it wake up it's when the motion sensor trigger the interrupt. (but need to be hard-reset to prevent this things append again)

        It's very sporadic, and can't find the reason.
        I already switch radio module, but same things.

        Any clue ?
        I copy the sketch below but nothing exotic in there.
        Thanks in advance.

        /**
         * 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.
         *
         */
        
        //#################
        // INCLUDE
        //#################
        #include <SPI.h>
        #include <MySensor.h>
        #include <DHT.h>
        
        //#################
        // OPTION
        //#################
        
        unsigned long SLEEP_TIME = 60000; // Sleep time between reads (in milliseconds)
        //#define DEBUG
        
        
        //#################
        // CHILD ID
        //#################
        #define CHILD_ID_HUM 0
        #define CHILD_ID_TEMP 1
        #define CHILD_ID_MOTION 2
        #define CHILD_ID_LIGHT 3
        #define CHILD_ID_BATTLVL 4
        
        
        //#################
        // PIN DEF
        //#################
        #define LIGHT_SENSOR_ANALOG_PIN A3
        #define MOTION_SENSOR_DIGITAL_PIN 2
        #define INTERRUPT MOTION_SENSOR_DIGITAL_PIN
        #define HUMIDITY_SENSOR_DIGITAL_PIN 4
        
        
        //#################
        // VAR
        //#################
        MySensor gw;
        DHT dht;
        float lastTemp;
        float lastHum;
        float lastbattvoltage;
        boolean metric = true;
        int lastLightLevel;
        char lasttripped;
        int lastBatteryPcnt;
        int updateAll = 60;
        int updateCount = 0;
        uint8_t backup;
        
        //#################
        // Messsage Settings
        //#################
        MyMessage msgHum(CHILD_ID_HUM, V_HUM);
        MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
        MyMessage msg(CHILD_ID_MOTION, V_TRIPPED);
        MyMessage msglight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
        MyMessage msgvoltage(CHILD_ID_BATTLVL, V_VOLTAGE);
        
        
        void setup()
        {
          backup = ADCSRA ;
          gw.begin(NULL, AUTO, false);
          dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
        
          pinMode(MOTION_SENSOR_DIGITAL_PIN, INPUT);
          attachInterrupt(digitalPinToInterrupt(MOTION_SENSOR_DIGITAL_PIN), loop, CHANGE);
        
        //#################
        // Info
        //#################
          gw.sendSketchInfo("Sensor Pack", "1.5");
        
          
        //#################
        // Send Presentation
        //#################
          gw.present(CHILD_ID_HUM, S_HUM);
          gw.present(CHILD_ID_TEMP, S_TEMP);
          gw.present(CHILD_ID_MOTION, S_MOTION);
          gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
          gw.present(CHILD_ID_BATTLVL, S_POWER);
        
        }
        
        void loop()
        {
        
          updateCount += 1;
              if (updateCount == updateAll) {
                lastTemp = -1;
                lastHum = -1;
                lastLightLevel = -1;
                lastBatteryPcnt = -1;
                lasttripped = -1;
                lastbattvoltage = -1;
                updateCount = 0;
              }
          
          ADCSRA = backup ;
        
          // Motion Sensor
          boolean tripped = digitalRead(MOTION_SENSOR_DIGITAL_PIN) == HIGH;
              #if defined(DEBUG)
              Serial.print("Motion : ");
              Serial.println(tripped);
            #endif
          if (tripped != lasttripped)
          {
            gw.send(msg.set(tripped ? "1" : "0")); // Send tripped value to gw
            lasttripped = tripped;
          }
        
          // DHT sensor for Humidity and temperature
          delay(dht.getMinimumSamplingPeriod());
          float temperature = dht.getTemperature();
          if (isnan(temperature)) {
            
            #if defined(DEBUG)
              Serial.println("Failed reading temperature from DHT");
              Serial.println(dht.getTemperature());
            #endif
            
          } else if (temperature != lastTemp) {
            lastTemp = temperature;
            gw.send(msgTemp.set(temperature, 1));
            
            #if defined(DEBUG)
              Serial.print("Temperature : ");
              Serial.println(temperature);
            #endif
          }
        
          float humidity = dht.getHumidity();
          if (isnan(humidity)) {
            #if defined(DEBUG)
              Serial.println("Failed reading humidity from DHT");
              Serial.println(dht.getHumidity());
            #endif
          } else if (humidity != lastHum) {
            lastHum = humidity;
            gw.send(msgHum.set(humidity, 1));
            #if defined(DEBUG)
              Serial.print("Humidity: ");
              Serial.println(humidity);
            #endif
          }
        
         // Light Sensor
          int anaread = analogRead(LIGHT_SENSOR_ANALOG_PIN);
          int lightLevel = (1023 - anaread) / 10.23;
          #if defined(DEBUG)
              Serial.print("Light : ");
              Serial.println(lightLevel);
              Serial.print("Analog Value : ");
              Serial.println(anaread);
            #endif
          if (lightLevel != lastLightLevel) {  
            gw.send(msglight.set(lightLevel));
            lastLightLevel = lightLevel;
          }
        
        
        
        
          // Batt
        
         float sensorValue = readVcc() - 2600;
         sensorValue = sensorValue / 6.0;  //(Tension 3.2V à 2.6V min. Soit 0.6V d'amplitude. 0.6 / 100 = 6mV par %)
         long batteryPcnt = sensorValue;
            #if defined(DEBUG)
              Serial.print("Battery percent: ");
              Serial.print(batteryPcnt);
              Serial.println(" %");
            #endif
          if (lastBatteryPcnt != batteryPcnt) {
            gw.sendBatteryLevel(batteryPcnt);
            lastBatteryPcnt = batteryPcnt;
          }
        
        
          float Battvoltage = readVcc() / 1000.0;
              #if defined(DEBUG)
                Serial.print("Battery volt: ");
                Serial.print(Battvoltage);
                Serial.println(" Volt");
              #endif
            if(Battvoltage!=lastbattvoltage)
            {
              gw.send(msgvoltage.set(Battvoltage,2));
              lastbattvoltage = Battvoltage;
            }
            
         gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
        
        }
        
        
        martinhjelmareM Offline
        martinhjelmareM Offline
        martinhjelmare
        Plugin Developer
        wrote on last edited by
        #3

        @fifipil909

        Hi!

        If you just want to wake from sleep, ie not run a special ISR, just remove the attachInterrupt call. The sleep function will exit and continue the loop by interrupt if you define the interrupt argument correctly.

        Right now that's not done. You use the same number for the interrupt as your motion pin number. Either use the pin-to-interrupt function or subtract 2 from the pin number to get correct interrupt number.

        1 Reply Last reply
        0
        • fifipil909F Offline
          fifipil909F Offline
          fifipil909
          wrote on last edited by
          #4

          Hi Thanks for your reply.
          I need to use the interrupt for the motion sensor.
          Actually this part is working quite well. the only issue it's sometimes, it doesn't exit from the Sleep mode even when the 60 seconds time expired.

          I just see that I normally don't need this line :

          attachInterrupt(digitalPinToInterrupt(MOTION_SENSOR_DIGITAL_PIN), loop, CHANGE);
          

          I will try without it.

          1 Reply Last reply
          0
          • carlierdC Offline
            carlierdC Offline
            carlierd
            wrote on last edited by
            #5

            Hello,

            In MySensors example there is no attachInterrupt so sure it's not useful.
            Your problem occurred also when battery are full ?

            May I asked you some question on your design ? On this post or by private message (could be in French ;)) ?

            David.

            1 Reply Last reply
            0
            Reply
            • Reply as topic
            Log in to reply
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes


            27

            Online

            11.7k

            Users

            11.2k

            Topics

            113.1k

            Posts


            Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
            • Login

            • Don't have an account? Register

            • Login or register to search.
            • First post
              Last post
            0
            • MySensors
            • OpenHardware.io
            • Categories
            • Recent
            • Tags
            • Popular