GARDUINO with Ethernet Shield

I’ve started a garduino project a couple o months ago and i’m having troubles with it.
It had a moisture sensor that, if low, triggered a relay connected to a water pump untill it was at a certain level.
The measure was triggered by an alarm from Alarm library.
I believe that due to the unnacuracy of the internal time clock it almost flooded my plants.

I, then, switched to a version where i would like to call a watering function everyday and everynight with an alarm for both.
The clock i’m trying to update with the Ethernet update library.

For some reason the alarm functions are not triggering the watering.

Any thoughs?

/*
 * Garduino Time sketch
 *
 */
 
 #include <Time.h>
 #include <TimeAlarms.h>
 #include <Ethernet.h>
 #include <EthernetUdp.h>
 #include <SPI.h>
  

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
// NTP Servers:
IPAddress timeServer(132, 163, 4, 101); // time-a.timefreq.bldrdoc.gov
// IPAddress timeServer(132, 163, 4, 102); // time-b.timefreq.bldrdoc.gov
// IPAddress timeServer(132, 163, 4, 103); // time-c.timefreq.bldrdoc.gov

const int timeZone = -3;     // Fuso horário
//const int timeZone = -5;  // Eastern Standard Time (USA)
//const int timeZone = -4;  // Eastern Daylight Time (USA)
//const int timeZone = -8;  // Pacific Standard Time (USA)
//const int timeZone = -7;  // Pacific Daylight Time (USA)

EthernetUDP Udp;
unsigned int localPort = 8888;  // local port to listen for UDP packets

 
int moistureSensor=A0;  //  Indicates analog port 0 to the moisture sensor.
int moisture_val;


int Relay=2;  //Indicates port 2 for Relay.

void digitalClockDisplay(){     // digital clock display of time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  //Serial.write(" ");
  //Serial.write(day());
  //Serial.write(" ");
  //Serial.write(month());
  //Serial.write(" ");
  //Serial.write(year());
  Serial.println();
   }


void printDigits(int digits){
  // utility function for clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
   }

void On(){
   Serial.print("Water On");
   Serial.println();
   digitalWrite(Relay, HIGH);
   }


void TurnOff(){
   Serial.print("Water Off");
   Serial.println();
   digitalWrite(Relay, LOW);
   }   
   
   
void Water() {      
    if (moisture_val>260){
      On();
      Alarm.delay(10000);    
      TurnOff();
    } else {
      Serial.print("Moist Ok");
      Serial.println();
    } 
}


  time_t prevDisplay = 0; // when the digital clock was displayed
  


 void setup()
 {
   Serial.begin(9600);
 //  setTime(14,00,0,2,11,14); //set time hour,minutes, seconds, month, day, year
   Alarm.alarmRepeat(21,26,30, Water);  // Day Watering
   Alarm.alarmRepeat(02,00,10, Water);  // Night watering
   pinMode (Relay,OUTPUT);              // Relay pin as OUTPUT.
 
   while (!Serial) ; // Needed for Leonardo only
   delay(250);
   Serial.println("Searching Time info");
   if (Ethernet.begin(mac) == 0) {
    // no point in carrying on, so do nothing forevermore:
       while (1) {
       Serial.println("No Conection");
       delay(10000);
       }
    }
    Serial.print("IP is ");
    Serial.println(Ethernet.localIP());
    Udp.begin(localPort);
    Serial.println("Waiting Sync");
    setSyncProvider(getNtpTime);
}

//time_t prevDisplay = 0; // when the digital clock was displayed
 
 void loop()
 {
   Alarm.delay(1000);   
   
   if (timeStatus() != timeNotSet) {
     if (now() != prevDisplay) { //update the display only if time has changed
       prevDisplay = now();
       digitalClockDisplay();  
     }
   }  
        
   moisture_val=analogRead(moistureSensor);  //read the value 
   Serial.print("Moisture is: ");
   Serial.print(moisture_val);
   Serial.println(); 
}


/*-------- NTP code ----------*/

const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets

time_t getNtpTime()
{
  while (Udp.parsePacket() > 0) ; // discard any previously received packets
  Serial.println("Transmit NTP Request");
  sendNTPpacket(timeServer);
  uint32_t beginWait = millis();
  while (millis() - beginWait < 1500) {
    int size = Udp.parsePacket();
    if (size >= NTP_PACKET_SIZE) {
      Serial.println("Receive NTP Response");
      Udp.read(packetBuffer, NTP_PACKET_SIZE);  // read packet into the buffer
      unsigned long secsSince1900;
      // convert four bytes starting at location 40 to a long integer
      secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
      secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
      secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
      secsSince1900 |= (unsigned long)packetBuffer[43];
      return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    }
  }
  Serial.println("No NTP Response :-(");
  return 0; // return 0 if unable to get the time
}

// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;
  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:                 
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}

Hi,

The problem doesn’t appear to be timing. Your Water() function never checks to see if the plants are sufficiently watered. It continues to test the same value in moisture_val without updating moisture_val with another analogRead(). Water() needs something like this:

void Water() {      
//    if (moisture_val>260){  <- test used to say this
    if(analogRead(moistureSensor)>260) {
      On();
      Alarm.delay(10000);    
      TurnOff();
    } else {
      Serial.print("Moist Ok");
      Serial.println();
    } 
}

Hopefully this will help your future water bill :slight_smile:

Cheers ! Geoff

Thanks,

i'll try this and reply if it works.

Cheers!