Update
This commit is contained in:
245
main.cpp
245
main.cpp
@ -15,11 +15,20 @@
|
||||
#include "ds1302.h"
|
||||
#include "sensor.h"
|
||||
#include "pwm.h"
|
||||
#include "dht11.h"
|
||||
#include "WirelessRelay.h"
|
||||
|
||||
//#define HAS_DHT
|
||||
#define HAS_TRANSMITTER
|
||||
//#define HAS_RECIVER
|
||||
|
||||
#define MAX_SENSORS 32
|
||||
#define COMMAND_BUFFER_SIZE 64
|
||||
#define SNPRINTF_BUFFER_SIZE 96
|
||||
|
||||
#define welcomeString "HELO "
|
||||
static constexpr bool bdayMsg = false;
|
||||
|
||||
void buttonHandler(uint8_t index, uint8_t type, void* data);
|
||||
SVector<Sensor, MAX_SENSORS> sensors;
|
||||
ShiftReg<16> shiftReg(&PORTB, PB3, PB2, PB1);
|
||||
@ -27,11 +36,30 @@ DS1302 clock(&PORTC, &PINC, &DDRC, PC0, PC2, PC1);
|
||||
DualCl56 display(&shiftReg);
|
||||
Buttons buttons(&buttonHandler);
|
||||
|
||||
#ifdef HAS_DHT
|
||||
#define DPY_FIXED_ITEMS 4
|
||||
#else
|
||||
#define DPY_FIXED_ITEMS 2
|
||||
#endif
|
||||
|
||||
static constexpr uint8_t almA = 0b01;
|
||||
static constexpr uint8_t almB = 0b10;
|
||||
|
||||
uint8_t displaying = 0;
|
||||
uint8_t alm = 0;
|
||||
|
||||
volatile bool setting = false;
|
||||
volatile int8_t settingOffset = 0;
|
||||
|
||||
volatile bool ringging = false;
|
||||
|
||||
char buffer[SNPRINTF_BUFFER_SIZE];
|
||||
|
||||
volatile bool sensorsPaused=true;
|
||||
volatile bool sensorsPaused = true;
|
||||
|
||||
volatile bool relaySetting = false;
|
||||
|
||||
volatile uint8_t timer = 0;
|
||||
|
||||
ISR(INT1_vect)
|
||||
{
|
||||
@ -42,15 +70,40 @@ ISR(TIMER2_OVF_vect)
|
||||
{
|
||||
display.tick();
|
||||
buttons.tick();
|
||||
if(ringging && ((timer % 4 == 0 && timer < 128) || (timer > 128 && timer % 16 == 0)) ) writePin(&PORTD, PD4, true);
|
||||
else writePin(&PORTD, PD4, false);
|
||||
++timer;
|
||||
}
|
||||
|
||||
void buttonHandler(uint8_t index, uint8_t type, void* data)
|
||||
{
|
||||
if(index == 0 && type == Buttons::RELEASED)
|
||||
{
|
||||
if(++displaying < sensors.count()+2);
|
||||
else displaying = 0;
|
||||
}
|
||||
if(!setting)
|
||||
{
|
||||
if(index == 0 && type == Buttons::RELEASED)
|
||||
{
|
||||
if(++displaying < sensors.count()+DPY_FIXED_ITEMS);
|
||||
else displaying = 0;
|
||||
}
|
||||
else if(index == 0 && type == Buttons::LONG_PRESSED)
|
||||
{
|
||||
relaySetting = !relaySetting;
|
||||
}
|
||||
else if(index == 1 && type == Buttons::RELEASED )
|
||||
{
|
||||
if(!ringging) if(++alm > 3) alm = 0;
|
||||
else ringging = false;
|
||||
}
|
||||
else if(index == 1 && type == Buttons::LONG_PRESSED )
|
||||
{
|
||||
setting = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(index == 1 && type == Buttons::LONG_PRESSED ) setting = false;
|
||||
else if(index == 0 && type == Buttons::RELEASED ) settingOffset += 10;
|
||||
else if(index == 1 && type == Buttons::RELEASED ) settingOffset -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
void printSensor(const Sensor& sensor, Serial* serial)
|
||||
@ -152,7 +205,7 @@ void serialDispatch(Serial* serial, SVector<Sensor, MAX_SENSORS>* sensors)
|
||||
DS1302::Timeval time = {atoi(sec),atoi(min),atoi(hour),atoi(day),atoi(mon),atoi(year)};
|
||||
clock.setTime(time);
|
||||
serial->write_p(PSTR("date and time set\n"));
|
||||
display.setString("SET");
|
||||
display.setString("SET ");
|
||||
_delay_ms(1000);
|
||||
}
|
||||
else serial->write_p(PSTR("usage: set [yyyy] [mm] [dd] [hh] [mm] [ss]\n"));
|
||||
@ -195,13 +248,11 @@ void serialDispatch(Serial* serial, SVector<Sensor, MAX_SENSORS>* sensors)
|
||||
}
|
||||
else if(strcmp(token, "beep") == 0)
|
||||
{
|
||||
for(uint16_t i = 0; i < 250; ++i)
|
||||
{
|
||||
writePin(&PORTD, PD4, true);
|
||||
_delay_us(500);
|
||||
writePin(&PORTD, PD4, false);
|
||||
_delay_us(1000);
|
||||
}
|
||||
serial->write_p(PSTR("Beeping\n"));
|
||||
ringging = true;
|
||||
_delay_ms(1000);
|
||||
serial->write_p(PSTR("Done\n"));
|
||||
ringging = false;
|
||||
}
|
||||
else if(strcmp(token, "help") == 0)
|
||||
{
|
||||
@ -212,7 +263,7 @@ void serialDispatch(Serial* serial, SVector<Sensor, MAX_SENSORS>* sensors)
|
||||
}
|
||||
}
|
||||
|
||||
void displayItems(const DS1302::Timeval& time)
|
||||
void displayItems(const DS1302::Timeval& time, int16_t temp, int16_t humid)
|
||||
{
|
||||
switch(displaying)
|
||||
{
|
||||
@ -220,27 +271,64 @@ void displayItems(const DS1302::Timeval& time)
|
||||
writePin(&PORTB, PB4, time.sec % 2);
|
||||
snprintf(buffer, 9, " %02u%02u", time.hour, time.min);
|
||||
display.setString(buffer);
|
||||
display.setSegments((alm & almA ? DualCl56::SEG_A : 0) | (alm & almB ? DualCl56::SEG_D : 0), 0);
|
||||
break;
|
||||
case 1:
|
||||
writePin(&PORTB, PB4, false);
|
||||
snprintf(buffer, 9, "%02u%02u%04u", time.day, time.month, time.year);
|
||||
display.setString(buffer, DualCl56::DP_B | DualCl56::DP_D);
|
||||
break;
|
||||
#ifdef HAS_DHT
|
||||
case 2:
|
||||
writePin(&PORTB, PB4, false);
|
||||
snprintf(buffer, 9, "0 1%4u", temp);
|
||||
display.setString(buffer, DualCl56::DP_G);
|
||||
break;
|
||||
case 3:
|
||||
writePin(&PORTB, PB4, false);
|
||||
snprintf(buffer, 9, "0 2%4u", humid);
|
||||
display.setString(buffer, DualCl56::DP_G);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
if(displaying == 2 && sensors.count() == 0) display.setString("0 SENSOR");
|
||||
else
|
||||
{
|
||||
writePin(&PORTB, PB4, false);
|
||||
snprintf(buffer, 9, "%u%3u%4u", sensors[displaying-2].id, sensors[displaying-2].type, sensors[displaying-2].field);
|
||||
display.setString(buffer, sensors[displaying-2].type == 1 || sensors[displaying-2].type == 2 ? DualCl56::DP_G : 0);
|
||||
}
|
||||
writePin(&PORTB, PB4, false);
|
||||
snprintf(buffer, 9, "%u%3u%4u",
|
||||
sensors[displaying-DPY_FIXED_ITEMS].id,
|
||||
sensors[displaying-DPY_FIXED_ITEMS].type,
|
||||
sensors[displaying-DPY_FIXED_ITEMS].field);
|
||||
display.setString(buffer, sensors[displaying-DPY_FIXED_ITEMS].type == 1 || sensors[displaying-2].type == 2 ? DualCl56::DP_G : 0);
|
||||
}
|
||||
}
|
||||
|
||||
void setAlarm(DS1302::Timeval* alarm, uint8_t leadingSegment = 0)
|
||||
{
|
||||
writePin(&PORTB, PB4, true);
|
||||
while(setting)
|
||||
{
|
||||
if(settingOffset+alarm->min > 59)
|
||||
{
|
||||
if(++alarm->hour > 23) alarm->hour = 0;
|
||||
alarm->min = settingOffset+alarm->min-60;
|
||||
}
|
||||
else if(settingOffset+alarm->min < 0)
|
||||
{
|
||||
if(alarm->hour-1 < 0) alarm->hour = 24;
|
||||
--alarm->hour;
|
||||
alarm->min = settingOffset+alarm->min+60;
|
||||
}
|
||||
else alarm->min += settingOffset;
|
||||
settingOffset = 0;
|
||||
snprintf(buffer, 9, "S %02u%02u", alarm->hour, alarm->min);
|
||||
display.setString(buffer);
|
||||
display.setSegments(leadingSegment, 1);
|
||||
}
|
||||
writePin(&PORTB, PB4, false);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
DDRB = (1 << PB1) | ( 1 << PB2) | ( 1 << PB3) | ( 1 << PB4) | ( 1 << PB5);
|
||||
DDRD = 1<<PD4;
|
||||
DDRD = (1<<PD4) | (1<<PD2);
|
||||
PORTD |= (1<<PD6) | (1<<PD7);
|
||||
|
||||
TCCR2B = 1<<CS22;
|
||||
@ -250,46 +338,131 @@ int main()
|
||||
|
||||
EICRA = 1<<ISC10;
|
||||
EIMSK = 1<<INT1;
|
||||
|
||||
|
||||
sei();
|
||||
|
||||
Serial serial;
|
||||
serial.write_p(PSTR("SensorDisplay v0.1 starting\n"));
|
||||
serial.write_p(PSTR("SensorDisplay v0.4 starting\n"));
|
||||
|
||||
DS1302::Timeval alarmA = EEPROM_read_class<DS1302::Timeval>(128);
|
||||
DS1302::Timeval alarmB = EEPROM_read_class<DS1302::Timeval>(128+64);
|
||||
DS1302::Timeval time = clock.getTime();
|
||||
|
||||
alm = EEPROM_read_char(0);
|
||||
uint8_t oldAlm = alm;
|
||||
|
||||
|
||||
#ifdef HAS_TRANSMITTER
|
||||
char name[] = "relay";
|
||||
WirelessRelay relay(0b1011010001000000, name);
|
||||
#endif
|
||||
|
||||
#ifdef HAS_DHT
|
||||
Dht11 sensor(&PORTD, &PIND, &DDRD, PD2);
|
||||
#endif
|
||||
if(time.day == 28 && time.month == 5)
|
||||
{
|
||||
display.setString("HAPPY");
|
||||
_delay_ms(1000);
|
||||
display.setString("b-DAY");
|
||||
_delay_ms(1000);
|
||||
display.setString("SASA");
|
||||
_delay_ms(1000);
|
||||
if constexpr(bdayMsg)
|
||||
{
|
||||
display.setString("HAPPY ");
|
||||
_delay_ms(1000);
|
||||
display.setString("b-DAY ");
|
||||
_delay_ms(1000);
|
||||
display.setString("SASA ");
|
||||
_delay_ms(1000);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
display.setString("HELOJANA");
|
||||
display.setString(welcomeString);
|
||||
_delay_ms(1000);
|
||||
}
|
||||
|
||||
#ifdef HAS_DHT
|
||||
sensor.read();
|
||||
_delay_ms(1000);
|
||||
sensor.read();
|
||||
#endif
|
||||
|
||||
W433DataReciver reciver(&PIND, PD3, &TCNT1, &TIFR1, &packetHandler, reinterpret_cast<void*>(&serial), &reciverError);
|
||||
|
||||
uint8_t deleteDate = 0;
|
||||
|
||||
serial.write_p(PSTR("Ready\n"));
|
||||
|
||||
|
||||
uint16_t i = 0;
|
||||
|
||||
bool oldRelaySetting = false;
|
||||
|
||||
while(true)
|
||||
{
|
||||
time = clock.getTime();
|
||||
displayItems(time);
|
||||
#ifdef HAS_DHT
|
||||
if((displaying == 2 || displaying == 3) && i%2048 == 0)
|
||||
{
|
||||
cli();
|
||||
sensor.read();
|
||||
sei();
|
||||
}
|
||||
#endif
|
||||
|
||||
if(alm != oldAlm)
|
||||
{
|
||||
oldAlm = alm;
|
||||
EEPROM_write_char(0, alm);
|
||||
}
|
||||
|
||||
#ifdef HAS_TRANSMITTER
|
||||
if(oldRelaySetting != relaySetting)
|
||||
{
|
||||
writePin(&PORTB, PB4, false);
|
||||
oldRelaySetting = relaySetting;
|
||||
relay.setValue(relaySetting);
|
||||
display.setString( relaySetting ? "RLY ON " : "RLY OFF ");
|
||||
_delay_ms(1000);
|
||||
}
|
||||
#endif
|
||||
|
||||
if(setting)
|
||||
{
|
||||
setAlarm(&alarmA, DualCl56::SEG_A);
|
||||
setting = true;
|
||||
setAlarm(&alarmB, DualCl56::SEG_D);
|
||||
EEPROM_write_class(128, alarmA);
|
||||
EEPROM_write_class(128+64, alarmB);
|
||||
}
|
||||
|
||||
time = clock.getTime();
|
||||
|
||||
#ifdef HAS_DHT
|
||||
displayItems(time, sensor.temperature, sensor.humidity);
|
||||
#else
|
||||
displayItems(time, 0, 0);
|
||||
#endif
|
||||
if(time.hour == alarmA.hour && time.min == alarmA.min && time.sec == 0)
|
||||
{
|
||||
ringging = true;
|
||||
}
|
||||
|
||||
if(time.hour == alarmB.hour && time.min == alarmB.min && time.sec == 0)
|
||||
{
|
||||
#ifdef HAS_TRANSMITTER
|
||||
relay.setValue(true);
|
||||
#else
|
||||
ringging = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef HAS_RECIVER
|
||||
serialDispatch(&serial, &sensors);
|
||||
if(deleteDate != time.day)
|
||||
{
|
||||
displaying = 0;
|
||||
sensors.clear();
|
||||
deleteDate = time.day;
|
||||
display.setString("CLEAR ");
|
||||
_delay_ms(1000);
|
||||
}
|
||||
#endif
|
||||
++i;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user