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