#include <WiFi.h>
#include <time.h>
#include <LiquidCrystal.h>
#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(23, 22, 21, 19, 18, 17);
// ===== WIFI =====
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ===== NTP =====
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 7 * 3600; // WIB (UTC+7)
const int daylightOffset_sec = 0;
// ===== CUSTOM SEGMENTS =====
byte segment[8][8] = {
{ B01111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 },
{ B11111, B11111, B11111, B00000, B00000, B00000, B00000, B00000 },
{ B11110, B11111, B11111, B11111, B11111, B11111, B11111, B11111 },
{ B11111, B11111, B11111, B11111, B11111, B11111, B11111, B01111 },
{ B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111 },
{ B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11110 },
{ B11111, B11111, B11111, B00000, B00000, B00000, B11111, B11111 },
{ B11111, B00000, B00000, B00000, B00000, B11111, B11111, B11111 }
};
int col = 0;
int number;
// ===== SETUP =====
void setup() {
lcd.begin(16, 2);
dht.begin();
for (byte i = 0; i < 8; i++) {
lcd.createChar(i, segment[i]);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Connecting.");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
lcd.print(".");
}
lcd.clear();
lcd.print("wifi connected");
delay(1500);
lcd.clear();
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
delay(1000);
}
// ===== LOOP =====
void loop() {
for (int count = 0; count < 10; count++) {
lcd.clear();
showClock();
delay(500);
}
lcd.clear();
for (int count2 = 0; count2 < 10; count2++) {
displayDHT();
delay(500);
}
lcd.clear();
for (int count2 = 0; count2 < 10; count2++) {
displayDHTH();
delay(500);
}
lcd.clear();
}
// ===== DIGITS =====
void digit0() {
lcd.setCursor(col, 0);
lcd.write((uint8_t)0);
lcd.write((uint8_t)1);
lcd.write((uint8_t)2);
lcd.setCursor(col, 1);
lcd.write((uint8_t)3);
lcd.write((uint8_t)4);
lcd.write((uint8_t)5);
}
void digit1() {
lcd.setCursor(col, 0);
lcd.write((uint8_t)1);
lcd.write((uint8_t)2);
lcd.setCursor(col + 1, 1);
lcd.write((uint8_t)5);
}
void digit2() {
lcd.setCursor(col, 0);
lcd.write((uint8_t)6);
lcd.write((uint8_t)6);
lcd.write((uint8_t)2);
lcd.setCursor(col, 1);
lcd.write((uint8_t)3);
lcd.write((uint8_t)7);
lcd.write((uint8_t)7);
}
void digit3() {
lcd.setCursor(col, 0);
lcd.write((uint8_t)6);
lcd.write((uint8_t)6);
lcd.write((uint8_t)2);
lcd.setCursor(col, 1);
lcd.write((uint8_t)7);
lcd.write((uint8_t)7);
lcd.write((uint8_t)5);
}
void digit4() {
lcd.setCursor(col, 0);
lcd.write((uint8_t)3);
lcd.write((uint8_t)4);
lcd.write((uint8_t)2);
lcd.setCursor(col + 2, 1);
lcd.write((uint8_t)5);
}
void digit5() {
lcd.setCursor(col, 0);
lcd.write((uint8_t)0);
lcd.write((uint8_t)6);
lcd.write((uint8_t)6);
lcd.setCursor(col, 1);
lcd.write((uint8_t)7);
lcd.write((uint8_t)7);
lcd.write((uint8_t)5);
}
void digit6() {
lcd.setCursor(col, 0);
lcd.write((uint8_t)0);
lcd.write((uint8_t)6);
lcd.write((uint8_t)6);
lcd.setCursor(col, 1);
lcd.write((uint8_t)3);
lcd.write((uint8_t)7);
lcd.write((uint8_t)5);
}
void digit7() {
lcd.setCursor(col, 0);
lcd.write((uint8_t)1);
lcd.write((uint8_t)1);
lcd.write((uint8_t)2);
lcd.setCursor(col + 1, 1);
lcd.write((uint8_t)0);
}
void digit8() {
lcd.setCursor(col, 0);
lcd.write((uint8_t)0);
lcd.write((uint8_t)6);
lcd.write((uint8_t)2);
lcd.setCursor(col, 1);
lcd.write((uint8_t)3);
lcd.write((uint8_t)7);
lcd.write((uint8_t)5);
}
void digit9() {
lcd.setCursor(col, 0);
lcd.write((uint8_t)0);
lcd.write((uint8_t)6);
lcd.write((uint8_t)2);
lcd.setCursor(col + 2, 1);
lcd.write((uint8_t)5);
}
void showDigit() {
switch (number) {
case 0: digit0(); break;
case 1: digit1(); break;
case 2: digit2(); break;
case 3: digit3(); break;
case 4: digit4(); break;
case 5: digit5(); break;
case 6: digit6(); break;
case 7: digit7(); break;
case 8: digit8(); break;
case 9: digit9(); break;
}
}
// ===== SHOW CLOCK =====
void showClock() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) return;
int hours = timeinfo.tm_hour;
int minutes = timeinfo.tm_min;
int seconds = timeinfo.tm_sec;
lcd.setCursor(8, 0);
lcd.print(seconds & 1 ? "." : " ");
lcd.setCursor(8, 1);
lcd.print(seconds & 1 ? "." : " ");
col = 0; number = hours / 10; showDigit();
col = 4; number = hours % 10; showDigit();
col = 9; number = minutes / 10; showDigit();
col = 13; number = minutes % 10; showDigit();
}
void displayDHT() {
float h = dht.readHumidity();
float t = dht.readTemperature(); // Celsius
float f = dht.readTemperature(true);
lcd.clear();
if (isnan(h) || isnan(t)) {
lcd.setCursor(0, 0);
lcd.print("DHT Error");
return;
}
lcd.setCursor(0, 0);
lcd.print("Temp C: ");
lcd.print(t, 1);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Temp F: ");
lcd.print(f, 1);
lcd.print((char)223);
lcd.print("F");
}
void displayDHTH() {
float h = dht.readHumidity();
lcd.clear();
if (isnan(h)) {
lcd.setCursor(0, 0);
lcd.print("DHT Error");
return;
}
lcd.setCursor(0, 0);
lcd.print("Humid : ");
lcd.print(h, 1);
lcd.print("%");
}