#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
#include "ThingSpeak.h"
const int DHT_PIN = 18;
WiFiClient espClient;
PubSubClient client(espClient);
char ssid[] = "Wokwi-GUEST"; // Change this to your network SSID
char pass[] = ""; // Change this your network password
// MQTT broker settings and topics
const char* mqtt_server = "mqtt3.thingspeak.com";
// Published settings
const char* publishTopic = "channels/2337657/publish";
// Subscribed settings Virtuino command 1
const char* subscribeTopicFor_Command_1 = "channels/2337657/subscribe/fields/field1";
const char* subscribeTopicFor_Command_2 = "channels/2337657/subscribe/fields/field2";
const unsigned long postingInterval = 10L * 1000L;
DHTesp dhtSensor;
unsigned long lastUploadedTime = 0;
void setup_wifi() {
delay(10);
Serial.print("\nConnecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("\nWiFi connected\nIP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("NCYXGw4eKTAoAzYDDSk4MRM", "NCYXGw4eKTAoAzYDDSk4MRM", "teq+xz20fEOEJibp4lm7s2NH")) {
Serial.println("connected");
client.subscribe(subscribeTopicFor_Command_1);
client.subscribe(subscribeTopicFor_Command_2);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying
delay(5000);
}
}
}
void messageReceived(String &topic, String &payload) {
Serial.println("incoming: " + topic + " - " + payload);
}
void setup() {
Serial.begin(9600);
while (!Serial)
delay(1);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); // Initialize the DHT22 sensor
delay(2000); // Add a delay after sensor initialization
}
void loop() {
if (!client.connected())
reconnect();
client.loop();
if (millis() - lastUploadedTime > postingInterval) {
float temperature = dhtSensor.getTemperature();
float humidity = dhtSensor.getHumidity();
if (!isnan(temperature) && !isnan(humidity)) {
publishMessage(publishTopic, temperature, humidity, true);
} else {
Serial.println("Invalid sensor readings. Skipping MQTT publish.");
}
lastUploadedTime = millis();
}
}
String toLowerCaseString(String str) {
String result = str;
result.toLowerCase();
return result;
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("Message arrived [" + String(topic) + "]");
String incomingMessage = "";
for (int i = 0; i < length; i++)
incomingMessage += (char)payload[i];
Serial.println("Payload: " + incomingMessage);
// Convert both topic and comparison string to lowercase for case-insensitive comparison
String lowerTopic = toLowerCaseString(String(topic));
String lowerField1 = toLowerCaseString("field1");
String lowerField2 = toLowerCaseString("field2");
if (lowerTopic.endsWith(lowerField1) || lowerTopic.endsWith(lowerField2)) {
// Process temperature (field1) or humidity (field2)
float value = incomingMessage.toFloat();
if (lowerTopic.endsWith(lowerField1)) {
Serial.println("Temperature: " + String(value, 2));
// Add your logic for handling temperature (field1) here
} else if (lowerTopic.endsWith(lowerField2)) {
Serial.println("Humidity: " + String(value, 2));
// Add your logic for handling humidity (field2) here
}
} else {
Serial.println("Unknown topic. Payload not processed.");
}
}
void publishMessage(const char* topic, float temperature, float humidity, boolean retained) {
String payload = "field1=" + String(temperature, 2) + "&field2=" + String(humidity, 2) + "&status=MQTTPUBLISH";
if (client.publish(topic, payload.c_str(), retained)) {
Serial.println("Message published [" + String(topic) + "]: " + payload);
} else {
Serial.println("Failed to publish message.");
}
}