#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include "secrets.h"
// ================== PINS ==================
#define MOISTURE_PIN 34
#define VALVE_PIN 26
// ================== DEVICE ==================
#define DEVICE_ID "esp32_1"
// ================== MQTT TOPICS ==================
const char* publish_topic = "garden/soil";
const char* subscribe_topic = "garden/valve";
// ================== MQTT ==================
WiFiClientSecure net;
PubSubClient client(net);
// ================== TIMER ==================
unsigned long lastPublish = 0;
const unsigned long publishInterval = 15000;
// ================== READ MOISTURE ==================
int readMoistureRaw() {
return analogRead(MOISTURE_PIN);
}
// ================== MQTT CALLBACK ==================
void callback(char* topic, byte* payload, unsigned int length) {
String msg;
for (int i = 0; i < length; i++) {
msg += (char)payload[i];
}
Serial.print("MQTT reçu: ");
Serial.println(msg);
if (msg.indexOf("open") >= 0) {
digitalWrite(VALVE_PIN, HIGH);
Serial.println("💧 Valve OPEN");
}
else if (msg.indexOf("close") >= 0) {
digitalWrite(VALVE_PIN, LOW);
Serial.println("🚫 Valve CLOSED");
}
}
// ================== WIFI ==================
void connectWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connexion WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connecté");
}
// ================== AWS IOT ==================
void connectAWS() {
net.setCACert(AWS_CERT_CA);
net.setCertificate(AWS_CERT_CRT);
net.setPrivateKey(AWS_CERT_PRIVATE);
client.setServer(AWS_IOT_ENDPOINT, 8883);
client.setCallback(callback);
while (!client.connected()) {
Serial.print("Connexion AWS IoT...");
if (client.connect(THINGNAME)) {
Serial.println("connecté");
client.subscribe(subscribe_topic);
} else {
Serial.println("échec, retry...");
delay(5000);
}
}
}
// ================== SETUP ==================
void setup() {
Serial.begin(115200);
pinMode(VALVE_PIN, OUTPUT);
digitalWrite(VALVE_PIN, LOW);
connectWiFi();
connectAWS();
}
// ================== LOOP ==================
void loop() {
if (!client.connected()) {
connectAWS();
}
client.loop();
if (millis() - lastPublish > publishInterval) {
lastPublish = millis();
int raw = readMoistureRaw();
int humidity = map(raw, 0, 4095, 100, 0);
humidity = constrain(humidity, 0, 100);
// ===== JSON COMPATIBLE DYNAMODB + LAMBDA =====
String payload = "{";
payload += "\"device_id\":\"" + String(DEVICE_ID) + "\",";
payload += "\"humidity\":" + String(humidity);
payload += "}";
client.publish(publish_topic, payload.c_str());
Serial.print("Publié: ");
Serial.println(payload);
}
}