Wetterstation
von
am 30.06.2016 um 00:17 (9941 Hits)
Ich möchte meine Bare-Metal gebastelte "Wetterstation" vorstellen, von der ich mittlerweile zwei gebaut habe - eine für zu hause und eine fürs Büro.
Angezeigt werden:
- Aussentemperatur und -feuchte gemessen mit einem AM2302, der draußen am Fenster an einer geschützten Stelle angebracht ist und mit einem flachen Kabel mit der Station verbunden
- Innentemperatur und Luftdruck gemessen mit BMP280
- Luftdrucktendenz angezeigt mit einem Pfeil und per Knopfdruck als Zahl abrufbar
Die Wetterstation entstand als Idee zum Verbasteln von Restbeständen:
- PIC16F88 - mittlerweile veralteter "moderner" Nachfolger des PIC16F84
- 2x16 LCD Modul
- BMP280 - Breakout Module und AM2302 (DHT22) die bei Ali für kleines € zu haben sind
- Lochrasterplatine, Steckernetzteil und ein paar Bauteile aus dem Wühlfundus
Den PIC16F88 habe ich genommen, weil er I2C hat. Allerdings habe ich erst nach dem Verlöten mit der Software angefangen und gemerkt, dass der 16F88 nur Slave in der Peripherie-Hardware unterstützt. Also zuerst das I2C Bit-Banging für die Masterfunktion anhand der AN554 erstellt, s. Anhang wit_SW_I2C_Master.c und .h
Dann kam der BMP280 an die Reihe. Der Bosch Sensor ist ganz schön unhandlich in der Auswertung. Um die Werte für die Temperatur und barometrischen Druck zu erhalten, sind ganz schön viele 32bit Berechnungen durchzuführen, s. Anhang BME280_swI2C.c und .h. Damit waren die 4k Flashspeicher des PIC schon ziemlich gut gefüllt. Um Programmspeicher zu sparen und mächtige Bibliotheksfunktionen wie Stringfunktionen oder itoa zu vermeiden entstand eine kleine LCD Ausgaberoutine für Fixkomma ZahlenwerteZum Glück ist der DHT22 mit einem relativ simplen Protokoll einfach auszulesen. Die DHT22 Auswertung braucht nur wenig Programmspeicher.Code:/* write int val to display with fixed dec position and sign * nWidth must be big enough for decimal and sign width due to value range */ void FixCommavalToDisp(int val, char nWidth, char nDec){ char disptext[9]; int tmpval = val; if (tmpval < 0) tmpval = -tmpval; // Text von rechts füllen disptext[nWidth] = 0; // '/0' Terminierung // Nachkommastellen if(nDec){ while((nDec) && (nWidth)){ disptext[--nWidth] = int_to_char(&tmpval); nDec--; } // Dezimalpunkt if(nWidth) disptext[--nWidth] = '.'; } // Vorkommastellen while(nWidth){ disptext[--nWidth] = int_to_char(&tmpval); if((tmpval == 0) && (nWidth)){ if (val < 0) disptext[--nWidth] = '-'; // Vorzeichen break; } } // führende Leerzeichen auffüllen while(nWidth) { disptext[--nWidth] = ' '; } // LCD Ausgabe putsLCD(disptext); return; } char int_to_char(int *val){ char c = (*val % 10) + '0'; *val /= 10; return c; }
Kompiliert mit dem XC8 im free mode also auf niedrigster Optimierungsstufe belegt das Projekt 94% des 4k Flashspeichers des PIC16F88, wovon allein die Prozeduren für die Auswertung des BMP280 ca. 2k belegen.