Arduino schéma - arduino.sk

Meteostanice

Kompletné projekty s návodom a zdrojovým kódom
Obrázok užívateľa
Príspevky: 64
Registrovaný: Str 30. Okt 2013 18:21:18
Bydlisko: ČR

Meteostanice

Poslaťod Diego » Ned 15. Feb 2015 19:24:14

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

Meteostanice je 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
detekce deště
měření osvětlení
modul RTC
zobrazení hodnot na LCD 4x20 znaků
odesílání na web
bluetooth

Tady je kód:
Kód: Vybrať všetko
#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>

#define AN 2               // příjem z anemometru
#define DHTPINi 7          // vnitřní čidlo
#define DHTPINo 8          // vnější čidlo 
#define vetrak 53          // větrák na pin 53

#define DHTTYPE DHT22       // DHT 22  (AM2302)
DHT dhti(DHTPINi, DHTTYPE); // nastavení DHT IN
DHT dhto(DHTPINo, DHTTYPE); // nastavení DHT OUT

// 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
int dest;                      // detekce srážek
float destCIDLO;               // % srážek
int vetrakM;                   // detekce spusteneho vetraku meteostanice

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

LiquidCrystal lcd(0, 1, 6, 5, 9, 3);  //zapojení LCD



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


//exosite
  String cikData = "VAŠE CIK Z EXOSITE";  //CIK číslo
  byte macData[] = {MAC ADRESA};        // MAC adresa

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

 
void setup()
{
  Serial1.begin(9600);   
  // nastavení pinů
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
  pinMode(vetrak, OUTPUT);
  digitalWrite(vetrak,LOW);  //vypni větrák
 
  lcd.begin(20, 4);  //nastavení LCD
  dhti.begin();
  dhto.begin();
  lcd.createChar(0, degree);  //vytvoření znaku pro stupeň
   
  dps.init(MODE_ULTRA_HIGHRES, 42600, true);  // 426 metrů, true = nastavené jednotky v metrech

  lcd.setCursor(0, 0); //první řádek
  lcd.print("ethernet start");
  Ethernet.begin(macData);  //spuštění ethernetu
 
  delay(3000);

  lcd.setCursor(0, 0); 
   
  pinMode(45, OUTPUT);   //piezo výstup

  tone(45,1000,200);  //tón na pinu 45,frekvence 1000, délka 200
}

void loop()
{
 
  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
  svetlo = analogRead(0);              // čtení osvětlení
  dest = analogRead(1);                // čtení deště
  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 % 
  destCIDLO = dest / 10.23;      //převod deště na %
   
  tlakk = tlak / 100;            //převod Pa na hPa
   
  if (tma <= 50)                 //pokud je tma menší nebo rovna 50%
    {
      digitalWrite(vetrak,HIGH); //zapni větrák
      vetrakM = 1; 
    }
    else                         //jinak
    {
      digitalWrite(vetrak,LOW);  //vypni větrák
      vetrakM = 0;
    }
   
  anemometr();     // měřění větru
   
  outexosite();    // zápis na exosite
   
  zobrazeniLCD();  // zobrazení na LCD

  bluetooth();     // odeslání bluetooth
     
}



//////////////////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(1);
}

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í naLCD////////////////////////////////////////////

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(8000);         //čekej 8s
  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("Dest:");
  lcd.print(destCIDLO);
  lcd.print("%");
       
 
  delay(4000);         //čekej 4s
   
  lcd.setCursor(0, 3); //čtvrtý řádek
  lcd.print("Web:");
   
}


////////////////////////////////odesílání na bluetooth///////////////////////////////

void bluetooth()
{
Serial1.println("Aktuální data z meteostanice");
   
Serial1.print("Datum a čas: ");
Serial1.print(dat);
Serial1.print(" ");
Serial1.println(cas);
       
Serial1.print("Vnitřní teplota: ");
Serial1.print(INtemp);
Serial1.println("°C");
   
Serial1.print("Venkovní teplota: ");
Serial1.print(OUTtemp);
Serial1.println("°C");   
   
Serial1.print("Vnitřní vlhkost: ");
Serial1.print(INhum);
Serial1.println("%");   
   
Serial1.print("Venkovní vlhkost: ");
Serial1.print(OUThum);
Serial1.println("%");     
   
Serial1.print("Rychlost větru: ");
Serial1.print(vitr);   
Serial1.println("km/h");
   
Serial1.print("Tma: ");
Serial1.print(tma);
Serial1.println("%");   
   
Serial1.print("Tlak vzduchu: ");
Serial1.print(tlakk);
Serial1.println("hPa");
   
Serial1.print("Větrák meteostanice: ");
Serial1.println(vetrakM);               
   
   

Serial1.println(" ");
Serial1.println(" ");

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

void outexosite()
{
  char buffer[7];
  String readParam = "";
  String writeParam = "";
  String returnString = ""; 
 
///////////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("OK");
    }
    else {
      lcd.print("Error");
    }
   
//////////////////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("OK");
    }
    else {
      lcd.print("Error");
    }
   
