#include <WiFi.h>
#include <PubSubClient.h>
#include <DHTesp.h>
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#define pinDht 15
DHTesp dhtSensor;
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define MQTT_SERVER "demo.thingsboard.io"
#define MQTT_PORT 1883
#define MQTT_CLIENT_ID "uioo7ccl0g32d9qppmua"
#define MQTT_USERNAME "d0pe8gj2avruimoj1y15"
#define MQTT_PASSWORD "iy4sndpkzv4zks3mwwzw"
WiFiClient espClient;
PubSubClient client(espClient);
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
static const unsigned char image_Lock_7x8_bits[] U8X8_PROGMEM = {0x1c,0x22,0x22,0x7f,0x7f,0x77,0x7f,0x3e};
static const unsigned char image_Bluetooth_Idle_5x8_bits[] U8X8_PROGMEM = {0x04,0x0d,0x16,0x0c,0x0c,0x16,0x0d,0x04};
static const unsigned char image_Volup_8x6_bits[] U8X8_PROGMEM = {0x48,0x8c,0xaf,0xaf,0x8c,0x48};
static const unsigned char image_Alert_9x8_bits[] U8X8_PROGMEM = {0x10,0x00,0x38,0x00,0x28,0x00,0x6c,0x00,0x6c,0x00,0xfe,0x00,0xee,0x00,0xff,0x01};
int progress = 0;
char buffer[32];
void connectToWiFi() {
Serial.print("Connecting to Wi-Fi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
unsigned long startAttemptTime = millis();
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 10000) {
delay(500);
Serial.print(".");
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nConnected to Wi-Fi");
} else {
Serial.println("\nWi-Fi connection failed. Retrying...");
}
}
void connectToMQTT() {
Serial.print("Connecting to MQTT...");
while (!client.connected()) {
if (client.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) {
Serial.println("Connected to MQTT");
} else {
Serial.print("Failed to connect to MQTT. Error code: ");
Serial.println(client.state());
delay(2000);
}
}
}
void sendDataToThingsBoard(float temp, float hum) {
if (isnan(temp) || isnan(hum)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
String payload = "{";
payload += "\"temperature\":" + String(temp, 2) + ",";
payload += "\"humidity\":" + String(hum, 2);
payload += "}";
if (client.publish("v1/devices/me/telemetry", payload.c_str())) {
Serial.println("Data sent successfully: " + payload);
} else {
Serial.println("Failed to send data");
}
}
void setup() {
Serial.begin(115200);
dhtSensor.setup(pinDht, DHTesp::DHT22);
u8g2.begin(); // Initialize the display
connectToWiFi();
client.setServer(MQTT_SERVER, MQTT_PORT);
connectToMQTT();
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
connectToWiFi();
}
if (!client.connected()) {
connectToMQTT();
}
// Read data from DHT sensor
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float temp = data.temperature;
float hum = data.humidity;
// Display on OLED
static const unsigned char image_Voltage_bits[] = {0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x80,0x01,0xc0,0x01,0xe0,0x00,0xf0,0x07,0x80,0x03,0xc0,0x01,0xc0,0x00,0x60,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
u8g2.clearBuffer();
u8g2.setFontMode(1);
u8g2.setBitmapMode(1);
u8g2.setFont(u8g2_font_timR24_tr);
u8g2.drawStr(35, 31, "SPU");
u8g2.setFont(u8g2_font_timR18_tr);
u8g2.drawStr(24, 55, "CPE212");
u8g2.drawXBM(9, 39, 16, 16, image_Voltage_bits);
u8g2.sendBuffer();
// Send data to ThingsBoard
sendDataToThingsBoard(temp, hum);
client.loop();
progress = progress + 1;
if (progress > 100) {
progress = 0;
}
delay(300); // Delay for 3 seconds
}