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. Sleep function breaks code

Sleep function breaks code

Scheduled Pinned Locked Moved Troubleshooting
6 Posts 3 Posters 1.7k Views 2 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.
  • martinsM Offline
    martinsM Offline
    martins
    wrote on last edited by
    #1

    Re: [💬 Door](Window and Push-button Sensor)

    As soon as I use the sleep function with this door-sensor-code it breaks it. Works awhile and then gone.

    sleep(PRIMARY_BUTTON_PIN-2, CHANGE, 0);

    Serial output:
    !TSM:UPL FAIL, SNP
    TSM:FPAR
    TSP:MSG:SEND 2-2-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:
    !TSP:SEND:TNR
    !TSP:SEND:TNR
    !TSP:SEND:TNR
    !TSP:SEND:TNR
    !TSP:SEND:TNR
    !TSP:SEND:TNR

    And there it dies ! Any suggestions?

    Thanks,
    Martin

    mfalkviddM 1 Reply Last reply
    0
    • martinsM martins

      Re: [💬 Door](Window and Push-button Sensor)

      As soon as I use the sleep function with this door-sensor-code it breaks it. Works awhile and then gone.

      sleep(PRIMARY_BUTTON_PIN-2, CHANGE, 0);

      Serial output:
      !TSM:UPL FAIL, SNP
      TSM:FPAR
      TSP:MSG:SEND 2-2-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:
      !TSP:SEND:TNR
      !TSP:SEND:TNR
      !TSP:SEND:TNR
      !TSP:SEND:TNR
      !TSP:SEND:TNR
      !TSP:SEND:TNR

      And there it dies ! Any suggestions?

      Thanks,
      Martin

      mfalkviddM Offline
      mfalkviddM Offline
      mfalkvidd
      Mod
      wrote on last edited by mfalkvidd
      #2

      @martins which Arduino are you using? Which pin are you using? Which sketch are you using? (I am unable to find a sketch that references PRIMARY_BUTTON_PIN, searched through the code for the library and the MySensorsArduinoExamples reporistory). How are you powering the sensor?

      There have been some threads about problems with CHANGE:
      https://forum.mysensors.org/topic/5552/pin-change-interrupt-not-firing-with-mysensors/
      https://forum.mysensors.org/topic/5807/interrupt-and-sleep/

      martinsM 1 Reply Last reply
      0
      • martinsM Offline
        martinsM Offline
        martins
        wrote on last edited by
        #3

        Thanks. I'm trying these 2 but both givers the same results:

        /**

        • 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.

        • DESCRIPTION
        • Simple binary switch example
        • Connect button or door/window reed switch between
        • digitial I/O pin 3 (BUTTON_PIN below) and GND.
        • http://www.mysensors.org/build/binary
          */

        // Enable debug prints to serial monitor
        #define MY_DEBUG

        // Enable and select radio type attached
        // #define MY_RADIO_NRF24
        #define MY_RADIO_RFM69
        #define MY_RFM69_FREQUENCY RF69_433MHZ
        #define MY_IS_RFM69HW

        #if F_CPU == 8000000L
        #define MY_BAUD_RATE 38400
        #endif

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

        #define CHILD_ID 3
        #define BUTTON_PIN 3 // Arduino Digital I/O pin for button/reed switch

        Bounce debouncer = Bounce();
        int oldValue=-1;
        int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point

        unsigned long SLEEP_TIME = 60000; // sleep time between reads (seconds * 1000 milliseconds)
        int oldBatteryPcnt = 0;

        // Change to V_LIGHT if you use S_LIGHT in presentation below
        MyMessage msg(CHILD_ID,V_TRIPPED);

        void setup()
        {
        // use the 1.1 V internal reference
        #if defined(AVR_ATmega2560)
        analogReference(INTERNAL1V1);
        #else
        analogReference(INTERNAL);
        #endif

        // Setup the button
        pinMode(BUTTON_PIN,INPUT);
        // Activate internal pull-up
        digitalWrite(BUTTON_PIN,HIGH);

        // After setting up the button, setup debouncer
        debouncer.attach(BUTTON_PIN);
        debouncer.interval(5);

        }

        void presentation() {
        // Register binary input sensor to gw (they will be created as child devices)
        // You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage.
        // If S_LIGHT is used, remember to update variable type you send in. See "msg" above.
        present(CHILD_ID, S_DOOR);
        // Send the sketch version information to the gateway and Controller
        sendSketchInfo("Door Sensor", "1.0");
        }

        // Check if digital input has changed and send in new value
        void loop()
        {
        debouncer.update();
        // Get the update value
        int value = debouncer.read();

        if (value != oldValue) {
        // Send in the new value
        send(msg.set(value==HIGH ? 1 : 0));
        oldValue = value;

             // get the battery Voltage
        int sensorValue = analogRead(BATTERY_SENSE_PIN);
        

        #ifdef MY_DEBUG
        Serial.println(sensorValue);
        #endif

        // 1M, 470K divider across battery and using internal ADC ref of 1.1V
        // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
        // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
        // 3.44/1023 = Volts per bit = 0.003363075
        
        int batteryPcnt = sensorValue / 10;
        

        #ifdef MY_DEBUG
        float batteryV = sensorValue * 0.003363075;
        Serial.print("Battery Voltage: ");
        Serial.print(batteryV);
        Serial.println(" V");

        Serial.print("Battery percent: ");
        Serial.print(batteryPcnt);
        Serial.println(" %");
        

        #endif

        if (oldBatteryPcnt != batteryPcnt) {
        // Power up radio after sleep
        sendBatteryLevel(batteryPcnt);
        oldBatteryPcnt = batteryPcnt;
        }
        // sleep(SLEEP_TIME);
        sleep(BUTTON_PIN-2, CHANGE, SLEEP_TIME);
        }
        }

        /**

        • 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.

        • DESCRIPTION
        • Interrupt driven binary switch example with dual interrupts
        • Author: Patrick 'Anticimex' Fallberg
        • Connect one button or door/window reed switch between
        • digitial I/O pin 3 (BUTTON_PIN below) and GND and the other
        • one in similar fashion on digital I/O pin 2.
        • This example is designed to fit Arduino Nano/Pro Mini

        */

        // Enable debug prints to serial monitor
        #define MY_DEBUG

        // Enable and select radio type attached
        //#define MY_RADIO_NRF24
        #define MY_RADIO_RFM69
        #define MY_RFM69_FREQUENCY RF69_433MHZ
        #define MY_IS_RFM69HW

        #if F_CPU == 8000000L
        #define MY_BAUD_RATE 38400
        #endif

        #include <SPI.h>
        #include <MySensors.h>

        #define BATTERY_SENSE_PIN A0

        #define SKETCH_NAME "Binary Sensor"
        #define SKETCH_MAJOR_VER "1"
        #define SKETCH_MINOR_VER "0"

        #define PRIMARY_CHILD_ID 3
        //#define SECONDARY_CHILD_ID 4

        unsigned long SLEEP_TIME = 60000; // sleep time between reads (seconds * 1000 milliseconds)

        #define PRIMARY_BUTTON_PIN 3 // Arduino Digital I/O pin for button/reed switch
        //#define SECONDARY_BUTTON_PIN 3 // Arduino Digital I/O pin for button/reed switch

        #if (PRIMARY_BUTTON_PIN < 2 || PRIMARY_BUTTON_PIN > 3)
        #error PRIMARY_BUTTON_PIN must be either 2 or 3 for interrupts to work
        #endif
        //#if (SECONDARY_BUTTON_PIN < 2 || SECONDARY_BUTTON_PIN > 3)
        //#error SECONDARY_BUTTON_PIN must be either 2 or 3 for interrupts to work
        //#endif
        //#if (PRIMARY_BUTTON_PIN == SECONDARY_BUTTON_PIN)
        //#error PRIMARY_BUTTON_PIN and BUTTON_PIN2 cannot be the same
        //#endif
        //#if (PRIMARY_CHILD_ID == SECONDARY_CHILD_ID)
        //#error PRIMARY_CHILD_ID and SECONDARY_CHILD_ID cannot be the same
        //#endif

        // Change to V_LIGHT if you use S_LIGHT in presentation below
        MyMessage msg(PRIMARY_CHILD_ID, V_TRIPPED);
        //MyMessage msg2(SECONDARY_CHILD_ID, V_TRIPPED);

        void setup()
        {
        // Setup the buttons
        pinMode(PRIMARY_BUTTON_PIN, INPUT);
        // pinMode(SECONDARY_BUTTON_PIN, INPUT);

        // Activate internal pull-ups
        digitalWrite(PRIMARY_BUTTON_PIN, HIGH);
        // digitalWrite(SECONDARY_BUTTON_PIN, HIGH);

        }

        void presentation() {
        // Send the sketch version information to the gateway and Controller
        sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER "." SKETCH_MINOR_VER);

        // Register binary input sensor to sensor_node (they will be created as child devices)
        // You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage.
        // If S_LIGHT is used, remember to update variable type you send in. See "msg" above.
        present(PRIMARY_CHILD_ID, S_DOOR);
        // present(SECONDARY_CHILD_ID, S_DOOR);
        }

        // Loop will iterate on changes on the BUTTON_PINs
        void loop()
        {
        uint8_t value;
        static uint8_t sentValue=2;
        //static uint8_t sentValue2=2;
        //attachInterrupt(0, wakeUp, LOW);
        // Short delay to allow buttons to properly settle
        //sleep(5);

        value = digitalRead(PRIMARY_BUTTON_PIN);

        if (value != sentValue) {
        // Value has changed from last transmission, send the updated value
        send(msg.set(value==HIGH ? 1 : 0));
        sentValue = value;
        }

        // value = digitalRead(SECONDARY_BUTTON_PIN);

        // if (value != sentValue2) {
        // // Value has changed from last transmission, send the updated value
        // send(msg2.set(value==HIGH ? 1 : 0));
        // sentValue2 = value;
        // }

        // Sleep until something happens with the sensor
        sleep(PRIMARY_BUTTON_PIN-2, CHANGE, SLEEP_TIME);
        delay(2000);
        value = digitalRead(PRIMARY_BUTTON_PIN);
        }

        Regards,
        Martin

        1 Reply Last reply
        0
        • mfalkviddM mfalkvidd

          @martins which Arduino are you using? Which pin are you using? Which sketch are you using? (I am unable to find a sketch that references PRIMARY_BUTTON_PIN, searched through the code for the library and the MySensorsArduinoExamples reporistory). How are you powering the sensor?

          There have been some threads about problems with CHANGE:
          https://forum.mysensors.org/topic/5552/pin-change-interrupt-not-firing-with-mysensors/
          https://forum.mysensors.org/topic/5807/interrupt-and-sleep/

          martinsM Offline
          martinsM Offline
          martins
          wrote on last edited by
          #4

          @mfalkvidd

          It's almost as if the RFM69 radio is not transmitting anymore:
          !TSP:SEND:TNR
          !TSP:SEND:TNR
          !TSP:SEND:TNR
          !TSP:SEND:TNR
          !TSP:SEND:TNR
          !TSP:SEND:TNR

          What does TNR mean ? Transmitter Not Ready ? I looked through the serial API but can't find any reference. Neither in the sensor API nor library API. Any suggestions ?

          Thanks,
          Martin

          1 Reply Last reply
          0
          • D Offline
            D Offline
            DavidZH
            wrote on last edited by
            #5

            first of all you should change the delay(2000) right after the sleep to wait(2000). Effect is exactly the same, but this will not stop your Arduino from doing anything. For the rest I'm not sure why the communication between your Arduino and radio stops. TNR is indeed "Transport not ready"...

            1 Reply Last reply
            0
            • martinsM Offline
              martinsM Offline
              martins
              wrote on last edited by
              #6

              OK it's working. Main fix I think is I used the new 2.1.1 library and all comms to the RFM69 radio seems to be fixed.

              Current code:

              • DESCRIPTION
              • Simple binary switch example
              • Connect button or door/window reed switch between
              • digitial I/O pin 3 (BUTTON_PIN below) and GND.
              • http://www.mysensors.org/build/binary
                */

              // Enable debug prints to serial monitor
              #define MY_DEBUG

              // Enable and select radio type attached
              // #define MY_RADIO_NRF24
              #define MY_RADIO_RFM69
              #define MY_RFM69_FREQUENCY RF69_433MHZ
              #define MY_IS_RFM69HW

              #if F_CPU == 8000000L
              #define MY_BAUD_RATE 38400
              #endif

              #include <SPI.h>
              #include <MySensors.h>

              #define CHILD_ID 3
              #define BUTTON_PIN 3 // Arduino Digital I/O pin for button/reed switch

              int oldValue=-1;

              // Change to V_LIGHT if you use S_LIGHT in presentation below
              MyMessage msg(CHILD_ID,V_TRIPPED);

              void setup()
              {
              // Setup the button
              pinMode(BUTTON_PIN,INPUT);
              // Activate internal pull-up
              digitalWrite(BUTTON_PIN,HIGH);
              }

              void presentation() {
              // Register binary input sensor to gw (they will be created as child devices)
              sendSketchInfo("Binary Sensor", "1.0");
              // You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage.
              // If S_LIGHT is used, remember to update variable type you send in. See "msg" above.
              present(CHILD_ID, S_DOOR);
              // Send the sketch version information to the gateway and Controller
              }

              // Check if digital input has changed and send in new value
              void loop()
              {
              int value = digitalRead(BUTTON_PIN);
              #ifdef MY_DEBUG
              Serial.println("Sensor Value");
              Serial.println(value);
              #endif
              send(msg.set(value==HIGH ? 1 : 0));
              sleep(BUTTON_PIN-2, CHANGE, 0);
              }

              Thanks,
              Martin

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


              22

              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