Created
April 23, 2024 02:05
-
-
Save Ajak58a/901243ff37fe5097b378132fc7ae460f to your computer and use it in GitHub Desktop.
App controlled watering system
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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