#include "DHT.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#define lebar 128
#define tinggi 64
#define reset -1
#define addr 0x3C
#define DHTPIN 11
#define DHTTYPE DHT22
float minimalSuhu = 20;
float maksimalSuhu = 30;
String keterangan;
DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 oled(lebar, tinggi, &Wire, reset);
void printCenter(String text, String mode, int tinggiTeks = 0, int ukuranText = 1, String warna = "putih") {
int16_t x1, y1;
uint16_t w, h;
uint16_t textColor;
if (warna == "putih") {
textColor = SSD1306_WHITE;
} else if (warna == "hitam") {
textColor = SSD1306_BLACK;
} else if (warna == "invert") {
textColor = SSD1306_INVERSE;
} oled.getTextBounds(text, 0, tinggiTeks, &x1, &y1, &w, &h);
while (w > lebar && text.length() > 0) {
text.remove(text.length() - 1);
text.trim();
text += "...";
oled.getTextBounds(text, 0, tinggiTeks, &x1, &y1, &w, &h);
} oled.setTextSize(ukuranText);
oled.setTextColor(textColor);
if (mode == "normal") {
int x = (lebar - w) / 2;
oled.setCursor(x, tinggiTeks);
oled.println(text);
} else if (mode == "center") {
int x = (lebar - w) / 2;
int y = (tinggi - h) / 2;
oled.setCursor(x, y);
oled.println(text);
} else if (mode == "centerX") {
int x = (lebar - w) / 2;
oled.setCursor(x, tinggiTeks);
oled.println(text);
}
}
void setup() {
Serial.begin(9600);
Wire.begin();
dht.begin();
if (!oled.begin(SSD1306_SWITCHCAPVCC, addr)) {
Serial.println(F("eror"));
while (true);
}
oled.clearDisplay();
printCenter("Sensor Suhu", "center", 0, 1, "putih");
oled.display();
delay(2000);
}
void loop() {
float kelembapan = dht.readHumidity();
float suhu = dht.readTemperature();
oled.clearDisplay();
if (isnan(suhu) || isnan(kelembapan)) {
printCenter("Gagal membaca dari sensor DHT22!","center",0,2,"putih");
return;
}
printCenter("Suhu: " + String(suhu, 1) + " C", "centerX", 10, 1, "putih");
printCenter("Kelembapan : " + String(kelembapan, 1) + " %", "centerX", 22, 1, "putih");
if (suhu < minimalSuhu) {
keterangan = "Terlalu Dingin";
}
else if (suhu >= minimalSuhu && suhu <= maksimalSuhu) {
keterangan = "Suhu ideal";
}
else if (suhu > maksimalSuhu) {
keterangan = "Terlalu Panas";
}
printCenter(keterangan, "centerX", 40, 1, "putih");
oled.display();
delay(200);
}