#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHT.h"
#include <WiFi.h>
#include "time.h"
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* ntpServer = "3.cz.pool.ntp.org";
const long gmtOffset_sec = 0;
const int daylightOffset_sec = 3600;
unsigned long lastUpdateTime = 0;
const unsigned long interval = 10000;
int currentScreen = 0;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define DHTTYPE DHT22
#define PIR 32
#define POT 35
#define LED 27
#define LEDW 26
#define RELAY 23
#define TEP 4
#define LDR 15
#define LED_TMP 19
#define TEMP_RELAY 18
int hodnota_potenciometr;
const float BETA = 3950;
bool pohybDetekovan = false;
unsigned long posledniPohybTime = 0;
const long intervalPohyb = 5000;
DHT dht(TEP, DHTTYPE);
void pohyb() {
int val = digitalRead(PIR);
if (val == HIGH) {
pohybDetekovan = true;
//Serial.println("Zaznamenán pohyb");
posledniPohybTime = millis();
} else {
pohybDetekovan = false;
//Serial.println("Bez pohybu");
}
if (pohybDetekovan) {
digitalWrite(LEDW, HIGH);
digitalWrite(RELAY, HIGH);
}
if (millis() - posledniPohybTime >= intervalPohyb) {
digitalWrite(LEDW, LOW);
digitalWrite(RELAY, LOW);
}
display.setCursor(0, 20);
display.print("Pohyb: ");
display.println(pohybDetekovan ? "ANO" : "NE");
}
void jas(){
hodnota_potenciometr = analogRead(POT);
// Serial.print("Hodnota potenciometru je: ");
//Serial.println(hodnota_potenciometr);
int jas = map(hodnota_potenciometr, 0, 4095, 0, 255);
analogWrite(LED, jas);
display.setCursor(0, 10);
display.print("Potenciometr: ");
display.println(hodnota_potenciometr);
}
void teplota(){
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
float hif = dht.computeHeatIndex(f, h);
float hic = dht.computeHeatIndex(t, h, false);
/*
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F Heat index: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));
*/
display.setCursor(0,30);
display.print("Teplota: ");
display.print(t);
display.println(" C");
if(t < 15 ){
digitalWrite(TEMP_RELAY, HIGH);
} else {
digitalWrite(TEMP_RELAY, LOW);
}
}
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(POT, INPUT);
pinMode(PIR, INPUT);
pinMode(TEP, INPUT);
pinMode(LDR, INPUT);
pinMode(LED, OUTPUT);
pinMode(LEDW, OUTPUT);
pinMode(RELAY, OUTPUT);
pinMode(LED_TMP,OUTPUT);
pinMode(TEMP_RELAY, OUTPUT);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED inicializace selhala"));
for (;;);
}
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
// Init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
//disconnect WiFi as it's no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
//display.println(&timeinfo, "%A,%B %d %Y %H:%M:%S");
display.println(&timeinfo, "%A,%B %d");
display.setTextSize(2);
display.setCursor(15,15);
display.println(&timeinfo, "%H:%M:%S");
char timeHour[3];
strftime(timeHour,3, "%H", &timeinfo);
char timeWeekDay[10];
strftime(timeWeekDay,10, "%A", &timeinfo);
display.display();
}
void loop() {
pohyb();
jas();
teplota();
screenchange();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("Hello, ESP32!"));
jas();
pohyb();
teplota();
light();
/*
display.setCursor(0,40);
display.print("Room: ");
if (digitalRead(LDR) == LOW) {
display.print("Zhasnuto");
//Serial.println("Light!");
digitalWrite(LED_TMP, LOW);
} else {
display.print("Rozsviceno");
//Serial.println("Dark");
digitalWrite(LED_TMP, HIGH);
}
display.display();
*/
}
void light() {
pohyb();
jas();
teplota();
display.setCursor(0,40);
display.print("Room: ");
if (digitalRead(LDR) == LOW) {
display.print("Zhasnuto");
//Serial.println("Light!");
digitalWrite(LED_TMP, LOW);
} else {
display.print("Rozsviceno");
//Serial.println("Dark");
digitalWrite(LED_TMP, HIGH);
}
display.display();
}
void screenchange(){
unsigned long currentMillis = millis();
if (currentMillis - lastUpdateTime >= interval) {
lastUpdateTime = currentMillis;
currentScreen = (currentScreen + 1) % 2;
display.clearDisplay();
if (currentScreen == 0) {
printLocalTime();
} else {
light();
}
}
}