Stacja Meteo Dominikowice pracująca na Arduino + Openwrt

(opis działania jest w trakcie pisania)

    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);
    
  }
}




test