Anemometr

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
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.
Odpovědět
Alexander
Příspěvky: 5
Registrován: 28 říj 2021, 18:43
Reputation: 0

Anemometr

Příspěvek od Alexander » 10 lis 2022, 18:51

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

Uživatelský avatar
Diego
Příspěvky: 166
Registrován: 23 črc 2017, 09:43
Reputation: 0
Kontaktovat uživatele:

Re: Anemometr

Příspěvek od Diego » 13 lis 2022, 13:01

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

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 16 hostů