//////////////////////////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("OK");
    }
    else {
      lcd.print("Error");
    }
   
////////////////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("OK");
    }
    else {
      lcd.print("Error");
    }

//////////////////////////////////rychlost větru m/s////////////////////////

    readParam = "";        //nothing to read back at this time e.g. 'control&status' if you wanted to read those data sources
    writeParam = "vitrm="; //parameters to write e.g. 'temp=65.54' or 'temp=65.54&status=on'
   
    String MvitrValue = dtostrf(speedwind, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2
   
    writeParam += MvitrValue;    //add converted temperature String value

    if ( exosite.writeRead(writeParam, readParam, returnString)) {
      lcd.print("OK");
    }
    else {
      lcd.print("Error");
    }

////////////////////////////////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("OK");
    }
    else {
      lcd.print("Error");
    }   
   
////////////////////////////////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("OK");
    }
    else {
      lcd.print("Error");
    }   
   
////////////////////////////////déšť//////////////////////////////////////

    readParam = "";        //nothing to read back at this time e.g. 'control&status' if you wanted to read those data sources
    writeParam = "dest="; //parameters to write e.g. 'temp=65.54' or 'temp=65.54&status=on'
   
    String destValue = dtostrf(destCIDLO, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2
   
    writeParam += destValue;    //add converted temperature String value

    if ( exosite.writeRead(writeParam, readParam, returnString)) {
      lcd.print("OK");
    }
    else {
      lcd.print("Error");
    }   
////////////////////////////////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("OK");
    }
    else {
      lcd.print("Error");
    }   
}


Zapojení se dá vysledovat z kódu, schéma nemám :-)

Více info a fotky najdete na mém webu zde:

http://elektronika2011.cz/meteostanice
Naposledy upravil Diego dňa Pon 11. Jan 2016 18:31:37, celkovo upravené 2

Príspevky: 74
Registrovaný: Štv 04. Dec 2014 22:15:58
Bydlisko: Banská Bystrica

Re: Meteostanice

Poslaťod Robo Ulbricht » Ned 15. Feb 2015 19:51:55

Páči sa mi to kreatívne testovanie na bicykli. :D To by chcelo aj video. Medzi ľuďmi alebo autami. Musela polka mesta na to pozerať ako na ufo.

Obrázok užívateľa
Príspevky: 64
Registrovaný: Str 30. Okt 2013 18:21:18
Bydlisko: ČR

Re: Meteostanice

Poslaťod Diego » Uto 17. Feb 2015 6:04:36

Robo Ulbricht píše:Páči sa mi to kreatívne testovanie na bicykli. :D To by chcelo aj video. Medzi ľuďmi alebo autami. Musela polka mesta na to pozerať ako na ufo.

Naštěstí máme za městem cyklostezku tak to bylo v pohodě :-D

Obrázok užívateľa
Príspevky: 300
Registrovaný: Pon 19. Nov 2012 12:01:08
Bydlisko: HC/BA

Re: Meteostanice

Poslaťod tomXX » Uto 24. Feb 2015 23:35:57

Paráda, tiež mám v pláne... do ďalšej päťročnice. Chcel som si vyrobiť anemometer, lebo mi je ľúto dať za to 20€ a ako sa poznám, bude to 4 roky ležať v šuflíku a potom to vyhodím.
blog.sitepoint.sk - zaujímavé riešenia okolo Arduina

Príspevky: 2
Registrovaný: Uto 24. Mar 2015 15:48:26
Bydlisko: Zilina

Re: Meteostanice

Poslaťod MirecXP » Str 25. Mar 2015 21:42:06

