/**
ESP32 + DHT22 Example for Wokwi
Nakornping Hospital - HIS-NKP
2.Oxygen Tank Tracking Logger
ส่งอุณหภูมิ, ความชื้น >> NKP/device/ESP8266-2
https://wokwi.com/arduino/projects/374837330678274049
*/
#include <WiFi.h>
#include "DHTesp.h"
#include "PubSubClient.h"
#include "ArduinoJson.h"
#define devLED 2
bool state = LOW; // flag to initialize variables
const char* mqtt_server = "mqtt.netpie.io"; // MQTT Netpie broker
const int mqtt_port = 1883; // MQTT Port
const char* mqtt_Client = "addd9fc3-ad1c-45f4-9c08-XXXXXXXXXXXX"; // Client ID
const char* mqtt_username = "Ei8zUa2oa4XLY1sCe1NqXXXXXXXXXXXX"; // Token
const char* mqtt_password = "6NmhtqUMjL8mvRDTvwLHXXXXXXXXXXXX"; // Secret
WiFiClient espClient;
PubSubClient client(espClient);
const int DHT_PIN = 15;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
char msg[100];
float actual_use, cylinder_size =0;
float temperature, humidity=0; // Previous temperature & humidity
//WiFiClient espClient;
DHTesp dhtSensor;
// Timers auxiliar variables
long now = millis();
long lastMeasure = 0;
void setup() {
DynamicJsonDocument doc(1024);
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
Serial.print("Connecting to WiFi");
wifiConnect();
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void wifiConnect() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection…");
if (client.connect(mqtt_Client, mqtt_username, mqtt_password)) {
Serial.println("connected");
// subscribe to topic @private/shadow/data/get to receive shadown data
client.subscribe("@msg/#");
client.subscribe("@private/#");
client.publish("@shadow/data/get", "nothing");
}
else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println("try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int msglength) {
String data;
Serial.print("Message arrived [");
Serial.print(topic);
Serial.println("]");
String message;
for (int i = 0; i < msglength; i++) {
message = message + (char)payload[i];
}
if(String(topic) == "@private/shadow/data/get/response") {
String bin_str, totalItem_str;
int data_idx;
// Get the cylinder_size value
data_idx = message.indexOf("cylinder_size");
totalItem_str = message.substring(data_idx+15);
data_idx = totalItem_str.indexOf("}");
totalItem_str = totalItem_str.substring(0,data_idx);
data_idx = totalItem_str.indexOf(",");
bin_str = totalItem_str.substring(0,data_idx);
//Serial.println("bin_str1:"+bin_str);
cylinder_size=bin_str.toFloat();
Serial.println("cylinder_size:"+String(cylinder_size));
// Get the actual_use value
data_idx = message.indexOf("actual_use");
totalItem_str = message.substring(data_idx+12);
data_idx = totalItem_str.indexOf("}");
totalItem_str = totalItem_str.substring(0,data_idx);
data_idx = totalItem_str.indexOf(",");
bin_str = totalItem_str.substring(0,data_idx);
//Serial.println("bin_str2:"+bin_str);
actual_use=bin_str.toFloat();
Serial.println("actual_use:"+String(actual_use));
}
if ((String(topic) == "@msg/ESP8266-1/cylinder_size")) {
cylinder_size=message.toFloat();
Serial.println("cylinder_size: "+message);
}
if ((String(topic) == "@msg/ESP8266-1/actual_use")) {
actual_use=message.toFloat();
Serial.println("actual_use: "+message);
}
}
void loop(){
if (client.connected()) {
client.loop();
now = millis();
if (now - lastMeasure > 1000) { // 6,000 มิลลิวินาที = 6 วินาที
lastMeasure = now;
TempAndHumidity data_dht = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data_dht.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data_dht.humidity, 1) + "%");
Serial.println("Cylinder Size: "+ String(cylinder_size));
Serial.println("Actual usage: " + String(actual_use));
Serial.println("----------------------------------------------------------------");
if ((data_dht.temperature!=temperature)||(data_dht.humidity!=humidity)) {
String data = "{\"data\":{\"temperature\":" + String(data_dht.temperature) + ",\"humidity\":" + String(data_dht.humidity) + "}}";
Serial.print("Update Shadow: ");
Serial.println(data);
data.toCharArray(msg, (data.length() + 1));
client.publish("@shadow/data/update", msg);
temperature=data_dht.temperature;
humidity=data_dht.humidity;
}
}
} else {
reconnect();
}
}
// 1 decimal places
double round1(double value) {
return (int)(value * 10 + 0.5) / 10.0;
}
// 2 decimal places
double round2(double value) {
return (int)(value * 100 + 0.5) / 100.0;
}
// SendToGoogleSheet(Temperature,Humidity,Cylinder Size,Actual usage);