<code>#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "*****"
#define BLYNK_TEMPLATE_NAME "****"
#define BLYNK_AUTH_TOKEN "****"
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <BlynkSimpleEsp8266.h>
#define DHTPIN D5
#define rainpin A0
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const char* ssid = "*****";
const char* password = "****";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
LiquidCrystal_I2C lcd(0x27, 16, 2);
char auth[] = "*****";
float t, h;
int rain;
String rainstatus;
char tempBuffer[10], humBuffer[10], rainBuffer[50];
long lastReconnectAttempt;
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Message received on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
Serial.println(message);
if (strcmp(topic, "proj/temperature") == 0) {
t = message.toFloat();
Blynk.virtualWrite(0, t);
} else if (strcmp(topic, "proj/humidity") == 0) {
h = message.toFloat();
Blynk.virtualWrite(1, h);
} else if (strcmp(topic, "proj/rain_status") == 0) {
rainstatus = message;
Blynk.virtualWrite(2, rainstatus);
}
}
boolean reconnect() {
if (client.connect("ESP8266Client")) {
Serial.println("MQTT Connection Established");
client.subscribe("proj/temperature");
client.subscribe("proj/humidity");
client.subscribe("proj/rain_status");
}
return client.connected();
}
void setup() {
Serial.begin(9600);
pinMode(rainpin, INPUT);
dht.begin();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
lcd.init();
lcd.backlight();
lcd.print(" IoT WEATHER");
lcd.setCursor(0, 1);
lcd.print(" STATION");
delay(2000);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("CONNECTING TO");
lcd.setCursor(3, 1);
lcd.print("INTERNET");
Blynk.begin(auth, ssid, password);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("CONNECTED TO");
lcd.setCursor(3, 1);
lcd.print("INTERNET");
delay(2000);
lastReconnectAttempt = 0;
}
void loop() {
if (!client.connected()) {
long now = millis();
if (now - lastReconnectAttempt > 5000) {
lastReconnectAttempt = now;
if (reconnect()) {
lastReconnectAttempt = 0;
}
}
} else {
Blynk.run();
client.loop();
t = dht.readTemperature();
h = dht.readHumidity();
rain = analogRead(rainpin);
if (isnan(t) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
if (rain < 300) {
rainstatus = "VERY HEAVY RAIN";
} else if (rain > 300 && rain <= 450) {
rainstatus = "HEAVY RAIN";
} else if (rain > 450 && rain <= 600) {
rainstatus = "LIGHT RAIN";
} else {
rainstatus = "NO RAIN";
}
unsigned long currentMillis = millis();
static unsigned long previousMillis = 0;
const unsigned long interval = 2000;
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
snprintf(tempBuffer, sizeof(tempBuffer), "%.1f", t);
snprintf(humBuffer, sizeof(humBuffer), "%.1f", h);
strcpy(rainBuffer, rainstatus.c_str());
if (client.publish("proj/temperature", tempBuffer)) {
Serial.println("Temperature published successfully!");
} else {
Serial.println("Failed to publish temperature data!");
}
if (client.publish("proj/humidity", humBuffer)) {
Serial.println("Humidity published successfully!");
} else {
Serial.println("Failed to publish humidity data!");
}
if (client.publish("proj/rain_status", rainBuffer)) {
Serial.println("Rain status published successfully!");
} else {
Serial.println("Failed to publish rain status data!");
}
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print((char) 223);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(h);
lcd.print("%");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RAIN STATUS");
lcd.setCursor(0, 1);
lcd.print(rainstatus);
delay(1000);
}
}
</code>
<code>#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "*****"
#define BLYNK_TEMPLATE_NAME "****"
#define BLYNK_AUTH_TOKEN "****"
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <BlynkSimpleEsp8266.h>
#define DHTPIN D5
#define rainpin A0
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const char* ssid = "*****";
const char* password = "****";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
LiquidCrystal_I2C lcd(0x27, 16, 2);
char auth[] = "*****";
float t, h;
int rain;
String rainstatus;
char tempBuffer[10], humBuffer[10], rainBuffer[50];
long lastReconnectAttempt;
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Message received on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
Serial.println(message);
if (strcmp(topic, "proj/temperature") == 0) {
t = message.toFloat();
Blynk.virtualWrite(0, t);
} else if (strcmp(topic, "proj/humidity") == 0) {
h = message.toFloat();
Blynk.virtualWrite(1, h);
} else if (strcmp(topic, "proj/rain_status") == 0) {
rainstatus = message;
Blynk.virtualWrite(2, rainstatus);
}
}
boolean reconnect() {
if (client.connect("ESP8266Client")) {
Serial.println("MQTT Connection Established");
client.subscribe("proj/temperature");
client.subscribe("proj/humidity");
client.subscribe("proj/rain_status");
}
return client.connected();
}
void setup() {
Serial.begin(9600);
pinMode(rainpin, INPUT);
dht.begin();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
lcd.init();
lcd.backlight();
lcd.print(" IoT WEATHER");
lcd.setCursor(0, 1);
lcd.print(" STATION");
delay(2000);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("CONNECTING TO");
lcd.setCursor(3, 1);
lcd.print("INTERNET");
Blynk.begin(auth, ssid, password);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("CONNECTED TO");
lcd.setCursor(3, 1);
lcd.print("INTERNET");
delay(2000);
lastReconnectAttempt = 0;
}
void loop() {
if (!client.connected()) {
long now = millis();
if (now - lastReconnectAttempt > 5000) {
lastReconnectAttempt = now;
if (reconnect()) {
lastReconnectAttempt = 0;
}
}
} else {
Blynk.run();
client.loop();
t = dht.readTemperature();
h = dht.readHumidity();
rain = analogRead(rainpin);
if (isnan(t) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
if (rain < 300) {
rainstatus = "VERY HEAVY RAIN";
} else if (rain > 300 && rain <= 450) {
rainstatus = "HEAVY RAIN";
} else if (rain > 450 && rain <= 600) {
rainstatus = "LIGHT RAIN";
} else {
rainstatus = "NO RAIN";
}
unsigned long currentMillis = millis();
static unsigned long previousMillis = 0;
const unsigned long interval = 2000;
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
snprintf(tempBuffer, sizeof(tempBuffer), "%.1f", t);
snprintf(humBuffer, sizeof(humBuffer), "%.1f", h);
strcpy(rainBuffer, rainstatus.c_str());
if (client.publish("proj/temperature", tempBuffer)) {
Serial.println("Temperature published successfully!");
} else {
Serial.println("Failed to publish temperature data!");
}
if (client.publish("proj/humidity", humBuffer)) {
Serial.println("Humidity published successfully!");
} else {
Serial.println("Failed to publish humidity data!");
}
if (client.publish("proj/rain_status", rainBuffer)) {
Serial.println("Rain status published successfully!");
} else {
Serial.println("Failed to publish rain status data!");
}
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print((char) 223);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(h);
lcd.print("%");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RAIN STATUS");
lcd.setCursor(0, 1);
lcd.print(rainstatus);
delay(1000);
}
}
</code>
#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "*****"
#define BLYNK_TEMPLATE_NAME "****"
#define BLYNK_AUTH_TOKEN "****"
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <BlynkSimpleEsp8266.h>
#define DHTPIN D5
#define rainpin A0
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const char* ssid = "*****";
const char* password = "****";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
LiquidCrystal_I2C lcd(0x27, 16, 2);
char auth[] = "*****";
float t, h;
int rain;
String rainstatus;
char tempBuffer[10], humBuffer[10], rainBuffer[50];
long lastReconnectAttempt;
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Message received on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
Serial.println(message);
if (strcmp(topic, "proj/temperature") == 0) {
t = message.toFloat();
Blynk.virtualWrite(0, t);
} else if (strcmp(topic, "proj/humidity") == 0) {
h = message.toFloat();
Blynk.virtualWrite(1, h);
} else if (strcmp(topic, "proj/rain_status") == 0) {
rainstatus = message;
Blynk.virtualWrite(2, rainstatus);
}
}
boolean reconnect() {
if (client.connect("ESP8266Client")) {
Serial.println("MQTT Connection Established");
client.subscribe("proj/temperature");
client.subscribe("proj/humidity");
client.subscribe("proj/rain_status");
}
return client.connected();
}
void setup() {
Serial.begin(9600);
pinMode(rainpin, INPUT);
dht.begin();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
lcd.init();
lcd.backlight();
lcd.print(" IoT WEATHER");
lcd.setCursor(0, 1);
lcd.print(" STATION");
delay(2000);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("CONNECTING TO");
lcd.setCursor(3, 1);
lcd.print("INTERNET");
Blynk.begin(auth, ssid, password);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("CONNECTED TO");
lcd.setCursor(3, 1);
lcd.print("INTERNET");
delay(2000);
lastReconnectAttempt = 0;
}
void loop() {
if (!client.connected()) {
long now = millis();
if (now - lastReconnectAttempt > 5000) {
lastReconnectAttempt = now;
if (reconnect()) {
lastReconnectAttempt = 0;
}
}
} else {
Blynk.run();
client.loop();
t = dht.readTemperature();
h = dht.readHumidity();
rain = analogRead(rainpin);
if (isnan(t) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
if (rain < 300) {
rainstatus = "VERY HEAVY RAIN";
} else if (rain > 300 && rain <= 450) {
rainstatus = "HEAVY RAIN";
} else if (rain > 450 && rain <= 600) {
rainstatus = "LIGHT RAIN";
} else {
rainstatus = "NO RAIN";
}
unsigned long currentMillis = millis();
static unsigned long previousMillis = 0;
const unsigned long interval = 2000;
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
snprintf(tempBuffer, sizeof(tempBuffer), "%.1f", t);
snprintf(humBuffer, sizeof(humBuffer), "%.1f", h);
strcpy(rainBuffer, rainstatus.c_str());
if (client.publish("proj/temperature", tempBuffer)) {
Serial.println("Temperature published successfully!");
} else {
Serial.println("Failed to publish temperature data!");
}
if (client.publish("proj/humidity", humBuffer)) {
Serial.println("Humidity published successfully!");
} else {
Serial.println("Failed to publish humidity data!");
}
if (client.publish("proj/rain_status", rainBuffer)) {
Serial.println("Rain status published successfully!");
} else {
Serial.println("Failed to publish rain status data!");
}
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print((char) 223);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(h);
lcd.print("%");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RAIN STATUS");
lcd.setCursor(0, 1);
lcd.print(rainstatus);
delay(1000);
}
}
I am using the PubSubClient.h library for MQTT protocol and Blynk as my frontend. Despite subscribing to the topics and successfully publishing data (except for a few instances where data publication fails), my callback function is not triggered. However, the callback function must trigger so that I can receive the incoming message and write it on Blynk.
New contributor
Hassan Murtaza is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.