#include "definition.h"
//der Digitale Output vom LDR betreibt eine andere Led die bei 100 Lux angeht
float temperatur = 24.00; //bei mehr als 24°C geht das Fenster auf oder
float feuchte = 50.00; //bei 50% luftfeuchte geht das fenster auf
int ldrSchwellWert = 1558; //bei 200 LUX geht das programmierte licht an. ich hab dafür nur den ldr genommen
//um den Alarm zurückzusetzen bitte den Button gedrückt halten
//LED Stucked ist nur eine Kontrolle falls der Button festhängt. Dann erneut auf den Button klicken.
void setup() {
Serial.begin(9600);
servo.attach(servoPin, 500, 2400);
lcd.begin(16, 2);
pinMode(PIR_PIN, INPUT);
pinMode(RESET_PIN, INPUT);
pinMode(LED_ALARM, OUTPUT);
pinMode(LDR_PIN, INPUT);
pinMode(LED_G, OUTPUT);
pinMode(KONTROLL_LED, OUTPUT);
pinMode(SPEAKER_PIN, OUTPUT);
dht.setup(DHT_PIN, DHTesp::DHT22);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Addresse 0x3C für 128x64
display.clearDisplay();
display.display(); //display die Ausgabe machen lassen
}
void loop() {
ausgabe(); //displayausgabe temperatur, licht an oder aus, luftfeuchte
licht(); //lichtsensor auslesen
temp(); //temperatur und luftfeuchte sensor auslesen
bewegungErkannt(); //der Melder löst aus und startet am ende die void startalarm
resetAlarm();
}
void temp() {
TempAndHumidity data = dht.getTempAndHumidity(); //vordefinierter wert um die Luftfeuchte und Temperatur auszulesen
if (data.temperature > temperatur or data.humidity > feuchte) { //Temperatur oder Luftfeuchte bei mehr als 25°C oder 50% Luftfeuchte Fenster auf
servo.write(pos - 90);
} else { //Temp, Luftfeuchte unter 25, 50 dann fenster zu
servo.write(pos + 90);
}
}
void licht() {
int ldrWert = analogRead(A6); //Analoger Channel 6 für Lichtsensor
if (analogRead(A6) <= ldrSchwellWert) {
digitalWrite(LED_G, LOW);
lichtAusgabe = false;
} else {
digitalWrite(LED_G, HIGH);
lichtAusgabe = true;
}
}
void ausgabe() {
TempAndHumidity data = dht.getTempAndHumidity(); //temperatursensor daten abgreifen
display.clearDisplay(); //display leeren
display.setTextSize(1.5); //display textgröße
display.setTextColor(SSD1306_WHITE);
display.setCursor(3, 13); //Display Position
if (lichtAusgabe == false){ //Hier ist nur die Ausgabe die auf dem Display erscheint
display.println("Licht aus.");
display.setCursor(3, 33); //damit wird die Position des textes in Pixeln platziert
display.println("Temperatur: " + String(data.temperature) + "*C"); //Temperatur mit den daten des DHT als string formatiert für eine gemeinsame ausgabe
display.setCursor(3, 53);
display.println("Luftfeuchte: " + String(data.humidity) + "%");
display.display();
} else {
display.println("Licht an."); //Hier das gegenspiel zu Oben
display.setCursor(3, 33);
display.println("Temperatur: " + String(data.temperature) + "*C");
display.setCursor(3, 53);
display.println("Luftfeuchte: " + String(data.humidity) + "%");
display.display();
}
}
void bewegungErkannt() {
if (digitalRead(PIR_PIN) == HIGH) { // Bewegung erkannt durch den Melder
if (!motionDetected) { // Vorher keine Bewegung
motionDetected = true; //bewegung auf wahr gesetzt für die schleife
startAlarm(); //schleife für die LED und den Piepton
}
}
}
void resetAlarm() {
if (digitalRead(RESET_PIN) == HIGH) { // Reset beim Button gedrückt halten
motionDetected = false; //zurücksetzen der Bewegung
lcd.clear(); //lcd Anzeige leeren
lcd.setCursor(2,0);
lcd.println("Erfolgreicher"); //LCD Ausgabe für den Alarmreset
lcd.setCursor(3, 1);
lcd.println("Alarm RESET!"); // wenn die RESET BUTTON STUCKED LED leuchtet hängt der Butten und muss erneut gedrückt werden
digitalWrite(KONTROLL_LED, HIGH); //LED für die Kontrolle ob Signal vom Button durch geht
} else {
digitalWrite(KONTROLL_LED, LOW); //erfolgreiches zurücksetzen des Alarmes schaltet Orange Kontrolllampe aus
delay(2000);
lcd.clear(); //Ausblenden der LCD Anzeige nach Alarm RESET.
}
}
void startAlarm() {
while (motionDetected == true) { //bewegung in schleife abgefragt mit einem wahrheitswert
if (digitalRead(RESET_PIN) == HIGH){ //durch drücken button wird die bewegung zurück gesetzt
motionDetected = false; //manuelles zurücksetzen der bewegung
loop();
} else { //da bewegung erkannt wurde folgt er diesen anweisungen
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Alarm");
lcd.setCursor(0,1);
lcd.print("Bewegung erkannt!");
digitalWrite(LED_ALARM, HIGH);
tone(SPEAKER_PIN, 880, 100);
delay(500);
digitalWrite(LED_ALARM, LOW);
noTone(SPEAKER_PIN);
delay(500);
}
}
}
Loading
ssd1306
ssd1306