Inspiracją do wykonania "Domowej Stacji Pogody" były opisy pomiaru temperatury z wykorzystaniem Openwrt umieszczone na forum eko.one.pl
jak i na http://openrouter.info gdzie znajdziemy dużo informacji i poradników o OpenWrt.
Co wykorzystałem do zbudowania Stacji Meteo:
1. Router NETGEAR WNDR4300 lub inny z możliwością wgrania Openwrt i portem USB lub platforma PC z opgrogramowaniem Linux
2. Aktywny hub z zasilaczem ze względu na to że routery mają z reguły 1 wejście usb
3. Dysk lub pendrive który umożliwi zapis danych z czujek + server www
4. Arduino Leonardo
5. Czujnik temperatury i wilgotności DHT22 (AM2023)
6. Czujnik ciśnienia i temperatury GY-68 BMP180
7. Czujnik temperatury DS18B20 1-wire
8. Przewód 3x0.5 taki jak stosuje się w alarmach aby podłączyć czujniki temperatury
Jak to działa:
Sercem stacji jest Arduino Leonardo do którego wpięte mamy czujniki temperatury, wilgotności, ciśnienia i połączone z ruoterem poprzez kabel USB. Odczyt danych odbywa
się co 10 min poprzez skrypt uruchamiany na ruterze z Crona który wysyła zapytanie o dane z czujników które zostają zwrócone i zapisane do bazy danych MySQL.
Kolejny zaś skryp odczutuje dane z bazy dancyh MySQL i generuje wykresy za pomocą programu Gnuplot zapisując je na serwerze www gdzie pózniej są prezentowane w
formie strony www.
#include <OneWire.h> #include <DallasTemperature.h> #include "DHT.h" #include <Wire.h> #include <BMP180.h> String odebraneDane = ""; // Czujnik oneWire podlaczony do wejscia nr 4 w Arduino // Czujnik DHT22 podlaczony do wejscia nr 5 i 6 Arduino //Podajemy ponizej w PA aktualne cisnienie dla swojej miejscowosci float seaLevelPressure = 99008; #define ONE_WIRE_BUS 4 //numer pinu sygnalowego dla czujnika temperatury DS18B20 #define TEMPERATURE_PRECISION 12 // Dolna rozdzielczosc #define DHT1PIN 5 // numer pinu sygnałowegodla czujnika temperatury DHT #define DHT2PIN 6 #define DHT1TYPE DHT22 // typ czujnika (DHT22). Jesli posiadamy DHT11 wybieramy DHT11 #define DHT2TYPE DHT22 // definicja czujnika OneWire oneWire(ONE_WIRE_BUS); DHT dht1(DHT1PIN, DHT1TYPE); DHT dht2(DHT2PIN, DHT2TYPE); BMP180 barometer; DallasTemperature sensors(&oneWire); int numberOfDevices; // Wykrywanie czujnikow DeviceAddress tempDeviceAddress; // Bedziemy uzywać tej zmiennej aby znaleźć adres urządzenia void setup(void) { // uruchomienie portu szeregowego Serial.begin(115200); //while(!Serial); // We start the I2C on the Arduino for communication with the BMP180 sensor. Wire.begin(); // We create an instance of our BMP180 sensor. barometer = BMP180(); // We check to see if we can connect to the sensor. if(barometer.EnsureConnected()) { Serial.println("Wykruto czuknik cisnienia BMP180."); // Output we are connected to the computer. // When we have connected, we reset the device to ensure a clean start. barometer.SoftReset(); // Now we initialize the sensor and pull the calibration data. barometer.Initialize(); } else { Serial.println("Nie wykryto czujnika BMP180."); } // inicjalizacja czujnika sensors.begin(); dht1.begin(); dht2.begin(); // Znajdowanie urzadzen na linii numberOfDevices = sensors.getDeviceCount(); // Wykryte urzadzenia na magistrali Serial.print("Wykrywanie czujnikow ... "); Serial.print("wykryto "); Serial.print(numberOfDevices, DEC); Serial.println(" czujnikow."); // Wykrycie trybu pracy Serial.print("Tryb pasozytniczy: "); if (sensors.isParasitePowerMode()) Serial.println("Tak"); else Serial.println("Nie"); // Petla dla kazdego urzadzenia i wyswietlanie opisu for(int i=0;i<numberOfDevices; i++) { // Szukanie adresow czujnikow if(sensors.getAddress(tempDeviceAddress, i)) { Serial.print("Znaleziono "); Serial.print(i, DEC); Serial.print(" urzadzenie z adresem: "); printAddress(tempDeviceAddress); Serial.println(); Serial.print("Ustawiono rozdzielczosc "); Serial.println(TEMPERATURE_PRECISION, DEC); // ustawianie rozdzielczosci sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION); Serial.print("Rozdzielczosc ustawiona: "); Serial.print(sensors.getResolution(tempDeviceAddress), DEC); Serial.println(); }else{ Serial.print("Znaleziono urzadzenie "); Serial.print(i, DEC); Serial.print(" o nie zidentyfikowanym adresie. Sprawdz zasilanie i przewody"); } } } // Wysiwetlanie i czytanie temperatury z czujnika void printTemperature(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); Serial.print(" "); Serial.print(tempC); //Serial.print(" *C ; "); } void loop(void) { if(Serial.available() > 0) { odebraneDane = Serial.readStringUntil('\n'); if (odebraneDane == "?") { // Zapytanie o temperature wszystkich urzadzen sensors.requestTemperatures(); Serial.print("OK "); //delay(6000); //Odczyt temperatury i cisnienia { if(barometer.IsConnected) { // Retrive the current pressure in Pascals. float currentPressure = barometer.GetPressure(); // Print out the Pressure. Serial.print("CA "); Serial.print(currentPressure/100+39.4); //Serial.print(" hPa ; "); // Retrive the current altitude (in meters). Current Sea Level Pressure is required for this. //float altitude = barometer.GetAltitude(seaLevelPressure); // Print out the Altitude. //Serial.print("\tWysokosc: "); //Serial.print(altitude); //Serial.print(" m"); // Retrive the current temperature in degrees celcius. float currentTemperature = barometer.GetTemperature(); // Print out the Temperature Serial.print(" TC "); Serial.print(currentTemperature); //Serial.print(" *C ; "); } } // Odczyt temperatury i wilgotności powietrza float t1 = dht1.readTemperature(); float h1 = dht1.readHumidity(); float t2 = dht2.readTemperature(); float h2 = dht2.readHumidity(); // Sprawdzamy czy są odczytane wartości if (isnan(t1) || isnan(h1)) { // Jeśli nie, wyświetlamy informację o błędzie Serial.println("Blad odczytu danych z czujnika"); } else { // Jeśli tak, wyświetlamy wyniki pomiaru Serial.print( " W1 "); Serial.print(h1); //Serial.print(" % ; "); Serial.print(" W2 "); Serial.print(h2); //Serial.print(" % ; "); Serial.print(" TW1 "); Serial.print(t1); //Serial.print(" *C ; "); Serial.print(" TW2 "); Serial.print(t2); //Serial.print(" *C ; "); } // Petla po kazdym urzadzeniu aby odczytac czujnik for(int i=0;i<numberOfDevices; i++) { // Wyszukiwanie na lini czujnikow if(sensors.getAddress(tempDeviceAddress, i)) { // Wyswietlenie opisu czujnika Serial.print(" T"); Serial.print(i,DEC ); //Serial.print(":"); //Serial.print(" "); printTemperature(tempDeviceAddress); } } } } } // Wyswietlanie adresu czujnika void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } }