#include "WiFi.h"
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <time.h>
unsigned long lastTransmissionTime = 0;
boolean transmissionFlag = 1;
const char* mqtt_server = "broker.emqx.io";
const char* mqtt_topic = "/thing";
const int mqtt_port = 1883;
const char* username = "ritesh";
const char* password = "ritesh";
const char* clientId = "randomwords";
int count = 0; //To find the number of mqtt requests sent
// NTP Server settings
// const char *ntp_server = "pool.ntp.org"; // Default NTP server
// const char* ntp_server = "cn.pool.ntp.org"; // Recommended NTP server for users in China
// const long gmt_offset_sec = 0; // GMT offset in seconds (adjust for your time zone)
// const int daylight_offset_sec = 0; // Daylight saving time offset in seconds
// WiFi and MQTT client initialization
// BearSSL::WiFiClientSecure espClient;
WiFiClient espClient;
PubSubClient mqttClient(espClient);
// SSL certificate for MQTT broker
// Load DigiCert Global Root CA ca_cert, which is used by EMQX Cloud Serverless Deployment
// static const char ca_cert[] PROGMEM = R"EOF(
// -----BEGIN CERTIFICATE-----
// MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
// MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
// d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
// QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
// MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
// b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
// 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
// CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
// nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
// 43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
// T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
// gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
// BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
// TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
// DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
// hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
// 06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
// PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
// YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
// CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
// -----END CERTIFICATE-----
// )EOF";
void setup() {
Serial.begin(115200);
WiFi.disconnect(); //Disconnect from previously connected wifi
Serial.println("\nWifi disconnected");
delay(200);
WiFi.mode(WIFI_STA); //STAtion mode: the ESP8266 connects to an access point
// syncTime();
mqttClient.setServer(mqtt_server, mqtt_port);
}
void loop() {
connectWifi();
mqttClient.loop();
getData();
delay(2000); // Wait for a new reading from the sensor (DHT22 has ~0.5Hz sample rate)
}
void connectWifi() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Attempting to connect to WiFi");
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
Serial.println(".");
delay(1000);
}
Serial.println("Wifi Connected");
return;
}
}
// void syncTime() {
// configTime(gmt_offset_sec, daylight_offset_sec, ntp_server);
// Serial.print("Waiting for NTP time sync: ");
// while (time(nullptr) < 8 * 3600 * 2) {
// delay(1000);
// Serial.print(".");
// }
// Serial.println("Time synchronized");
// struct tm timeinfo;
// if (getLocalTime(&timeinfo)) {
// Serial.print("Current time: ");
// Serial.println(asctime(&timeinfo));
// } else {
// Serial.println("Failed to obtain local time");
// }
// }
void getData() {
double randomDecimal = random(0, 100) / 100.0;
double temp = random(0, 100) + randomDecimal;
double humidity = random(0, 100) + randomDecimal;
Serial.println("----------------");
Serial.print("Humidity: " + String(humidity) + "% , ");
Serial.println("Temp: " + String(temp) + "°C");
unsigned long currentTime = millis();
int time_elapsed = currentTime - lastTransmissionTime;
Serial.println("Time elapsed: " + String(time_elapsed));
StaticJsonDocument<50> doc;
doc["Humidity"] = humidity;
doc["Temperature"] = temp;
// Serialize the JSON object to a string
String jsonString;
serializeJson(doc, jsonString);
// if ((time_elapsed >= 6000) && transmissionFlag) {
connectMQTT(jsonString);
lastTransmissionTime = currentTime;
// }
}
void connectMQTT(String jsonString) {
int retryCount = 4;
// BearSSL::X509List serverTrustedCA(ca_cert);
// espClient.setTrustAnchors(&serverTrustedCA);
while (!mqttClient.connected() && retryCount) {
Serial.print("Attempting MQTT connection...");
if (mqttClient.connect(clientId,username,password)) {
Serial.println("connected " + String(count++));
mqttClient.publish(mqtt_topic, jsonString.c_str());
// count++;
} else {
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 2 seconds");
delay(2000);
retryCount--;
}
}
mqttClient.disconnect();
}