Liebe Forengemeinde,
zunächst ein Eingeständnis: "Ich bin blutiger Anfänger, was den Arduino angeht"!
Als Einstiegsprojekkt habe ich mir eine "Wetterstation" vorgenommen. Und ja, ich weiß sehr wohl, ich kann sie für unter 10€ beim nächsten Discounter kaufen, aber ich möchte eben einen Eigenbau.
Also habe ich mir die von mir für für notwendig erachteten Bauteile beim Chinamann meiner Wahl bestellt:
LCD-Display 16*4 mit entsprechendem I2C-Adapter
Echtzeituhr RTC 3231
Luftfeuchte und Temperatursensor DHT22
Luftdruck, Luftfeuchte und -Temperatursensor GY-BME/P280
Aufgebaut ist das ganze mit einem Arduino UNO
RTC und BME280 kommunizieren genau wie das Display über den I2C-Bus. Weder Display noch RTC sind an dieser Stelle auffällig. Auch den DHT22 kann ich problemlos auslesen und die Werte auf dem Display darstellen.
Lediglich diese GY-BME/P280 Sensor verweigert mir seinen Dienst. Da ich davon zwei Stück hier habe, dürfte ein Sensordefekt auszuschließen sein, da beide den Dienst verweigern.
Ich nutze für diesen Sensor die SparkFunLibrary "SparkFun_BME280_Arduino_Library-master". Das Beispiel "I2C_and_SPI_Multisensor.ino" liefert auch plausible Werte. Was wiederum ein Indiz dafür sein dürfte, dass die Sensoren in Ordnung sind.
Versuche ich aber jetzt, diese Werte eben nicht über den Serialmonitor sondern über das LCD-Display auszugeben, dann sind diese Werte eben weit weg von plausibel...
Ich habe einmal den Sketch dafür angehängt und hoffe, dass hier jemand den Fehler, den ich dabei scheinbar mache findet und mir auch erklären kann.
Bei diesem Sketch habe ich auch schon versucht, den Wert für den Druck einer Variablen zuzuweisen, aber das hat auch nicht funktioniert.
Bin für jede Hilfestellung dankbar.
Tante Edit:
Hier dann meinen Code wie gewünscht in tags
#include <Wire.h> //Standardmäßig in der Arduino IDE
#include <LiquidCrystal_I2C.h> //https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/
#include "DHT.h" //https://github.com/RobTillaart/Arduino/tree/master/libraries/DHTlib
#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
#include <stdint.h>
#include "SparkFunBME280.h"
#include "SPI.h"
#include <Streaming.h> //http://arduiniana.org/libraries/streaming/
#include <Time.h> //http://playground.arduino.cc/Code/Time
#include <TimeLib.h> //gemäß Hilfestellung von github
// Definiert, welche Pins vom PCF8574T-Chipmit welchem Pin mit dem Display verbunden sind:
// addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Setzt die LCD-Adresse (HEX-Code) und definiert dei Pins wie oben beschrieben
#define DHTPIN 7 // PIN an dem der DHT-Sensor angeschlossen ist
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // für einen DHT 11
#define DHTTYPE DHT22 // für einen DHT 22 (AM2302)
//#define DHTTYPE DHT21 // für einen DHT 21 (AM2301)
// Von vorne auf den Sensor schauend ist links Pin 1 (+5V oder +3,3V)
// Achtung: Wenn ein Board mit 3,3V Versorgungsspannung genutzt wird, den Sensor ebenfalls nur mit 3,3V betreiben
// Sonst besteht Gefahr, das Board zu zerstören!
// Pin 2 ist die Datenleitung des Sensors
// Pin 4 (ganz rechts am Sensor) ist die Masse.
// Ein 10k-Widerstand als Pullup-Widerstand zwischen Datenleitung und Vcc schalten
DHT dht(DHTPIN, DHTTYPE); // Initialisiert den DHT-Sensor für einen Arduino mit 16 MHz Taktfrequenz
BME280 mySensorA; //Sensormodul einbinden
int p; //Luftdruck (BME280)
int h; //Luftfeuchte (BMP280)
int t; //Temperatur (BMP280)
int h1; //Feuchte (DHT22)
int t1; //Temperatur (DHT22)
void setup() {
mySensorA.settings.commInterface = I2C_MODE;
mySensorA.settings.I2CAddress = 0x76;
mySensorA.settings.runMode = 3;
mySensorA.settings.tStandby = 0;
mySensorA.settings.filter = 0;
mySensorA.settings.tempOverSample = 1;
mySensorA.settings.pressOverSample = 0;
mySensorA.settings.humidOverSample = 1;
dht.begin();
lcd.begin(16,4);
lcd.backlight();
setSyncProvider(RTC.get);
delay(1000);
}
void loop() {
float h1 = dht.readHumidity(); //Luftfeuchte in % auslesen (DHT22)
float t1 = dht.readTemperature(); //Temperaturauslesen in Grad Celsius (DHT22)
if (isnan(h) || isnan(t)) { //Fehlerbehandlung um frühzeitig Lesefehler zu erkennen und erneut zu messen || isnan(f)) {
lcd.print("FAILURE SENSOR"); //Fehlermeldung
return; //Ende Fehlerbehandlung
}
char lcdline[15]; //bestimmt die Zeilenlänge (hier 16 Zeichen von 0 bis 15)
lcd.setCursor(0,0); //Cursor auf Zeile1 Position1 setzen
printDay(); //gibt ein Kürzel für den Wochentag gemäß Definition unten aus
sprintf(lcdline,"%02d.%02d.%04d",day(),month(),year()); //formatiert dei Datumsausgabe (setzt führende Nullen ein)
lcd.print(lcdline); //Schreibt den Zeilenblock
lcd.setCursor(0,1); //Cursor auf Zeichen 0 in Zeile 2 setzen
sprintf(lcdline,"%02d:%02d:%02d",hour(),minute(),second()); //legt die Formatierung für die Ausgabe der Einzelwerte fest (fügt führende Nullen ein)
lcd.print(" "); //fügt zwei führende Leerzeichen ein
lcd.print(lcdline); //schreibt die oben formatierte Zeile als ganzen Block
lcd.print(" Uhr"); //fügt den entprechenden Text hinter den Zeilenblock ein
//t=(mySensorA.readTempC(), 2);
//p=(mySensorA.readFloatPressure(), 1);
lcd.setCursor(0,2); //Cursor auf Position 0 in Zeile 3 setzen
lcd.print("h:");
lcd.print(h1,0); //DHT22: h,0 gibt die Luftfeuchte ohne Nachkommastellen aus...bei gewünschten Nachkommastellen die 0 entsprechend ändern
lcd.print("%");
lcd.print(" p:"); //gibt das Symbol für Luftdruck aus
lcd.print(mySensorA.readFloatPressure(), 0); //gibt den Luftdruck mit 2 Nachkommestellen aus
lcd.print(p);
lcd.print("Pa"); //gibt die Einheit für den Luftdruck aus
lcd.setCursor(0,3); //Cursor Position 0 Zeile 4
lcd.print("\xBE:"); //Gibt Symbol für Temperatur aus
lcd.print(t1,1); //Gibt die Temperatur mit einer Nachkommastelle aus
lcd.print("\xDE""C"); //gibt das "Gradzeichen" mit dem Zusatz "C" aus
}
void printDay() //Hier wird wird für den vorher im Code schon verwendeten Befehl printDay() eine Bedeutung festgelegt
{
int day;
day = weekday(); //Die Wochentage sollen abhängig vom Datum angezeigt werden.
if(day == 1){lcd.print("So. ");} //Wenn es sich um Tag 1 handelt soll „So“ usw. angezeigt werden.
if(day == 2){lcd.print("Mo. ");}
if(day == 3){lcd.print("Di. ");}
if(day == 4){lcd.print("Mi. ");}
if(day == 5){lcd.print("Do. ");}
if(day == 6){lcd.print("Fr. ");}
if(day == 7){lcd.print("Sa. ");}
}
Gruß
Thomas
DHT22LCD_mit_RTCv4.ino (8.44 KB)