There seems to be some issue with my programming, since the OLED is showing weird numbers. I wanted the temperature to be on the top left, the humidity on the top right and CO2 in the middle. However, CO2 is showing perfectly, but temperature and humidity always looks crooked.
I have tried different fonts, added u8g2.clear (); for a test but nothing helps
My code is the following
#include <DFRobot_DHT20.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
DFRobot_DHT20 dht20;
int SensorPin = D7; // Der PWM-Pin des Sensors wird an Pin5 des Mikrocontrollers angeschlossen. Bei anderen Mikrocontrollern muss darauf geachtet werden, dass der Pin PWM-Fähig ist.
int Messbereich = 5000; // Der voreingestellte Messbereich (0-5000ppm). Der Sensor MH-Z19B kann auch auf einen Maximalwert von 2000ppm vorkonfiguriert sein.
unsigned long ZeitMikrosekunden; // Variable für die Dauer des PWM-Signalpegels in Mikrosenkunden
unsigned long ZeitMillisekunden; // Variable für die Dauer des PWM-Signalpegels in Millisekunden
int PPM = 0; // Variable für den CO2-Messwert in ppm (parts per million - Anteile pro Million)
float Prozent = 0; // Variable für den prozentuale Länge des PWM-Signals
void setup()
{
// Setze LED Pins als Ausagabe
pinMode(SensorPin, INPUT); //Der Pin für die Sensorwerte (6) wird als Eingang definiert.
Serial.begin(9600); // Aufbau der seriellen Verbindung, um Messwerte am Seriellen Monitor anzeigen zu können
u8g2.begin();
dht20.begin();
}
void loop()
{
ZeitMikrosekunden = pulseIn(SensorPin, HIGH, 2000000); // Der pulseIn Befehl misst die Zeit, ab der ein Signal am angegebenen Pin auf HIGH wechselt und in diesem Zustand verbleibt. Standartmäßig endet diese Messung nach maximal 1.000.000 Mikrosekunden (1000ms). Durch das Ahängen des letzten Wertes kann man diesen sogenannten "Timeout" verlängern. Da das Signal des CO2 Sensors bis zu 1004ms lang sein kann, müssen wir den Wert entsprechend hoch ansetzen.
ZeitMillisekunden = ZeitMikrosekunden / 1000; // Umwandeln der Zeiteinheit von Mikrosekunden in Millisekunden.
float Prozent = ZeitMillisekunden / 1004.0; // Die maximale Länge des PWM-Signals ist laut Datenblatt des MH-Z19B 1004ms (Millisekunden) lang. Daher berechnen wir hier die gemessene PWM-Signaldauer durch die maximal mögliche Signaldauer und erhalten einen Prozentwert des aktiven (5V) Pegels im PWM-Signal. Dieser Prozentwert spiegelt einen PPM-Wert zwischen 0PPM und 5000PPM wieder.
PPM = Messbereich * Prozent; // PPM-Wert berechnen aus der prozentualen Signaldauer und dem maximalen Messbereich.
Serial.print("CO2 Anteil in der Luft in PPM: "); // Ausgabe der Werte über den Seriellen Monitor
Serial.println(PPM);
//delay(1000); // Eine Sekunde Wartezeit bis zur Bestimmung des nächsten Messwertes.
//Get ambient temperature
Serial.print("temperature:");
Serial.print(dht20.getTemperature());
Serial.print("C");
//Get relative humidity
Serial.print(" humidity:");
Serial.print(dht20.getHumidity() * 100);
Serial.println(" %RH");
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_fur11_tf);
u8g2.setCursor(1, 15);
u8g2.print(dht20.getTemperature());
u8g2.print("C");
u8g2.setCursor(75, 15);
u8g2.print(dht20.getHumidity() * 100);
u8g2.print("%");
if (PPM > 1000) {
u8g2.setFont(u8g2_font_fur30_tf);
u8g2.setCursor(15, 55);
u8g2.print(PPM);
} else {
u8g2.setFont(u8g2_font_fur30_tf);
u8g2.setCursor(30, 55);
u8g2.print(PPM);
}
} while ( u8g2.nextPage() );
delay(5000);
}
I also uploaded a picture of the problem:
