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();
}