Kód: Vybrat vše
#include <Arduino.h>
#include <SPI.h>
#include "RF24.h"
#include <nRF24L01.h>
#include <Adafruit_BMP085.h>
#include <Wire.h>
#include <SHT21.h>
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
RF24 radio(8, 10);
Adafruit_BMP085 bmp;
SHT21 sht;
const uint64_t pipe = 0xE8E8F0F0E1LL;
float data[6];
// zde se bude ukládat zda přišel impuls z watchdog timeru
// hodnota 1 simuluje impuls po zapnutí, aby jsme nečekali
volatile int impuls_z_wdt = 1;
// zde se ukládají impulsy
volatile int citac_impulsu = 2;
// zde nastavíme potřebný počet impulsů
// podle nastavení WDT viz níže je jeden impuls 8 sekund
volatile int impulsu_ke_spusteni = 10;
// impuls z WATCHDOG TIMERU /////////////////
ISR(WDT_vect)
{
//když je proměnná impuls_z_wdt na 0
if (impuls_z_wdt == 0)
{
// zapiš do proměnné 1
impuls_z_wdt = 1;
}
}
void enterSleep(void)
{
//nastavení nejúspornějšího módu
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
// spánkový režim je povolený
sleep_enable();
// spuštění režimu spánku
sleep_mode();
// tady bude program pokračovat když se probudí
// spánek zakázán
sleep_disable();
//znovu zapojení všech funkcí
power_all_enable();
}
void setup()
{
Serial.begin(9600);
bmp.begin();
radio.begin();
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate(RF24_250KBPS);
radio.openWritingPipe(pipe);
// nastavení WATCHDOG TIMERU
MCUSR &= ~(1 << WDRF);
WDTCSR |= (1 << WDCE) | (1 << WDE);
// nastavení času impulsu
WDTCSR = 1 << WDP0 | 1 << WDP3; // 8 sekund, WDTCSR = B0110 --> 1 sekunda
WDTCSR |= _BV(WDIE);
}
void loop()
{
//když je impuls z WATCHDOG TIMERU a zároveň i potřebný jejich počet
if ((impuls_z_wdt == 1) & (impulsu_ke_spusteni == citac_impulsu))
{
//radio.powerUp();
float rychlostvetra = map(analogRead(A2), 0.0f, 1024.0f, 0, 100);
int vietor = analogRead(A1);
int vstupnenapetie = analogRead(A0);
float napetie = vstupnenapetie * (4.3 / 1023);
float teplota = bmp.readTemperature();
float tlak = (bmp.readPressure() / 100);
float vlhkost = sht.getHumidity();
float smervetra;
if ( vietor < 720 && vietor > 660) {
smervetra = 0;
}
if ( vietor < 250 && vietor > 200) {
smervetra = 180;
}
if ( vietor < 500 && vietor > 430) {
smervetra = 270;
}
if ( vietor < 429 && vietor > 395) {
smervetra = 90;
}
if ( vietor < 580 && vietor > 540) {
smervetra = 315;
}
if ( vietor < 800 && vietor > 730) {
smervetra = 45;
}
if ( vietor < 390 && vietor > 350) {
smervetra = 225;
}
if ( vietor < 199 && vietor > 150) {
smervetra = 135;
}
Serial.print("teplota ");
Serial.println(teplota);
Serial.print("tlak ");
Serial.println(tlak);
Serial.print("vlhkost ");
Serial.println(vlhkost);
Serial.print("napetie ");
Serial.println(napetie);
Serial.print("vietor ");
Serial.println(vietor);
Serial.print("rychlostvetra ");
Serial.println(rychlostvetra);
Serial.print("smervetra ");
Serial.println(smervetra);
data[0] = teplota;
data[1] = tlak;
data[2] = vlhkost;
data[3] = napetie;
data[4] = smervetra;
data[5] = rychlostvetra;
radio.write(data, sizeof(data));
//delay(200);
radio.powerDown();
citac_impulsu = 0;// vynuluj čítač
impuls_z_wdt = 0; // vynuluj impuls
enterSleep();// znovu do spánku
}
else
{
enterSleep();//znovu do spánku
}
citac_impulsu++; // inpuls se přičte i když nic neproběhlo
}