/* https://luuvachiase.net/dashboard/home_v5.php#
inlog guest0
ww dashbord
https://wokwi.com/projects/385650849867448321
https://luuvachiase.net/dashboard/home_v5.php#
facebook: esp8266/esp32 Do Thanh Nam
Youtube: Store and share (ESP32 Arduino) @luuvachiase8000
https://luuvachiase.net/
*/
#include <WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ArduinoJson.h>
#include "DHTesp.h"
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
String macAddressString;
// Set MQTT topics using the MAC address as a string
char stopic[30];
char ptopic[30];
char datatopic[30];
char lwt_topic[30];
char macAddress[18];
uint8_t mac[6];
bool cn_check = false;
int sw[] = {12, 13, 14};
int pw[] = {25, 26, 27};
const int DHT_PIN = 15; // DHT22
const float minValue = 1.05; // Minimum analog value
const float maxValue = 1.26; // Maximum analog value
int count=0;
int alarmt=0;
int auth=0;
int intId =0;
int rsp =0;
int value=0;
int id=0;
String type_data1 = "temp";
String type_data2 = "batt";
String type_data3 = "gas";
DHTesp dhtSensor;
// Define a variable to store the temperature reading
float temperature;
float prv_value;
float humidity;
int percentage;
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(19, HIGH);
delay(200);
digitalWrite(19, LOW);
delay(200);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Obtain the MAC address as a string
WiFi.macAddress(mac);
sprintf(macAddress, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
// Convert macAddress to a string
for (int i = 0; i < 6; i++) {
char hexChar[8];
sprintf(hexChar, "%02X", mac[i]);
macAddressString += hexChar;
}
Serial.print("MAC Address: ");
Serial.println(macAddress);
sprintf(stopic, "cmd_%s", macAddress);
//Serial.println(stopic);
sprintf(lwt_topic, "lwt_topic_%s", macAddress);
//Serial.println(lwt_topic);
sprintf(datatopic, "data_topic_%s", macAddress);
//Serial.println(datatopic);
sprintf(ptopic, "stt_topic_%s", macAddress);
//Serial.println(ptopic);
}
void ReceivedMessage(char* topic, byte* payload, unsigned int length) {
// Output the first character of the message to serial (debug)
StaticJsonDocument<100> doc;
deserializeJson(doc, payload, length);
// Extract values from the JSON data
String mac = doc["mac"];
String type= doc["type"];
id = doc["id"];
value = doc["value"].as<int>();
rsp = doc["rsp"].as<int>();
//Serial.print(type);
//Serial.print(":");
//Serial.println(value);
if(type=="btn") control_button(id,value,rsp);
if(type=="sld") control_pwm(id,value,rsp);
}
void control_button(int id,int value, int rsp)
{
//rsp =1;
intId = id-1;
if(value == 1) {digitalWrite(sw[intId], HIGH); Serial.println("HIGH");}
if(value == 0) {digitalWrite(sw[intId], LOW); Serial.println("LOW");}
if(rsp ==1) publish_data(3,id,"state",sw[intId]);
}
void control_pwm(int id, int value, int rsp)
{
id = id-1;
analogWrite(pw[id], value);
if(rsp ==1) publish_data(3,id,"pwm",value);
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(19, HIGH);
delay(200);
digitalWrite(19, LOW);
delay(200);
Serial.print(".");
}
// Create a random client ID
String clientId = "ESP32Client-"+macAddressString;
Serial.println(clientId);
//clientId += String(random(0xffff), HEX);
// Attempt to connect
StaticJsonDocument<50> lwtJson;
lwtJson["stt"] = 0; // Customize the JSON data as needed
// Convert the JSON object to a JSON string
char lwtMessage[200];
serializeJson(lwtJson, lwtMessage);
if (client.connect(clientId.c_str(),lwt_topic, 2, true, lwtMessage)) {
Serial.println("connected");
cn_check =true;
DynamicJsonDocument RtJson(50);
RtJson["stt"] = 1; // Customize the JSON data as needed
// Convert the JSON object to a JSON string
String RtMessage;
serializeJson(RtJson, RtMessage);
// Once connected, publish an announcement...
const char* pl_RtMessage = RtMessage.c_str();
client.publish(lwt_topic, pl_RtMessage, true);
// ... and resubscribe
client.subscribe(stopic);
} else {
cn_check =false;
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void publish_data(int stt, int id, String type_data, int pin_to_read) {
DynamicJsonDocument json(80);
int state = digitalRead(pin_to_read);
json["stt"] = stt;
json["id"] = id;
json["type_data"] = type_data;
json["value"] = state;
String jsonString;
serializeJson(json, jsonString);
const char* payload = jsonString.c_str();
//Serial.print("Publishing: ");
//Serial.println(payload);
client.publish(datatopic, payload);
//Serial.println("Done!");
}
void publish_data(int stt, String type_data, float value) {
// Your existing code for float value
if (type_data == "temp") prv_value = value;
DynamicJsonDocument json(100);
json["stt"] = stt;
json["type_data"] = type_data;
json["value"] = value;
String jsonString;
serializeJson(json, jsonString);
const char* payload = jsonString.c_str();
//Serial.print("Publishing: ");
//Serial.println(payload);
client.publish(datatopic, payload);
//Serial.println("Done!");
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
//Serial.println(lwtMessage);
// Set ADC attenuation to 11dB
//analogSetAttenuation(ADC_11db); //esp32 only
//pinMode(3, OUTPUT); // Initialize the BUILTIN_LED pin as an output
pinMode(sw[0], OUTPUT);
pinMode(sw[1], OUTPUT);
pinMode(sw[2], OUTPUT);
digitalWrite(sw[0], HIGH);
digitalWrite(sw[1], HIGH);
digitalWrite(sw[2], HIGH);
pinMode(pw[0], OUTPUT);
pinMode(pw[1], OUTPUT);
pinMode(pw[2], OUTPUT);
analogWrite(pw[0], 255);
analogWrite(pw[1], 255);
analogWrite(pw[2], 255);
setup_wifi();
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
client.setServer(mqtt_server, 1883);
client.setCallback(ReceivedMessage);
}
void loop() {
if (!client.connected()) {
cn_check =false;
reconnect();
}
client.loop();
delay(100);
// Get the temperature reading from the first sensor publish_temp(float temperature, String type_data)
TempAndHumidity data_temp = dhtSensor.getTempAndHumidity();
temperature = data_temp.temperature;
humidity = data_temp.humidity;
delay(100);
//Serial.println("Hello, ESP32!");
delay(1000);
publish_data(3,type_data2, humidity);
publish_data(3,type_data1, temperature);
//if (cn_check ==true && temperature!= prv_value1) {publish_data(type_data1, temperature);}
//if (cn_check ==true && humidity!= prv_value2) {publish_data(type_data2, humidity);}
}