Re: CO2 Gassensor Testen
Verfasst: Di 23. Nov 2021, 08:01
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
Forum zur gegenseitigen Hilfe für Hobby´s, Spass und Technik, im Raum Penzberg, Garmisch, Bad Tölz, Seeshaupt
https://franzls-technik-forum.de/
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 "));
}
}
}
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 "));
}
}
}
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 "));
}
}
}
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 "));
}
}
}
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);
}
}
}