#include "WiFi.h"
#include "secrets.h"
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
const int SOIL_MOISTURE_PIN = 34;
const int SPRINKLER_CONTROL_PIN = 19;
int MOISTURE_THRESHOLD_LOW = 25; // Set Activation threshold in percentage
int MOISTURE_THRESHOLD_HIGH = 75; // Set Deactivation threshold in percentage
bool SPRINKLER_ACTIVATION_STATUS = false;
#define AWS_IOT_PUBLISH_TOPIC "IOT_thing/pub"
#define AWS_IOT_SUBSCRIBE_TOPIC "IOT_thing/sub"
WiFiClientSecure net = WiFiClientSecure();
PubSubClient client(net);
void connectAWS()
{
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.println("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
net.setCACert(AWS_CERT_CA);
net.setCertificate(AWS_CERT_CRT);
net.setPrivateKey(AWS_CERT_PRIVATE);
client.setServer(AWS_IOT_ENDPOINT, 8883);
client.setCallback(messageHandler);
Serial.println("Connecting to AWS IOT");
while (!client.connect(THINGNAME))
{
Serial.print(".");
delay(100);
}
if (!client.connected())
{
Serial.println("AWS IoT Timeout!");
return;
}
client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC);
Serial.println("AWS IoT Connected!");
}
void publishMessage()
{
StaticJsonDocument<200> doc;
int soilMoisturePercentage = map(analogRead(SOIL_MOISTURE_PIN), 0, 4095, 0, 100);
doc["soil_moisture"] = soilMoisturePercentage;
doc["sprinkler_status"] = SPRINKLER_ACTIVATION_STATUS ? "on" : "off";
char jsonBuffer[512];
serializeJson(doc, jsonBuffer);
client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer);
}
void messageHandler(char* topic, byte* payload, unsigned int length)
{
Serial.print("Incoming: ");
Serial.println(topic);
StaticJsonDocument<200> doc;
deserializeJson(doc, payload);
const char* message = doc["message"];
Serial.println(message);
}
void setup()
{
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.println("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED)
{
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
pinMode(SOIL_MOISTURE_PIN, INPUT);
pinMode(SPRINKLER_CONTROL_PIN, OUTPUT);
connectAWS();
}
void loop()
{
int soilMoisturePercentage = map(analogRead(SOIL_MOISTURE_PIN), 0, 4095, 0, 100);
if (soilMoisturePercentage < MOISTURE_THRESHOLD_LOW)
{
SPRINKLER_ACTIVATION_STATUS = true;
digitalWrite(SPRINKLER_CONTROL_PIN, HIGH);
}
else if (soilMoisturePercentage > MOISTURE_THRESHOLD_HIGH)
{
SPRINKLER_ACTIVATION_STATUS = false;
digitalWrite(SPRINKLER_CONTROL_PIN, LOW);
}
Serial.println("---");
Serial.print("Soil Moisture Percentage: ");
Serial.print(soilMoisturePercentage);
Serial.println("%");
Serial.print("Sprinkler: ");
Serial.println(SPRINKLER_ACTIVATION_STATUS ? "on" : "off");
Serial.println("---");
publishMessage();
client.loop();
delay(2500);
}