Anemometr
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Anemometr
Ahoj, měl by prosím někdo schéma a kód pro meteostanici? Anemometr + teploměr/vlhkoměr. Anemometr mám. Odkoupen od místního aeroklubu, je dost robustní. Směr větru je udáván podle 18 jazýčkových kontaktů, na hřídeli směrovky je jeden magnet. Snímání rychlosti větru bych si přizpůsobil podle použitých věcí ve schématu- hall senzor nebo optická brána. K dispozici mám arduino Uno ,3,5" LCD shield, temperature senzor DHT11/22, hall senzor, IR bránu. Děkuji
Re: Anemometr
Mam tady starší program co jsem měl před pár lety meteostanici. Schéma si musíš odvodit sám a upravit si to dle svých potřeb
Kód: Vybrat vše
#include <LiquidCrystal.h>
#include <Arduino.h>
#include <Wire.h>
#include <DHT.h>
#include <BMP085.h>
#include <Ethernet.h>
#include <EEPROM.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SD.h>
#include <VirtualWire.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é
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
long tlak; // tlak vzduchu v Pa
float tlakk; // tlak vzduchu v hPa
int svetlo; // osvětlení
float tma; // % tmy
float zdrojTEMP; // teplota zdroje
unsigned long citac = 0; // čítač smyček
unsigned long citac2 = 0;
float vitrPRUMER = 0; // proměnná na průměrnou rychlost větru
byte zprava[VW_MAX_MESSAGE_LEN]; //pole s příchozí zprávou
byte delkaZPRAVY = VW_MAX_MESSAGE_LEN; //délka příchozí zprávy
byte mycka[] = ("mycka"); //pole pro porovnání - mycka
int porovnani; //proměnná pro porovnání zprávy
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
};
//web
String apiKlic = "xxxx"; //thingspeak klíč
const char* server = "api.thingspeak.com"; //adresa thingspeaku
byte macData[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // MAC adresa
IPAddress ip(192, 168, 2, 200); // IP adresa
class EthernetClient client;
DallasTemperature sensors(&oneWire);
DeviceAddress ZDROJt = {0x28, 0xFF, 0x12, 0x8F, 0x52, 0x14, 0x0, 0x17};
void setup()
{
// nastavení pinů
pinMode(2, INPUT);
digitalWrite(2, HIGH);
pinMode(RGBR, OUTPUT);
pinMode(RGBG, OUTPUT);
pinMode(RGBB, OUTPUT);
digitalWrite(RGBR, HIGH); // zhasni RGB
digitalWrite(RGBG, HIGH); // zhasni RGB
digitalWrite(RGBB, HIGH); // zhasni RGB
pinMode(PIEZO, OUTPUT);
pinMode(17, OUTPUT); //napájení přijímače
digitalWrite(17, HIGH); //zapnout
lcd.begin(20, 4); //nastavení LCD
dhti.begin();
dhto.begin();
sensors.begin();
sensors.setResolution(ZDROJt, 10); // rozlišení čidla
vw_setup(1000); //rychlost přenosu
vw_set_rx_pin(19); //přijímač na pinu 19
vw_rx_start(); //start přijímače
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();
lcd.setCursor(0, 0); //první řádek
lcd.print("ethernet start");
Ethernet.begin(macData,ip); //spuštění ethernetu
if (!SD.begin(chipSelect)) {
lcd.println("Chyba SD");
return;
}
lcd.println("SD OK");
tone(PIEZO,1000,200); //tón na pinu 45,frekvence 1000, délka 200
lcd.clear();
citac = millis(); //načti čas
}
void loop()
{
sensors.requestTemperatures();
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í
dps.getPressure(&tlak); // čtení tlaku
tma = svetlo / 10.23; //převod tmy na %
tlakk = tlak / 100; //převod Pa na hPa
prijem433MHz(); //příjem 433MHz
anemometr(); // měřění větru
zobrazeniLCD(); // zobrazení na LCD
RGB(); // RGB LED
citac2 = millis();
if (citac2 - citac >= 60000) // pokud uběhla 1 minuta
{
thingspeak(); // zápis na thingspeak
SDzapis(); // zápis na SD kartu
citac = millis(); // vynuluj čítač
}
}
///////////////////////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(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
}
// pokud se zápis nezdaří
else {
lcd.setCursor(0, 3);
lcd.print("SD error");
}
}
/////////////////////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++;
}
/////////////////////////////////////příjem 433MHz//////////////////////////////////////////
void prijem433MHz()
{
porovnani = 0; //vynulování proměnné
if (vw_get_message(zprava, &delkaZPRAVY)) //pokud je přijata zpráva
{
for (int i = 0; i < delkaZPRAVY; i++) //opakuj dokud není porovnáno
{
if (zprava[i] == mycka[i]) //porovnej znaky zpráv a pokud jsou stejné
{
porovnani++; //zvyš porovnání
}
}
if (porovnani == 5) //pokud je zpráva schodná s "mycka"
{
lcd.clear();
tone(PIEZO, 3000, 200); //tón na pinu REPRO o frekvenci 3000Hz o délce 200ms
delay(500); //čekej 0,5s
tone(PIEZO, 3000, 200);
delay(500);
tone(PIEZO, 3000, 200);
delay(500);
lcd.setCursor(0,0); //nastav kursor
lcd.print("domyckovano"); //vypiš zprávu na LCD
delay(5000); //čekej 5s
lcd.clear();
}
}
}
//////////////////////////////////zobrazení na LCD////////////////////////////////////////////
void zobrazeniLCD()
{
lcd.setCursor(0, 0); //první řá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, 1); //druhý řá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, 2); //třetí řá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
lcd.setCursor(0, 3); //čtvrtý řádek
lcd.print("Tlak:");
lcd.print(tlakk); //vypíše tlak vzduchu
lcd.print("hPa ");
}
////////////////////////////////odeslání na thingspeak//////////////////////////////////
void thingspeak()
{
if (client.connect(server,80))
{
// vytvoření zprávy, která bude odeslána na Thingspeak
String zprava = apiKlic;
zprava +="&field1=";
zprava += String(OUTtemp); //teplota venku
zprava +="&field2=";
zprava += String(OUThum); //vlhkost venku
zprava +="&field3=";
zprava += String(tlakk); //tlak vzduchu
zprava +="&field4=";
zprava += String(vitr); //rychlost větru
zprava +="&field5=";
zprava += String(tma); //tma
zprava +="&field6=";
zprava += String(INtemp); //teplota doma
zprava +="&field7=";
zprava += String(INhum); //vlhkost doma
zprava += "\r\n\r\n";
// po vytvoření celé zprávy ji odešleme na server Thingspeak
// včetně našeho API klíče
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+apiKlic+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(zprava.length());
client.print("\n\n");
client.print(zprava);
}
// ukončení spojení se serverem Thingspeak
client.stop();
}
https://arze.cz - ARduino Zapojení Elektronika
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti