Close

Meteostanice Žamberk

Úvodní stránka Fórum Vaše projekty Arduino Meteostanice Žamberk

  • Toto téma obsahuje celkem 2 odpovědi. Do diskuze (2 diskutující) se naposledy zapojil uživatel Diego a poslední změna proběhla před 8 roky.
Aktuálně jsou na stránce zobrazeny 3 příspěvky - 1. až 3. (celkem z 3)
  • Autor
    Příspěvky
  • #6265
    Diego
    Účastník

    Už dlouho sním o pořádné meteostanici a díky arduinu se mi konečně sen splnil.

    Další info a fotky na http://elektronika2011.cz

    Meteostanice je postavená na desce arduino mega.

    Stanice má tyto funkce:

    měření vnitřní a vnější teploty a vlhkosti vzduchu – čidla DHT22

    měření rychlosti větru – anemometr

    měření tlaku vzduchu – čidlo BMP180

    měření osvětlení

    modul RTC – DS1307

    zobrazení hodnot na LCD 4×20 znaků

    ukládání na SD kartu

    odesílání na web

    Zobrazovací panel

    čidla

    zapojení

    `/*
    Meteostanice verze 5.1 final

    rozšířené možnosti nastavení sítě

    Finální verze mojí meteostanice
    Další info naleznete na webu http://elektronika2011.cz
    Snažil jsem se o řádné okomentování tak doufám že je všechno dostatečně zřejmé
    /*
    #include <LiquidCrystal.h>
    #include <Arduino.h>
    #include <Wire.h>
    #include <DS1307.h>
    #include <DHT.h>
    #include <Exosite.h>
    #include <BMP085.h>
    #include <Ethernet.h>
    #include <EEPROM.h>
    #include <SPI.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <SD.h>

    #define AN 2 // příjem z anemometru
    #define DHTPINi 26 // vnitřní čidlo
    #define DHTPINo 27 // vnější čidlo
    #define RGBR 5 // RGB LED – R
    #define RGBG 6 // RGB LED – G
    #define RGBB 7 // RGB LED – B
    #define PIEZO 45 // piezo

    #define DHTTYPE DHT22 // DHT 22
    DHT dhti(DHTPINi, DHTTYPE); // nastavení DHT IN
    DHT dhto(DHTPINo, DHTTYPE); // nastavení DHT OUT
    OneWire oneWire(49); // one wire na pin 49
    const int chipSelect = 4; // CS SD karty

    // definice konstant měření větru
    const float pi = 3.14159265; // číslo pí
    int period = 1000; // Measurement period (miliseconds)
    unsigned int Sample = 0; // Sample number
    unsigned int counter = 0; // B/W counter for sensor
    unsigned int RPM = 0; // Revolutions per minute
    int anemo = 91; // konstanta pro výpočet rychlosti větru

    // proměnné
    char cas[9]; // pole znaků pro čas
    char dat[11]; // pole znaků pro datum
    float speedwind = 0; // rychlost větru (m/s)
    float vitr = 0; // rychlost větru km/h
    float INtemp; // vnitřní teplota
    int INhum; // vnitřní vlhkost
    float OUTtemp; // venkovní teplota
    int OUThum; // venkovní vlhkost
    int rtc[7]; // pole čísel na čas
    long tlak; // tlak vzduchu v Pa
    float tlakk; // tlak vzduchu v hPa
    int svetlo; // osvětlení
    float tma; // % tmy
    float zdrojTEMP; // teplota zdroje

    BMP085 dps = BMP085(); // inicializace tlaku vzduchu

    LiquidCrystal lcd(0, 1, 25, 24, 23, 22); //zapojení LCD – RS, E, D4, D5, D6, D7

    //vytvoření znaku pro stupeň
    byte degree[8] = {
    B00111,
    B00101,
    B00111,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000
    };

    //exosite
    String cikData = „VAŠE CIK ČÍSLO“; // CIK číslo
    byte macData[] = {VAŠE MAC ADRESA}; // MAC adresa
    IPAddress ip(VAŠE IP ADRESA); // IP adresa

    class EthernetClient client;
    Exosite exosite(cikData, &client);

    DallasTemperature sensors(&oneWire);

    DeviceAddress ZDROJt = {0x28, 0xFF, 0x12, 0x8F, 0x52, 0x14, 0x0, 0x17}; // adresa čidla teploty zdroje

    void setup()
    {
    // nastavení pinů
    pinMode(2, INPUT); // pin anemometru vstup
    digitalWrite(2, HIGH); // pull up na pinu anemometru
    pinMode(RGBR, OUTPUT); // pin RGB LED RED výstup
    pinMode(RGBG, OUTPUT); // pin RGB LED GREEN výstup
    pinMode(RGBB, OUTPUT); // pin RGB LED BLUE výstup
    digitalWrite(RGBR, HIGH); // zhasni RGB
    digitalWrite(RGBG, HIGH); // zhasni RGB
    digitalWrite(RGBB, HIGH); // zhasni RGB
    pinMode(PIEZO, OUTPUT); // pin piezo výstup

    lcd.begin(20, 4); //nastavení LCD
    dhti.begin(); //nastavení DHT IN
    dhto.begin(); //nastavení DHT OUT
    sensors.begin(); //nastavení čidla zdroje
    sensors.setResolution(ZDROJt, 10); // rozlišení čidla

    lcd.createChar(0, degree); //vytvoření znaku pro stupeň

    dps.init(MODE_ULTRA_HIGHRES, 42600, true); // 426 metrů, true = nastavené jednotky v metrech

    lcd.clear(); // smaž LCD
    lcd.setCursor(0, 0); // první řádek
    lcd.print(„ethernet start“); // vypiš
    Ethernet.begin(macData,ip); // spuštění ethernetu
    if (!SD.begin(chipSelect)) { // pokud nejde SD karta pak
    lcd.println(„Chyba SD“); // vypiš
    return; // návrat
    }
    lcd.println(„SD OK“); // vypiš
    tone(PIEZO,1000,200); // tón na pinu 45,frekvence 1000, délka 200
    lcd.clear(); // smaž LCD
    }

    // hlavní smyčka
    void loop()
    {
    sensors.requestTemperatures(); // spuštění čidla teploty
    INhum = dhti.readHumidity(); // čtení vnitřní vlhkosti
    INtemp = dhti.readTemperature(); // čtení vnitřní teploty
    OUThum = dhto.readHumidity(); // čtení venkovní vlhkosti
    OUTtemp = dhto.readTemperature(); // čtení venkovní teploty
    zdrojTEMP = sensors.getTempC(ZDROJt);// čtení teploty zdroje
    svetlo = analogRead(0); // čtení osvětlení
    delay(100); // čekej
    dps.getPressure(&tlak); // čtení tlaku

    RTC.get(rtc,true); // načte čas z modulu
    sprintf(cas, „%02d:%02d“ ,rtc[2],rtc[1]); // zapíše do pole cas čas z rtc
    sprintf(dat, „%02d.%02d.%4d“ ,rtc[4],rtc[5],rtc[6]); // zapíše do pole dat datum z rtc

    tma = svetlo / 10.23; //převod tmy na %

    tlakk = tlak / 100; //převod Pa na hPa

    anemometr(); // měřění větru

    zobrazeniLCD(); // zobrazení na LCD

    RGB(); // RGB LED

    outexosite(); // zápis na exosite

    SDzapis(); // zápis na SD kartu

    }
    ///////////////////////zápis na SD kartu/////////////////

    void SDzapis()
    {
    File sd = SD.open(„log.csv“, FILE_WRITE); // otevři log.csv

    // pokud soubor existuje pak zapiš
    if (sd) {
    sd.print(cas);
    sd.print(„;“);
    sd.print(dat);
    sd.print(„;“);
    sd.print(INtemp);
    sd.print(„;“);
    sd.print(OUTtemp);
    sd.print(„;“);
    sd.print(INhum);
    sd.print(„;“);
    sd.print(OUThum);
    sd.print(„;“);
    sd.print(tlakk);
    sd.print(„;“);
    sd.println(vitr);

    sd.close(); // zavři log.csv

    lcd.setCursor(0, 3); // nastav 4.řádek LCD
    lcd.print(„SD OK“); // vypiš
    delay(1000); // čekej
    }
    // pokud se zápis nezdaří
    else {
    lcd.setCursor(0, 3); // nastav 4.řádek LCD
    lcd.print(„SD error“); // vypiš
    }

    }

    /////////////////////RGB LED/////////////////////////////

    void RGB()
    {
    if (OUTtemp <= -10) // pokud je teplota <= -10
    {
    analogWrite(RGBR, 255);
    analogWrite(RGBG, 255);
    analogWrite(RGBB, 0);
    }

    if (OUTtemp > -10 && OUTtemp <= -5) // pokud je teplota > -10 a <= -5
    {
    analogWrite(RGBR, 255);
    analogWrite(RGBG, 197);
    analogWrite(RGBB, 0);
    }

    if (OUTtemp <= 0 && OUTtemp > -5) // pokud je teplota <= 0 a > -5
    {
    analogWrite(RGBR, 150);
    analogWrite(RGBG, 100);
    analogWrite(RGBB, 0);
    }

    if (OUTtemp > 0 && OUTtemp <= 5) // pokud je teplota > 0 a <= 5
    {
    analogWrite(RGBR, 119);
    analogWrite(RGBG, 57);
    analogWrite(RGBB, 255);
    }

    if (OUTtemp > 5 && OUTtemp <= 10) // pokud je teplota > 5 a <= 10
    {
    analogWrite(RGBR, 255);
    analogWrite(RGBG, 0);
    analogWrite(RGBB, 255);
    }

    if (OUTtemp > 10 && OUTtemp <= 15) // pokud je teplota > 10 a <= 15
    {
    analogWrite(RGBR, 161);
    analogWrite(RGBG, 255);
    analogWrite(RGBB, 0);
    }

    if (OUTtemp > 15 && OUTtemp <= 20) // pokud je teplota > 15 a <= 20
    {
    analogWrite(RGBR, 78);
    analogWrite(RGBG, 84);
    analogWrite(RGBB, 129);
    }

    if (OUTtemp > 20) // pokud je teplota > 20
    {
    analogWrite(RGBR, 0);
    analogWrite(RGBG, 255);
    analogWrite(RGBB, 255);
    }
    }

    //////////////////Měření rychlosti větru/////////////////

    void anemometr()
    {
    windvelocity();
    RPMcalc();
    WindSpeed();
    vitr = speedwind * 3,6;
    }

    void windvelocity(){
    speedwind = 0;
    counter = 0;
    attachInterrupt(0, addcount, CHANGE);
    unsigned long millis();
    long startTime = millis();
    while(millis() < startTime + period) {
    }
    detachInterrupt(0);
    }

    void RPMcalc(){
    RPM=((counter/2)*60)/(period/1000); // Calculate revolutions per minute (RPM)
    }

    void WindSpeed()
    {
    speedwind = ((2 * pi * anemo * RPM)/60) / 1000; // Calculate wind speed on m/s
    }

    void addcount()
    {
    counter++;
    }

    //////////////////////////////////zobrazení na LCD////////////////////////////////////////////

    void zobrazeniLCD()
    {
    lcd.clear(); // smaže LCD
    lcd.setCursor(0, 0); //první řádek
    lcd.print(cas); //vypíše čas
    lcd.print(“ „); //vypíše mezeru
    lcd.print(dat); //vypíše datum

    lcd.setCursor(0, 1); //druhý řádek
    lcd.print(„Ti:“);
    lcd.print(INtemp); //vypíše vnitřní teplotu
    lcd.write(byte(0));
    lcd.print(„C“);
    lcd.print(“ Hi:“); //vypíše vnitřní vlhkost
    lcd.print(INhum);
    lcd.print(„%“);

    lcd.setCursor(0, 2); //třetí řádek
    lcd.print(„To:“);
    lcd.print(OUTtemp); //vypíše venkovní teplotu
    lcd.write(byte(0));
    lcd.print(„C“);
    lcd.print(“ Ho:“); //vypíše venkovní vlhkost
    lcd.print(OUThum);
    lcd.print(„%“);

    lcd.setCursor(0, 3); //čtvrtý řádek
    lcd.print(speedwind);//vypíše rychlost větru v m/s
    lcd.print(„m/s „);
    lcd.print(vitr);
    lcd.print(„km/h“); //vypíše rychlost větru v km/h

    delay(10000); //čekej 10s
    lcd.clear(); //smaže LCD

    lcd.setCursor(0, 0); //první řádek
    lcd.print(„Tlak:“);
    lcd.print(tlakk); //vypíše tlak vzduchu
    lcd.print(„hPa“);
    lcd.setCursor(0, 1); //druhý řádek
    lcd.print(„Tma:“);
    lcd.print(tma);
    lcd.print(„%“);
    lcd.setCursor(0, 2); //třetí řádek
    lcd.print(„Web:“);
    }

    ////////////////////////////////odeslání na exosite//////////////////////////////////

    void outexosite()
    {
    char buffer[7];
    String readParam = „“;
    String writeParam = „“;
    String returnString = „“;
    int bzucakD = 0;

    ///////////venkovní teplota/////////////

    readParam = „“;
    writeParam = „Otemp=“;

    String OtempValue = dtostrf(OUTtemp, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2

    writeParam += OtempValue; //add converted temperature String value

    if ( exosite.writeRead(writeParam, readParam, returnString)) {
    lcd.print(„O“);
    }
    else {
    lcd.print(„E“);
    }

    //////////////////vnitřní teplota/////////////
    readParam = „“; //nothing to read back at this time e.g. ‚control&status‘ if you wanted to read those data sources
    writeParam = „Itemp=“; //parameters to write e.g. ‚temp=65.54‘ or ‚temp=65.54&status=on‘

    String ItempValue = dtostrf(INtemp, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2

    writeParam += ItempValue; //add converted temperature String value

    if ( exosite.writeRead(writeParam, readParam, returnString)) {
    lcd.print(„O“);
    }
    else {
    lcd.print(„E“);
    }

    //////////////////////////venkovní vlhkost////////////////////////

    readParam = „“; //nothing to read back at this time e.g. ‚control&status‘ if you wanted to read those data sources
    writeParam = „Ohum=“; //parameters to write e.g. ‚temp=65.54‘ or ‚temp=65.54&status=on‘

    String OhumValue = dtostrf(OUThum, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2

    writeParam += OhumValue; //add converted temperature String value

    if ( exosite.writeRead(writeParam, readParam, returnString)) {
    lcd.print(„O“);
    }
    else {
    lcd.print(„E“);
    }

    ////////////////vnitřní vlhkost///////////////////////

    readParam = „“; //nothing to read back at this time e.g. ‚control&status‘ if you wanted to read those data sources
    writeParam = „Ihum=“; //parameters to write e.g. ‚temp=65.54‘ or ‚temp=65.54&status=on‘

    String IhumValue = dtostrf(INhum, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2

    writeParam += IhumValue; //add converted temperature String value

    if ( exosite.writeRead(writeParam, readParam, returnString)) {
    lcd.print(„O“);
    }
    else {
    lcd.print(„E“);
    }

    ////////////////////////////////rychlost větru km/h////////////////////////////////

    readParam = „“; //nothing to read back at this time e.g. ‚control&status‘ if you wanted to read those data sources
    writeParam = „vitrkm=“; //parameters to write e.g. ‚temp=65.54‘ or ‚temp=65.54&status=on‘

    String KvitrValue = dtostrf(vitr, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2

    writeParam += KvitrValue; //add converted temperature String value

    if ( exosite.writeRead(writeParam, readParam, returnString)) {
    lcd.print(„O“);
    }
    else {
    lcd.print(„E“);
    }

    ////////////////////////////////osvětlení////////////////////////////////

    readParam = „“; //nothing to read back at this time e.g. ‚control&status‘ if you wanted to read those data sources
    writeParam = „svetlo=“; //parameters to write e.g. ‚temp=65.54‘ or ‚temp=65.54&status=on‘

    String svetloValue = dtostrf(tma, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2

    writeParam += svetloValue; //add converted temperature String value

    if ( exosite.writeRead(writeParam, readParam, returnString)) {
    lcd.print(„O“);
    }
    else {
    lcd.print(„E“);
    }

    ////////////////////////////////tlak vzduchu//////////////////////////////////////

    readParam = „“; //nothing to read back at this time e.g. ‚control&status‘ if you wanted to read those data sources
    writeParam = „tlak=“; //parameters to write e.g. ‚temp=65.54‘ or ‚temp=65.54&status=on‘

    String tlakValue = dtostrf(tlakk, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2

    writeParam += tlakValue; //add converted temperature String value

    if ( exosite.writeRead(writeParam, readParam, returnString)) {
    lcd.print(„O“);
    }
    else {
    lcd.print(„E“);
    }

    //////////////////Teplota zdroje/////////////
    readParam = „“; //nothing to read back at this time e.g. ‚control&status‘ if you wanted to read those data sources
    writeParam = „Ztemp=“; //parameters to write e.g. ‚temp=65.54‘ or ‚temp=65.54&status=on‘

    String ZtempValue = dtostrf(zdrojTEMP, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2

    writeParam += ZtempValue; //add converted temperature String value

    if ( exosite.writeRead(writeParam, readParam, returnString)) {
    lcd.print(„O“);
    }
    else {
    lcd.print(„E“);
    }

    }

    Attachments:
    #6272
    posjirka
    Účastník

    tohle jsou krásné projekty. Taky chceme s hasičama postavit malou meteostanici. Tento tvůj projekt je velmi dobrou inspirací. Máš někde na WEBu vizualizaci? Nenašel jsem jí tam, pouze měsíční statistiky. S Exosite jsem ještě nepracoval a nejdřív zvažují co všechno měřit. Neměl jsi tam i měřič srážek ?

    #6274
    Diego
    Účastník

    Diky. Mam tam odkaz Aktualni data z meteostanice. Nebo mrkni sem http://elektronika2011.cz/pocasi
    Srazkomer sem tam mel ale nakonec sem ho zrusil kuli chybam

Aktuálně jsou na stránce zobrazeny 3 příspěvky - 1. až 3. (celkem z 3)
  • Pro reakci na toto téma se musíte přihlásit.