Sending sms 2 times a day, tested version

This commit is contained in:
vlad 2022-08-24 17:24:57 +03:00
parent 93b45b8444
commit a1b2ad3ab4
3 changed files with 55 additions and 39 deletions

63
main.c
View File

@ -6,6 +6,13 @@
#define SMS_END "\032\n" #define SMS_END "\032\n"
#define SIM800_DELAY_TIME 100 #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; static volatile uint8_t timer0_time;
ISR(TIMER0_OVF_vect) { ISR(TIMER0_OVF_vect) {
timer0_time++; timer0_time++;
@ -156,14 +163,29 @@ void sim800_send_telemetry() {
// sprintf(buff, "F1=%d F2=%d\033\n", sensor_1, sensor_2); // sprintf(buff, "F1=%d F2=%d\033\n", sensor_1, sensor_2);
_delay_ms(SIM800_DELAY_TIME); _delay_ms(SIM800_DELAY_TIME);
for (uint8_t i = 0; i < sensor_measurements; i++) {
uart_write_fstr(PSTR("F1=")); buff[0] = 'L';
num2buff(buff, sensor_1); 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_str(buff);
uart_write_fstr(PSTR(" F2=")); buff[0] = ' ';
num2buff(buff, sensor_2); buff[1] = 'R';
buff[2] = (char)('0' + i);
buff[3] = '=';
buff[4] = '\0';
uart_write_str(buff); uart_write_str(buff);
num2buff(buff, sensor_2[i]);
uart_write_str(buff);
uart_write_char(' ');
}
// все измерения забрали
sensor_measurements = 0;
uart_write_fstr(PSTR("BAT=")); uart_write_fstr(PSTR("BAT="));
num2buff(buff, bat); num2buff(buff, bat);
@ -204,8 +226,9 @@ void read_sensors() {
// быстрое деление на 2 (считалось каждое изменение) // быстрое деление на 2 (считалось каждое изменение)
// 64 секунды * 2 = 128 (2^7) // 64 секунды * 2 = 128 (2^7)
sensor_2 = (uint16_t)(s1 >> 7); sensor_1[sensor_measurements] = (uint16_t)(s1 >> 7);
sensor_1 = (uint16_t)(s2 >> 7); sensor_2[sensor_measurements] = (uint16_t)(s2 >> 7);
sensor_measurements++;
// готово! // готово!
} }
@ -215,7 +238,7 @@ int main() {
LED2_Set(); LED2_Set();
_delay_ms(100); _delay_ms(100);
LED2_Reset(); LED2_Reset();
_delay_ms(10000); _delay_ms(5000);
// врубаем модем // врубаем модем
sim800_start(); sim800_start();
@ -258,18 +281,36 @@ ISR(TIMER1_OVF_vect) {
} }
} }
} else { } else {
// если скорость зажата, то максимальное ожидание 5 минут // если скорость зажата, шлем смс каждые 5 минут с тем что есть
if (time > 300) { if (time > 300) {
if (!exec) { if (!exec) {
time = 0; time = 0;
exec = 1; exec = 2;
} }
} }
} }
} }
// без скорости
if (exec == 1) { 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); MCUCR &= ~(1 << SE);
sei(); sei();
read_sensors(); read_sensors();

View File

@ -7,10 +7,6 @@
#include <avr/interrupt.h> #include <avr/interrupt.h>
#include <util/delay.h> #include <util/delay.h>
char systick_execution_enable;
uint16_t sensor_1;
uint16_t sensor_2;
void platform_init() { void platform_init() {
// инициализация GPIO // инициализация GPIO
@ -23,10 +19,6 @@ void platform_init() {
uart_init(); uart_init();
// инициализация таймера 1 (16-ти битный) // инициализация таймера 1 (16-ти битный)
systick_execution_enable = 0;
// настройка таймера 1
// mode=14 (FastPWM, top in ICR1), x64, ICR1=1000000/64=15625 // mode=14 (FastPWM, top in ICR1), x64, ICR1=1000000/64=15625
TCCR1B = (1 << WGM13) | (1 << WGM12); TCCR1B = (1 << WGM13) | (1 << WGM12);
TCCR1A = (1 << WGM11); TCCR1A = (1 << WGM11);
@ -34,7 +26,7 @@ void platform_init() {
// выставляем TOP // выставляем TOP
ICR1 = (uint16_t)(F_CPU / 64); ICR1 = (uint16_t)(F_CPU / 64);
// настройка таймера 0 // инициализация таймера 0 (8-ми битный)
// x1024, mode7 (fastpwm, top in OCRA) // x1024, mode7 (fastpwm, top in OCRA)
TCCR0A = (1 << WGM01) | (1 << WGM00); TCCR0A = (1 << WGM01) | (1 << WGM00);
TCCR0B = (1 << WGM02); // предделитель пока не ставим, таймер без него не работает TCCR0B = (1 << WGM02); // предделитель пока не ставим, таймер без него не работает
@ -48,20 +40,6 @@ void platform_init() {
sei(); 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() { void uart_init() {
// U2X=1, baud=9600, error=0.2%, f=1M // U2X=1, baud=9600, error=0.2%, f=1M
UBRRH = 0; UBRRH = 0;

View File

@ -8,9 +8,6 @@
#include <stdint.h> #include <stdint.h>
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
extern uint16_t sensor_1;
extern uint16_t sensor_2;
extern char systick_execution_enable;
/** /**
* Инициализация модуля * Инициализация модуля