#define BLYNK_TEMPLATE_ID "TMPL6Pd0KfW8E"
#define BLYNK_TEMPLATE_NAME "ESP32S3"
#define BLYNK_AUTH_TOKEN "PboC-R0dgxkoGiVJeXyd60JbeXGDIk1O"
#define BLYNK_PRINT Serial
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHTesp.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>
#define BLYNK_TEMP V0
#define BLYNK_HUMI V1
#define BLYNK_TERMINAL V2
#define BLYNK_CITY_TEMP V3
#define BLYNK_CITY_HUMI V4
#define RED_LED 4
#define RED_LED_ON digitalWrite(RED_LED, HIGH)
#define RED_LED_OFF digitalWrite(RED_LED, LOW)
#define GREEN_LED 5
#define GREEN_LED_ON digitalWrite(GREEN_LED, HIGH)
#define GREEN_LED_OFF digitalWrite(GREEN_LED, LOW)
WidgetTerminal terminal(BLYNK_TERMINAL);
BlynkTimer timer;
BlynkTimer weather_timer;
int DHT_PIN = 21;
double last_temp = 0.0, last_humi = 0.0;
DHTesp myDHT22;
// OLED parameters
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C // Change if required
#define ROTATION 0 // Rotates text on OLED 1=90 degrees, 2=180 degrees
// Define display object
Adafruit_SSD1306 myOLED(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// OpenWeatherMap API details
String api_key = "14a9d4c4e5a579495d7c10b500d77a45";
String city = "Busan";
String country_code = "KR";
String server_path = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + country_code + "&units=metric&APPID=" + api_key;
JSONVar city_weather;
void setup() {
timer.setInterval(1000L, readSensor);
weather_timer.setInterval(30000L, weatherUpdate);
Blynk.begin(BLYNK_AUTH_TOKEN, "Wokwi-GUEST", "", "blynk.cloud", 80);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
myDHT22.setup(DHT_PIN, DHTesp::DHT22);
Serial.begin(115200);
Serial.println("Hello form ESP32-S3");
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if (!myOLED.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
// Show splash screen
myOLED.display();
delay(2000); // Pause for 2 seconds
// Display settings
myOLED.clearDisplay();
myOLED.setTextSize(1); // Normal 1:1 pixel scale
myOLED.setTextColor(WHITE); // Draw white text
myOLED.setRotation(ROTATION); // Set screen rotation
myOLED.setCursor(0, 0); // Start from top-left corner
myOLED.print("IoT System Design");
myOLED.setCursor(15, 15);
myOLED.print("Busan Weather");
myOLED.display();
delay(2000);
}
void loop() {
timer.run();
weather_timer.run();
Blynk.run();
}
void readSensor() {
TempAndHumidity values = myDHT22.getTempAndHumidity();
Blynk.virtualWrite(BLYNK_TEMP, values.temperature);
Blynk.virtualWrite(BLYNK_HUMI, values.humidity);
if ((values.temperature != last_temp) || (values.humidity != last_humi)) {
myOLED.clearDisplay();
myOLED.setCursor(15, 5);
myOLED.print("Local Weather");
myOLED.setCursor(5, 25);
myOLED.print("Temp: " + String(values.temperature, 1) + char(247) + "C");
myOLED.setCursor(5, 45);
myOLED.print("Humi: " + String(values.humidity, 1) + "%");
myOLED.display();
last_temp = values.temperature;
last_humi = values.humidity;
}
}
void weatherUpdate() {
if (WiFi.status() == WL_CONNECTED) {
String jsonBuffer = httpGETRequest(server_path.c_str());
JSONVar weather_data = JSON.parse(jsonBuffer);
// Check if parsing succeeded
if (JSON.typeof(weather_data) == "undefined") {
Serial.println("Parsing failed!");
return;
}
// Extract temperature and humidity
double temp = (double)weather_data["main"]["temp"];
double humidity = (double)weather_data["main"]["humidity"];
// Send data to Blynk
Blynk.virtualWrite(BLYNK_CITY_TEMP, temp);
Blynk.virtualWrite(BLYNK_CITY_HUMI, humidity);
city_weather = weather_data;
}
}
// Function to perform HTTP GET request
String httpGETRequest(const char* server_name) {
HTTPClient http;
http.begin(server_name);
int httpResponseCode = http.GET();
String payload = "{}";
if (httpResponseCode > 0) {
payload = http.getString();
} else {
Serial.print("HTTP Error: ");
Serial.println(httpResponseCode);
}
http.end();
return payload;
}
BLYNK_WRITE(BLYNK_TERMINAL) {
String cmd = param.asStr();
if (cmd == "local temp") {
TempAndHumidity values = myDHT22.getTempAndHumidity();
terminal.println("Temp: " + String(values.temperature) + "\u00B0C");
} else if (cmd == "local humi") {
TempAndHumidity values = myDHT22.getTempAndHumidity();
terminal.println("Humi: " + String(values.humidity) + "%");
} else if (cmd == "red on") {
RED_LED_ON;
} else if (cmd == "red off") {
RED_LED_OFF;
} else if (cmd == "green on") {
GREEN_LED_ON;
} else if (cmd == "green off") {
GREEN_LED_OFF;
} else {
terminal.println("Invalid command");
}
}