From e268d49c4889444a5372553867a10bbc64aa9b42 Mon Sep 17 00:00:00 2001 From: uvos Date: Mon, 3 Apr 2023 01:26:14 +0200 Subject: [PATCH] update to new reciver type --- main.cpp | 416 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 211 insertions(+), 205 deletions(-) diff --git a/main.cpp b/main.cpp index 9374be7..ebf2635 100644 --- a/main.cpp +++ b/main.cpp @@ -18,15 +18,15 @@ #include "dht11.h" #include "WirelessRelay.h" -//#define HAS_DHT -#define HAS_TRANSMITTER -//#define HAS_RECIVER +#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 " +#define welcomeString "HELO SAS" static constexpr bool bdayMsg = false; void buttonHandler(uint8_t index, uint8_t type, void* data); @@ -61,15 +61,15 @@ volatile bool relaySetting = false; volatile uint8_t timer = 0; -ISR(INT1_vect) +ISR(TIMER1_COMPA_vect) { - W433DataReciver::staticInterrupt(); + W433DataReciver::staticInterrupt(); } ISR(TIMER2_OVF_vect) { - display.tick(); - buttons.tick(); + 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; @@ -91,7 +91,7 @@ void buttonHandler(uint8_t index, uint8_t type, void* data) else if(index == 1 && type == Buttons::RELEASED ) { if(!ringging) if(++alm > 3) alm = 0; - else ringging = false; + else ringging = false; } 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) { - serial->write_p(PSTR("SENSOR TYPE: ")); - serial->write(sensor.type); - serial->write_p(PSTR(" ID: ")); - serial->write(sensor.id); - - if(sensor.type == 1) serial->write_p(PSTR(" TEMPERATURE: ")); - else if(sensor.type == 2) serial->write_p(PSTR(" HUMIDITY: ")); - else serial->write_p(PSTR(" FIELD: ")); - serial->write(sensor.field); - serial->putChar('\n'); + serial->write_p(PSTR("SENSOR TYPE: ")); + serial->write(sensor.type); + serial->write_p(PSTR(" ID: ")); + serial->write(sensor.id); + + if(sensor.type == 1) serial->write_p(PSTR(" TEMPERATURE: ")); + else if(sensor.type == 2) serial->write_p(PSTR(" HUMIDITY: ")); + else serial->write_p(PSTR(" FIELD: ")); + serial->write(sensor.field); + serial->putChar('\n'); } void packetHandler(uint32_t packet, void* data) { - Serial* serial = reinterpret_cast(data); - - Sensor sensor; - - sensor.field = packet & 0x0000FFFF; - sensor.type = packet >> 24; - sensor.id = (packet & 0x00FF0000) >> 16; - - bool found = false; - for(uint8_t i = 0; i < sensors.count() && !found; ++i) - { - if(sensors[i] == sensor) - { - sensors[i] = sensor; - found = true; - } - } - if(!found) sensors.push_back(sensor); - - if(!sensorsPaused) printSensor(sensor, serial); + Serial* serial = reinterpret_cast(data); + + Sensor sensor; + + sensor.field = packet & 0x0000FFFF; + sensor.type = packet >> 24; + sensor.id = (packet & 0x00FF0000) >> 16; + + bool found = false; + for(uint8_t i = 0; i < sensors.count() && !found; ++i) + { + if(sensors[i] == sensor) + { + sensors[i] = sensor; + found = true; + } + } + if(!found) sensors.push_back(sensor); + + if(!sensorsPaused) printSensor(sensor, serial); } void reciverError(uint8_t code, void* userData) @@ -157,7 +157,7 @@ void reciverError(uint8_t code, void* userData) 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\ date : 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* sensors) { - if(serial->dataIsWaiting()) - { - char buffer[COMMAND_BUFFER_SIZE]; - unsigned int length = serial->getString(buffer, COMMAND_BUFFER_SIZE); - if(length > 2) - { - char* token = strtok(buffer, " \n"); - if(strcmp(token, "date") == 0) - { - 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); - serial->write(buffer, SNPRINTF_BUFFER_SIZE); - } - else if(strcmp(token, "set") == 0) - { - char* year = strtok(NULL, " \n"); - char* mon = strtok(NULL, " \n"); - char* day = strtok(NULL, " \n"); - char* hour = strtok(NULL, " \n"); - char* min = strtok(NULL, " \n"); - 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); - serial->write_p(PSTR("date and time set\n")); - display.setString("SET "); - _delay_ms(1000); - } - else serial->write_p(PSTR("usage: set [yyyy] [mm] [dd] [hh] [mm] [ss]\n")); - } - else if(strcmp(token, "pause") == 0) - { - sensorsPaused = true; + if(serial->dataIsWaiting()) + { + char buffer[COMMAND_BUFFER_SIZE]; + unsigned int length = serial->getString(buffer, COMMAND_BUFFER_SIZE); + if(length > 2) + { + char* token = strtok(buffer, " \n"); + if(strcmp(token, "date") == 0) + { + 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); + serial->write(buffer, SNPRINTF_BUFFER_SIZE); + } + else if(strcmp(token, "set") == 0) + { + char* year = strtok(NULL, " \n"); + char* mon = strtok(NULL, " \n"); + char* day = strtok(NULL, " \n"); + char* hour = strtok(NULL, " \n"); + char* min = strtok(NULL, " \n"); + 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); + serial->write_p(PSTR("date and time set\n")); + display.setString("SET "); + _delay_ms(1000); + } + else serial->write_p(PSTR("usage: set [yyyy] [mm] [dd] [hh] [mm] [ss]\n")); + } + else if(strcmp(token, "pause") == 0) + { + sensorsPaused = true; serial->write_p(PSTR("Sensors paused\n")); - } - else if(strcmp(token, "resume") == 0) - { - sensorsPaused = false; + } + else if(strcmp(token, "resume") == 0) + { + sensorsPaused = false; serial->write_p(PSTR("Sensors resumed\n")); - } - else if(strcmp(token, "list") == 0) - { - serial->write_p(PSTR("Sensors:\n")); - for(uint8_t i = 0; i < sensors->count(); ++i) printSensor(sensors->at(i), serial); - serial->write('\n'); - } - else if(strcmp(token, "erase") == 0) - { - for(uint16_t i = 0; i < 1024; i++) EEPROM_write_char(i, 0); - serial->write_p(PSTR("EEPROM erased\n")); - } - else if(strcmp(token, "dump") == 0) - { - for(uint16_t i = 0; i < 1024; i++) - { - if(i != 0) serial->putChar(','); - serial->write((uint16_t)EEPROM_read_char(i)); - } - serial->putChar('\n'); - } - else if(strcmp(token, "free") == 0) - { - serial->write_p(PSTR("Free Ram: ")); + } + else if(strcmp(token, "list") == 0) + { + serial->write_p(PSTR("Sensors:\n")); + for(uint8_t i = 0; i < sensors->count(); ++i) printSensor(sensors->at(i), serial); + serial->write('\n'); + } + else if(strcmp(token, "erase") == 0) + { + for(uint16_t i = 0; i < 1024; i++) EEPROM_write_char(i, 0); + serial->write_p(PSTR("EEPROM erased\n")); + } + else if(strcmp(token, "dump") == 0) + { + for(uint16_t i = 0; i < 1024; i++) + { + if(i != 0) serial->putChar(','); + serial->write((uint16_t)EEPROM_read_char(i)); + } + serial->putChar('\n'); + } + else if(strcmp(token, "free") == 0) + { + serial->write_p(PSTR("Free Ram: ")); serial->write(freeRAM()); serial->write_p(PSTR(" Bytes.\n")); - } - else if(strcmp(token, "beep") == 0) - { + } + else if(strcmp(token, "beep") == 0) + { 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) - { - printHelp(serial); - } - else serial->write_p(PSTR("Not a valid command\n")); - } - } + } + else if(strcmp(token, "help") == 0) + { + printHelp(serial); + } + else serial->write_p(PSTR("Not a valid command\n")); + } + } } void displayItems(const DS1302::Timeval& time, int16_t temp, int16_t humid) { - switch(displaying) - { - case 0: - 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); + switch(displaying) + { + case 0: + 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 3: - writePin(&PORTB, PB4, false); - snprintf(buffer, 9, "0 2%4u", humid); - display.setString(buffer, DualCl56::DP_G); + 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: - 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); - } + default: + 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) + else if(settingOffset+alarm->min < 0) { if(alarm->hour-1 < 0) alarm->hour = 24; --alarm->hour; @@ -325,31 +327,31 @@ void setAlarm(DS1302::Timeval* alarm, uint8_t leadingSegment = 0) writePin(&PORTB, PB4, false); } -int main() +int main() { - DDRB = (1 << PB1) | ( 1 << PB2) | ( 1 << PB3) | ( 1 << PB4) | ( 1 << PB5); - DDRD = (1<(128); DS1302::Timeval alarmB = EEPROM_read_class(128+64); - DS1302::Timeval time = clock.getTime(); + DS1302::Timeval time = clock.getTime(); alm = EEPROM_read_char(0); uint8_t oldAlm = alm; - + #ifdef HAS_TRANSMITTER char name[] = "relay"; @@ -357,10 +359,10 @@ int main() #endif #ifdef HAS_DHT - Dht11 sensor(&PORTD, &PIND, &DDRD, PD2); + Dht11 sensor(&PORTD, &PIND, &DDRD, PD2); #endif - if(time.day == 28 && time.month == 5) - { + if(time.day == 28 && time.month == 5) + { if constexpr(bdayMsg) { display.setString("HAPPY "); @@ -370,40 +372,44 @@ int main() display.setString("SASA "); _delay_ms(1000); } - } - else - { - display.setString(welcomeString); - _delay_ms(1000); - } - + } + else + { + display.setString(welcomeString); + _delay_ms(1000); + } + #ifdef HAS_DHT - sensor.read(); - _delay_ms(1000); + sensor.read(); + _delay_ms(1000); sensor.read(); #endif - - W433DataReciver reciver(&PIND, PD3, &TCNT1, &TIFR1, &packetHandler, reinterpret_cast(&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<(&serial), &reciverError); + + uint8_t deleteDate = 0; + + serial.write_p(PSTR("Ready\n")); + + uint16_t i = 0; + bool oldRelaySetting = false; - - while(true) - { + + while(true) + { #ifdef HAS_DHT - if((displaying == 2 || displaying == 3) && i%2048 == 0) + if((displaying == 2 || displaying == 3) && i%2048 == 0) { cli(); sensor.read(); sei(); } #endif - + if(alm != oldAlm) { oldAlm = alm; @@ -429,11 +435,11 @@ int main() EEPROM_write_class(128, alarmA); EEPROM_write_class(128+64, alarmB); } - + time = clock.getTime(); - + #ifdef HAS_DHT - displayItems(time, sensor.temperature, sensor.humidity); + displayItems(time, sensor.temperature, sensor.humidity); #else displayItems(time, 0, 0); #endif @@ -441,7 +447,7 @@ int main() { ringging = true; } - + if(time.hour == alarmB.hour && time.min == alarmB.min && time.sec == 0) { #ifdef HAS_TRANSMITTER @@ -450,21 +456,21 @@ int main() ringging = true; #endif } - + #ifdef HAS_RECIVER - serialDispatch(&serial, &sensors); - if(deleteDate != time.day) - { - displaying = 0; - sensors.clear(); - deleteDate = time.day; + serialDispatch(&serial, &sensors); + if(deleteDate != time.day) + { + displaying = 0; + sensors.clear(); + deleteDate = time.day; display.setString("CLEAR "); _delay_ms(1000); - } + } #endif - ++i; - } + ++i; + } - return 0; + return 0; }