![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Relay counter
Dependencies: TM1638 mbed mbed-rtos AT45
main_count_v1.cmm
- Committer:
- Oleg_B
- Date:
- 2021-01-28
- Revision:
- 0:1b4c0e7c9316
File content as of revision 0:1b4c0e7c9316:
/**************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); } }