#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
RTC_DS1307 rtc;
#define DHTPIN 2 // Czujnik DHT podpięty do pinu numer 2
// Można użyć także pinów 3, 4, 5, 12, 13 or 14 --
// Odkomentuj właściwy typ sensora:
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
#define LDRPIN A3
#define DIGITALLDRPIN 3
const float GAMMA = 0.7;
const float RL10 = 50;
#define R 6
#define G 5
#define B 4
LiquidCrystal_I2C lcd(0x27, 16, 2);
bool dangerous(float temp, float humidity, float light) {
bool tempDanger = temp > 70 || temp < -30;
bool humidityDanger = humidity > 90 || humidity < 10;
bool lightDanger = light > 90000 || light < 1;
return tempDanger || humidityDanger || lightDanger;
}
bool closeToDangerous(float temp, float humidity, float light) {
bool tempDanger = temp > 60 || temp < -20;
bool humidityDanger = humidity > 80 || humidity < 20;
bool lightDanger = light > 80000 || light < 10;
return tempDanger || humidityDanger || lightDanger;
}
void setup() {
Serial.begin(115200);
Serial.println("Arduino Uno Wokwi Test");
// Initialize LCD
lcd.init();
lcd.backlight();
// Initialize DHT sensor
dht.begin();
// Print sensor details
sensor_t sensor;
dht.temperature().getSensor(&sensor);
Serial.print("Temperature Sensor: ");
Serial.print(sensor.name);
Serial.print(" | Version: ");
Serial.println(sensor.version);
dht.humidity().getSensor(&sensor);
Serial.print("Humidity Sensor: ");
Serial.print(sensor.name);
Serial.print(" | Version: ");
Serial.println(sensor.version);
// Set up pin modes
pinMode(LDRPIN, INPUT);
// Calculate minimum delay between measurements
delayMS = sensor.min_delay / 1000;
rtc.begin();
}
void loop() {
// Odstęp czasowy pomiędzy pomiarami na podst. delayMS.
delay(delayMS);
// Pobierz i wyświetl wartość temperatury.
sensors_event_t event;
float temp;
float humidity;
float light;
dht.temperature().getEvent(&event);
temp = event.temperature;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T=");
lcd.setCursor(2, 0);
lcd.print(temp);
// Pobierz i wyświetl wartość wilgotności.
dht.humidity().getEvent(&event);
humidity = event.relative_humidity;
lcd.setCursor(8, 0);
lcd.print("H=");
lcd.setCursor(10, 0);
lcd.print(humidity);
lcd.setCursor(0,1);
light = analogRead(LDRPIN);
int analogValue = analogRead(LDRPIN);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
light = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
if (digitalRead(DIGITALLDRPIN) == LOW) {
lcd.print("Light! ");
} else {
lcd.print("Dark ");
}
DateTime now = rtc.now();
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second());
if (dangerous(temp, humidity, light)) {
digitalWrite(R, HIGH);
digitalWrite(G, LOW);
digitalWrite(B, LOW);
} else if(closeToDangerous(temp, humidity, light)) {
digitalWrite(R, HIGH);
digitalWrite(G, HIGH);
digitalWrite(B, LOW);
} else {
digitalWrite(R, LOW);
digitalWrite(G, HIGH);
digitalWrite(B, LOW);
}
}