#include "secrets.h" // Contains all the credentials
// Important Libraries
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <WiFi.h>
//Included just to use it's timer function(Blynk cloud platfrom is not used in this code)
#include <Blynk.h>
// Relay Pins
#define Relay1 15
#define Relay2 2
#define Relay3 4
#define Relay4 16
//Counter Initialisation
int c = 0;
// Topics of MQTT
#define AWS_IOT_PUBLISH_TOPIC "esp32/counter"
#define AWS_IOT_SUBSCRIBE_TOPIC1 "esp32/relay1"
#define AWS_IOT_SUBSCRIBE_TOPIC2 "esp32/relay2"
#define AWS_IOT_SUBSCRIBE_TOPIC3 "esp32/relay3"
#define AWS_IOT_SUBSCRIBE_TOPIC4 "esp32/relay4"
BlynkTimer timer;
WiFiClientSecure net = WiFiClientSecure();
PubSubClient client(net);
// Timer Callback function
void myTimerEvent()
{
StaticJsonDocument<200> doc;
doc["message"] = "Hello from ESP32";
doc["Counter"] = c;
char jsonBuffer[512];
serializeJson(doc, jsonBuffer); // print to client
client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer);
Serial.println("Message Published");
c++;
}
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(".");
}
// Configure WiFiClientSecure to use the AWS IoT device credentials
net.setCACert(AWS_CERT_CA);
net.setCertificate(AWS_CERT_CRT);
net.setPrivateKey(AWS_CERT_PRIVATE);
// Connect to the MQTT broker on the AWS endpoint we defined earlier
client.setServer(AWS_IOT_ENDPOINT, 8883);
// Create a message handler
client.setCallback(messageHandler);
Serial.print("Connecting to AWS IOT");
while (!client.connect(THINGNAME)) {
Serial.print(".");
delay(100);
}
if (!client.connected()) {
Serial.println("AWS IoT Timeout!");
return;
}
// Subscribe to a topic
client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC1);
client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC2);
client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC3);
client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC4);
Serial.println("AWS IoT Connected!");
}
void messageHandler(char* topic, byte* payload, unsigned int length)
{
Serial.print("incoming: ");
Serial.println(topic);
if ( strstr(topic, "esp32/relay1") )
{
StaticJsonDocument<200> doc;
deserializeJson(doc, payload);
String Relay_data = doc["status"];
int r = Relay_data.toInt();
digitalWrite(Relay1, !r);
Serial.print("Relay1 - "); Serial.println(Relay_data);
}
if ( strstr(topic, "esp32/relay2") )
{
StaticJsonDocument<200> doc;
deserializeJson(doc, payload);
String Relay_data = doc["status"];
int r = Relay_data.toInt();
digitalWrite(Relay2, !r);
Serial.print("Relay2 - "); Serial.println(Relay_data);
}
if ( strstr(topic, "esp32/relay3") )
{
StaticJsonDocument<200> doc;
deserializeJson(doc, payload);
String Relay_data = doc["status"];
int r = Relay_data.toInt();
digitalWrite(Relay3, !r);
Serial.print("Relay3 - "); Serial.println(Relay_data);
}
if ( strstr(topic, "esp32/relay4") )
{
StaticJsonDocument<200> doc;
deserializeJson(doc, payload);
String Relay_data = doc["status"];
int r = Relay_data.toInt();
digitalWrite(Relay4, !r);
Serial.print("Relay4 - "); Serial.println(Relay_data);
}
}
void setup()
{
Serial.begin(115200);
pinMode(Relay1, OUTPUT);
pinMode(Relay2, OUTPUT);
pinMode(Relay3, OUTPUT);
pinMode(Relay4, OUTPUT);
timer.setInterval(5000L, myTimerEvent);
connectAWS();
}
void loop()
{
timer.run(); // Initiates BlynkTimer
client.loop();
}