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