Meteostanice
Príspevkov: 29
• Stránka 1 z 2 • 1, 2
Meteostanice
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:
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
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
- Robo Ulbricht
- Príspevky: 78
- Registrovaný: Štv 04. Dec 2014 22:15:58
- Bydlisko: Banská Bystrica
Re: Meteostanice
Páči sa mi to kreatívne testovanie na bicykli.
To by chcelo aj video. Medzi ľuďmi alebo autami. Musela polka mesta na to pozerať ako na ufo.

Re: Meteostanice
Robo Ulbricht píše:Páči sa mi to kreatívne testovanie na bicykli.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ě

Re: Meteostanice
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
Re: Meteostanice
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.

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.
Re: Meteostanice
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í

Re: Meteostanice
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ří

Re: Meteostanice
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
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
Re: Meteostanice
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.
Re: Meteostanice
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.
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.
Re: Meteostanice
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
Príspevkov: 29
• Stránka 1 z 2 • 1, 2