Skip to content
  • 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. HC-SR501 3.3V randomly sends tripped when radio is on
  • Getting Started
  • Controller
  • Build
  • Hardware
  • Download/API
  • Forum
  • Store

HC-SR501 3.3V randomly sends tripped when radio is on

Scheduled Pinned Locked Moved Troubleshooting
39 Posts 8 Posters 10.7k Views 8 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.
  • B burningstone

    Hi all,

    I've read a lot of posts about battery-powered motion/temp/humidity sensors.
    I'm new to electronics and programming, but I've already had sucess in setting everything up.

    Below is my wiring.

    ![0_1490045167603_pir-dht22-battery-sketch.PNG](Uploading 100%)

    I haven't modified the arduino pro mini 3.3V version for a battery optimizied use.
    The VCC is directly connected to the h-pad (wire soldered to h-pad) of the HC-SR501.
    The Temp/Humidity sensors is a DHT22.

    The node should do the following:
    If the arduino woke up from interrupt, then send only the tripped status of the motion sensor.

    if the arduino woke up from the sleep timer (1 min for testing), then send humidity, battery and temperature, but only if the values changed more than the treshold.

    Everything works well, the node sends humidity, battery and temperature when the sleep timer ended and does this only if it changed more than my defined threshold.
    The node also detects correctly that it woke up from interrupt and sends only the motion sensor value.

    The problem is that it looks like the radio triggers the motion sensors or something like that.
    Everytime when the motion sensor detects motion, it sends 2-3 tripped messages in a row, if I understood correctly, this means the arduino wakes up from the interrupt, then sends the message and goes back to sleep and then immediately wakes up and sends the message again, right?
    Also when the arduino wakes up from the sleep timer, it sends the temp/hum/battery values and sometimes, with random behaviour also the motion tripped value.

    Where is the problem? Wiring? Coding? I tried dozens of codes and always the same behaviour :(
    Below my sketch:

    #include <SD.h>
    
    // Enable debug prints
    #define MY_DEBUG
    
    // Enable and select radio type attached 
    #define MY_RADIO_NRF24
    
    
    //define Node ID before include mysensors.h
    #define MY_NODE_ID 200
    
    #include <SPI.h>
    #include <MySensors.h>
    #include <readVcc.h>  
    #include <DHT.h>  
    
    
    #define CHILD_ID_HUM 0
    #define CHILD_ID_TEMP 1
    #define CHILD_ID_MOT 2
    
    //define PINS
    int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
    #define DHT_DATA_PIN 5
    #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 MIN_V 1900 // empty voltage (0%)
    #define MAX_V 3000 // full voltage (100%)
    
    unsigned long SLEEP_TIME = 60000UL; // Sleep time between reads (in milliseconds)
    int oldBatteryPcnt = 0;
    
    
    //Reporting Thresholds
    #define HUMI_TRANSMIT_THRESHOLD 3.0  // THRESHOLD tells how much the value should have changed since last time it was transmitted.
    #define TEMP_TRANSMIT_THRESHOLD 0.5
    #define BATTERY_TRANSMIT_THRESHOLD 2.0
    
    //Parameters
    DHT dht;
    float lastTemp = 0 ;
    float lastHum = 0 ;
    int count = 0;
    boolean lastTripped = false ;
    boolean metric = true; 
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    MyMessage msgMot(CHILD_ID_MOT, V_TRIPPED);
    
    
    
    void setup()  
    { 
     // use the 1.1 V internal reference
    #if defined(__AVR_ATmega2560__)
     analogReference(INTERNAL1V1);
    #else
     analogReference(INTERNAL);
    #endif
      dht.setup(DHT_DATA_PIN); 
    
      // Send the Sketch Version Information to the Gateway
      sendSketchInfo("Humidity/Motion", "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)
      present(CHILD_ID_HUM, S_HUM);
      present(CHILD_ID_TEMP, S_TEMP);
      present(CHILD_ID_MOT, S_MOTION);
       
      metric = getControllerConfig().isMetric;
    }
    
    void loop()      
    
    {  
      //-1 woke up from sleep timer, 1 woke up from pin interrupt
       static int8_t wakeup; 
       
      //////////////////////////////////////////////////////////////////////////
      // Battery
      /////////////////////////////////////////////////////////////////////////
       int sensorValue = analogRead(BATTERY_SENSE_PIN);
       #ifdef 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
       // 3440/1023 = Volts per bit = 3.363075
       float batteryV  = sensorValue * 3.363075;
       //int batteryPcnt = ((batteryV - MIN_V) / (MAX_V - MIN_V))*100;
       int batteryPcnt = min(map(readVcc(), MIN_V, MAX_V, 0, 100), 100);
       
       #ifdef DEBUG
       Serial.print("Battery Voltage: ");
       Serial.print(batteryV);
       Serial.println(" V");  
    
       Serial.print("Battery percent: ");
       Serial.print(batteryPcnt);
       Serial.println(" %");
       #endif
    
       float diffBattery = abs(oldBatteryPcnt - batteryPcnt);
       if(wakeup == 1){
       }
       else if (diffBattery > BATTERY_TRANSMIT_THRESHOLD) {
         // Power up radio after sleep
       sendBatteryLevel(batteryPcnt);
         oldBatteryPcnt = batteryPcnt;
       }
    
      /////////////////////////////////////////////////////////////
      //Motion
      ////////////////////////////////////////////////////////////
      boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; 
     
      if(wakeup == -1){
      }
      else if (tripped != lastTripped ) {      
        Serial.println(tripped);
        send(msgMot.set(tripped?"1":"0"));  // Send tripped value to gw
      }
    
    
      ////////////////////////////////////////////////////////////////////
      //Temp and Humidity
      ///////////////////////////////////////////////////////////////////
      delay(dht.getMinimumSamplingPeriod());
    
      float temperature = dht.getTemperature();
      float diffTemp = abs(lastTemp - temperature);
      
      float humidity = dht.getHumidity();
      float diffHum = abs(lastHum - humidity);
      
      if (isnan(temperature)) {
        Serial.println("Failed reading temperature from DHT");
      }else if (wakeup == 1){
      }
      else if(diffTemp > TEMP_TRANSMIT_THRESHOLD) {
        lastTemp = temperature;
        if (!metric) {
          temperature = dht.toFahrenheit(temperature);
        }
        send(msgTemp.set(temperature, 1));
        Serial.print("T: ");
        Serial.println(temperature);
      }
      
      if (isnan(humidity)) {
          Serial.println("Failed reading humidity from DHT");
      } else if (wakeup == 1){
      }
      else if(diffHum > HUMI_TRANSMIT_THRESHOLD) {
          lastHum = humidity;
         send(msgHum.set(humidity, 1));
          Serial.print("H: ");
          Serial.println(humidity);
      }  
      //////////////////////////////////////////////////////////////////////
      // Sleep until interrupt comes in on motion sensor. Send update every two minute. 
      wakeup=sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), RISING, SLEEP_TIME);
    }
    
    YveauxY Offline
    YveauxY Offline
    Yveaux
    Mod
    wrote on last edited by
    #14

    @burningstone I didn't read the whole thread, but quickly scanning over it I understood you are powering the pir with 2xAA cells. If that's the case it is not going to work. The pir needs at least 3xAA cells to function correctly when you bypass its regulator.

    http://yveaux.blogspot.nl

    1 Reply Last reply
    0
    • B Offline
      B Offline
      burningstone
      wrote on last edited by
      #15

      @Yveaux
      Could you please explain why this will not work?
      Because the pir sensor detects motion perfectly fine, the only problem are the false triggers, which occur when the radio sends the signal to the gateway.
      I also saw some guys that run the exact same pir and arduino pro mini 3.3V version on 2xAA batteries.

      YveauxY 1 Reply Last reply
      0
      • B burningstone

        @Yveaux
        Could you please explain why this will not work?
        Because the pir sensor detects motion perfectly fine, the only problem are the false triggers, which occur when the radio sends the signal to the gateway.
        I also saw some guys that run the exact same pir and arduino pro mini 3.3V version on 2xAA batteries.

        YveauxY Offline
        YveauxY Offline
        Yveaux
        Mod
        wrote on last edited by
        #16

        @burningstone the biss0001 chip on the pir is rated for 3..5V operation. If you use it outside its allowed range you can expect undefined behavior, e.g. false triggers.

        These sensors are very sensitive to power supply. Even with a good supply within spec behavior is sometimes strange, to say the least...

        http://yveaux.blogspot.nl

        1 Reply Last reply
        4
        • B Offline
          B Offline
          burningstone
          wrote on last edited by
          #17

          @Yveaux
          So what would you suggest? Adding a third AA-battery?
          I just can't understand why some people got this pir sensor working on 2 AA batteries and without false triggers.

          YveauxY 1 Reply Last reply
          0
          • B burningstone

            @Yveaux
            So what would you suggest? Adding a third AA-battery?
            I just can't understand why some people got this pir sensor working on 2 AA batteries and without false triggers.

            YveauxY Offline
            YveauxY Offline
            Yveaux
            Mod
            wrote on last edited by
            #18

            @burningstone pure luck? It's all about tolerances. Let's see if it still works for them once the environment temperature changes, the pir ages, the battery levels drop, the radio sends more data, etc, etc.
            A simple fix is to power the pir from 3xAA and the arduino and radio from only 2xAA.
            Search the forum, I've already explained it in another thread.

            http://yveaux.blogspot.nl

            1 Reply Last reply
            0
            • B Offline
              B Offline
              burningstone
              wrote on last edited by
              #19

              @Yveaux
              So i would need 5 batteries in total??
              Seems like overkill to me, and the sensor would become quite big :(

              YveauxY 1 Reply Last reply
              0
              • B burningstone

                @Yveaux
                So i would need 5 batteries in total??
                Seems like overkill to me, and the sensor would become quite big :(

                YveauxY Offline
                YveauxY Offline
                Yveaux
                Mod
                wrote on last edited by
                #20

                @burningstone no, just 3xAA.
                Power the arduino and radio from the first 2 only.

                http://yveaux.blogspot.nl

                YveauxY 1 Reply Last reply
                0
                • B Offline
                  B Offline
                  burningstone
                  wrote on last edited by
                  #21

                  @Yveaux
                  I found your other post here in the forum regarding the 3AAA batteries. Could you please explain how I do this?
                  Do I need to buy a battery pack for 3 batteries or is it possible do modify the battery pack I already have?
                  Sorry for bothering you with this type of questions, I just recently started with this.

                  1 Reply Last reply
                  0
                  • YveauxY Yveaux

                    @burningstone no, just 3xAA.
                    Power the arduino and radio from the first 2 only.

                    YveauxY Offline
                    YveauxY Offline
                    Yveaux
                    Mod
                    wrote on last edited by
                    #22

                    @burningstone Here's a schematic representation of what I mean:

                    0_1490118551766_upload-52d98145-abd5-4638-aec4-e113815f2474

                    The red wire w.r.t. ground (black wire) will supply max. 4.5V (3xAA), the yellow one w.r.t ground will supply max. 3V.
                    The load of the Arduino and nRF24 are small, so all batteries will more or less drain equally fast.

                    It can easily be implemented by soldering an extra wire (the yellow one) to a 3xAA battery holder:

                    0_1490118888468_upload-ff89e5ca-5fe9-49a3-93ce-f0d117426868

                    Try it, and verify the output voltages with a DMM!

                    http://yveaux.blogspot.nl

                    1 Reply Last reply
                    3
                    • B Offline
                      B Offline
                      burningstone
                      wrote on last edited by
                      #23

                      @Yveaux
                      Thank you very much.
                      I'll order a battery pack for 3 batteries, currently I have only a pack for 2 batteries.

                      How long does it take approximately till the batteries are empty? I know that it depends on how frequent the sensor gets triggered, but maybe you can tell me some average values.

                      YveauxY mfalkviddM 2 Replies Last reply
                      0
                      • B burningstone

                        @Yveaux
                        Thank you very much.
                        I'll order a battery pack for 3 batteries, currently I have only a pack for 2 batteries.

                        How long does it take approximately till the batteries are empty? I know that it depends on how frequent the sensor gets triggered, but maybe you can tell me some average values.

                        YveauxY Offline
                        YveauxY Offline
                        Yveaux
                        Mod
                        wrote on last edited by
                        #24

                        @burningstone I have one next to my front door for exactly one year now, which triggers many times per day.
                        Battery has only decreased from 100% to 89% ! :+1:

                        http://yveaux.blogspot.nl

                        1 Reply Last reply
                        0
                        • B Offline
                          B Offline
                          burningstone
                          wrote on last edited by
                          #25

                          @Yveaux
                          That sounds like exactly what I want :)

                          Would it be possible to add a dht22 or would this interfere with the pir?

                          1 Reply Last reply
                          0
                          • B burningstone

                            @Yveaux
                            Thank you very much.
                            I'll order a battery pack for 3 batteries, currently I have only a pack for 2 batteries.

                            How long does it take approximately till the batteries are empty? I know that it depends on how frequent the sensor gets triggered, but maybe you can tell me some average values.

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

                            @burningstone if you don't want to wait for the 3xAA holder you can do like this
                            0_1490128739892_pir.png

                            1 Reply Last reply
                            0
                            • B Offline
                              B Offline
                              burningstone
                              wrote on last edited by
                              #27

                              @mfalkvidd
                              Awesome! How do i connect the wires to the battery? Solder them or what?

                              mfalkviddM 1 Reply Last reply
                              0
                              • B burningstone

                                @mfalkvidd
                                Awesome! How do i connect the wires to the battery? Solder them or what?

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

                                @burningstone the ugly way is to solder :) It works, but becomes a quite permanent solution.
                                I prefer using scotch tape. Or, if you have an extra 2xAA holder you can do like this (skip the fourth battery):
                                0_1490130384837_pir2.png

                                1 Reply Last reply
                                0
                                • B Offline
                                  B Offline
                                  burningstone
                                  wrote on last edited by
                                  #29

                                  @mfalkvidd
                                  And how can i tape the wire on the side of the battery holder? My battery holder package already has two wires connected like in the fritzing pictures.

                                  YveauxY 1 Reply Last reply
                                  0
                                  • gohanG Offline
                                    gohanG Offline
                                    gohan
                                    Mod
                                    wrote on last edited by
                                    #30

                                    Or put the wire between the battery and spring/contact

                                    1 Reply Last reply
                                    0
                                    • B burningstone

                                      @mfalkvidd
                                      And how can i tape the wire on the side of the battery holder? My battery holder package already has two wires connected like in the fritzing pictures.

                                      YveauxY Offline
                                      YveauxY Offline
                                      Yveaux
                                      Mod
                                      wrote on last edited by
                                      #31

                                      @burningstone tape a wire directly on the battery, or solder to the battery or the holder.
                                      Look what you have lying around and be creative!
                                      That's what MySensors is about!

                                      http://yveaux.blogspot.nl

                                      B 1 Reply Last reply
                                      2
                                      • YveauxY Yveaux

                                        @burningstone tape a wire directly on the battery, or solder to the battery or the holder.
                                        Look what you have lying around and be creative!
                                        That's what MySensors is about!

                                        B Offline
                                        B Offline
                                        burningstone
                                        wrote on last edited by
                                        #32

                                        @Yveaux
                                        Sorry I have been a long time away due to exams.
                                        Now I finally have time to spend for mysensors :)

                                        I tried your approach with the three batteries. My setup looks like this:

                                        0_1497178432582_Motion Light.PNG

                                        I modified the HC-SR501 as shown below:

                                        0_1497178475013_HC-SR501.jpg

                                        The sketch is pretty simple, it sends the motion and the light level and then goes to sleep with interrupt for 30 minutes. I still get the false positives whenever the arduino doesn't wake up from intrerrupt.

                                        What am I doing wrong?

                                        YveauxY m26872M 2 Replies Last reply
                                        0
                                        • gohanG Offline
                                          gohanG Offline
                                          gohan
                                          Mod
                                          wrote on last edited by
                                          #33

                                          Try adding a cap on the power of the pir sensor, start from 10uf and try to increase up to 100uf and see if it gets better

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


                                          16

                                          Online

                                          11.7k

                                          Users

                                          11.2k

                                          Topics

                                          113.0k

                                          Posts


                                          Copyright 2019 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
                                          • OpenHardware.io
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular