update to new reciver type

This commit is contained in:
2023-04-03 01:26:14 +02:00
parent 99ba609f6f
commit e268d49c48

416
main.cpp
View File

@ -18,15 +18,15 @@
#include "dht11.h" #include "dht11.h"
#include "WirelessRelay.h" #include "WirelessRelay.h"
//#define HAS_DHT #define HAS_DHT
#define HAS_TRANSMITTER //#define HAS_TRANSMITTER
//#define HAS_RECIVER #define HAS_RECIVER
#define MAX_SENSORS 32 #define MAX_SENSORS 32
#define COMMAND_BUFFER_SIZE 64 #define COMMAND_BUFFER_SIZE 64
#define SNPRINTF_BUFFER_SIZE 96 #define SNPRINTF_BUFFER_SIZE 96
#define welcomeString "HELO " #define welcomeString "HELO SAS"
static constexpr bool bdayMsg = false; static constexpr bool bdayMsg = false;
void buttonHandler(uint8_t index, uint8_t type, void* data); void buttonHandler(uint8_t index, uint8_t type, void* data);
@ -61,15 +61,15 @@ volatile bool relaySetting = false;
volatile uint8_t timer = 0; volatile uint8_t timer = 0;
ISR(INT1_vect) ISR(TIMER1_COMPA_vect)
{ {
W433DataReciver::staticInterrupt(); W433DataReciver::staticInterrupt();
} }
ISR(TIMER2_OVF_vect) ISR(TIMER2_OVF_vect)
{ {
display.tick(); display.tick();
buttons.tick(); buttons.tick();
if(ringging && ((timer % 4 == 0 && timer < 128) || (timer > 128 && timer % 16 == 0)) ) writePin(&PORTD, PD4, true); if(ringging && ((timer % 4 == 0 && timer < 128) || (timer > 128 && timer % 16 == 0)) ) writePin(&PORTD, PD4, true);
else writePin(&PORTD, PD4, false); else writePin(&PORTD, PD4, false);
++timer; ++timer;
@ -91,7 +91,7 @@ void buttonHandler(uint8_t index, uint8_t type, void* data)
else if(index == 1 && type == Buttons::RELEASED ) else if(index == 1 && type == Buttons::RELEASED )
{ {
if(!ringging) if(++alm > 3) alm = 0; if(!ringging) if(++alm > 3) alm = 0;
else ringging = false; else ringging = false;
} }
else if(index == 1 && type == Buttons::LONG_PRESSED ) else if(index == 1 && type == Buttons::LONG_PRESSED )
{ {
@ -108,40 +108,40 @@ void buttonHandler(uint8_t index, uint8_t type, void* data)
void printSensor(const Sensor& sensor, Serial* serial) void printSensor(const Sensor& sensor, Serial* serial)
{ {
serial->write_p(PSTR("SENSOR TYPE: ")); serial->write_p(PSTR("SENSOR TYPE: "));
serial->write(sensor.type); serial->write(sensor.type);
serial->write_p(PSTR(" ID: ")); serial->write_p(PSTR(" ID: "));
serial->write(sensor.id); serial->write(sensor.id);
if(sensor.type == 1) serial->write_p(PSTR(" TEMPERATURE: ")); if(sensor.type == 1) serial->write_p(PSTR(" TEMPERATURE: "));
else if(sensor.type == 2) serial->write_p(PSTR(" HUMIDITY: ")); else if(sensor.type == 2) serial->write_p(PSTR(" HUMIDITY: "));
else serial->write_p(PSTR(" FIELD: ")); else serial->write_p(PSTR(" FIELD: "));
serial->write(sensor.field); serial->write(sensor.field);
serial->putChar('\n'); serial->putChar('\n');
} }
void packetHandler(uint32_t packet, void* data) void packetHandler(uint32_t packet, void* data)
{ {
Serial* serial = reinterpret_cast<Serial*>(data); Serial* serial = reinterpret_cast<Serial*>(data);
Sensor sensor; Sensor sensor;
sensor.field = packet & 0x0000FFFF; sensor.field = packet & 0x0000FFFF;
sensor.type = packet >> 24; sensor.type = packet >> 24;
sensor.id = (packet & 0x00FF0000) >> 16; sensor.id = (packet & 0x00FF0000) >> 16;
bool found = false; bool found = false;
for(uint8_t i = 0; i < sensors.count() && !found; ++i) for(uint8_t i = 0; i < sensors.count() && !found; ++i)
{ {
if(sensors[i] == sensor) if(sensors[i] == sensor)
{ {
sensors[i] = sensor; sensors[i] = sensor;
found = true; found = true;
} }
} }
if(!found) sensors.push_back(sensor); if(!found) sensors.push_back(sensor);
if(!sensorsPaused) printSensor(sensor, serial); if(!sensorsPaused) printSensor(sensor, serial);
} }
void reciverError(uint8_t code, void* userData) void reciverError(uint8_t code, void* userData)
@ -157,7 +157,7 @@ void reciverError(uint8_t code, void* userData)
inline static void printHelp(Serial* serial) inline static void printHelp(Serial* serial)
{ {
serial->write_p(PSTR("Available Commands: \n\ serial->write_p(PSTR("Available Commands: \n\
help : Show this prompt.\n\ help : Show this prompt.\n\
date : Show current date and time.\n\ date : Show current date and time.\n\
set [yyyy] [mm] [dd] [hh] [mm] [ss] : Show current date and time.\n\ set [yyyy] [mm] [dd] [hh] [mm] [ss] : Show current date and time.\n\
@ -179,138 +179,140 @@ int freeRAM()
void serialDispatch(Serial* serial, SVector<Sensor, MAX_SENSORS>* sensors) void serialDispatch(Serial* serial, SVector<Sensor, MAX_SENSORS>* sensors)
{ {
if(serial->dataIsWaiting()) if(serial->dataIsWaiting())
{ {
char buffer[COMMAND_BUFFER_SIZE]; char buffer[COMMAND_BUFFER_SIZE];
unsigned int length = serial->getString(buffer, COMMAND_BUFFER_SIZE); unsigned int length = serial->getString(buffer, COMMAND_BUFFER_SIZE);
if(length > 2) if(length > 2)
{ {
char* token = strtok(buffer, " \n"); char* token = strtok(buffer, " \n");
if(strcmp(token, "date") == 0) if(strcmp(token, "date") == 0)
{ {
DS1302::Timeval time = clock.getTime(); DS1302::Timeval time = clock.getTime();
snprintf(buffer, SNPRINTF_BUFFER_SIZE, "%04u.%02u.%02u %02u:%02u:%02u\n", time.year, time.month, time.day, time.hour, time.min, time.sec); snprintf(buffer, SNPRINTF_BUFFER_SIZE, "%04u.%02u.%02u %02u:%02u:%02u\n", time.year, time.month, time.day, time.hour,
serial->write(buffer, SNPRINTF_BUFFER_SIZE); time.min, time.sec);
} serial->write(buffer, SNPRINTF_BUFFER_SIZE);
else if(strcmp(token, "set") == 0) }
{ else if(strcmp(token, "set") == 0)
char* year = strtok(NULL, " \n"); {
char* mon = strtok(NULL, " \n"); char* year = strtok(NULL, " \n");
char* day = strtok(NULL, " \n"); char* mon = strtok(NULL, " \n");
char* hour = strtok(NULL, " \n"); char* day = strtok(NULL, " \n");
char* min = strtok(NULL, " \n"); char* hour = strtok(NULL, " \n");
char* sec = strtok(NULL, " \n"); char* min = strtok(NULL, " \n");
if(year != NULL && mon != NULL && day != NULL && hour != NULL && min != NULL && sec != NULL) char* sec = strtok(NULL, " \n");
{ if(year != NULL && mon != NULL && day != NULL && hour != NULL && min != NULL && sec != NULL)
DS1302::Timeval time = {atoi(sec),atoi(min),atoi(hour),atoi(day),atoi(mon),atoi(year)}; {
clock.setTime(time); DS1302::Timeval time = {atoi(sec),atoi(min),atoi(hour),atoi(day),atoi(mon),atoi(year)};
serial->write_p(PSTR("date and time set\n")); clock.setTime(time);
display.setString("SET "); serial->write_p(PSTR("date and time set\n"));
_delay_ms(1000); display.setString("SET ");
} _delay_ms(1000);
else serial->write_p(PSTR("usage: set [yyyy] [mm] [dd] [hh] [mm] [ss]\n")); }
} else serial->write_p(PSTR("usage: set [yyyy] [mm] [dd] [hh] [mm] [ss]\n"));
else if(strcmp(token, "pause") == 0) }
{ else if(strcmp(token, "pause") == 0)
sensorsPaused = true; {
sensorsPaused = true;
serial->write_p(PSTR("Sensors paused\n")); serial->write_p(PSTR("Sensors paused\n"));
} }
else if(strcmp(token, "resume") == 0) else if(strcmp(token, "resume") == 0)
{ {
sensorsPaused = false; sensorsPaused = false;
serial->write_p(PSTR("Sensors resumed\n")); serial->write_p(PSTR("Sensors resumed\n"));
} }
else if(strcmp(token, "list") == 0) else if(strcmp(token, "list") == 0)
{ {
serial->write_p(PSTR("Sensors:\n")); serial->write_p(PSTR("Sensors:\n"));
for(uint8_t i = 0; i < sensors->count(); ++i) printSensor(sensors->at(i), serial); for(uint8_t i = 0; i < sensors->count(); ++i) printSensor(sensors->at(i), serial);
serial->write('\n'); serial->write('\n');
} }
else if(strcmp(token, "erase") == 0) else if(strcmp(token, "erase") == 0)
{ {
for(uint16_t i = 0; i < 1024; i++) EEPROM_write_char(i, 0); for(uint16_t i = 0; i < 1024; i++) EEPROM_write_char(i, 0);
serial->write_p(PSTR("EEPROM erased\n")); serial->write_p(PSTR("EEPROM erased\n"));
} }
else if(strcmp(token, "dump") == 0) else if(strcmp(token, "dump") == 0)
{ {
for(uint16_t i = 0; i < 1024; i++) for(uint16_t i = 0; i < 1024; i++)
{ {
if(i != 0) serial->putChar(','); if(i != 0) serial->putChar(',');
serial->write((uint16_t)EEPROM_read_char(i)); serial->write((uint16_t)EEPROM_read_char(i));
} }
serial->putChar('\n'); serial->putChar('\n');
} }
else if(strcmp(token, "free") == 0) else if(strcmp(token, "free") == 0)
{ {
serial->write_p(PSTR("Free Ram: ")); serial->write_p(PSTR("Free Ram: "));
serial->write(freeRAM()); serial->write(freeRAM());
serial->write_p(PSTR(" Bytes.\n")); serial->write_p(PSTR(" Bytes.\n"));
} }
else if(strcmp(token, "beep") == 0) else if(strcmp(token, "beep") == 0)
{ {
serial->write_p(PSTR("Beeping\n")); serial->write_p(PSTR("Beeping\n"));
ringging = true; ringging = true;
_delay_ms(1000); _delay_ms(1000);
serial->write_p(PSTR("Done\n")); serial->write_p(PSTR("Done\n"));
ringging = false; ringging = false;
} }
else if(strcmp(token, "help") == 0) else if(strcmp(token, "help") == 0)
{ {
printHelp(serial); printHelp(serial);
} }
else serial->write_p(PSTR("Not a valid command\n")); else serial->write_p(PSTR("Not a valid command\n"));
} }
} }
} }
void displayItems(const DS1302::Timeval& time, int16_t temp, int16_t humid) void displayItems(const DS1302::Timeval& time, int16_t temp, int16_t humid)
{ {
switch(displaying) switch(displaying)
{ {
case 0: case 0:
writePin(&PORTB, PB4, time.sec % 2); writePin(&PORTB, PB4, time.sec % 2);
snprintf(buffer, 9, " %02u%02u", time.hour, time.min); snprintf(buffer, 9, " %02u%02u", time.hour, time.min);
display.setString(buffer); display.setString(buffer);
display.setSegments((alm & almA ? DualCl56::SEG_A : 0) | (alm & almB ? DualCl56::SEG_D : 0), 0); 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; break;
case 3: case 1:
writePin(&PORTB, PB4, false); writePin(&PORTB, PB4, false);
snprintf(buffer, 9, "0 2%4u", humid); snprintf(buffer, 9, "%02u%02u%04u", time.day, time.month, time.year);
display.setString(buffer, DualCl56::DP_G); 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; break;
#endif #endif
default: default:
writePin(&PORTB, PB4, false); writePin(&PORTB, PB4, false);
snprintf(buffer, 9, "%u%3u%4u", snprintf(buffer, 9, "%u%3u%4u",
sensors[displaying-DPY_FIXED_ITEMS].id, sensors[displaying-DPY_FIXED_ITEMS].id,
sensors[displaying-DPY_FIXED_ITEMS].type, sensors[displaying-DPY_FIXED_ITEMS].type,
sensors[displaying-DPY_FIXED_ITEMS].field); 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); 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) void setAlarm(DS1302::Timeval* alarm, uint8_t leadingSegment = 0)
{ {
writePin(&PORTB, PB4, true); writePin(&PORTB, PB4, true);
while(setting) while(setting)
{ {
if(settingOffset+alarm->min > 59) if(settingOffset+alarm->min > 59)
{ {
if(++alarm->hour > 23) alarm->hour = 0; if(++alarm->hour > 23) alarm->hour = 0;
alarm->min = settingOffset+alarm->min-60; alarm->min = settingOffset+alarm->min-60;
} }
else if(settingOffset+alarm->min < 0) else if(settingOffset+alarm->min < 0)
{ {
if(alarm->hour-1 < 0) alarm->hour = 24; if(alarm->hour-1 < 0) alarm->hour = 24;
--alarm->hour; --alarm->hour;
@ -325,31 +327,31 @@ void setAlarm(DS1302::Timeval* alarm, uint8_t leadingSegment = 0)
writePin(&PORTB, PB4, false); writePin(&PORTB, PB4, false);
} }
int main() int main()
{ {
DDRB = (1 << PB1) | ( 1 << PB2) | ( 1 << PB3) | ( 1 << PB4) | ( 1 << PB5); DDRB = (1 << PB1) | ( 1 << PB2) | ( 1 << PB3) | ( 1 << PB4) | ( 1 << PB5);
DDRD = (1<<PD4) | (1<<PD2); DDRD = (1<<PD4) | (1<<PD2);
PORTD |= (1<<PD6) | (1<<PD7); PORTD |= (1<<PD6) | (1<<PD7);
TCCR2B = 1<<CS22; TCCR2B = 1<<CS22;
TIMSK2 = 1; TIMSK2 = 1;
TCCR1B = 1<<CS10; TCCR1B = 1<<CS10;
EICRA = 1<<ISC10; EICRA = 1<<ISC10;
EIMSK = 1<<INT1; EIMSK = 1<<INT1;
sei(); sei();
Serial serial; Serial serial;
serial.write_p(PSTR("SensorDisplay v0.4 starting\n")); serial.write_p(PSTR("SensorDisplay v0.4 starting\n"));
DS1302::Timeval alarmA = EEPROM_read_class<DS1302::Timeval>(128); DS1302::Timeval alarmA = EEPROM_read_class<DS1302::Timeval>(128);
DS1302::Timeval alarmB = EEPROM_read_class<DS1302::Timeval>(128+64); DS1302::Timeval alarmB = EEPROM_read_class<DS1302::Timeval>(128+64);
DS1302::Timeval time = clock.getTime(); DS1302::Timeval time = clock.getTime();
alm = EEPROM_read_char(0); alm = EEPROM_read_char(0);
uint8_t oldAlm = alm; uint8_t oldAlm = alm;
#ifdef HAS_TRANSMITTER #ifdef HAS_TRANSMITTER
char name[] = "relay"; char name[] = "relay";
@ -357,10 +359,10 @@ int main()
#endif #endif
#ifdef HAS_DHT #ifdef HAS_DHT
Dht11 sensor(&PORTD, &PIND, &DDRD, PD2); Dht11 sensor(&PORTD, &PIND, &DDRD, PD2);
#endif #endif
if(time.day == 28 && time.month == 5) if(time.day == 28 && time.month == 5)
{ {
if constexpr(bdayMsg) if constexpr(bdayMsg)
{ {
display.setString("HAPPY "); display.setString("HAPPY ");
@ -370,40 +372,44 @@ int main()
display.setString("SASA "); display.setString("SASA ");
_delay_ms(1000); _delay_ms(1000);
} }
} }
else else
{ {
display.setString(welcomeString); display.setString(welcomeString);
_delay_ms(1000); _delay_ms(1000);
} }
#ifdef HAS_DHT #ifdef HAS_DHT
sensor.read(); sensor.read();
_delay_ms(1000); _delay_ms(1000);
sensor.read(); sensor.read();
#endif #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; //enable interrupt
TIMSK1 |= 1 << OCIE1A;
OCR1A = W433DataReciver::calculateOverflowRegister(2000, 1);
TCCR1B = 1<<CS10 | 1<<WGM12;
W433DataReciver reciver(&PIND, PD3, &packetHandler, reinterpret_cast<void*>(&serial), &reciverError);
uint8_t deleteDate = 0;
serial.write_p(PSTR("Ready\n"));
uint16_t i = 0;
bool oldRelaySetting = false; bool oldRelaySetting = false;
while(true) while(true)
{ {
#ifdef HAS_DHT #ifdef HAS_DHT
if((displaying == 2 || displaying == 3) && i%2048 == 0) if((displaying == 2 || displaying == 3) && i%2048 == 0)
{ {
cli(); cli();
sensor.read(); sensor.read();
sei(); sei();
} }
#endif #endif
if(alm != oldAlm) if(alm != oldAlm)
{ {
oldAlm = alm; oldAlm = alm;
@ -429,11 +435,11 @@ int main()
EEPROM_write_class(128, alarmA); EEPROM_write_class(128, alarmA);
EEPROM_write_class(128+64, alarmB); EEPROM_write_class(128+64, alarmB);
} }
time = clock.getTime(); time = clock.getTime();
#ifdef HAS_DHT #ifdef HAS_DHT
displayItems(time, sensor.temperature, sensor.humidity); displayItems(time, sensor.temperature, sensor.humidity);
#else #else
displayItems(time, 0, 0); displayItems(time, 0, 0);
#endif #endif
@ -441,7 +447,7 @@ int main()
{ {
ringging = true; ringging = true;
} }
if(time.hour == alarmB.hour && time.min == alarmB.min && time.sec == 0) if(time.hour == alarmB.hour && time.min == alarmB.min && time.sec == 0)
{ {
#ifdef HAS_TRANSMITTER #ifdef HAS_TRANSMITTER
@ -450,21 +456,21 @@ int main()
ringging = true; ringging = true;
#endif #endif
} }
#ifdef HAS_RECIVER #ifdef HAS_RECIVER
serialDispatch(&serial, &sensors); serialDispatch(&serial, &sensors);
if(deleteDate != time.day) if(deleteDate != time.day)
{ {
displaying = 0; displaying = 0;
sensors.clear(); sensors.clear();
deleteDate = time.day; deleteDate = time.day;
display.setString("CLEAR "); display.setString("CLEAR ");
_delay_ms(1000); _delay_ms(1000);
} }
#endif #endif
++i; ++i;
} }
return 0; return 0;
} }