Parada. Dalsi krok je solarne napajanie? :)

Momentalne skusam nieco jednoduchsie a data posielam na ThingSpeak cez WiFi.
No chcel by som to napajat z baterie a momentalne sa pasujem s uspornym rezimom ESP8266.

Obrázok užívateľa
Príspevky: 64
Registrovaný: Str 30. Okt 2013 18:21:18
Bydlisko: ČR

Re: Meteostanice

Poslaťod Diego » Ned 29. Mar 2015 10:11:37

MirecXP píše:Parada. Dalsi krok je solarne napajanie? :)

Momentalne skusam nieco jednoduchsie a data posielam na ThingSpeak cez WiFi.
No chcel by som to napajat z baterie a momentalne sa pasujem s uspornym rezimom ESP8266.


Solární napájení řešit nebudu, spotřeba není tak velká :-)

Další v plánu je GSM modul na SMS zpravodajství a upozornění ;-)

Obrázok užívateľa
Príspevky: 64
Registrovaný: Str 30. Okt 2013 18:21:18
Bydlisko: ČR

Re: Meteostanice

Poslaťod Diego » Sob 25. Apr 2015 4:56:30

Konečně sem udělal prezentační video, tak můžete mrknout ;-)

https://youtu.be/WmOknuO6gHg

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: Meteostanice

Poslaťod posjirka » Sob 25. Apr 2015 20:23:11

hezká práce. Co dělaji ty rele??

Obrázok užívateľa
Príspevky: 64
Registrovaný: Str 30. Okt 2013 18:21:18
Bydlisko: ČR

Re: Meteostanice

Poslaťod Diego » Ned 26. Apr 2015 16:11:17

posjirka píše:hezká práce. Co dělaji ty rele??

Relé jsou na: reset, ventilátor v radiačním štítu, odsávač a otvírání dveří ;)

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: Meteostanice

Poslaťod posjirka » Ned 26. Apr 2015 22:14:48

Husty ...

Príspevky: 6
Registrovaný: Uto 09. Júl 2013 23:38:12

Re: Meteostanice

Poslaťod fri » Pon 28. Sep 2015 6:08:23

Prosim Ta, odkial mas ten display? Paci sa mi to podsvietenie.
Vdaka, F.

Príspevky: 13
Registrovaný: Sob 29. Nov 2014 16:10:07

Re: Meteostanice

Poslaťod sraj » Uto 29. Sep 2015 12:08:56

Ahoj,
tiež používam tieto LCD s bielym posvietením, vyzerajú dobre
ak môžem doporučiť tak ja som kupoval od tohto pána viackrát, a maximálna spokojnosť, rýchle jednanie, doporučujem sa s nim skontaktovať
http://svetelektro.com/modules.php?name ... iew=unread

Obrázok užívateľa
Príspevky: 64
Registrovaný: Str 30. Okt 2013 18:21:18
Bydlisko: ČR

Re: Meteostanice

Poslaťod Diego » Uto 29. Sep 2015 17:43:13

fri píše:Prosim Ta, odkial mas ten display? Paci sa mi to podsvietenie.
Vdaka, F.

Ahoj,
Ten LCD mam vykuchanej ze staryho ovladaciho panelu ze srotu. Jinak nikde sem takovej na prodej nevidel.

Príspevky: 21
Registrovaný: Pon 11. Feb 2013 12:57:54

Re: Meteostanice

Poslaťod Korko » Pia 01. Jan 2016 15:08:02

caves ,
ktoru DHT kniznicu pouzivas ?
mohol by si napisat link na stiahnutie ?
mam problem ze ked klesne teplota pod 0 , tak mi DHT22 vracia 10-miestne kladne cislo.
vdaka.

Obrázok užívateľa
Príspevky: 64
Registrovaný: Str 30. Okt 2013 18:21:18
Bydlisko: ČR

Re: Meteostanice

Poslaťod Diego » Pia 08. Jan 2016 6:17:52

Korko píše:caves ,
ktoru DHT kniznicu pouzivas ?
mohol by si napisat link na stiahnutie ?
mam problem ze ked klesne teplota pod 0 , tak mi DHT22 vracia 10-miestne kladne cislo.
vdaka.


Ahoj, knihovnu používam tuhle: https://drive.google.com/file/d/0B_K-yz ... cslist_api

Ďalší

Späť na Hotové projekty