#include <WiFi.h>
#include "secrets.h"
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <DHTesp.h>
// Wi-Fi and AWS IoT settings
const int DHT_PIN = 15;
DHTesp dhtSensor;
#define AWS_IOT_PUBLISH_TOPIC "iotresc/pub"
#define AWS_IOT_SUBSCRIBE_TOPIC "iotresc/sub"
String h;
String t;
WiFiClientSecure net;
PubSubClient client(net);
// Connect to AWS IoT
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(".");
}
Serial.println("\nConnected to Wi-Fi!");
// Configure WiFiClientSecure to use AWS IoT device credentials
net.setCACert(AWS_CERT_CA); // Root CA
net.setCertificate(AWS_CERT_CRT); // Device Certificate
net.setPrivateKey(AWS_CERT_PRIVATE); // Device Private Key
// Connect to AWS IoT MQTT broker
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); // Subscribe to topic
Serial.println("\nAWS IoT Connected!");
}
// Publish sensor data to AWS IoT
void publishMessage() {
StaticJsonDocument<200> doc;
doc["humidity"] = h;
doc["temperature"] = t;
char jsonBuffer[512];
serializeJson(doc, jsonBuffer); // Convert to JSON format
client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer); // Publish to MQTT topic
}
// Handle incoming MQTT messages
void messageHandler(char* topic, byte* payload, unsigned int length) {
Serial.print("Incoming message from topic: ");
Serial.println(topic);
StaticJsonDocument<200> doc;
deserializeJson(doc, payload); // Parse incoming JSON message
const char* message = doc["message"];
Serial.println(message);
}
void setup() {
Serial.begin(115200);
Serial.println("Starting...");
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); // Setup DHT sensor
connectAWS(); // Connect to Wi-Fi and AWS IoT
}
void loop() {
TempAndHumidity data = dhtSensor.getTempAndHumidity(); // Read sensor data
h = String(data.humidity, 1); // Humidity with 1 decimal place
t = String(data.temperature, 2); // Temperature with 2 decimal places
Serial.println("Temp: " + t + "°C");
Serial.println("Humidity: " + h + "%");
Serial.println("---");
publishMessage(); // Send data to AWS IoT
client.loop(); // Keep MQTT client alive
delay(5000); // Wait 5 seconds before next reading
}