#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <time.h>
#include <DHT.h>
#define DHTPIN 2 // what pin we're connected to
#define DHTTYPE DHT22
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
// Replace with your network credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// OpenWeatherMap API
const char* server = "api.openweathermap.org";
String apiKey = "2268f19d883e77b03c4300f159a50922";
String city = "Haiphong, VN";
String units = "metric";
String weatherData;
// Time settings
struct tm timeinfo;
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 7 * 3600; // GMT +7 for Vietnam
const int daylightOffset_sec = 0;
int i=240; boolean ck=0;
void setup() {
dht.begin(); // initialize dht
pinMode(34, INPUT_PULLUP);
// Initialize Serial
Serial.begin(115200);
// Initialize OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
// Connect to WiFi
WiFi.begin(ssid, password);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Connecting to WiFi ...");
display.display();
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi");
display.clearDisplay();
display.setCursor(0, 0);
display.print("Connected to WiFi");
// Initialize NTP
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}
void loop() {
// Get current time from NTP
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time");
return;
}
// Display data on OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.drawRect(1, 52, 126, 12, SSD1306_WHITE);
display.setCursor(5, 54);
display.print(&timeinfo, "%d/%m/%Y");
display.setCursor(77, 54);
display.print(&timeinfo, "%H:%M:%S");
display.display();
if(digitalRead(34)==0) ck=!ck;
if (ck==0) {
dispweather();
}
else {
displayTempHumid();
}
if (i==240) {
// Fetch weather data
weatherData = getWeatherData();
i=0;
}
i=i+1;
delay(250); // Update every minute
}
void dispweather() {
// Display data on OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 10);
display.print("Time: ");
display.print(&timeinfo, "%H:%M:%S");
display.setCursor(0, 0);
//display.print("Hai Phong Weather");
display.setCursor(0, 20);
display.print("T: ");
display.print(parseWeatherData(weatherData, "temp"));
display.print(" C");
display.setCursor(64, 20);
display.print("H:");
display.print(parseWeatherData(weatherData, "humidity"));
display.print("%");
display.setCursor(0, 30);
display.print("Press: ");
display.print(parseWeatherData(weatherData, "pressure"));
display.print(" hPa");
display.setCursor(0, 40);
display.print("Condition: ");
display.print(parseWeatherData(weatherData, "description"));
display.display();
}
String getWeatherData() {
HTTPClient http;
String url = String("http://") + server + "/data/2.5/weather?q=" + city + "&appid=" + apiKey + "&units=" + units;
http.begin(url);
int httpCode = http.GET();
String payload = "";
if (httpCode > 0) {
payload = http.getString();
}
http.end();
return payload;
}
String parseWeatherData(String weatherData, String key) {
int startIndex = weatherData.indexOf(key);
int startValue = weatherData.indexOf(":", startIndex) + 1;
int endValue = weatherData.indexOf(",", startValue);
if (endValue == -1) {
endValue = weatherData.indexOf("}", startValue);
}
String value = weatherData.substring(startValue, endValue);
value.trim();
value.replace("\"", "");
return value;
}
void displayTempHumid(){
int h = dht.readHumidity()-10;
// Read temperature as Celsius
int t = dht.readTemperature();
Serial.println(t);
Serial.println(h);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) ) {
display.clearDisplay(); // clearing the display
display.setTextColor(SSD1306_WHITE); //setting the color
display.setTextSize(1); //set the font size
display.setCursor(5,0); //set the cursor coordinates
display.print("Failed to read from DHT sensor!");
return;
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("Humid: ");
display.print(h);
display.print(" %");
display.setCursor(0,10);
display.print("Temp: ");
display.print(t);
display.print(" C");
display.display();
}