Files
TemperatureSensor/main.cpp
2024-06-11 16:20:56 +02:00

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