Problem mit eigener Wetterstation

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)

Bitte setze Deinen Sketch in Codetags (oben links </> im Foreneditor oder [code] davor und [/code] dahinter - ohne die *).
Das kannst Du auch noch nachträglich durch Editieren tun. Bitte mach das, der Sketch ist besser zu lesen, besonders auf mobilen Geräten.

Anhänge werden selten gelesen.

Der BME280 ist nach meiner Erinnerung ein Typ mit max. 3,6 V Betriebsspannung.
Der kann auch nicht an 5V I2C benutzt werden. Da würdest Du einen Pegelwandler brauchen.

Das ist aber alles nur Vermutung, denn die wichtigste Frage dazu ist: Welchen Arduino benutzt Du?

Gruß Tommy
Gruß Tommy

Danke für die Hinweise, Tommy56.

Ich habe dann mal meinen Code in Tags eingefügt. Aufgebaut ist das Ganze mit einem Arduino UNO. Dieser ist auf Quarz und Kondensatoren an Stelle des Oszillators aufgebaut.

tcgoebel: Aufgebaut ist das Ganze mit einem Arduino UNO. Dieser ist auf Quarz und Kondensatoren an Stelle des Oszillators aufgebaut.

Was genau meinst du damit ?

Und wie Tommy schon schrieb, für den Sensor brauchst du am Uno einen Levelshifter.

Gib mal bitte einen Link zum 280er Sensor mit. Es gibt bei Adafruit auch 5V-Module.

Ansonsten erst mal den Sensor mit den Beispielen der Lib einzeln testen.

Gruß Tommy

Hallo HotSystems,

Ich habe auf dem Arduino Uno den Oszillator (Bauteil mit 3 Pins) und die beiden 1 Megaohm Widerstände ausgelötet und statt dessen einen Quarz mit 16 MHz Grundton und 2 Stück 30 pF Keramik-Kondensatoren zwischen Quarz und Masse gelötet. Der Quarz liegt selbstverständlich an XTAL1 und XTAL2 vom Atmega328. Das gibt keinerlei Probleme, andere Sketche laufen damit sauber. Der Shifter ist meiner Meinung überflüssig, da sowohl die RTC als auch der DHT22 stabil laufen (auch beides 3,3V-Varianten). Hinzu kommt, dass bei dem Aufbau auch der BME280 stabil läuft, da die Beispiel-Programme aus der SparkFun Library ja in dieser Kombination auch plausible Werte liefern. Es muss also irgendwo in meinem Code eine Klanke sein. Das Display wird übrigens mit +5V vom Arduino Uno direkt versorgt. Auf dem Bread-Board liegen saubere 3,3V als Versorgungsspannung an (theoretisch mit 0,8 A Strom). Selbst wenn ich sowohl die RTC als auch den DHT22 abziehe bringt der BME280 keine Daten...alle Readings nur Müll....allerdings auf dem Display, die auf dem SerialMonitor sind plausibel.

http://www.ebay.de/itm/I2C-SPI-Breakout-Temperature-Humidity-Barometric-Pressure-BME280-Digital-Sensor-/272455018461?hash=item3f6f95a7dd:g:w6kAAOSw5cNYL-aa

Dieser Sensor wird hier verwendet.

Da ich deine weiteren verwendeten Bauteile nicht kennne (ausser dem Namen) kann ich auch zu dem Spannungsthema nichts weiter zutragen. Mag sein, dass es alles funktioniert. Leider ist es immer ein Problem, wenn man zu wenig Informationen erhält.

Das was du ausgelötet hast, ist kein Oszilator, sondern das was ein Keramikresonator.

  char lcdline[15];                                             //bestimmt die Zeilenlänge (hier 16 Zeichen von 0 bis 15)

Auch wenn es wohl keine Auswirkungen hat, so gehört in die eckigen Klammern die Anzahl der Elemente plus dem Abschlußzeichen ‘\0’, also wäre [17] besser.

Die Vatiablen h1 und t1 werden global und lokal deklariert, das gibt Durcheinander.

lcd.print(mySensorA.readFloatPressure(), 0);                  //gibt den Luftdruck mit 2 Nachkommestellen aus
  lcd.print(p);

Zwei Werte nacheinander?

Da ich die ganzen Sensoren nicht habe, zeigt ein vereinfachtes Programm dies an:

IMG_4440.png

Am Ende von void(Loop) sollte ein delay(2000) stehen. Der BME wird wie sein Bruder BMP180 eine Messträgheit haben.

tcgoebel: http://www.ebay.de/itm/I2C-SPI-Breakout-Temperature-Humidity-Barometric-Pressure-BME280-Digital-Sensor-/272455018461?hash=item3f6f95a7dd:g:w6kAAOSw5cNYL-aa

Dieser Sensor wird hier verwendet.

Das ist ein reiner max. 3,6V-Typ. Aber wenigstens PullUp-Widerstände hat er drauf.

Gruß Tommy