From a1b2ad3ab41f3d836a912699597c16320be8c776 Mon Sep 17 00:00:00 2001 From: vlad Date: Wed, 24 Aug 2022 17:24:57 +0300 Subject: [PATCH] Sending sms 2 times a day, tested version --- main.c | 67 +++++++++++++++++++++++++++++++++++++++++++----------- platform.c | 24 +------------------ platform.h | 3 --- 3 files changed, 55 insertions(+), 39 deletions(-) diff --git a/main.c b/main.c index 6164963..33d5328 100644 --- a/main.c +++ b/main.c @@ -6,6 +6,13 @@ #define SMS_END "\032\n" #define SIM800_DELAY_TIME 100 +#define MEASUREMENTS 6 + +uint8_t sensor_measurements = 0; +char systick_execution_enable = 0; +uint16_t sensor_1[MEASUREMENTS]; +uint16_t sensor_2[MEASUREMENTS]; + static volatile uint8_t timer0_time; ISR(TIMER0_OVF_vect) { timer0_time++; @@ -156,16 +163,31 @@ void sim800_send_telemetry() { // sprintf(buff, "F1=%d F2=%d\033\n", sensor_1, sensor_2); _delay_ms(SIM800_DELAY_TIME); + for (uint8_t i = 0; i < sensor_measurements; i++) { + buff[0] = 'L'; + buff[1] = (char)('0' + i); + buff[2] = '='; + buff[3] = '\0'; + uart_write_str(buff); + num2buff(buff, sensor_1[i]); + uart_write_str(buff); - uart_write_fstr(PSTR("F1=")); - num2buff(buff, sensor_1); - uart_write_str(buff); + buff[0] = ' '; + buff[1] = 'R'; + buff[2] = (char)('0' + i); + buff[3] = '='; + buff[4] = '\0'; + uart_write_str(buff); + num2buff(buff, sensor_2[i]); + uart_write_str(buff); - uart_write_fstr(PSTR(" F2=")); - num2buff(buff, sensor_2); - uart_write_str(buff); + uart_write_char(' '); + } - uart_write_fstr(PSTR(" BAT=")); + // все измерения забрали + sensor_measurements = 0; + + uart_write_fstr(PSTR("BAT=")); num2buff(buff, bat); uart_write_str(buff); @@ -204,8 +226,9 @@ void read_sensors() { // быстрое деление на 2 (считалось каждое изменение) // 64 секунды * 2 = 128 (2^7) - sensor_2 = (uint16_t)(s1 >> 7); - sensor_1 = (uint16_t)(s2 >> 7); + sensor_1[sensor_measurements] = (uint16_t)(s1 >> 7); + sensor_2[sensor_measurements] = (uint16_t)(s2 >> 7); + sensor_measurements++; // готово! } @@ -215,7 +238,7 @@ int main() { LED2_Set(); _delay_ms(100); LED2_Reset(); - _delay_ms(10000); + _delay_ms(5000); // врубаем модем sim800_start(); @@ -258,18 +281,36 @@ ISR(TIMER1_OVF_vect) { } } } else { - // если скорость зажата, то максимальное ожидание 5 минут + // если скорость зажата, шлем смс каждые 5 минут с тем что есть if (time > 300) { if (!exec) { time = 0; - exec = 1; + exec = 2; } } } } + // без скорости if (exec == 1) { - exec = 2; + exec = -1; + MCUCR &= ~(1 << SE); + sei(); + read_sensors(); + // если измерений 6 (и мало ли больше), то отправляем смс + if (sensor_measurements >= MEASUREMENTS) { + sim800_start(); + sim800_send_telemetry(); + sim800_stop(); + } + cli(); + MCUCR |= (1 << SE); + exec = 0; + } + + // под скоростью + if (exec == 2) { + exec = -1; MCUCR &= ~(1 << SE); sei(); read_sensors(); diff --git a/platform.c b/platform.c index 760cf4e..85f5728 100644 --- a/platform.c +++ b/platform.c @@ -7,10 +7,6 @@ #include #include -char systick_execution_enable; -uint16_t sensor_1; -uint16_t sensor_2; - void platform_init() { // инициализация GPIO @@ -23,10 +19,6 @@ void platform_init() { uart_init(); // инициализация таймера 1 (16-ти битный) - - systick_execution_enable = 0; - - // настройка таймера 1 // mode=14 (FastPWM, top in ICR1), x64, ICR1=1000000/64=15625 TCCR1B = (1 << WGM13) | (1 << WGM12); TCCR1A = (1 << WGM11); @@ -34,7 +26,7 @@ void platform_init() { // выставляем TOP ICR1 = (uint16_t)(F_CPU / 64); - // настройка таймера 0 + // инициализация таймера 0 (8-ми битный) // x1024, mode7 (fastpwm, top in OCRA) TCCR0A = (1 << WGM01) | (1 << WGM00); TCCR0B = (1 << WGM02); // предделитель пока не ставим, таймер без него не работает @@ -48,20 +40,6 @@ void platform_init() { sei(); } -void platform_wait_for_interrupt() { - // для режима сна Idle нужно отрубить компаратор (в даташите просили) - // в других режимах сна он отрубается автоматически - char acsr = ACSR; - ACSR |= (1 << ACD); // чтобы отрубить компаратор нужно записать 1 в этот бит - - MCUCR |= (1 << SE); - asm volatile ("sleep"); - MCUCR &= ~(1 << SE); - - // восстанавливаем состояние компаратора - ACSR |= acsr; -} - void uart_init() { // U2X=1, baud=9600, error=0.2%, f=1M UBRRH = 0; diff --git a/platform.h b/platform.h index 490f113..963beef 100644 --- a/platform.h +++ b/platform.h @@ -8,9 +8,6 @@ #include #include -extern uint16_t sensor_1; -extern uint16_t sensor_2; -extern char systick_execution_enable; /** * Инициализация модуля