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 a 7 měsíci.
-
AutorPříspěvky
-
6.3.2016 v 8:57 #6265DiegoÚč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
`/*
Meteostanice verze 5.1 finalrozšíř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 zdrojeBMP085 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 adresaclass 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ýstuplcd.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í čidlalcd.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í tlakuRTC.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 rtctma = 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 datumlcd.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/hdelay(10000); //čekej 10s
lcd.clear(); //smaže LCDlcd.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:
6.3.2016 v 13:25 #6272posjirkaÚčastníktohle 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 ?
6.3.2016 v 13:30 #6274DiegoÚčastníkDiky. 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 -
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.