Relay counter
Dependencies: TM1638 mbed mbed-rtos AT45
Diff: main_count_v1.cmm
- Revision:
- 0:1b4c0e7c9316
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main_count_v1.cmm Thu Jan 28 14:18:16 2021 +0000 @@ -0,0 +1,267 @@ + +/**************rele-counter v1 **********************************/ +// при включении восстанавливаются значения текущие и уставка +// при подаче импульсов +24В на счетный вход значение увеличиваются +1 +// при подаче +24В на вхд сброса, значения сбрасываются +// реле включается если значение равно или больше установленного +// + + + +#include "mbed.h" +#include "rtos.h" +#include "TM1638.h" +#include "AT45.h" + + +// ------- input/output ---------------- +DigitalOut led(PC_13); +DigitalOut rel(PA_15); +DigitalIn in1(PA_8); +DigitalIn in2(PA_9); +DigitalIn in3(PA_10); + +// ------- displey -------------------- +TM1638_LEDKEY8 LEDKEY8(PB_15,PB_14,PB_13, PB_12); +TM1638::KeyData_t keydata; + + +//----------- SPI FLASH ------------------------ +SPI spi(PA_7, PA_6, PA_5); // mosi, miso, sclk +AT45 spif(&spi, PA_4); // NSS + +char *spi_buffer = (char*) malloc(64); +char str[10]; + + +// -------- глоб.переменные --------------- +int present_val = 0; // текущее заначение +int present_val_last = 0; // текущее значение (старое) +int max_value = 0; // значение вкл. реле + +int led1=0; // индикация LED1 +int led2=0; // индикация LED2 +int led3=0; // индикация LED3 + +// -------- Прототипы функций: ---------- +void count_value(); + + +/********************************************************************/ +int main() { + + // предустановка значений + int update = 0; + int update2 = 0; + int delay_update_x10 = 2000; // задержка перед +/- x_inreasing_decreasing + int time_update_increase = 0; // отсчет времени до +10 + int time_update_decrease = 0; // отсчет времени до -10 + int delay_cycle = 25; // период вывода инф. на дисплей + int once_increase = 0; + int once_decrease = 0; + int x_inreasing_decreasing = 10; // +/- после удержания кнопки + + + int write_page_time = 5000; // время до записи max_value + int timer_to_write_page = 0; // отсчет времени до записи max_value + int write_page_start = 0; // старт процедуры записи + + + // Вычитываем сохраненное максимальное значение (11 стр для записи) + spif.read_page(spi_buffer, 11); + max_value = atoi(spi_buffer); + + // Вычитываем сохраненное текущее значение (12 стр для записи) + spif.read_page(spi_buffer, 12); + present_val = atoi(spi_buffer); + + // Делаем текущее значение != текущему прошлому значение + present_val_last = present_val + 10; + + // Поток для работы с текущим значением + Thread count_thread; + count_thread.start(count_value); + + + while(1) { + + /*** обработка нажатия кнопок ***/ + + LEDKEY8.getKeys(&keydata); + + // Нажимаем кнопку X, текущее значение = 0 + if(keydata[LEDKEY8_SW3_IDX] == LEDKEY8_SW3_BIT) { + present_val = 0; + } + + + // Нажимаем кнопку увеличить + if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) { + if(keydata[LEDKEY8_SW2_IDX] != LEDKEY8_SW2_BIT) { + time_update_increase = time_update_increase + delay_cycle; + + // Один раз делаем +1 + if(once_increase == 0) { + once_increase = 1; + if(max_value<999){max_value = max_value + 1;} + update = 0; + } + + write_page_start = 1; + timer_to_write_page = 0; + } + } + else { + time_update_increase = 0; + once_increase = 0; + } + + + + // Нажимаем кнопку уменьшить + if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) { + if(keydata[LEDKEY8_SW1_IDX] != LEDKEY8_SW1_BIT) { + time_update_decrease = time_update_decrease + delay_cycle; + + // Один раз делаем -1 + if(once_decrease == 0) { + once_decrease = 1; + if(max_value>0){max_value = max_value - 1;} + update = 0; + } + + write_page_start = 1; + timer_to_write_page = 0; + } + } + else { + once_decrease = 0; + time_update_decrease = 0; + } + + + + + // При удержании кнопки увеличить на +10 + if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) { + if(time_update_increase >= delay_update_x10) { + time_update_increase = delay_update_x10 - delay_cycle*10; + if(max_value<=990){max_value = max_value + x_inreasing_decreasing;} + update = 0; + } + } + + + + + // При удержании кнопки уменьшить на -10 + if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) { + if(time_update_decrease >= delay_update_x10) { + time_update_decrease = delay_update_x10 - delay_cycle*10; + if(max_value>10){max_value = max_value - x_inreasing_decreasing;} + update = 0; + } + } + + + + // Записываем в память максимальное значение + // через время write_page_time после нажатий кнопок + if(write_page_start == 1) { + timer_to_write_page = timer_to_write_page + delay_cycle; + + if(timer_to_write_page >= write_page_time) { + write_page_start = 0; + timer_to_write_page = 0; + sprintf(spi_buffer, "%d", max_value); + spif.page_erase(11); + spif.write_page(spi_buffer, 11); + + LEDKEY8.locate(0); + LEDKEY8.printf(" "); + Thread::wait(500); + LEDKEY8.locate(0); + LEDKEY8.printf("%d", max_value); + } + } + + + + /*** вывод на дисплей ***/ + + led = !led ; + + LEDKEY8.cls(); + LEDKEY8.setBrightness(TM1638_BRT1); + LEDKEY8.locate(0); + LEDKEY8.printf("%d", max_value); + LEDKEY8.locate(3); + LEDKEY8.printf("%d", present_val); + if(led1==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD1);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD1);} + if(led2==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD2);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD2);} + if(led3==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD3);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD3);} + + + Thread::wait(delay_cycle); + } +} + +/****************************************************************/ + +// Поток работы с текущим значением 10msec +void count_value() { + + int c_inp1=0; + int c_inp2=0; + int c_inp3=0; + int m_inp1=0; + int m_inp2=0; + int m_inp3=0; + + while(1) { + + // фиксируем значения + if(in1==0){c_inp1=1;}else{c_inp1=0;} + if(in2==0){c_inp2=1;}else{c_inp2=0;} + if(in3==0){c_inp3=1;}else{c_inp3=0;} + + + // сохраняем тек.значение в 12 стр. при выкл. питания + if(c_inp1==0 && m_inp1==1){ + sprintf(spi_buffer, "%d", present_val); + spif.page_erase(12); + spif.write_page(spi_buffer, 12); + } + + // подсчет импульсов по входу 1 + if(c_inp2==1 && m_inp2==0){ + present_val++; + } + + // сбрасываем текущее значение по входу 2 + if(c_inp3==1 && m_inp3==0){ + present_val=0; + } + + + // управление реле + if(present_val>=max_value){ rel=1; }else{rel=0; } + + + // управляем светодиодами + if(rel==1) {led1=1;}else{led1=0;} + if(c_inp2==1){led2=1;}else{led2=0;} + if(c_inp3==1){led3=1;}else{led3=0;} + + + // сохраняем значени + m_inp1=c_inp1; + m_inp2=c_inp2; + m_inp3=c_inp3; + + + Thread::wait(5); + } +} + +