CO2 Gassensor Testen
Re: CO2 Gassensor Testen
Ja, heute ist kein Poblem
ich schicke mal die Zeichnung per mail, da gibt es ein Problem
ich schicke mal die Zeichnung per mail, da gibt es ein Problem
Grüße aus der Heimat der E69
- Admin
- Administrator
- Beiträge: 1251
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: CO2 Gassensor Testen
Ja, so ist es. Ich war mal wieder zu voreilig. Lasse die Bohrungen weg, die mache ich dann selber.
Dankeeeeee
Franz
Dankeeeeee
Franz
- Admin
- Administrator
- Beiträge: 1251
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: CO2 Gassensor Testen
So ich habe jetzt das Gerät provisorisch eingebaut. Mir fehlt noch die Abschaltunf des Motors nach Zeit. Also der braucht ja eine gewisse Zeit zum öffnen des Fenster, genauso zum schließen das Fensters. Eigentlich brauche ich mir da keinen Kopf machen, weil in dem Gerät einstellbare Endanschläge vorhanden sind. Aber ich mag die Zeit so bekessen, dass das Fenster kurz nachdem es im Enganschlag gestoppt wurde, die Spannung abgeschalten wird. Das eine Sicherheit drin ist, wenn der Automatische Endabschalter streikt. Und das in beide Richtungen. Dann ist es so wie ich es haben will. Ja die Abdeckung fehlt noch, inder das Display der Fenster auf - zu - Automatic schalten und der Taster für Display ein / aus.
Hier ist das aktuelle Programm.
.
Hier ist das aktuelle Programm.
.
Code: Alles auswählen
// Arduino CO2 Sensor - MH-Z19 Beispiel und Sketch
// https://iotspace.dev/arduino-co2-sensor-mh-z19-beispiel-und-sketch
/*
bis 400 frische Außenluft
bis 800 hohe Raumluftqualität
bis 1000 akzeptabel „Pettenkoferzahl“
1000–2000 Hygienisch auffällig
über 2000 Hygienisch inakzeptabel
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include "DHT.h"
#define DHTPIN1 2 // Hier die Pin Nummer eintragen wo der Sensor1 angeschlossen ist
#define DHTPIN2 3 // Hier die Pin Nummer eintragen wo der Sensor2 angeschlossen ist
#define DHTTYPE DHT22 // Hier wird definiert was für ein Sensor DHT11 oder DHT22 !!
DHT dht1(DHTPIN1, DHTTYPE); //Sensor1 einrichten
DHT dht2(DHTPIN2, DHTTYPE); //Sensor2 einrichten
int DataPin = 6; // Pin für CO2 Sensor
const byte RPWM = 9;
const byte LPWM = 10;
const byte offen = 11;
byte schalter1 = 0;
const byte zu = 12;
byte schalter2 = 0;
const byte Taster = 13;
byte fenstermerker = 0;
byte Tasterstatus = 0;
byte Tastenmerker = 0;
unsigned long Sekundenablauf01 = 0; // Tastenabfrage von Taster 300ms aussetzen
const unsigned long Pausezeit01 = 300;
int ppmrange = 5000;
unsigned long pwmtime;
int PPM = 0;
float pulsepercent = 0;
byte lueftung = 0;
unsigned long Sekundenablauf02 = 0; // Programmpause 5 Sekunden
const unsigned long Pausezeit02 = 5000;
//-----------------------AusgangPIN7-------------------------------------
const byte Ausgang01 = 7; // Pin 7 LED1
byte Ausgangsstatus01 = 0;
//-----------------------AusgangPIN8-------------------------------------
const byte Ausgang02 = 8; // Pin 8 LED2
byte Ausgangsstatus02 = 0;
//-----------------------AusgangPIN9-------------------------------------
const byte Ausgang03 = 9; // Pin 9 LED3
byte Ausgangsstatus03 = 0;
//-------------------------Tonausgabe PIN 17-----------------------------
const byte tonPin = 17;
const int frequenz = 1000;
unsigned long tonZeit = 50;
//--------------------------------------------------------------
void setup() {
lcd.begin();
lcd.backlight();
lcd.setCursor (0, 0);
lcd.print (F(" - CO2 Bel""\xF5""ftung -"));
pinMode(DataPin, INPUT);
Serial.begin(9600);
// Luftfeuchte und Temperatur Sensoren
dht1.begin(); // Sensor1 starten
dht2.begin(); // Sensor2 starten
//-----------Ausgänge einrichten--------------------------------------
Ausgangsstatus01 = 0; // LED
pinMode(Ausgang01, OUTPUT);
Ausgangsstatus02 = 0; // LED
pinMode(Ausgang02, OUTPUT);
Ausgangsstatus03 = 0; // LED
pinMode(Ausgang03, OUTPUT);
pinMode(RPWM, OUTPUT); // PWM Motorsteuerung auf
pinMode(LPWM, OUTPUT); // PWM Motorsteuerung zu
pinMode(offen, INPUT_PULLUP); // Schalter Fenster auf
pinMode(zu, INPUT_PULLUP); // Schalter Fenster zu
pinMode(Taster, INPUT_PULLUP); // Taster Display ein/aus
}
//--------------------------------------------------------------
void loop()
{
//-------------Taster lesen-----------------------------------------------
if (millis() - Sekundenablauf01 >= Pausezeit01) { // 300msec abgelaufen?
Tasterstatus = digitalRead(Taster); // Pin von Taster abfragen
if (Tasterstatus == LOW) { // Ist Taster gedrueckt?
Tastenmerker = !Tastenmerker; // Merken dass Taster gedrueckt wurde
if (Tastenmerker == LOW)
{
lcd.noBacklight();
}
else
{
lcd.backlight();
}
Sekundenablauf01 = millis(); // Die 300ms neu starten
}
}
//-------------------------------------------------------------------------
if (millis() - Sekundenablauf02 >= Pausezeit02) { // 5000ms abgelaufen?
Sekundenablauf02 = millis(); // Die 5000ms neu starten
//-----------------------------------------------------------------------
pwmtime = pulseIn(DataPin, HIGH, 2000000) / 1000;
float pulsepercent = pwmtime / 1004.0;
PPM = ppmrange * pulsepercent;
lcd.setCursor (0, 3);
lcd.print (F(" CO2 in PPM = "));
lcd.setCursor (14, 3);
lcd.print (F(" "));
lcd.setCursor (14, 3);
lcd.print (PPM);
float h1 = dht1.readHumidity(); // Lesen der Luftfeuchtigkeit1 und speichern in die Variable h1
float t1 = dht1.readTemperature(); // Lesen der Temperatur in °C1 und speichern in die Variable t1
float h2 = dht2.readHumidity(); // Lesen der Luftfeuchtigkeit2 und speichern in die Variable h2
float t2 = dht2.readTemperature(); // Lesen der Temperatur in °C2 und speichern in die Variable t2
//--------------------------
lcd.setCursor (18, 1);
lcd.print (F(" "));
lcd.setCursor (0, 1);
lcd.print (F(" L1 "));
lcd.print (h1);
lcd.print (F("% T1 "));
lcd.setCursor (14, 1);
lcd.print (t1);
if (t1 < 10)
{
lcd.setCursor (14, 1);
lcd.print (F(" "));
lcd.print (t1);
}
//------------------------
lcd.setCursor (18, 2);
lcd.print (F(" "));
lcd.setCursor (0, 2);
lcd.print (F(" L2 "));
lcd.print (h2);
lcd.print (F("% T2 "));
lcd.setCursor (14, 2);
lcd.print (t2);
if (t2 < 10)
{
lcd.setCursor (14, 2);
lcd.print (F(" "));
lcd.print (t2);
}
//-----------------------
if (PPM <= 1000)
{
Ausgangsstatus01 = 1;
Ausgangsstatus02 = 0;
}
if ((PPM > 1000) && (PPM < 2000))
{
Ausgangsstatus01 = 0;
Ausgangsstatus02 = 1;
}
if (PPM > 2000)
{
Ausgangsstatus01 = 0;
Ausgangsstatus02 = 0;
tone(tonPin, frequenz, tonZeit);
}
//----------------------
//---Lüftung Einschaltbedingung-----
if (lueftung == 0)
{
if ((t1 > 22) && (PPM > 900))
{
lueftung = 1;
Ausgangsstatus03 = 1; //Fenster öffnen
}
}
//---Lüftung Ausschaltbedingung-----
if (lueftung == 1)
{
if ((t1 < 20) || (PPM < 430))
{
lueftung = 0;
Ausgangsstatus03 = 0; //Fenster zu
}
}
//-------------Schalter lesen-------------------------------------------
schalter1 = digitalRead(offen);
if (schalter1 == LOW)
{
fenstermerker = 1;
}
schalter2 = digitalRead(zu);
if (schalter2 == LOW)
{
fenstermerker = 2;
}
if ((schalter1 == HIGH) && (schalter2 == HIGH))
{
fenstermerker = 0;
}
//-------------LED01 schalten-------------------------------------------
digitalWrite (Ausgang01, Ausgangsstatus01); // Ausgang01 LED Grün umschalten
//-------------LED02 schalten-------------------------------------------
digitalWrite (Ausgang02, Ausgangsstatus02); // Ausgang02 LED Gelb umschalten
//-------------LED03 schalten-------------------------------------------
digitalWrite (Ausgang03, Ausgangsstatus03); // Ausgang03 LED Rot (Blau) umschalten
//------------------Fenster öffnen--------------------------------------
if (((lueftung == 1) && (fenstermerker == 0)) || (fenstermerker == 1))
{
analogWrite(LPWM, 0);
analogWrite(RPWM, 255);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster ist offen "));
}
//------------------Fenster schließen-----------------------------------
if (((lueftung == 0) && (fenstermerker == 0)) || (fenstermerker == 2))
{
analogWrite(LPWM, 255);
analogWrite(RPWM, 0);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster geschlossen "));
}
}
}
- Admin
- Administrator
- Beiträge: 1251
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: CO2 Gassensor Testen
Heute Nacht war Probelauf. Es geht schon recht gut.
. Die Aluabdeckung für Display, Schalter und Taster fehlt noch, und eine kleine Softwareänderung, dann gefällt mir das Ding. Ja und ein Vorhang, der das ganze einigermassen verdeckt.
Und das Kabel zum Motor wird noch gegen ein reinweisses ausgetauscht und in der Ecke am Fensterrahmen mit heißkleber sauber runter verlegt. Das ist inzwischen erledigt, wie man am Bild sehen kann, ist das Kabel verlängert, neu verlegt, und nicht mehr zu kurz.
Hier die aktuelle Software:
PS: Ich habe jetzt diesen Code nochmal ausgetauscht und er ist jetzt so wie ich ihn im Moment haben will. Also der Motorstop ist jetzt auch drin. Mein Motor läuft bis zum Anschlag, egal ob auf oder zu, etwa 12 Sekunden. Ich habe jetzt den Motorstopp nach 15 Sekunden eingebaut. Also sollte der Motoreigene Endanschlag des Fenster Stellmotors nicht mehr funktionieren, wird er trotzdem nach einer Fahrzeit von 15 Sekunden gestoppt. Eine Alternative wäre noch, dass man die Stromaufnahme des Motors kontrolliert und dann bei deutlicher Erhöhung des benötigen Strom´s sofort die Fahrt unterbricht. Wäre kein Problem das Gerät um diese Funktion zu erweitern. Aber ich sehe jetzt, jedenfalls im Moment, keine Notwendigkeit dafür.
. Die Aluabdeckung für Display, Schalter und Taster fehlt noch, und eine kleine Softwareänderung, dann gefällt mir das Ding. Ja und ein Vorhang, der das ganze einigermassen verdeckt.


Hier die aktuelle Software:
PS: Ich habe jetzt diesen Code nochmal ausgetauscht und er ist jetzt so wie ich ihn im Moment haben will. Also der Motorstop ist jetzt auch drin. Mein Motor läuft bis zum Anschlag, egal ob auf oder zu, etwa 12 Sekunden. Ich habe jetzt den Motorstopp nach 15 Sekunden eingebaut. Also sollte der Motoreigene Endanschlag des Fenster Stellmotors nicht mehr funktionieren, wird er trotzdem nach einer Fahrzeit von 15 Sekunden gestoppt. Eine Alternative wäre noch, dass man die Stromaufnahme des Motors kontrolliert und dann bei deutlicher Erhöhung des benötigen Strom´s sofort die Fahrt unterbricht. Wäre kein Problem das Gerät um diese Funktion zu erweitern. Aber ich sehe jetzt, jedenfalls im Moment, keine Notwendigkeit dafür.
Code: Alles auswählen
// Arduino CO2 Sensor - MH-Z19 Beispiel und Sketch
// https://iotspace.dev/arduino-co2-sensor-mh-z19-beispiel-und-sketch
/*
bis 400 frische Außenluft
bis 800 hohe Raumluftqualität
bis 1000 akzeptabel „Pettenkoferzahl“
1000–2000 Hygienisch auffällig
über 2000 Hygienisch inakzeptabel
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include "DHT.h"
const byte DHTPIN1 = 2; // Hier die Pin Nummer eintragen wo der Sensor1 angeschlossen ist
const byte DHTPIN2 = 3; // Hier die Pin Nummer eintragen wo der Sensor2 angeschlossen ist
#define DHTTYPE DHT22 // Hier wird definiert was für ein Sensor DHT11 oder DHT22 !!
DHT dht1(DHTPIN1, DHTTYPE); //Sensor1 einrichten
DHT dht2(DHTPIN2, DHTTYPE); //Sensor2 einrichten
const byte DataPin = 6; // Pin für CO2 Sensor
const byte RPWM = 9;
const byte LPWM = 10;
unsigned long motostart = 0;
unsigned long motolauf = 15000;
//-------Schalter------
const byte offen = 11;
byte schalter1 = 0;
const byte zu = 12;
byte schalter2 = 0;
byte schaltermerker = 0;
byte schaltermerker2 = 0;
//-------Taster-------
const byte Taster = 13;
byte Tasterstatus = 0;
byte Tastenmerker = 0;
unsigned long Sekundenablauf01 = 0; // Tastenabfrage von Taster 300ms aussetzen
const unsigned long Pausezeit01 = 300;
//----CO2 Sensor------
int ppmrange = 5000;
unsigned long pwmtime;
int PPM = 0;
float pulsepercent = 0;
//---Fenstersteller--
byte lueftung = 0;
byte lueftung2 = 0;
//---Programm Pause--
unsigned long Sekundenablauf02 = 5000; // Programmpause 5 Sekunden
const unsigned long Pausezeit02 = 5000;
void setup() {
lcd.begin();
lcd.backlight();
pinMode(DataPin, INPUT);
Serial.begin(9600);
// Luftfeuchte und Temperatur Sensoren
dht1.begin(); // Sensor1 starten
dht2.begin(); // Sensor2 starten
//-----------Aus-/Eingänge einrichten-------------------------------------
pinMode(RPWM, OUTPUT); // PWM Motorsteuerung auf
pinMode(LPWM, OUTPUT); // PWM Motorsteuerung zu
pinMode(offen, INPUT_PULLUP); // Schalter Fenster auf
pinMode(zu, INPUT_PULLUP); // Schalter Fenster zu
pinMode(Taster, INPUT_PULLUP); // Taster Display ein/aus
}
//--------------------------------------------------------------------------
void loop()
{
//-------------Taster lesen-----------------------------------------------
if (millis() - Sekundenablauf01 >= Pausezeit01) { // 200msec abgelaufen?
Tasterstatus = digitalRead(Taster); // Pin von Taster abfragen
if (Tasterstatus == LOW) { // Ist Taster gedrueckt?
Tastenmerker = !Tastenmerker; // Merken dass Taster gedrueckt wurde
if (Tastenmerker == LOW)
{
lcd.noBacklight();
}
else
{
lcd.backlight();
}
Sekundenablauf01 = millis(); // Die 200ms neu starten
}
}
//-------------------------------------------------------------------------
if (millis() - Sekundenablauf02 >= Pausezeit02) { // 5000ms abgelaufen?
Sekundenablauf02 = millis(); // Die 5000ms neu starten
//-----------------------------------------------------------------------
pwmtime = pulseIn(DataPin, HIGH, 2000000) / 1000;
float pulsepercent = pwmtime / 1004.0;
PPM = ppmrange * pulsepercent;
lcd.setCursor (0, 3);
lcd.print (F(" CO2 in PPM = "));
lcd.setCursor (14, 3);
lcd.print (F(" "));
lcd.setCursor (14, 3);
lcd.print (PPM);
float h1 = dht1.readHumidity(); // Lesen der Luftfeuchtigkeit1 und speichern in die Variable h1
float t1 = dht1.readTemperature(); // Lesen der Temperatur in °C1 und speichern in die Variable t1
float h2 = dht2.readHumidity(); // Lesen der Luftfeuchtigkeit2 und speichern in die Variable h2
float t2 = dht2.readTemperature(); // Lesen der Temperatur in °C2 und speichern in die Variable t2
//--------------------------
lcd.setCursor (18, 1);
lcd.print (F(" "));
lcd.setCursor (0, 1);
lcd.print (F(" L1 "));
lcd.print (h1);
lcd.print (F("% T1 "));
lcd.setCursor (14, 1);
lcd.print (t1);
if (t1 < 10)
{
lcd.setCursor (14, 1);
lcd.print (F(" "));
lcd.print (t1);
}
lcd.setCursor (19, 1);
lcd.print (F(" "));
//------------------------
lcd.setCursor (18, 2);
lcd.print (F(" "));
lcd.setCursor (0, 2);
lcd.print (F(" L2 "));
lcd.print (h2);
lcd.print (F("% T2 "));
lcd.setCursor (14, 2);
lcd.print (t2);
if (t2 < 10)
{
lcd.setCursor (14, 2);
lcd.print (F(" "));
lcd.print (t2);
}
lcd.setCursor (19, 2);
lcd.print (F(" "));
//---Lüftung Einschaltbedingung-----
if (lueftung == 0)
{
if ((t1 >= 23) && (PPM > 900))
{
lueftung = 1;
}
}
//---Lüftung Ausschaltbedingung-----
if (lueftung == 1)
{
if ((t1 <= 21) || (PPM < 430))
{
lueftung = 0;
}
}
//-------------Schalter lesen-------------------------------------------
schalter1 = digitalRead(offen);
if (schalter1 == LOW)
{
schaltermerker = 1;
}
schalter2 = digitalRead(zu);
if (schalter2 == LOW)
{
schaltermerker = 2;
}
if ((schalter1 == HIGH) && (schalter2 == HIGH))
{
schaltermerker = 0;
}
lcd.setCursor (14 , 0);
lcd.print (schaltermerker);
lcd.print (F(" - "));
lcd.print (lueftung);
//---------------Motoranforderung überwachen--------------------------------
if ((lueftung != lueftung2) || (schaltermerker != schaltermerker2))
{
//------------------Fenster öffnen--------------------------------------
if (((lueftung == 1) && (schaltermerker == 0)) || (schaltermerker == 1))
{
analogWrite(LPWM, 0);
analogWrite(RPWM, 255);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster auf "));
}
//------------------Fenster schließen-----------------------------------
if (((lueftung == 0) && (schaltermerker == 0)) || (schaltermerker == 2))
{
analogWrite(LPWM, 255);
analogWrite(RPWM, 0);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster zu "));
}
motostart = millis();
lueftung2 = lueftung;
schaltermerker2 = schaltermerker;
}
if (millis() - motolauf >= motostart)
{
analogWrite(LPWM, 0);
analogWrite(RPWM, 0);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster Stop "));
}
}
}
- Admin
- Administrator
- Beiträge: 1251
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: CO2 Gassensor Testen
Nochmal eine kleine Änderung. Ich wollte. dass das Display von alleine dunkel wird, wenn ich es auch nicht ausschalte. Es wird nach 10 Min automatisch dunkel, wenn der Fenstermotor angesprochen wird, dann wird das Display wieder eingeschalten, dass man den Hinweiß Fenster auf / Fenster zu / Fenster stopp sehen kann. Nach 10 Min ist es wieder aus.
Also diese Änderung ist im Programm hier enthalten:
.
Also diese Änderung ist im Programm hier enthalten:
.
Code: Alles auswählen
// Arduino CO2 Sensor - MH-Z19 Beispiel und Sketch
// https://iotspace.dev/arduino-co2-sensor-mh-z19-beispiel-und-sketch
/*
bis 400 frische Außenluft
bis 800 hohe Raumluftqualität
bis 1000 akzeptabel „Pettenkoferzahl“
1000–2000 Hygienisch auffällig
über 2000 Hygienisch inakzeptabel
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include "DHT.h"
const byte DHTPIN1 = 2; // Hier die Pin Nummer eintragen wo der Sensor1 angeschlossen ist
const byte DHTPIN2 = 3; // Hier die Pin Nummer eintragen wo der Sensor2 angeschlossen ist
#define DHTTYPE DHT22 // Hier wird definiert was für ein Sensor DHT11 oder DHT22 !!
DHT dht1(DHTPIN1, DHTTYPE); //Sensor1 einrichten
DHT dht2(DHTPIN2, DHTTYPE); //Sensor2 einrichten
const byte DataPin = 6; // Pin für CO2 Sensor
const byte RPWM = 9;
const byte LPWM = 10;
unsigned long motostart = 0;
unsigned long motolauf = 15000;
//-------Schalter------
const byte offen = 11;
byte schalter1 = 0;
const byte zu = 12;
byte schalter2 = 0;
byte schaltermerker = 0;
byte schaltermerker2 = 0;
//-------Taster-------
const byte Taster = 13;
byte Tasterstatus = 0;
byte Tastenmerker = 0;
unsigned long Sekundenablauf01 = 0; // Tastenabfrage von Taster 300ms aussetzen
const unsigned long Pausezeit01 = 300;
unsigned long Sekundenablauf03 = 0; // Displayzeit 10 Min. hell
const unsigned long Pausezeit03 = 60000 * 10UL;
//----CO2 Sensor------
int ppmrange = 5000;
unsigned long pwmtime;
int PPM = 0;
float pulsepercent = 0;
//---Fenstersteller--
byte lueftung = 0;
byte lueftung2 = 0;
//---Programm Pause--
unsigned long Sekundenablauf02 = 5000; // Programmpause 5 Sekunden
const unsigned long Pausezeit02 = 5000;
void setup() {
lcd.begin();
lcd.backlight();
pinMode(DataPin, INPUT);
Serial.begin(9600);
// Luftfeuchte und Temperatur Sensoren
dht1.begin(); // Sensor1 starten
dht2.begin(); // Sensor2 starten
//-----------Aus-/Eingänge einrichten-------------------------------------
pinMode(RPWM, OUTPUT); // PWM Motorsteuerung auf
pinMode(LPWM, OUTPUT); // PWM Motorsteuerung zu
pinMode(offen, INPUT_PULLUP); // Schalter Fenster auf
pinMode(zu, INPUT_PULLUP); // Schalter Fenster zu
pinMode(Taster, INPUT_PULLUP); // Taster Display ein/aus
}
//--------------------------------------------------------------------------
void loop()
{
//-------------Taster lesen-----------------------------------------------
if (millis() - Sekundenablauf01 >= Pausezeit01) { // 200msec abgelaufen?
Tasterstatus = digitalRead(Taster); // Pin von Taster abfragen
if (Tasterstatus == LOW) { // Ist Taster gedrueckt?
Tastenmerker = !Tastenmerker; // Merken dass Taster gedrueckt wurde
if (Tastenmerker == LOW)
{
lcd.noBacklight();
}
else
{
lcd.backlight();
Sekundenablauf03 = millis();
}
Sekundenablauf01 = millis(); // Die 200ms neu starten
}
}
if (millis() - Sekundenablauf03 >= Pausezeit03) // 10 Min. abgelaufen?
{
Tastenmerker = LOW; // Tastenmerker auf Displaybeleuchtung aus
lcd.noBacklight(); // Displaybeleuchtung aus
}
//-------------------------------------------------------------------------
if (millis() - Sekundenablauf02 >= Pausezeit02) { // 5000ms abgelaufen?
Sekundenablauf02 = millis(); // Die 5000ms neu starten
//-----------------------------------------------------------------------
pwmtime = pulseIn(DataPin, HIGH, 2000000) / 1000;
float pulsepercent = pwmtime / 1004.0;
PPM = ppmrange * pulsepercent;
lcd.setCursor (0, 3);
lcd.print (F(" CO2 in PPM = "));
lcd.setCursor (14, 3);
lcd.print (F(" "));
lcd.setCursor (14, 3);
lcd.print (PPM);
float h1 = dht1.readHumidity(); // Lesen der Luftfeuchtigkeit1 und speichern in die Variable h1
float t1 = dht1.readTemperature(); // Lesen der Temperatur in °C1 und speichern in die Variable t1
float h2 = dht2.readHumidity(); // Lesen der Luftfeuchtigkeit2 und speichern in die Variable h2
float t2 = dht2.readTemperature(); // Lesen der Temperatur in °C2 und speichern in die Variable t2
//--------------------------
lcd.setCursor (18, 1);
lcd.print (F(" "));
lcd.setCursor (0, 1);
lcd.print (F(" L1 "));
lcd.print (h1);
lcd.print (F("% T1 "));
lcd.setCursor (14, 1);
lcd.print (t1);
if (t1 < 10)
{
lcd.setCursor (14, 1);
lcd.print (F(" "));
lcd.print (t1);
}
lcd.setCursor (19, 1);
lcd.print (F(" "));
//------------------------
lcd.setCursor (18, 2);
lcd.print (F(" "));
lcd.setCursor (0, 2);
lcd.print (F(" L2 "));
lcd.print (h2);
lcd.print (F("% T2 "));
lcd.setCursor (14, 2);
lcd.print (t2);
if (t2 < 10)
{
lcd.setCursor (14, 2);
lcd.print (F(" "));
lcd.print (t2);
}
lcd.setCursor (19, 2);
lcd.print (F(" "));
//---Lüftung Einschaltbedingung-----
if (lueftung == 0)
{
if ((t1 >= 23) && (PPM > 900))
{
lueftung = 1;
}
}
//---Lüftung Ausschaltbedingung-----
if (lueftung == 1)
{
if ((t1 <= 21) || (PPM < 430))
{
lueftung = 0;
}
}
//-------------Schalter lesen-------------------------------------------
schalter1 = digitalRead(offen);
if (schalter1 == LOW)
{
schaltermerker = 1;
}
schalter2 = digitalRead(zu);
if (schalter2 == LOW)
{
schaltermerker = 2;
}
if ((schalter1 == HIGH) && (schalter2 == HIGH))
{
schaltermerker = 0;
}
lcd.setCursor (14 , 0);
lcd.print (schaltermerker);
lcd.print (F(" - "));
lcd.print (lueftung);
//---------------Motoranforderung überwachen--------------------------------
if ((lueftung != lueftung2) || (schaltermerker != schaltermerker2))
{
Tastenmerker = HIGH; //Tastenmerker für Displaybeleuchtung
lcd.backlight(); // Displaybeleuchtung ein
//------------------Fenster öffnen--------------------------------------
if (((lueftung == 1) && (schaltermerker == 0)) || (schaltermerker == 1))
{
analogWrite(LPWM, 0);
analogWrite(RPWM, 255);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster auf "));
}
//------------------Fenster schließen-----------------------------------
if (((lueftung == 0) && (schaltermerker == 0)) || (schaltermerker == 2))
{
analogWrite(LPWM, 255);
analogWrite(RPWM, 0);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster zu "));
}
motostart = millis();
lueftung2 = lueftung;
schaltermerker2 = schaltermerker;
}
if (millis() - motolauf >= motostart)
{
analogWrite(LPWM, 0);
analogWrite(RPWM, 0);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster Stop "));
}
}
}
- Admin
- Administrator
- Beiträge: 1251
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: CO2 Gassensor Testen
Hi Wolfgang.
Lieferung angekommen. Alles gut
Kreutztische ausgepackt. Den werde ich fürs Erste auf der Ständerbohrmaschiene platzieren. Das sollte funktionieren. Und im Laufe des neuen Jahres kommen Nema 34 Motoren dran, und ein Umbau, dass ich auch die Z - Achse habe. Aber das muss noch ein wenig warten. Für´s erste geht das mit der Ständerbormaschine.
Die Alupanels sind auch suuuuper. Passen wunderbar. da muss ich nur noch auf den bestellten Klebstoff warten den ich erst heute bestellt habe. Sekundekleber für Metall, Glas, Kunststoff, mit Kunststoff Granulat zum einstreuen. Damit bekommt man alles bombenfest. Sowas hatte ich schon mal aber habe mal vergessen in wieder in der Kühlung zu lagern, dann wurde er unbrauchbar.
Also kommende Woche ist der Abschluss an dem Gerät fällig. Heute hat es schon wieder sehr gut seinen Dienst getan.
Danke einstweilen, schönes Wochenende.
Franz
Lieferung angekommen. Alles gut

Kreutztische ausgepackt. Den werde ich fürs Erste auf der Ständerbohrmaschiene platzieren. Das sollte funktionieren. Und im Laufe des neuen Jahres kommen Nema 34 Motoren dran, und ein Umbau, dass ich auch die Z - Achse habe. Aber das muss noch ein wenig warten. Für´s erste geht das mit der Ständerbormaschine.
Die Alupanels sind auch suuuuper. Passen wunderbar. da muss ich nur noch auf den bestellten Klebstoff warten den ich erst heute bestellt habe. Sekundekleber für Metall, Glas, Kunststoff, mit Kunststoff Granulat zum einstreuen. Damit bekommt man alles bombenfest. Sowas hatte ich schon mal aber habe mal vergessen in wieder in der Kühlung zu lagern, dann wurde er unbrauchbar.
Also kommende Woche ist der Abschluss an dem Gerät fällig. Heute hat es schon wieder sehr gut seinen Dienst getan.

Danke einstweilen, schönes Wochenende.
Franz
- Admin
- Administrator
- Beiträge: 1251
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: CO2 Gassensor Testen
So, ich habe mal die Alufront eingebaut. Das Display habe ich nur mit Heißkleber eingeklebt. Schalter / Taster sind auch drin. Alles gut.
Oben in der ersten Reihe des Displays sieht man Fenster auf, wenn es gerade geöfnet wird, Fenster zu, wenn es gerade geschlossen wird, Fenster Stopp, wenn der Fenstermotor abgeschalten ist. Und rechts oben sieht man am Bild gerade "0 - 1". Der Einser steht für Fenster wegen erhöhter CO2 Werte geöffnet. Wenn da Null steht, dann ist das Fenster von der Steuerung geschlossen worden. Diese Null im Bild "0 - 1" sagt aus, dass die Automatik aktiviert ist, wenn da eine "1" steht, ist der Schalter auf Handsteuerung Fenster auf, wenn da eine "2" steht, ist der Schalter auf Handsteuerung Fenster zu. Steht der Schalter also auf 1 oder 2, dann kann die automatische Lüftungs-Steuerung das Fenster nicht mehr beeinflussen.
Franz
.
Oben in der ersten Reihe des Displays sieht man Fenster auf, wenn es gerade geöfnet wird, Fenster zu, wenn es gerade geschlossen wird, Fenster Stopp, wenn der Fenstermotor abgeschalten ist. Und rechts oben sieht man am Bild gerade "0 - 1". Der Einser steht für Fenster wegen erhöhter CO2 Werte geöffnet. Wenn da Null steht, dann ist das Fenster von der Steuerung geschlossen worden. Diese Null im Bild "0 - 1" sagt aus, dass die Automatik aktiviert ist, wenn da eine "1" steht, ist der Schalter auf Handsteuerung Fenster auf, wenn da eine "2" steht, ist der Schalter auf Handsteuerung Fenster zu. Steht der Schalter also auf 1 oder 2, dann kann die automatische Lüftungs-Steuerung das Fenster nicht mehr beeinflussen.
Franz
.
- Admin
- Administrator
- Beiträge: 1251
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: CO2 Gassensor Testen
So alles fertig. Der Fenstermotor ist nicht soooo schön aber robust und eusserst Preiswert.
.
.
- Admin
- Administrator
- Beiträge: 1251
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: CO2 Gassensor Testen
Ich bin immer noch am erweitern meines Codes für das Gerät. Klar das wird noch einige Zeit so gehen. Es sind eigentlich keine Fehler die ich damit rausmache, sondern so kleine Wünsche die mir immer wieder einfallen
Ich werde hier gelegentlich mal wieder ein SoftwareUpdate reinsetzen. Aber ich muss erst mal testen ob das Neue das tut, was es soll. So habe ich einen Zähler eingebaut, der mir anzeigt, wie oft seit dem letzten Löschen das Fenster geöffnet wurde. Ja, die erste Version war erst mal nur für mich, da hat der Zähler noch beim Öffnen und beim schießen eines hochgezählt. Also zwei für jede Öffnung. Ausserdem hatte ich noch keine Möglichkeit den Zähler wieder auf Null zu stellen. Jetzt habe ich gerade diese beiden Mankos beseitigt. Aber ob das so geht wie ich will
, schauma mal, dann seh´n wir´s schon 



Code: Alles auswählen
// Arduino CO2 Sensor - MH-Z19 Beispiel und Sketch
// https://iotspace.dev/arduino-co2-sensor-mh-z19-beispiel-und-sketch
/*
bis 400 frische Außenluft
bis 800 hohe Raumluftqualität
bis 1000 akzeptabel „Pettenkoferzahl“
1000–2000 Hygienisch auffällig
über 2000 Hygienisch inakzeptabel
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include "DHT.h"
const byte DHTPIN1 = 2; // Hier die Pin Nummer eintragen wo der Sensor1 angeschlossen ist
const byte DHTPIN2 = 3; // Hier die Pin Nummer eintragen wo der Sensor2 angeschlossen ist
#define DHTTYPE DHT22 // Hier wird definiert was für ein Sensor DHT11 oder DHT22 !!
DHT dht1(DHTPIN1, DHTTYPE); //Sensor1 einrichten
DHT dht2(DHTPIN2, DHTTYPE); //Sensor2 einrichten
const byte DataPin = 6; // Pin für CO2 Sensor
const byte RPWM = 9;
const byte LPWM = 10;
unsigned long motostart = 0;
unsigned long motolauf = 15000;
//-------Schalter------
const byte offen = 11;
byte schalter1 = 0;
const byte zu = 12;
byte schalter2 = 0;
byte schaltermerker = 0;
byte schaltermerker2 = 0;
//-------Taster-------
const byte Taster = 13;
byte Tasterstatus = 0;
byte Tastenmerker = 0;
unsigned long Sekundenablauf01 = 0; // Tastenabfrage von Taster 300ms aussetzen
const unsigned long Pausezeit01 = 300;
unsigned long Sekundenablauf03 = 0; // Displayzeit 10 Min. hell
const unsigned long Pausezeit03 = 60000 * 10UL;
//----CO2 Sensor------
int ppmrange = 5000;
unsigned long pwmtime;
int PPM = 0;
float pulsepercent = 0;
//---Fenstersteller--
byte lueftung = 0;
byte lueftung2 = 0;
int lueftungszaehler = 0;
//---Programm Pause--
unsigned long Sekundenablauf02 = 5000; // Programmpause 5 Sekunden
const unsigned long Pausezeit02 = 5000;
void setup() {
lcd.begin();
lcd.backlight();
pinMode(DataPin, INPUT);
Serial.begin(9600);
// Luftfeuchte und Temperatur Sensoren
dht1.begin(); // Sensor1 starten
dht2.begin(); // Sensor2 starten
//-----------Aus-/Eingänge einrichten-------------------------------------
pinMode(RPWM, OUTPUT); // PWM Motorsteuerung auf
pinMode(LPWM, OUTPUT); // PWM Motorsteuerung zu
pinMode(offen, INPUT_PULLUP); // Schalter Fenster auf
pinMode(zu, INPUT_PULLUP); // Schalter Fenster zu
pinMode(Taster, INPUT_PULLUP); // Taster Display ein/aus
}
//--------------------------------------------------------------------------
void loop()
{
//-------------Taster lesen-----------------------------------------------
if (millis() - Sekundenablauf01 >= Pausezeit01) { // 200msec abgelaufen?
Tasterstatus = digitalRead(Taster); // Pin von Taster abfragen
if (Tasterstatus == LOW) { // Ist Taster gedrueckt?
Tastenmerker = !Tastenmerker; // Merken dass Taster gedrueckt wurde
if (Tastenmerker == LOW)
{
lcd.noBacklight();
}
else
{
lcd.backlight();
Sekundenablauf03 = millis();
}
Sekundenablauf01 = millis(); // Die 200ms neu starten
}
}
if (millis() - Sekundenablauf03 >= Pausezeit03) // 10 Min. abgelaufen?
{
Tastenmerker = LOW; // Tastenmerker auf Displaybeleuchtung aus
lcd.noBacklight(); // Displaybeleuchtung aus
}
//----------------Lüftungszähler-------------------------------------------
if (lueftung == 1)
{
}
//-------------------------------------------------------------------------
if (millis() - Sekundenablauf02 >= Pausezeit02) { // 5000ms abgelaufen?
Sekundenablauf02 = millis(); // Die 5000ms neu starten
//-----------------------------------------------------------------------
pwmtime = pulseIn(DataPin, HIGH, 2000000) / 1000;
float pulsepercent = pwmtime / 1004.0;
PPM = ppmrange * pulsepercent;
lcd.setCursor (0, 3);
lcd.print (F(" CO2 in PPM = "));
lcd.setCursor (14, 3);
lcd.print (F(" "));
lcd.setCursor (14, 3);
lcd.print (PPM);
float h1 = dht1.readHumidity(); // Lesen der Luftfeuchtigkeit1 und speichern in die Variable h1
float t1 = dht1.readTemperature(); // Lesen der Temperatur in °C1 und speichern in die Variable t1
float h2 = dht2.readHumidity(); // Lesen der Luftfeuchtigkeit2 und speichern in die Variable h2
float t2 = dht2.readTemperature(); // Lesen der Temperatur in °C2 und speichern in die Variable t2
//--------------------------
lcd.setCursor (18, 1);
lcd.print (F(" "));
lcd.setCursor (0, 1);
lcd.print (F(" L1 "));
lcd.print (h1);
lcd.print (F("% T1 "));
lcd.setCursor (14, 1);
lcd.print (t1);
if (t1 < 10)
{
lcd.setCursor (14, 1);
lcd.print (F(" "));
lcd.print (t1);
}
lcd.setCursor (19, 1);
lcd.print (F(" "));
//------------------------
lcd.setCursor (18, 2);
lcd.print (F(" "));
lcd.setCursor (0, 2);
lcd.print (F(" L2 "));
lcd.print (h2);
lcd.print (F("% T2 "));
lcd.setCursor (14, 2);
lcd.print (t2);
if (t2 < 10)
{
lcd.setCursor (14, 2);
lcd.print (F(" "));
lcd.print (t2);
}
lcd.setCursor (19, 2);
lcd.print (F(" "));
//---Lüftung Einschaltbedingung-----
if (lueftung == 0)
{
if ((t1 >= 23) && (PPM > 900))
{
lueftung = 1;
}
}
//---Lüftung Ausschaltbedingung-----
if (lueftung == 1)
{
if ((t1 <= 21) || (PPM < 430))
{
lueftung = 0;
}
}
//-------------Schalter lesen-------------------------------------------
schalter1 = digitalRead(offen);
if (schalter1 == LOW)
{
schaltermerker = 1;
}
schalter2 = digitalRead(zu);
if (schalter2 == LOW)
{
schaltermerker = 2;
lueftungszaehler = 0;
}
if ((schalter1 == HIGH) && (schalter2 == HIGH))
{
schaltermerker = 0;
}
lcd.setCursor (14 , 0);
lcd.print (schaltermerker);
lcd.print (F("-"));
lcd.print (lueftung);
lcd.print (F("-"));
lcd.print (lueftungszaehler);
//---------------Motoranforderung überwachen--------------------------------
if ((lueftung != lueftung2) || (schaltermerker != schaltermerker2))
{
if ((lueftung == 0) && (schaltermerker == 0))
{
lueftungszaehler ++;
}
Tastenmerker = HIGH; //Tastenmerker auf Displaybeleuchtung ein
lcd.backlight(); // Displaybeleuchtung ein
//------------------Fenster öffnen--------------------------------------
if (((lueftung == 1) && (schaltermerker == 0)) || (schaltermerker == 1))
{
analogWrite(LPWM, 0);
analogWrite(RPWM, 255);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster auf "));
}
//------------------Fenster schließen-----------------------------------
if (((lueftung == 0) && (schaltermerker == 0)) || (schaltermerker == 2))
{
analogWrite(LPWM, 255);
analogWrite(RPWM, 0);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster zu "));
}
motostart = millis();
lueftung2 = lueftung;
schaltermerker2 = schaltermerker;
}
if (millis() - motolauf >= motostart)
{
analogWrite(LPWM, 0);
analogWrite(RPWM, 0);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster Stop "));
}
}
}
- Admin
- Administrator
- Beiträge: 1251
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: CO2 Gassensor Testen
Hier habe ich mal die benutzten Teile:
Der CO2 Sensor:
https://www.amazon.de/gp/product/B07VD1 ... UTF8&psc=1
Der Motortreiber:
https://www.ebay.de/itm/162573599073
Das Gehäuse:
https://www.ebay.de/itm/352270266330
Temperatur / Luftfeuchte Sensor:
https://www.reichelt.de/entwicklerboard ... os_0&nbc=1
LCD Display 4x20:
https://www.az-delivery.de/products/hd4 ... nittstelle
DC / DC Wandler:
https://www.amazon.de/LAOMAO-Step-up-Co ... 2082040955
Arduino Uno:
https://www.amazon.de/AZDelivery-Mikroc ... r=8-5&th=1
Das Netzteil ist ein externes 12 Volt 5 Amp. Netzteil. Extern ist unbedingt nötig, dass im Gehäuse keine Wärme entsteht. Das würde die Messungen mit den Sensoren im Gerät unmöglich machen. Ich habe die Bauteile mit Heißkleber befestigt, das reicht locker, die sind bombig fest, können aber mit sanfter Gewalt gelöst werden. Auch die Drähte habe ich mit dem Heißkleber befestigt, dadurch können sie an den Lötstellen nicht durch Vibrationen abbrechen. Man sieht die Lüftungslöcher an den Sensoren sehr gut und auch den Lüftungsspalt unter der Aluabdeckung, rund um die ganze Platte sieht man am zweiten Bild. Die Lüftung reicht ganz wunderbar. Ich habe jetzt, weil ich eh offen hatte, gleich noch unten rechts auf dem freien Platz einen Lautsprecher eingebaut. Der meldet, wenn die Automatik was anderes will, als die eingestellte Handsteuerung. Der Lautsprecher kommt auf Pin. 8 über einen 270 Ohm Widerstand gegen GND. Wenn der Ton alle 5 Sek. kommt, sollte man den Schalter auf Mittelstellung für Automatik stellen, dann macht das Fenster was die Automatik will, und der Ton hört auf.
Und hier die aktuelle Software:
Der CO2 Sensor:
https://www.amazon.de/gp/product/B07VD1 ... UTF8&psc=1
Der Motortreiber:
https://www.ebay.de/itm/162573599073
Das Gehäuse:
https://www.ebay.de/itm/352270266330
Temperatur / Luftfeuchte Sensor:
https://www.reichelt.de/entwicklerboard ... os_0&nbc=1
LCD Display 4x20:
https://www.az-delivery.de/products/hd4 ... nittstelle
DC / DC Wandler:
https://www.amazon.de/LAOMAO-Step-up-Co ... 2082040955
Arduino Uno:
https://www.amazon.de/AZDelivery-Mikroc ... r=8-5&th=1
Das Netzteil ist ein externes 12 Volt 5 Amp. Netzteil. Extern ist unbedingt nötig, dass im Gehäuse keine Wärme entsteht. Das würde die Messungen mit den Sensoren im Gerät unmöglich machen. Ich habe die Bauteile mit Heißkleber befestigt, das reicht locker, die sind bombig fest, können aber mit sanfter Gewalt gelöst werden. Auch die Drähte habe ich mit dem Heißkleber befestigt, dadurch können sie an den Lötstellen nicht durch Vibrationen abbrechen. Man sieht die Lüftungslöcher an den Sensoren sehr gut und auch den Lüftungsspalt unter der Aluabdeckung, rund um die ganze Platte sieht man am zweiten Bild. Die Lüftung reicht ganz wunderbar. Ich habe jetzt, weil ich eh offen hatte, gleich noch unten rechts auf dem freien Platz einen Lautsprecher eingebaut. Der meldet, wenn die Automatik was anderes will, als die eingestellte Handsteuerung. Der Lautsprecher kommt auf Pin. 8 über einen 270 Ohm Widerstand gegen GND. Wenn der Ton alle 5 Sek. kommt, sollte man den Schalter auf Mittelstellung für Automatik stellen, dann macht das Fenster was die Automatik will, und der Ton hört auf.
Und hier die aktuelle Software:
Code: Alles auswählen
// Arduino CO2 Sensor - MH-Z19 Beispiel und Sketch
// https://iotspace.dev/arduino-co2-sensor-mh-z19-beispiel-und-sketch
/*
bis 400 frische Außenluft
bis 800 hohe Raumluftqualität
bis 1000 akzeptabel „Pettenkoferzahl“
1000–2000 Hygienisch auffällig
über 2000 Hygienisch inakzeptabel
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include "DHT.h"
const byte DHTPIN1 = 2; // Hier die Pin Nummer eintragen wo der Sensor1 angeschlossen ist
const byte DHTPIN2 = 3; // Hier die Pin Nummer eintragen wo der Sensor2 angeschlossen ist
#define DHTTYPE DHT22 // Hier wird definiert was für ein Sensor DHT11 oder DHT22 !!
DHT dht1(DHTPIN1, DHTTYPE); //Sensor1 einrichten
DHT dht2(DHTPIN2, DHTTYPE); //Sensor2 einrichten
//------CO2 Sensor-----
const byte DataPin = 6; // Pin für CO2 Sensor
//-----Motortreiber----
const byte RPWM = 9;
const byte LPWM = 10;
unsigned long motostart = 0;
unsigned long motolauf = 15000;
//-------Schalter------
const byte offen = 11;
byte schalter1 = 0;
const byte zu = 12;
byte schalter2 = 0;
byte schaltermerker = 0;
byte schaltermerker2 = 0;
//-------Taster-------
const byte Taster = 13;
byte Tasterstatus = 0;
byte Tastenmerker = 0;
unsigned long Sekundenablauf01 = 0; // Tastenabfrage von Taster 300ms aussetzen
const unsigned long Pausezeit01 = 300;
unsigned long Sekundenablauf03 = 0; // Displayzeit 10 Min. hell
const unsigned long Pausezeit03 = 60000 * 10UL;
//----CO2 Sensor------
int ppmrange = 5000;
unsigned long pwmtime;
int PPM = 0;
float pulsepercent = 0;
//---Fenstersteller--
byte lueftung = 0;
byte lueftung2 = 0;
int lueftungszaehler = 0;
//-----Lautsprecher---
const byte lautsprecher = 8;
byte LS_merker = 0;
//---Programm Pause--
unsigned long Sekundenablauf02 = 5000; // Programmpause 5 Sekunden
const unsigned long Pausezeit02 = 5000;
//--------------------------------------------------------------------------------------------
void setup() {
lcd.begin();
lcd.backlight();
pinMode(DataPin, INPUT);
Serial.begin(9600);
// Luftfeuchte und Temperatur Sensoren
dht1.begin(); // Sensor1 starten
dht2.begin(); // Sensor2 starten
//-----------Aus-/Eingänge einrichten-------------------------------------
pinMode(RPWM, OUTPUT); // PWM Motorsteuerung auf
pinMode(LPWM, OUTPUT); // PWM Motorsteuerung zu
pinMode(offen, INPUT_PULLUP); // Schalter Fenster auf
pinMode(zu, INPUT_PULLUP); // Schalter Fenster zu
pinMode(Taster, INPUT_PULLUP); // Taster Display ein/aus
}
//--------------------------------------------------------------------------------------------
void loop()
{
//-------------Taster lesen-----------------------------------------------
if (millis() - Sekundenablauf01 >= Pausezeit01) { // 200msec abgelaufen?
Tasterstatus = digitalRead(Taster); // Pin von Taster abfragen
if (Tasterstatus == LOW) { // Ist Taster gedrueckt?
Tastenmerker = !Tastenmerker; // Merken dass Taster gedrueckt wurde
if (Tastenmerker == LOW)
{
lcd.noBacklight();
}
else
{
lcd.backlight();
Sekundenablauf03 = millis();
}
Sekundenablauf01 = millis(); // Die 200ms neu starten
}
}
if (millis() - Sekundenablauf03 >= Pausezeit03) // 10 Min. abgelaufen?
{
Tastenmerker = LOW; // Tastenmerker auf Displaybeleuchtung aus
lcd.noBacklight(); // Displaybeleuchtung aus
}
//----------------Lüftungszähler-------------------------------------------
if (lueftung == 1)
{
}
//-------------------------------------------------------------------------
if (millis() - Sekundenablauf02 >= Pausezeit02) { // 5000ms abgelaufen?
Sekundenablauf02 = millis(); // Die 5000ms neu starten
//-----------------------------------------------------------------------
pwmtime = pulseIn(DataPin, HIGH, 2000000) / 1000;
float pulsepercent = pwmtime / 1004.0;
PPM = ppmrange * pulsepercent;
lcd.setCursor (0, 3);
lcd.print (F(" CO2 in PPM = "));
lcd.setCursor (14, 3);
lcd.print (F(" "));
lcd.setCursor (14, 3);
lcd.print (PPM);
float h1 = dht1.readHumidity(); // Lesen der Luftfeuchtigkeit1 und speichern in die Variable h1
float t1 = dht1.readTemperature(); // Lesen der Temperatur in °C1 und speichern in die Variable t1
float h2 = dht2.readHumidity(); // Lesen der Luftfeuchtigkeit2 und speichern in die Variable h2
float t2 = dht2.readTemperature(); // Lesen der Temperatur in °C2 und speichern in die Variable t2
//--------------------------
lcd.setCursor (18, 1);
lcd.print (F(" "));
lcd.setCursor (0, 1);
lcd.print (F(" L1 "));
lcd.print (h1);
lcd.print (F("% T1 "));
lcd.setCursor (14, 1);
lcd.print (t1);
if (t1 < 10)
{
lcd.setCursor (14, 1);
lcd.print (F(" "));
lcd.print (t1);
}
lcd.setCursor (19, 1);
lcd.print (F(" "));
//------------------------
lcd.setCursor (18, 2);
lcd.print (F(" "));
lcd.setCursor (0, 2);
lcd.print (F(" L2 "));
lcd.print (h2);
lcd.print (F("% T2 "));
lcd.setCursor (14, 2);
lcd.print (t2);
if (t2 < 10)
{
lcd.setCursor (14, 2);
lcd.print (F(" "));
lcd.print (t2);
}
lcd.setCursor (19, 2);
lcd.print (F(" "));
//---Lüftung Einschaltbedingung-----
if (lueftung == 0)
{
if ((t1 >= 23) && (PPM > 900))
{
lueftung = 1;
}
}
//---Lüftung Ausschaltbedingung-----
if (lueftung == 1)
{
if ((t1 <= 21) || (PPM < 430))
{
lueftung = 0;
}
}
//-------------Schalter lesen-------------------------------------------
schalter1 = digitalRead(offen);
if (schalter1 == LOW)
{
schaltermerker = 1;
}
schalter2 = digitalRead(zu);
if (schalter2 == LOW)
{
schaltermerker = 2;
lueftungszaehler = 0;
}
if ((schalter1 == HIGH) && (schalter2 == HIGH))
{
schaltermerker = 0;
}
lcd.setCursor (14 , 0);
lcd.print (schaltermerker);
lcd.print (F("-"));
lcd.print (lueftung);
lcd.print (F("-"));
lcd.print (lueftungszaehler);
//---------------Motoranforderung überwachen--------------------------------
if ((lueftung != lueftung2) || (schaltermerker != schaltermerker2))
{
if ((lueftung == 0) && (schaltermerker == 0))
{
lueftungszaehler ++;
}
if ((lueftung == 1) && (schaltermerker == 2))
{
tone(lautsprecher, 440, 200); //Ton wenn Fenster nicht geöffnet werden kann
LS_merker = 1;
}
else
if ((lueftung == 1) && (schaltermerker == 0))
{
LS_merker = 0;
}
if ((lueftung == 0) && (schaltermerker == 1))
{
tone(lautsprecher, 440, 200);//Ton wenn Fenster nicht geschlossen werden kann
LS_merker = 1;
}
else
if ((lueftung == 1) && (schaltermerker == 0))
{
LS_merker = 0;
}
Tastenmerker = HIGH; //Tastenmerker auf Displaybeleuchtung ein
lcd.backlight(); // Displaybeleuchtung ein
//------------------Fenster öffnen--------------------------------------
if (((lueftung == 1) && (schaltermerker == 0)) || (schaltermerker == 1))
{
analogWrite(LPWM, 0);
analogWrite(RPWM, 255);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster auf "));
}
//------------------Fenster schließen-----------------------------------
if (((lueftung == 0) && (schaltermerker == 0)) || (schaltermerker == 2))
{
analogWrite(LPWM, 255);
analogWrite(RPWM, 0);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster zu "));
}
motostart = millis();
lueftung2 = lueftung;
schaltermerker2 = schaltermerker;
}
if (millis() - motolauf >= motostart)
{
analogWrite(LPWM, 0);
analogWrite(RPWM, 0);
lcd.setCursor (0, 0);
lcd.print (F(" Fenster Stop "));
}
if (LS_merker == 1)
{
tone(lautsprecher, 440, 200);
}
}
}
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste