150 lines
2.7 KiB
C++
150 lines
2.7 KiB
C++
#include <stdint.h>
|
|
#include <avr/io.h>
|
|
#include <util/delay.h>
|
|
#include <avr/interrupt.h>
|
|
#include <avr/sleep.h>
|
|
#include "dht11.h"
|
|
#include "W433DataTransmitter.h"
|
|
#include "watchdog.h"
|
|
#include "softspim.h"
|
|
#include "BMP280.h"
|
|
#include "comperator.h"
|
|
|
|
|
|
#define TEMP_SENSOR_DATA PB4
|
|
#define TRANSMITTER_DATA PD0
|
|
#define DOOR_PIN PD2
|
|
#define POWER_PIN PD5
|
|
#define LED_PIN PD1
|
|
|
|
EMPTY_INTERRUPT(WDT_OVERFLOW_vect);
|
|
|
|
static constexpr uint8_t id = 4;
|
|
static constexpr bool WATCH_DOOR = false;
|
|
static constexpr bool BMP_280 = false;
|
|
static constexpr bool DHT22 = true;
|
|
|
|
static void power(const bool power)
|
|
{
|
|
if(power)
|
|
{
|
|
PORTD |= 1 << POWER_PIN | 1 << LED_PIN;
|
|
DDRD = 1 << POWER_PIN | 1 << LED_PIN | 1 << TRANSMITTER_DATA;
|
|
DDRB = 1 << PB0 | 1 << PB3;
|
|
}
|
|
else
|
|
{
|
|
PORTD &= ~(1 << POWER_PIN | 1 << LED_PIN | 1 << TRANSMITTER_DATA);
|
|
DDRB = 0;
|
|
}
|
|
}
|
|
|
|
void debugBlink(bool fast = true)
|
|
{
|
|
_delay_ms(100);
|
|
if(!fast) _delay_ms(200);
|
|
PORTD &= ~(1 << LED_PIN);
|
|
_delay_ms(100);
|
|
if(!fast) _delay_ms(200);
|
|
PORTD |= 1 << LED_PIN;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
|
|
Dht11 tempSensor(&PORTB, &PINB, &DDRB, TEMP_SENSOR_DATA);
|
|
|
|
//pressure sensor
|
|
SpiMaster spi;
|
|
BMP280 pressSensor(&spi, &PORTB, PB1);
|
|
|
|
//Transmitter and transmiter power
|
|
W433DataTransmitter transmiter(&PORTD, TRANSMITTER_DATA);
|
|
|
|
Comperator comp;
|
|
|
|
sei();
|
|
WDTCSR = 1<<WDIE;
|
|
wdt_set(WDTO_2S);
|
|
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
|
|
|
uint8_t couter = 200;
|
|
|
|
while(true)
|
|
{
|
|
if(++couter > 80)
|
|
{
|
|
couter = 0;
|
|
|
|
power(true);
|
|
comp.on();
|
|
for(uint8_t i = 0; i < 20; ++i)
|
|
{
|
|
debugBlink();
|
|
}
|
|
PORTD &= ~(1 << LED_PIN);
|
|
|
|
uint8_t paket[4] = {0};
|
|
paket[1] = id;
|
|
|
|
|
|
//temperature sensor
|
|
if constexpr (DHT22)
|
|
{
|
|
//debugBlink(false);
|
|
tempSensor.read();
|
|
paket[0] = 1;
|
|
paket[2] = tempSensor.temperature >> 8;
|
|
paket[3] = tempSensor.temperature;
|
|
transmiter.send(paket, 4);
|
|
}
|
|
|
|
//humidity sensor
|
|
if constexpr (DHT22)
|
|
{
|
|
//debugBlink(false);
|
|
paket[0] = 2;
|
|
paket[2] = tempSensor.humidity >> 8;
|
|
paket[3] = tempSensor.humidity;
|
|
transmiter.send(paket, 4);
|
|
}
|
|
|
|
//low battery waring
|
|
if(comp.compare())
|
|
{
|
|
//debugBlink(false);
|
|
paket[0] = 128;
|
|
paket[2] = 0;
|
|
paket[3] = id;
|
|
transmiter.send(paket, 4);
|
|
}
|
|
|
|
//presure sensor
|
|
if constexpr(BMP_280)
|
|
{
|
|
//debugBlink(false);
|
|
uint16_t pressure = pressSensor.getPressure();
|
|
paket[0] = 3;
|
|
paket[2] = pressure >> 8;
|
|
paket[3] = pressure;
|
|
transmiter.send(paket, 4);
|
|
}
|
|
|
|
//door
|
|
if constexpr(WATCH_DOOR)
|
|
{
|
|
//debugBlink(false);
|
|
paket[0] = 0;
|
|
paket[1] = 2;
|
|
paket[2] = 0;
|
|
paket[3] = readPin(&PIND, DOOR_PIN);
|
|
transmiter.send(paket, 4);
|
|
}
|
|
comp.off();
|
|
power(false);
|
|
}
|
|
sleep_mode();
|
|
}
|
|
}
|
|
|