Skip to content

Instantly share code, notes, and snippets.

@Ajak58a
Created April 23, 2024 02:05
Show Gist options
  • Save Ajak58a/901243ff37fe5097b378132fc7ae460f to your computer and use it in GitHub Desktop.
Save Ajak58a/901243ff37fe5097b378132fc7ae460f to your computer and use it in GitHub Desktop.
App controlled watering system
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
//#include <ArduinoJson.h>
#include <WiFiUdp.h>
WiFiUDP udp;
const int Port = 5000;
char Packet[80];
const char* ssid = "REPLACE_WITH_YOUR_WIFI_SSID";
const char* password = "REPLACE_WITH_YOUR_WIFI_PASSWORD";
const char* API_KEY = "REPLACE_WITH_YOUR_WEATHER_API_KEY";
const int relayPin = 16;
long localTimeMinutes, startTimeMinutes, endTimeMinutes;
int num1, num2, num3, num4;
void connectWiFi(){
// Connect to Wi-Fi
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
long convertToMinutes(const char* time12) {
int h, m;
char ampm[3];
// Extract hour, minute, and AM/PM from the input string
sscanf(time12, "%d:%d %2s", &h, &m, ampm);
// Convert to 24-hour format
if (strcmp(ampm, "PM") == 0 && h != 12) {
h += 12;
}
else if (strcmp(ampm, "AM") == 0 && h == 12) {
h = 0;
}
long timeInMinutes = h*60+m;
return timeInMinutes;
}
void stringToCharArray(String inputString, char* outputBuffer, int bufferSize) {
if (inputString.length() < bufferSize) {
inputString.toCharArray(outputBuffer, bufferSize);
} else {
Serial.println("Error: Buffer size is too small for the input string.");
}
}
void getCurrentTime(){
int y, mn, d, h, m;
WiFiClient client;
HTTPClient http;
String endpoint = "http://api.weatherapi.com/v1/current.json?key=" + String(API_KEY) + "&q=auto:ip";
http.begin(client, endpoint);
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
int timePos = payload.indexOf("\"localtime\":\"");
if (timePos > 0) {
int startTime = timePos + 13; // move past the identifier
int endTime = payload.indexOf("\"", startTime);
String localtime = payload.substring(startTime, endTime);
Serial.println("Current Local Time: " + localtime);
char time12[18];
stringToCharArray(localtime, time12, sizeof(time12));
sscanf(time12, "%d-%d-%d %d:%d", &y, &mn, &d, &h, &m);
long localTimeMinutes = h*60+m;
Serial.println(localTimeMinutes);
}
} else {
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}
void processMsg(String str){
int startIndex = str.indexOf('H');
int endIndex = str.indexOf('M');
String numString = str.substring(startIndex+1, endIndex);
Serial.println(numString);
num1 = numString.toInt();
startIndex = str.indexOf('M');
endIndex = str.indexOf('X');
numString = str.substring(startIndex+1, endIndex);
Serial.println(numString);
num2 = numString.toInt();
startIndex = str.indexOf('X');
endIndex = str.indexOf('Y');
numString = str.substring(startIndex+1, endIndex);
Serial.println(numString);
num3 = numString.toInt();
startIndex = str.indexOf('Y');
endIndex = -1;
numString = str.substring(startIndex+1, endIndex);
Serial.println(numString);
num4 = numString.toInt();
}
void setup() {
Serial.begin(115200);
pinMode(relayPin, OUTPUT);
connectWiFi();
udp.begin(Port);
Serial.print("Listening on UDP port ");
Serial.print(Port);
}
void loop(){
getCurrentTime();
int PacketSize = udp.parsePacket();
if(PacketSize)
{
Serial.println(PacketSize);
int len = udp.read(Packet, PacketSize);
Serial.println(Packet);
}
if(String(Packet[0]) == "T"){
if(String(Packet[1])=="0") digitalWrite(relayPin, HIGH);
else if (String(Packet[1]) == "1") digitalWrite(relayPin, LOW);
}
if(String(Packet[0]) == "H"){
processMsg(String(Packet));
Serial.print("Watering To Start At ");
Serial.print(num1);
Serial.print(":");
Serial.println(num2);
Serial.print("Watering To Stop At ");
Serial.print(num3);
Serial.print(":");
Serial.println(num4);
startTimeMinutes = num1*60 + num2;
endTimeMinutes = num3*60 + num4;
if(localTimeMinutes == startTimeMinutes){digitalWrite(relayPin, LOW);}
if(localTimeMinutes == endTimeMinutes){digitalWrite(relayPin, HIGH);}
}
delay(1000);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment