In diesem schon etwas umfangreicherem Projekt beschäftigen wir uns mit mehreren Faktoren rund um das Thema (Raum-)Klima. Wir werden die Temperatur, die Luftfeuchtigkeit und den Luftdruck messen, Höchst- und Tiefstwerte unserer Messungen speichern und dies alles auf einem TFT-Display ausgeben.
Für die Luftdruckmessung verwenden wir einen BMP085 Luftdruck- und Temperatursensor (in diesem Fall auf einem Breakoutboard, namens GY-65).
Die Luftfeuchtigkeitsmessung erfolgt durch einen DHT11, welcher sowohl die Luftfeuchtigkeit, als auch die Temperatur messen kann.
Wie schon an den obigen Bauteilen zu erkennen, können wir für die Temperaturmessung gleich 2 verschiedene Sensorquellen benutzen, den BMP085 oder den DHT11 (im Programmbeispiel werden beide abwechselnd ausgelesen und angezeigt).
Um gleichzeitig auch noch das Datum und die Zeit anzuzeigen verwenden wir ein Tiny RTC Modul, inklusive Batterie, damit die Zeit auch bei Stromausfall weiterläuft, auf Basis des DS1307-Echtzeitchips.
Weiterhin werden in unserem Projekt ein Arduino Nano (dies kann natürlich auch ein Arduino anderen Typs sein), ein TFT Farbmodul (HY-1.8 SPI), ein Breadboard, ein Breadboard-Power-Modul und diverse Verbindungskabel verwendet. Links für die Beschaffung der entsprechenden Komponenten finden sich weiter unten.
Schaltplan (komplette Verdrahtung auf dem Breadboard):
mit der Maus über Elemente fahren (oder im Touch-Modus: Elemente antippen)...
Arduino (Nano, Uno, Pro Mini) |
BMP085 (GY-65) |
DHT11 | Tiny RTC-Modul DS1307 |
TFT-Display HY-1.8 SPI |
Spannungsquelle 5V (z.B. Breadboard Power Supply) |
5V (VCC) | VCC | VCC | VCC | VCC, LED+ VCC | VCC 5V |
GND | GND | GND | GND | GND, LED- GND | GND |
A4 (SDA) | SDA | SDA | |||
A5 (SCL) | SCL (SDL) | SCL | |||
D4 | DATA | ||||
D9 | A0 | ||||
D10 | CS | ||||
D11 | SDA | ||||
D13 | SCK | ||||
D8 | RESET |
Wie auf dem Foto ganz oben gut zu erkennen ist hier einiges an Verkabelung durchzuführen.
Für den Arduino-Sketch müssen wir nun noch folgende Bibliotheken installieren:
- Adafruit-BMP085-Bibliothek – GY-65 (BMP085)
- Adafruit-DHT-Bibliothek – DHT11
- Adafruit-ST3375-Bibliothek – TFT-Display HY-1.8 SPI (ST7735-Chipsatz)
- Adafruit-Grafik-Bibliothek
- RTClib von Jean-Claude Wippler – Tiny RTC Modul
Dann laden wir noch den Sketch auf den Arduino…
Programmcode:
// BMP085, DHT11, TinyRTC (DS1307) und 1.8 Zoll TFT-Farb-Display (HY-1.8 SPI) #include <SPI.h> #include "Adafruit_GFX.h" // Adafruit Grafik-Bibliothek #include "Adafruit_ST7735.h" // Adafruit ST7735-Bibliothek #include <Wire.h> #include "Adafruit_BMP085.h" // Adafruit BMP085-Bibliothek #include "RTClib.h" #include <DHT.h> #define DHTPIN 4 // Zur Messung verwendeter Pin, in unserem Fall also Pin 4 #define DHTTYPE DHT11 // DHT 11 // TFT-Display #define CS 10 // Arduino-Pin an Display CS #define DC 9 // Arduino-Pin an Display A0 #define RST 8 // Arduino Reset-Pin Adafruit_ST7735 tft = Adafruit_ST7735(CS, DC, RST); // Display-Bibliothek Setup RTC_DS1307 RTC; // Tiny RTC Modul Adafruit_BMP085 bmp; // BMP085 DHT dht(DHTPIN, DHTTYPE); // Initialisieren des DHTs DateTime now; DateTime time_old; DateTime date_old; boolean night_mode=true; void setup(void) { // Initialisiere RTC Wire.begin(); RTC.begin(); if (! RTC.isrunning()) { // Aktuelles Datum und Zeit setzen, falls die Uhr noch nicht läuft RTC.adjust(DateTime(__DATE__, __TIME__)); } bmp.begin(); // BMP085 starten dht.begin(); // DHT starten // Display tft.initR(INITR_BLACKTAB); // ST7735-Chip initialisieren display_show(); } float temp=1000; float hum=1000; int32_t pressure=1000; float min_temp=1000; float max_temp=-1000; float min_humidity=1000; float max_humidity=-1000; int32_t min_pressure=1000000; int32_t max_pressure=-1000; int tempct=0; void loop() { DateTime now=RTC.now(); if(now.minute()!=time_old.minute()){ show_time(time_old,true); time_old=now; show_time(time_old,false); } if(now.day()!=date_old.day()){ show_date(date_old,true); date_old=now; show_date(date_old,false); } float t; if(tempct%2==0)t=dht.readTemperature(); else t=bmp.readTemperature(); if(isnan(t)){} else if((int)t!=(int)temp){ show_temp(temp,true); temp=t; if(min_temp>temp)min_temp=temp; if(max_temp<temp)max_temp=temp; show_temp(temp,false); } tempct++; float h = dht.readHumidity(); if(isnan(h)){} else if(h!=hum){ show_hum(hum,true); hum=h; if(min_humidity>hum)min_humidity=hum; if(max_humidity<hum)max_humidity=hum; show_hum(hum,false); } int32_t p=bmp.readPressure(); if(p!=pressure){ show_pressure(pressure,true); pressure=p; if(min_pressure>pressure)min_pressure=pressure; if(max_pressure<pressure)max_pressure=pressure; show_pressure(pressure,false); } delay(10000); } void show_temp(float temp,boolean clear){ int clearcolor=night_mode?ST7735_BLACK:ST7735_WHITE; int textcolor=night_mode?ST7735_WHITE:ST7735_BLACK; byte xs=12; byte ys=66; String htemp=String((int)temp); //byte xss=(temp<10?:temp set_text(xs,ys,htemp,clear?clearcolor:textcolor,3); set_text(xs+(3*htemp.length()*8),ys,"",(clear?clearcolor:textcolor),2); tft.write(247); // das °-Zeichen tft.print("C"); set_text(xs+81,ys+1,String((int)max_temp),clear?clearcolor:ST7735_RED,1); tft.write(247);tft.print("C"); set_text(xs+81,ys+11,String((int)min_temp),clear?clearcolor:ST7735_BLUE,1); tft.write(247);tft.print("C"); } void show_hum(float hum,boolean clear){ int clearcolor=night_mode?ST7735_BLACK:ST7735_WHITE; int textcolor=night_mode?ST7735_WHITE:ST7735_BLACK; byte xs=12; byte ys=96; set_text(xs,ys,String((int)hum)+"%",clear?clearcolor:textcolor,3); set_text(xs+81,ys+1,String((int)max_humidity)+"%",clear?clearcolor:ST7735_GREEN,1); set_text(xs+81,ys+11,String((int)min_humidity)+"%",clear?clearcolor:ST7735_YELLOW,1); } void show_pressure(float pressure,boolean clear){ int clearcolor=night_mode?ST7735_BLACK:ST7735_WHITE; int textcolor=night_mode?ST7735_WHITE:ST7735_BLACK; byte xs=12; byte ys=130; set_text(xs,ys,String((int32_t)pressure)+"Pa",clear?clearcolor:textcolor,1); if(max_pressure>=100000)xs-=8; set_text(xs+68,ys-5,String((int32_t)max_pressure)+"Pa",clear?clearcolor:ST7735_CYAN,1); set_text(xs+68,ys+5,String((int32_t)min_pressure)+"Pa",clear?clearcolor:ST7735_MAGENTA,1);// } String get_day_of_week(uint8_t dow){ String dows=" "; switch(dow){ case 0: dows="So"; break; case 1: dows="Mo"; break; case 2: dows="Di"; break; case 3: dows="Mi"; break; case 4: dows="Do"; break; case 5: dows="Fr"; break; case 6: dows="Sa"; break; } return dows; } void show_time(DateTime now, boolean clear){ int clearcolor=night_mode?ST7735_BLACK:ST7735_WHITE; int textcolor=night_mode?ST7735_WHITE:ST7735_BLACK; tft.setTextColor(clear?clearcolor:textcolor); tft.setTextSize(3); tft.setCursor(21,21); if(now.hour()<10)tft.print(0); tft.print(now.hour(),DEC); tft.print(":"); if(now.minute()<10)tft.print(0); tft.print(now.minute(),DEC); // tft.print(":"); // if(now.second()<10)tft.print(0); // tft.print(now.second(),DEC); } void show_date(DateTime now,boolean clear){ int clearcolor=night_mode?ST7735_BLACK:ST7735_WHITE; int textcolor=night_mode?ST7735_WHITE:ST7735_BLACK; tft.setTextColor(clear?clearcolor:textcolor); tft.setTextSize(1); tft.setCursor(24,47); tft.print(get_day_of_week(now.dayOfWeek())); tft.print(", "); if(now.day()<10)tft.print(0); tft.print(now.day(),DEC); tft.print("."); if(now.month()<10)tft.print(0); tft.print(now.month(),DEC); tft.print("."); tft.print(now.year(),DEC); } void set_text(int x,int y,String text,int color,int size){ tft.setTextSize(size); tft.setCursor(x,y); tft.setTextColor(color); tft.print(text); } void display_show(){ tft.fillScreen(night_mode?ST7735_BLACK:ST7735_WHITE); set_text(2,4,"Raumklimaueberwachung",ST7735_BLUE,1); set_text(14,147,"blog.simtronyx.de",ST7735_GREEN,1); time_old=date_old=RTC.now(); show_time(time_old,false); show_date(date_old,false); }
… und schon kann die Überwachung beginnen.
Bei einigen Blogbesuchern und Bastlern sind bei der Kompilierung Fehler aufgetreten. Dies lag an der “Robot_Control”-Bibliothek, welche sich nicht mit den verwendeten Bibliotheken verträgt. Die “Robot_Control”-Bibliothek sollte temporär entfernt werden, wodurch das Problem behoben wird.
Die obigen Bibliotheken sind ZIP-Versionen die mit der Arduino IDE 1.0.X funktionieren, eventuell sollten bei Verwendung der IDE mit Version 1.6.X die aktuellsten Bibliotheken direkt bei GitHub gesucht und installiert werden, falls es zu Fehlern beim Kompilieren kommt!
Bauteile (Bezugsquellen):
Gut?











