Relay counter
Dependencies: TM1638 mbed mbed-rtos AT45
Revision 1:36d6279f43d5, committed 2021-02-15
- Comitter:
- Oleg_B
- Date:
- Mon Feb 15 04:03:12 2021 +0000
- Parent:
- 0:1b4c0e7c9316
- Commit message:
- relay - counter
Changed in this revision
main_count_v1.cmm | Show diff for this revision Revisions of this file |
diff -r 1b4c0e7c9316 -r 36d6279f43d5 main_count_v1.cmm --- a/main_count_v1.cmm Thu Jan 28 14:18:16 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,267 +0,0 @@ - -/**************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); - } -} - -