//========= DHT22 Sensor ================//
#include <DHT.h>
const int DHTPIN = 12;
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE); // Membuat Object
float temperature;
float humidity;
//========= LDR Sensor ================//
const int LDRSensor = 32;
float intensitasCahaya; //Lux
//========= PIR Motion Sensor ================//
const byte PIRSENSOR = 4;
bool motion;
String Smotion;
//========== OLED Declaration ==========//
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
//========== RTC Declaration ==========//
#include <RTClib.h>
RTC_DS3231 rtc;
String currentTime;
void setup() {
Serial.begin(115200);
// Initialize DHT sensor
dht.begin();
pinMode(DHTPIN, INPUT);
pinMode(LDRSensor, INPUT);
pinMode(PIRSENSOR, INPUT);
// Initialize OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (true); // Stop if OLED initialization fails
}
delay(2000);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(25, 15);
display.println("EDSPERT");
display.setCursor(20, 40);
display.println("BOOTCAMP");
display.display();
delay(2000);
display.clearDisplay();
// Initialize RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (true);
}
// Sync RTC with compile time (Only run once to set time)
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
temperature = dht.readTemperature(); // Membaca nilai suhu
humidity = dht.readHumidity(); // Membaca nilai kelembapan
int nilaiADC = analogRead(LDRSensor);
intensitasCahaya = intensitas(nilaiADC); // Conversi ADC ke Lux
motion = digitalRead(PIRSENSOR);
if(motion == 1){Smotion = "Detected";}
else{Smotion = "Undetected";}
Serial.print("Suhu : ");
Serial.print(temperature);
Serial.print("\tKelembapan : ");
Serial.print(humidity);
Serial.print("\tIntensitas : ");
Serial.print(intensitasCahaya);
Serial.print("\tObject : ");
Serial.println(Smotion);
delay(1000);
DateTime now = rtc.now();
currentTime = formatDateTime(now);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
// Title
display.setCursor(15, 0);
display.print("NILAI PARAMETER");
display.setCursor(15,3);
display.print("_______________");
// Temperature
display.setCursor(8, 14);
display.print("Temp : ");
display.print(temperature, 2);
display.print(" ");
display.print((char)247); // Degree symbol
display.print("C");
// Humidity
display.setCursor(8, 24);
display.print("Humi : ");
display.print(humidity, 2);
display.print(" %");
// Light
display.setCursor(8, 34);
display.print("Light: ");
display.print(intensitasCahaya, 2);
display.print(" Lux");
// Motion
display.setCursor(8, 44);
display.print("Obj : ");
display.print(motion ? "Detected" : "Undetected");
// Current Time
display.setCursor(5, 54);
display.print(time);
display.display();
}
//========= Format RTC Time =========//
String formatDateTime(DateTime now) {
char buffer[20];
sprintf(buffer, "%04d/%02d/%02d %02d:%02d:%02d",
now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second());
return String(buffer);
}
//================ LDR Sensor ==========//
// Fungsi untuk mengconversi nilai ADC menjadi Intensitas
float intensitas(int adcValue){
// These constants should match the photoresistor's "gamma" and "rl10" attributes
const float GAMMA = 0.7;
const float RL10 = 33;;
// Convert the analog value into lux value:
float voltage = adcValue / 4096. * 3.3;
float resistance = 2000 * voltage / (1 - voltage / 3.3);
float luxValue = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
return luxValue;
}