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. General Discussion
  3. Crazy timer on my sketch

Crazy timer on my sketch

Scheduled Pinned Locked Moved General Discussion
7 Posts 2 Posters 981 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.
  • TmasterT Offline
    TmasterT Offline
    Tmaster
    wrote on last edited by
    #1

    hello . i'm finishing an second version from my water irrigation(1 valve control) and i have an issue with one of the timers that i can't understand.

    its set for 1 hour,but never reach 1 hour, sometimes 47minutes ,other times 5 minutes.... annoying.

    Can anyone understand this ? i'm too limited on programming :s

    this is the crazy timer that i talk about:
    this timer close the valv after 3600second(1hour) but won't work..

      unsigned long nowMillis = millis();
        
       if ((timer==true) && (nowMillis - startMillis >= VALVE_TIME))          
        {
          startMillis =  nowMillis ;
           VALV1_OFF();
           timer==false;
    

    full code:

    // Set blinking period (in milliseconds)
    #define MY_DEFAULT_LED_BLINK_PERIOD 500
    #define MY_WITH_LEDS_BLINKING_INVERSE
    //#define MY_DEFAULT_ERR_LED_PIN 17
    #define MY_DEFAULT_TX_LED_PIN 17
    #define MY_DEFAULT_RX_LED_PIN 17
    
    //#define MY_DEBUG
    #define MY_RADIO_RFM69
    //#define MY_REPEATER_FEATURE
    
    #include <TimeLib.h>
    #include <SPI.h>
    #include <OneWire.h> 
    #include <DallasTemperature.h>
    #include <MySensors.h>
    
    
    #define ONE_WIRE_BUS 6 
    OneWire oneWire(ONE_WIRE_BUS); 
    DallasTemperature sensors(&oneWire);
    //#define CHILD_ID_MOISTURE 4
    #define CHILD_ID_TEMP 21
    #define CHILD_ID_VALV1 10
    //#define CHILD_ID_VALV2 11
    
    
    #define RELAY_PIN  3  // Arduino Digital I/O pin number for relay  VALV 1 
    #define RELAY_PIN2  5  // Arduino Digital I/O pin number for relay VALV 2
    #define BUTTON_PIN  4  // Arduino Digital I/O pin number for button 
    #define LEDR1   16  // LED A2 pin
    #define LEDR2  15// LED A1 pin
    //#define LEDERRO 17  // LED A3  pin
    
    
    
    #define VALVE_TIME 3600000UL    //selenoid 1 goes off after () time  (7200000UL)-2HOUR
    #define readtime 1800000UL  //time between read TEMPERATURE (3600000UL) - 1HOUR
    
    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxx |SET TIME HERE|     - valve1-  xxxxxxxxxxxxxxxxxxxxxxxx |
    //TIME1
    const int H1 = 17; //HOURS START PROGRAM     //time to start  selenoid1                 |
    const int M1 = 00; //MINUTES START PROGRAM                                              |
    //TIME2
    const int H2 = 8; //HOURS START PROGRAM     //time to start  selenoid1                 |
    const int M2 = 00; //MINUTES START PROGRAM 
    //----------------------------------------valve2--------------------------------------- |                                         
    
    unsigned long startMillis = 0;
    unsigned long startMillisA = 0;
     
    int reading;// the current reading from the input pin
    bool RH = false;         
    int previous = LOW;
    int timer = false;
    bool timeReceived = false;
    unsigned long  lastRequest=0;
    
    MyMessage msg1(CHILD_ID_TEMP,V_TEMP);
    MyMessage msg2(CHILD_ID_VALV1,V_LIGHT);
    
    bool state;
     
    
    void before()
    {
      // Startup up the OneWire library
      sensors.begin();  //DS18B20 LIBRARY START
    }
    
    void setup()  
        {  
    //request time from gw
       requestTime(receiveTime);
              
      // Setup the button
       pinMode(BUTTON_PIN,INPUT);  
       pinMode(RELAY_PIN, OUTPUT);   
       pinMode(RELAY_PIN2, OUTPUT);  
    
       pinMode(LEDR1, OUTPUT); 
       pinMode(LEDR2, OUTPUT); 
       sensors.begin();  //DS18B20 LIBRARY START
    
    
      // Make sure relays are off when starting up
      digitalWrite(RELAY_PIN,LOW);
      
        }
    
    
    
    void presentation()
        {
      sendSketchInfo("irrigation_temp_soilMoisture", "2.0");
      present(CHILD_ID_TEMP, S_TEMP);
      present(CHILD_ID_VALV1, S_LIGHT);
        }
    void receiveTime(unsigned long time)
    {
      // Ok, set incoming time 
      setTime(time);
      timeReceived = true;
    
    Serial.print("Time now is: ");
    
      Serial.print(hour());
      Serial.print(":");
      Serial.print(minute());
      Serial.print(":");
      Serial.print(second());
    }
    //#################################################################################################
     void VALV1_ON()
        {
         analogWrite(RELAY_PIN,255);
         delay(400);
         analogWrite(RELAY_PIN,90);
         digitalWrite(LEDR1,HIGH);
         send(msg2.set(true),false);
          
        }
    
    void VALV1_OFF()
       {
          analogWrite(RELAY_PIN,LOW);
          digitalWrite(LEDR1,LOW);
          send(msg2.set(false),false);
        }
    //#########################################################################################################3
    // ✓ ORDER RECEIVED FROM GW  #   ORDER RECEIVED FROM GW  #  ORDER RECEIVED FROM GW  ORDER RECEIVED FROM GW  ORDER RECEIVED FROM GW ✓
    
    void receive(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.isAck()) {
        // Serial.println("This is an ack from gateway");
      }
    
      if (message.type == V_LIGHT) {
         // Change relay state
         state = message.getBool();
             
          if (state == 1) 
          {
            VALV1_ON();
          }
       
        else if (state == 0)
         { 
          VALV1_OFF();
         }
       
        } 
    }
    void loop() //loop    loop         loop        loop        loop        loop        loop        loop        loop        loop        loop    
    {
        
       
       unsigned long nows = millis();
       // If no time has been received yet, request it every 10 second from controller
      // When time has been received, request update every 12h
      if ((!timeReceived && (nows-lastRequest) > (10UL*1000UL))
        || (timeReceived && (nows-lastRequest) > (43200000UL)))
        {
        // Request time from controller. 
     //   Serial.println("requesting time");
        requestTime(receiveTime);  
        lastRequest = nows;
        }
    
     
    
      
       //       toogle  switch   toogle  switch   toogle  switch   toogle  switch   toogle  switch  
    //toogle  switch----------selenoid 1------------------------------- 
    
     reading = digitalRead(BUTTON_PIN);
    
     
       if (reading == HIGH && RH == false)
      {
           VALV1_ON();
          RH = true;
          timer = true;
           delay(400);
      }
      else if(reading == HIGH &&RH == true)
      {
        VALV1_OFF();
        RH = false;
        timer==false;
        delay(400);
      }
    
    // ✓ time out ✓
        unsigned long nowMillis = millis();
        
       if ((timer==true) && (nowMillis - startMillis >= VALVE_TIME))          
        {
          startMillis =  nowMillis ;
           VALV1_OFF();
           timer==false;
       
        }
    
      //✓ ON by time ✓
      if ((hour() == H1 && minute() == M1) ||(hour() == H2 && minute() == M2)  )  
     {
         VALV1_ON();
         timer = true;
     }
       
    
    
    
    //✓ time to send temperature ? ✓
     float temperature =sensors.getTempCByIndex(0); 
     
    unsigned long nowMillisA = millis();
        if (nowMillisA - startMillisA >= readtime)
        {
    //✓ read temperature  sensors ✓
         sensors.requestTemperatures();
         send(msg1.set(temperature,1));  //send  temp to gw
         startMillisA =  nowMillisA ;  //reset time
        }
    }
    

    i'm a arduino fan .Even sometimes don't undestanding how to use it :P

    mfalkviddM 1 Reply Last reply
    0
    • TmasterT Tmaster

      hello . i'm finishing an second version from my water irrigation(1 valve control) and i have an issue with one of the timers that i can't understand.

      its set for 1 hour,but never reach 1 hour, sometimes 47minutes ,other times 5 minutes.... annoying.

      Can anyone understand this ? i'm too limited on programming :s

      this is the crazy timer that i talk about:
      this timer close the valv after 3600second(1hour) but won't work..

        unsigned long nowMillis = millis();
          
         if ((timer==true) && (nowMillis - startMillis >= VALVE_TIME))          
          {
            startMillis =  nowMillis ;
             VALV1_OFF();
             timer==false;
      

      full code:

      // Set blinking period (in milliseconds)
      #define MY_DEFAULT_LED_BLINK_PERIOD 500
      #define MY_WITH_LEDS_BLINKING_INVERSE
      //#define MY_DEFAULT_ERR_LED_PIN 17
      #define MY_DEFAULT_TX_LED_PIN 17
      #define MY_DEFAULT_RX_LED_PIN 17
      
      //#define MY_DEBUG
      #define MY_RADIO_RFM69
      //#define MY_REPEATER_FEATURE
      
      #include <TimeLib.h>
      #include <SPI.h>
      #include <OneWire.h> 
      #include <DallasTemperature.h>
      #include <MySensors.h>
      
      
      #define ONE_WIRE_BUS 6 
      OneWire oneWire(ONE_WIRE_BUS); 
      DallasTemperature sensors(&oneWire);
      //#define CHILD_ID_MOISTURE 4
      #define CHILD_ID_TEMP 21
      #define CHILD_ID_VALV1 10
      //#define CHILD_ID_VALV2 11
      
      
      #define RELAY_PIN  3  // Arduino Digital I/O pin number for relay  VALV 1 
      #define RELAY_PIN2  5  // Arduino Digital I/O pin number for relay VALV 2
      #define BUTTON_PIN  4  // Arduino Digital I/O pin number for button 
      #define LEDR1   16  // LED A2 pin
      #define LEDR2  15// LED A1 pin
      //#define LEDERRO 17  // LED A3  pin
      
      
      
      #define VALVE_TIME 3600000UL    //selenoid 1 goes off after () time  (7200000UL)-2HOUR
      #define readtime 1800000UL  //time between read TEMPERATURE (3600000UL) - 1HOUR
      
      //xxxxxxxxxxxxxxxxxxxxxxxxxxxxx |SET TIME HERE|     - valve1-  xxxxxxxxxxxxxxxxxxxxxxxx |
      //TIME1
      const int H1 = 17; //HOURS START PROGRAM     //time to start  selenoid1                 |
      const int M1 = 00; //MINUTES START PROGRAM                                              |
      //TIME2
      const int H2 = 8; //HOURS START PROGRAM     //time to start  selenoid1                 |
      const int M2 = 00; //MINUTES START PROGRAM 
      //----------------------------------------valve2--------------------------------------- |                                         
      
      unsigned long startMillis = 0;
      unsigned long startMillisA = 0;
       
      int reading;// the current reading from the input pin
      bool RH = false;         
      int previous = LOW;
      int timer = false;
      bool timeReceived = false;
      unsigned long  lastRequest=0;
      
      MyMessage msg1(CHILD_ID_TEMP,V_TEMP);
      MyMessage msg2(CHILD_ID_VALV1,V_LIGHT);
      
      bool state;
       
      
      void before()
      {
        // Startup up the OneWire library
        sensors.begin();  //DS18B20 LIBRARY START
      }
      
      void setup()  
          {  
      //request time from gw
         requestTime(receiveTime);
                
        // Setup the button
         pinMode(BUTTON_PIN,INPUT);  
         pinMode(RELAY_PIN, OUTPUT);   
         pinMode(RELAY_PIN2, OUTPUT);  
      
         pinMode(LEDR1, OUTPUT); 
         pinMode(LEDR2, OUTPUT); 
         sensors.begin();  //DS18B20 LIBRARY START
      
      
        // Make sure relays are off when starting up
        digitalWrite(RELAY_PIN,LOW);
        
          }
      
      
      
      void presentation()
          {
        sendSketchInfo("irrigation_temp_soilMoisture", "2.0");
        present(CHILD_ID_TEMP, S_TEMP);
        present(CHILD_ID_VALV1, S_LIGHT);
          }
      void receiveTime(unsigned long time)
      {
        // Ok, set incoming time 
        setTime(time);
        timeReceived = true;
      
      Serial.print("Time now is: ");
      
        Serial.print(hour());
        Serial.print(":");
        Serial.print(minute());
        Serial.print(":");
        Serial.print(second());
      }
      //#################################################################################################
       void VALV1_ON()
          {
           analogWrite(RELAY_PIN,255);
           delay(400);
           analogWrite(RELAY_PIN,90);
           digitalWrite(LEDR1,HIGH);
           send(msg2.set(true),false);
            
          }
      
      void VALV1_OFF()
         {
            analogWrite(RELAY_PIN,LOW);
            digitalWrite(LEDR1,LOW);
            send(msg2.set(false),false);
          }
      //#########################################################################################################3
      // ✓ ORDER RECEIVED FROM GW  #   ORDER RECEIVED FROM GW  #  ORDER RECEIVED FROM GW  ORDER RECEIVED FROM GW  ORDER RECEIVED FROM GW ✓
      
      void receive(const MyMessage &message) {
        // We only expect one type of message from controller. But we better check anyway.
        if (message.isAck()) {
          // Serial.println("This is an ack from gateway");
        }
      
        if (message.type == V_LIGHT) {
           // Change relay state
           state = message.getBool();
               
            if (state == 1) 
            {
              VALV1_ON();
            }
         
          else if (state == 0)
           { 
            VALV1_OFF();
           }
         
          } 
      }
      void loop() //loop    loop         loop        loop        loop        loop        loop        loop        loop        loop        loop    
      {
          
         
         unsigned long nows = millis();
         // If no time has been received yet, request it every 10 second from controller
        // When time has been received, request update every 12h
        if ((!timeReceived && (nows-lastRequest) > (10UL*1000UL))
          || (timeReceived && (nows-lastRequest) > (43200000UL)))
          {
          // Request time from controller. 
       //   Serial.println("requesting time");
          requestTime(receiveTime);  
          lastRequest = nows;
          }
      
       
      
        
         //       toogle  switch   toogle  switch   toogle  switch   toogle  switch   toogle  switch  
      //toogle  switch----------selenoid 1------------------------------- 
      
       reading = digitalRead(BUTTON_PIN);
      
       
         if (reading == HIGH && RH == false)
        {
             VALV1_ON();
            RH = true;
            timer = true;
             delay(400);
        }
        else if(reading == HIGH &&RH == true)
        {
          VALV1_OFF();
          RH = false;
          timer==false;
          delay(400);
        }
      
      // ✓ time out ✓
          unsigned long nowMillis = millis();
          
         if ((timer==true) && (nowMillis - startMillis >= VALVE_TIME))          
          {
            startMillis =  nowMillis ;
             VALV1_OFF();
             timer==false;
         
          }
      
        //✓ ON by time ✓
        if ((hour() == H1 && minute() == M1) ||(hour() == H2 && minute() == M2)  )  
       {
           VALV1_ON();
           timer = true;
       }
         
      
      
      
      //✓ time to send temperature ? ✓
       float temperature =sensors.getTempCByIndex(0); 
       
      unsigned long nowMillisA = millis();
          if (nowMillisA - startMillisA >= readtime)
          {
      //✓ read temperature  sensors ✓
           sensors.requestTemperatures();
           send(msg1.set(temperature,1));  //send  temp to gw
           startMillisA =  nowMillisA ;  //reset time
          }
      }
      
      mfalkviddM Offline
      mfalkviddM Offline
      mfalkvidd
      Mod
      wrote on last edited by
      #2

      @tmaster the debug log will probably give good insight to why the node reacts early.

      If you use the auto-formatting feature in the Arduino IDE, it will be much easier to follow the code.

      1 Reply Last reply
      0
      • TmasterT Offline
        TmasterT Offline
        Tmaster
        wrote on last edited by Tmaster
        #3

        @mfalkvidd said in Crazy timer on my sketch:

        the debug log will probably give good insight to why the node reacts early.

        i just discovered the auto-formatting right now :)

        About debug (mydebug) just reacts as normal,everything as should, but in shorter time... less 70-80% of the time most the times. Tomorrow i will get the arduino that its watering right know and change the code a bit..try some "while" instead of "if" or hammering it ;)

        i'm a arduino fan .Even sometimes don't undestanding how to use it :P

        mfalkviddM 1 Reply Last reply
        1
        • TmasterT Tmaster

          @mfalkvidd said in Crazy timer on my sketch:

          the debug log will probably give good insight to why the node reacts early.

          i just discovered the auto-formatting right now :)

          About debug (mydebug) just reacts as normal,everything as should, but in shorter time... less 70-80% of the time most the times. Tomorrow i will get the arduino that its watering right know and change the code a bit..try some "while" instead of "if" or hammering it ;)

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

          @tmaster the sketch has a few

          timer==false;
          

          that probably should be

          timer=false;
          
          TmasterT 1 Reply Last reply
          0
          • TmasterT Offline
            TmasterT Offline
            Tmaster
            wrote on last edited by
            #5

            Nice catch! i didn´t see that . thank you

            i'm a arduino fan .Even sometimes don't undestanding how to use it :P

            1 Reply Last reply
            1
            • mfalkviddM mfalkvidd

              @tmaster the sketch has a few

              timer==false;
              

              that probably should be

              timer=false;
              
              TmasterT Offline
              TmasterT Offline
              Tmaster
              wrote on last edited by
              #6

              @mfalkvidd that was the problem! I correct the code and timers are working perfect now. I will post the skematic and code this night on projects for if someone want to use it . Very handy on summer for water some vegetables like i do. It's a very simple build.

              i'm a arduino fan .Even sometimes don't undestanding how to use it :P

              mfalkviddM 1 Reply Last reply
              1
              • TmasterT Tmaster

                @mfalkvidd that was the problem! I correct the code and timers are working perfect now. I will post the skematic and code this night on projects for if someone want to use it . Very handy on summer for water some vegetables like i do. It's a very simple build.

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

                @tmaster great work!

                1 Reply Last reply
                0

                Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                With your input, this post could be even better 💗

                Register Login
                Reply
                • Reply as topic
                Log in to reply
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes


                14

                Online

                12.0k

                Users

                11.2k

                Topics

                113.4k

                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