Powering a sensor with digital out



  • Hi,

    I'm trying to power a sensor with one of the digital pins of Arduino. Issue I'm facing is I'm unable to turn on digital pin, I have tried quite few options. I feel I'm missing something simple but its wrecking my brain. Can any one of you look at the code and see what I'm doing wrong, please.

    Arduino : pro mini Atmega168 3.3v

    #define MY_NODE_ID 1  // node id 
    #define MY_RADIO_NRF24  // enabling support for NRF radio module
    #define NODE_ID 1  // sensor id
    #define SENS_ON 2
    #include <MySensors.h>
    #include <SPI.h>
    
    
    MyMessage msg(NODE_ID, V_LEVEL); // constructing the msg
    const int VAL_PROBE = 0; // initializing the moisture variable
    
    void setup()
    {
      pinMode(SENS_ON, OUTPUT);
    }
    void presentation()
    {
      present(NODE_ID, S_MOISTURE);  // presenting the sensor 
      sendSketchInfo("SoilSensor", "0.1"); //meta data 
    }
    
    void loop()
    {
      digitalWrite(SENS_ON, HIGH);
      delay(10000); // To check the input voltage on pin 2
      int moisture = analogRead(VAL_PROBE); //measuring the moisture
      send(msg.set(moisture));  // sending the data 
      sleep(1000);  // sleeping for 10 sec
    }
    

  • Contest Winner

    @hozze

    try this

    void loop()
    {
      digitalWrite(SENS_ON, HIGH);
    
      delay(10000); // To check the input voltage on pin 2
    // byTheo 10 seconds seems to be a bit much??
    
      int moisture = analogRead(VAL_PROBE); //measuring the moisture
    
      digitalWrite(SENS_ON, LOW); // turn it off
    //byTheo you didn't turn the pin off
    
    
      send(msg.set(moisture));  // sending the data 
      sleep(10000);  // sleeping for 10 sec
    // byTheo 1000 s isn't 10 secs 
    }

  • Mod

    @hozze I'm using a similar solution if my office plant monitoring. It works well. What observation made you think that it doesn't work? Have you tried measuring the output pin with a multimeter? Could you show your wiring diagram?


  • Mod

    You could try changing

    const int VAL_PROBE = 0; // initializing the moisture variable
    

    to

    #define VAL_PROBE A0
    

    I don't see any point in declaring it const int, and I prefer to use the An naming to make it clear which pin I am using.



  • @TheoL , Thanks for the suggestion . Tried that, same result.

    @mfalkvidd , Thanks for the code suggestion, I made the change. Regarding the issue, I did check with a multi-meter and it shows 0V . To make sure I also used the example blink sketch with pin 2 as output and it is showing 3.24V I will attach the wiring diagram(I haven't drawn one). Things I noticed.

    • On commenting the Mysensor.h library and related code from above sketch I'm able to turn on the Pin
    • I tried using different digital pins and same result.
    • To make sure I measured the output pin voltage powering it with USB ( without connecting the board to radio and soil sensor ) , same result voltage is 0V

  • Mod

    @hozze looks like good troubleshooting, great work.

    Very interesting that it works when uncommenting the MySensors stuff. I think there are some leds blinking features in 2.0 (have not yet moved to 2.0 myself so I don't know more than what I've read in the forum), but I think that is only enabled for gateways.

    Does it help if you remove include <SPI.h>? It looks like SPI is not used so it shouldn't make a difference but you might as well remove it if you aren't using it.


  • Mod

    @mfalkvidd said:

    there are some leds blinking features in 2.0

    This feature is also present in previous versions and not limited to gateways.
    Pin 2 however is never used for leds as it is the default irq pin for nRF.
    Try with another pin, e.g. 4/5/6 and see if that makes a difference.



  • @mfalkvidd : Removed SPI.h , it didn't help though. Thanks for pointers on cleaning up the code πŸ˜ƒ
    @Yveaux :
    Tried with pin 5 , same result.
    Tried using a different pro mini ( Atmega328 16Mhz 5 v ) got same result , no output on pin πŸ˜‘


  • Mod

    @hozze make sure you don't define MY_LEDS_BLINKING_FEATURE or MY_INCLUSION_MODE_FEATURE, as their pin mappings might interfere with your application.



  • @Yveaux I don't have those defined. Below is my current code.

    #define MY_NODE_ID 1  // node id 
    #define MY_RADIO_NRF24  // enabling support for NRF radio module
    #define NODE_ID 1  // sensor id
    #define SENS_ON 5
    #define VAL_PROBE A0
    #include <MySensors.h>
    
    MyMessage msg(NODE_ID, V_LEVEL); // constructing the msg
    
    void setup()
    {
      pinMode(SENS_ON, OUTPUT);
    }
    
    void presentation()
    {
      present(NODE_ID, S_MOISTURE);  // presenting the sensor 
      sendSketchInfo("SoilSensor", "0.1"); //meta data 
    }
    
    void loop()
    {
      digitalWrite(SENS_ON, HIGH);
      delay(1000); // To check the input voltage of pin 2
      int moisture = analogRead(VAL_PROBE); //measuring the moisture
      send(msg.set(moisture));  // sending the data 
      digitalWrite(SENS_ON, LOW); // turn it off
    //  sleep(1000);  // sleeping for 10 sec
    }
    

    An as soon as I comment it out like below the pin out on 5 works

    #define MY_NODE_ID 1  // node id 
    #define MY_RADIO_NRF24  // enabling support for NRF radio module
    #define NODE_ID 1  // sensor id
    #define SENS_ON 5
    #define VAL_PROBE A0
    //#include <MySensors.h>
    
    MyMessage msg(NODE_ID, V_LEVEL); // constructing the msg
    
    void setup()
    {
      pinMode(SENS_ON, OUTPUT);
    }
    
    void presentation()
    {
    //  present(NODE_ID, S_MOISTURE);  // presenting the sensor 
    //  sendSketchInfo("SoilSensor", "0.1"); //meta data 
    }
    
    void loop()
    {
      digitalWrite(SENS_ON, HIGH);
      delay(1000); // To check the input voltage of pin 2
      int moisture = analogRead(VAL_PROBE); //measuring the moisture  
    // send(msg.set(moisture));  // sending the data 
      digitalWrite(SENS_ON, LOW); // turn it off
    //  sleep(1000);  // sleeping for 10 sec
    }
    

  • Mod

    @hozze it's strange that you only measure 3.24V on the output pin if you're using a 5V pro mini. This is IMHO an indication that something is wrong, also when your pin does seem to toggle.



  • I see that output on pro mini Atmega168 3.3v with commented sketch.
    I tried with a different 5v pro mini Atmega368 and I'm getting 5.04V on output pin with commented sketch.


  • Contest Winner

    @Yveaux @hozze Are you sure it's a ProMini 5V? Could you measure the voltage on the Raw pin.

    I've received some Pro Mini 3.3V while I actually did order 5V.

    It's just a guess.



  • @TheoL I have two pro mini's. I measured the voltage across a output pin ( HIGH ) and GND and it gives me near 5V on one and near 3.3V on another .So it looks as if I do have 5V pro mini.

    I have tried few other sketches on both, seems they are working fine, I face the specific issue only when including the Mysensor.h library. I will give it a try on a nano that I have and see what happens.


  • Contest Winner

    @hozze It was just a guess. I once compiled a sketch for a 5V and uploaded it to a ProMini 3.3V. Took me a while before I noticed my mistake. I just didn;t understand why my Arduino couldn't control my relay boards πŸ˜‰



  • @TheoL πŸ˜ƒ me too learning things the hard way.

    Thanks for all the pointers that you guys are giving . Looks as if I'm in the right place and with a great community,

    Let me tinker a bit more and see if I can get somewhere, if anyone can give any further info kindly do.


  • Hero Member

    @hozze You should enable debugging at the top of your sketch with

    // Enable debug prints to serial monitor
    #define MY_DEBUG
    

    and check the serial monitor to see if the radio is initialising . Maybe the loop part of the program will not run if this does not happen. That could be why commenting out the #include <MySensors.h> allows it to work.

    You might also use wait instead of delay



  • @Boots33 , I enabled MY_DEBUG. Sorry if I sound stupid. I have connected the pro mini to computer with USB serial CP2102 for programming/serial debug , at the same time can I power the pro mini + Radio with an external power supply 3.3V ?

    I did something similar with a ATTINY85 few days back and bricked it 😒 ( Connected it to USB and same time powered it )


  • Mod

    @hozze connect gnd from the serial adapter AND the external power supply to gnd on the Arduino. Connect + on the external adapter to the pin you normally use (vcc or raw). Do not connect + from the serial adapter. That's it.


  • Hero Member

    @hozze The whole purpose of a good forum is for people to share ideas and knowledge. So never be worried about asking questions. πŸ™‚



  • Thanks guys, I will check this out.



  • Was away from arduino for over a week with regular job. Tested the code with debug on a new arduino pro mini 3.3v 8Mhz and the below is the output ( please note that the values getting send are random values , i'm still not able to power the sensor with digital Pin )

    TSP:MSG:SEND 1-1-0-0 s=255,c=3,t=15,pt=6,l=2,sg=0,ft=0,st=ok:0100
    TSP:MSG:SEND 1-1-0-0 s=255,c=0,t=17,pt=0,l=5,sg=0,ft=0,st=ok:2.0.0
    TSP:MSG:SEND 1-1-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,ft=0,st=ok:0
    TSP:MSG:READ 0-0-1 s=255,c=3,t=15,pt=6,l=2,sg=0:0100
    TSP:MSG:SEND 1-1-0-0 s=1,c=0,t=35,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 1-1-0-0 s=255,c=3,t=11,pt=0,l=10,sg=0,ft=0,st=ok:SoilSensor
    TSP:MSG:SEND 1-1-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,ft=0,st=ok:0.1
    Request registration...
    TSP:MSG:SEND 1-1-0-0 s=255,c=3,t=26,pt=1,l=1,sg=0,ft=0,st=ok:2
    TSP:MSG:READ 0-0-1 s=255,c=3,t=27,pt=1,l=1,sg=0:1
    Node registration=1
    Init complete, id=1, parent=0, distance=1, registration=1
    TSP:MSG:SEND 1-1-0-0 s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=ok:786
    TSP:MSG:SEND 1-1-0-0 s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=ok:503
    TSP:MSG:SEND 1-1-0-0 s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=ok:410
    TSP:MSG:SEND 1-1-0-0 s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=ok:425
    TSP:MSG:SEND 1-1-0-0 s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=ok:461
    TSP:MSG:SEND 1-1-0-0 s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=ok:539
    TSP:MSG:SEND 1-1-0-0 s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=ok:507
    TSP:MSG:SEND 1-1-0-0 s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=ok:392
    

    Looks fine for me , still I can't turn a digital pin On 😞


  • Hero Member

    @hozze It really should be working. I tried your original above and with a led connected to pin 5 it turns on when the code is run

    try the code below with some serial prints to see what happens

    // Enable debug prints to serial monitor
    #define MY_DEBUG
    #define MY_NODE_ID 150  // node id 
    #define MY_RADIO_NRF24  // enabling support for NRF radio module
    
    #define NODE_ID 1  // sensor id
    #define SENS_ON 5
    #define VAL_PROBE A0
    #include <MySensors.h>
    #define POWER_ON 1  //  value to write to turn on sensor
    #define POWER_OFF 0 //  value to write to turn off sensor
    MyMessage msg(NODE_ID, V_LEVEL); // constructing the msg
    
    void setup()
    {
      pinMode(SENS_ON, OUTPUT);
    }
    
    void presentation()
    {
      present(NODE_ID, S_MOISTURE);  // presenting the sensor
      sendSketchInfo("SoilSensor", "0.1"); //meta data
    }
    
    void loop()
    {
    
    
      digitalWrite(SENS_ON, POWER_ON);
      Serial.print("Sensor Power on pin "); Serial.print(SENS_ON); Serial.print(" is..."); Serial.println((POWER_ON));
      wait(1000); // To check the input voltage of pin 2
      int moisture = analogRead(VAL_PROBE); //measuring the moisture
      send(msg.set(moisture));  // sending the data
      digitalWrite(SENS_ON, POWER_OFF); // turn it off
      Serial.print("Sensor Power on pin "); Serial.print(SENS_ON); Serial.print(" is..."); Serial.println((POWER_OFF));
    
      wait(1000);
    }
    
    

    I get an output like this below and the led flashes on and off at 1 second intervals. Maybe try just a led with a 200 to 300 ohm resistor on pin 5 to see what is happening. could the moisture sensor be drawing more than the arduino can give?

    TSP:MSG:SEND 150-150-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,ft=1,st=ok:0
    TSP:MSG:READ 0-0-150 s=255,c=3,t=6,pt=0,l=1,sg=0:M
    TSP:MSG:SEND 150-150-0-0 s=1,c=0,t=35,pt=0,l=0,sg=0,ft=0,st=ok:
    TSP:MSG:SEND 150-150-0-0 s=255,c=3,t=11,pt=0,l=10,sg=0,ft=0,st=ok:SoilSensor
    TSP:MSG:SEND 150-150-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,ft=0,st=ok:0.1
    Request registration...
    TSP:MSG:SEND 150-150-0-0 s=255,c=3,t=26,pt=1,l=1,sg=0,ft=0,st=ok:2
    TSP:MSG:READ 0-0-150 s=255,c=3,t=27,pt=1,l=1,sg=0:1
    Node registration=1
    Init complete, id=150, parent=0, distance=1, registration=1
    Sensor Power on pin 5 is...1
    TSP:MSG:SEND 150-150-0-0 s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=ok:511
    Sensor Power on pin 5 is...0
    Sensor Power on pin 5 is...1
    TSP:MSG:SEND 150-150-0-0 s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=ok:313
    Sensor Power on pin 5 is...0
    Sensor Power on pin 5 is...1
    TSP:MSG:SEND 150-150-0-0 s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=ok:254
    Sensor Power on pin 5 is...0
    Sensor Power on pin 5 is...1
    TSP:MSG:SEND 150-150-0-0 s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=ok:326
    Sensor Power on pin 5 is...0
    Sensor Power on pin 5 is...1
    TSP:MSG:SEND 150-150-0-0 s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=ok:235
    Sensor Power on pin 5 is...0
    Sensor Power on pin 5 is...1
    


  • I'm stupid ! @Boots33 the debug info saved me. With debug info I came to notice that the sketch goes into loop part only if the gateway is also connected and available. Stupid me was doing the pin checks just by connecting the sensor and keeping the gateway disconnected , when I had the gateway connected I didn't bother to check the pin out, I was going in the same loop and wasting my and all your valuable time.

    Thanks for all your assistance people, you guys are awesome.


  • Hero Member

    Great to hear you got it going, and don't worry I am sure everyone here ( including me) has there own moments they would rather forget when it comes to writing code. πŸ™‚



  • This sounds like a really good idea.
    Can I use this to power like a DS18B20 tempsensor. Would this save power and give my battery powered sensors extended battery life?



  • @xydix
    Arduino using Atmega can supply max 40mA per pin, and in total max 100mA.
    DS18B20 seems to use max 1,5mA
    so yes this will work
    After searching on the net.
    https://github.com/nathanchantrell/TinyTX/blob/master/TinyTX_DS18B20/TinyTX_DS18B20.ino

    The part for the power on, read, power off is below (taken from the above link):

    void loop() {

    digitalWrite(ONE_WIRE_POWER, HIGH); // turn DS18B20 sensor on

    //Sleepy::loseSomeTime(5); // Allow 5ms for the sensor to be ready
    delay(5); // The above doesn't seem to work for everyone (why?)

    sensors.begin(); //start up temp sensor
    sensors.requestTemperatures(); // Get the temperature
    tinytx.temp=(sensors.getTempCByIndex(0)*100); // Read first sensor and convert to integer, reversed at receiving end

    digitalWrite(ONE_WIRE_POWER, LOW); // turn DS18B20 off


 

330
Online

7.5k
Users

8.4k
Topics

90.3k
Posts