Relay counter
Dependencies: TM1638 mbed mbed-rtos AT45
main_count_v2.cpp
00001 00002 /**************rele-counter v2 **********************************/ 00003 // при включении реле выключено, тек.показания и уставка как до выключения, 00004 // но подсчет импульсов не работает до подачи 1го импульса на сброс. 00005 // после подачи 1го имп.сброс - показания сбрасываются реле включается 00006 // при достижении подсчитанных импульсов уставки - реле отключается 00007 // при повторной подаче сигнала сброс, показания сбрасываются и реле включается 00008 // 00009 // 00010 00011 00012 #include "mbed.h" 00013 #include "rtos.h" 00014 #include "TM1638.h" 00015 #include "AT45.h" 00016 00017 00018 // ------- input/output ---------------- 00019 DigitalOut led(PC_13); 00020 DigitalOut rel(PA_15); 00021 DigitalIn in1(PA_8); 00022 DigitalIn in2(PA_9); 00023 DigitalIn in3(PA_10); 00024 00025 // ------- displey -------------------- 00026 TM1638_LEDKEY8 LEDKEY8(PB_15,PB_14,PB_13, PB_12); 00027 TM1638::KeyData_t keydata; 00028 00029 00030 //----------- SPI FLASH ------------------------ 00031 SPI spi(PA_7, PA_6, PA_5); // mosi, miso, sclk 00032 AT45 spif(&spi, PA_4); // NSS 00033 00034 char *spi_buffer = (char*) malloc(64); 00035 char str[10]; 00036 00037 00038 // -------- глоб.переменные --------------- 00039 int present_val = 0; // текущее заначение 00040 int present_val_last = 0; // текущее значение (старое) 00041 int max_value = 0; // значение вкл. реле 00042 00043 int led1=0; // индикация LED1 00044 int led2=0; // индикация LED2 00045 int led3=0; // индикация LED3 00046 00047 int enbl=0; // разрешение на работу 00048 00049 // -------- Прототипы функций: ---------- 00050 void count_value(); 00051 00052 00053 /********************************************************************/ 00054 int main() { 00055 00056 // предустановка значений 00057 int update = 0; 00058 int update2 = 0; 00059 int delay_update_x10 = 2000; // задержка перед +/- x_inreasing_decreasing 00060 int time_update_increase = 0; // отсчет времени до +10 00061 int time_update_decrease = 0; // отсчет времени до -10 00062 int delay_cycle = 25; // период вывода инф. на дисплей 00063 int once_increase = 0; 00064 int once_decrease = 0; 00065 int x_inreasing_decreasing = 10; // +/- после удержания кнопки 00066 00067 00068 int write_page_time = 5000; // время до записи max_value 00069 int timer_to_write_page = 0; // отсчет времени до записи max_value 00070 int write_page_start = 0; // старт процедуры записи 00071 00072 00073 // Вычитываем сохраненное максимальное значение (11 стр для записи) 00074 spif.read_page(spi_buffer, 11); 00075 max_value = atoi(spi_buffer); 00076 00077 // Вычитываем сохраненное текущее значение (12 стр для записи) 00078 spif.read_page(spi_buffer, 12); 00079 present_val = atoi(spi_buffer); 00080 00081 // Делаем текущее значение != текущему прошлому значение 00082 present_val_last = present_val + 10; 00083 00084 // Поток для работы с текущим значением 00085 Thread count_thread; 00086 count_thread.start(count_value); 00087 00088 00089 while(1) { 00090 00091 /*** обработка нажатия кнопок ***/ 00092 00093 LEDKEY8.getKeys(&keydata); 00094 00095 // Нажимаем кнопку X, текущее значение = 0 00096 if(keydata[LEDKEY8_SW3_IDX] == LEDKEY8_SW3_BIT) { 00097 present_val = 0; 00098 enbl=1; 00099 } 00100 00101 00102 // Нажимаем кнопку увеличить 00103 if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) { 00104 if(keydata[LEDKEY8_SW2_IDX] != LEDKEY8_SW2_BIT) { 00105 time_update_increase = time_update_increase + delay_cycle; 00106 00107 // Один раз делаем +1 00108 if(once_increase == 0) { 00109 once_increase = 1; 00110 if(max_value<999){max_value = max_value + 1;} 00111 update = 0; 00112 } 00113 00114 write_page_start = 1; 00115 timer_to_write_page = 0; 00116 } 00117 } 00118 else { 00119 time_update_increase = 0; 00120 once_increase = 0; 00121 } 00122 00123 00124 00125 // Нажимаем кнопку уменьшить 00126 if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) { 00127 if(keydata[LEDKEY8_SW1_IDX] != LEDKEY8_SW1_BIT) { 00128 time_update_decrease = time_update_decrease + delay_cycle; 00129 00130 // Один раз делаем -1 00131 if(once_decrease == 0) { 00132 once_decrease = 1; 00133 if(max_value>0){max_value = max_value - 1;} 00134 update = 0; 00135 } 00136 00137 write_page_start = 1; 00138 timer_to_write_page = 0; 00139 } 00140 } 00141 else { 00142 once_decrease = 0; 00143 time_update_decrease = 0; 00144 } 00145 00146 00147 00148 00149 // При удержании кнопки увеличить на +10 00150 if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) { 00151 if(time_update_increase >= delay_update_x10) { 00152 time_update_increase = delay_update_x10 - delay_cycle*10; 00153 if(max_value<=990){max_value = max_value + x_inreasing_decreasing;} 00154 update = 0; 00155 } 00156 } 00157 00158 00159 00160 00161 // При удержании кнопки уменьшить на -10 00162 if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) { 00163 if(time_update_decrease >= delay_update_x10) { 00164 time_update_decrease = delay_update_x10 - delay_cycle*10; 00165 if(max_value>10){max_value = max_value - x_inreasing_decreasing;} 00166 update = 0; 00167 } 00168 } 00169 00170 00171 00172 // Записываем в память максимальное значение 00173 // через время write_page_time после нажатий кнопок 00174 if(write_page_start == 1) { 00175 timer_to_write_page = timer_to_write_page + delay_cycle; 00176 00177 if(timer_to_write_page >= write_page_time) { 00178 write_page_start = 0; 00179 timer_to_write_page = 0; 00180 sprintf(spi_buffer, "%d", max_value); 00181 spif.page_erase(11); 00182 spif.write_page(spi_buffer, 11); 00183 00184 LEDKEY8.locate(0); 00185 LEDKEY8.printf(" "); 00186 Thread::wait(500); 00187 LEDKEY8.locate(0); 00188 LEDKEY8.printf("%d", max_value); 00189 } 00190 } 00191 00192 00193 00194 /*** вывод на дисплей ***/ 00195 00196 led = !led ; 00197 00198 LEDKEY8.cls(); 00199 LEDKEY8.setBrightness(TM1638_BRT1); 00200 LEDKEY8.locate(0); 00201 LEDKEY8.printf("%d", max_value); 00202 LEDKEY8.locate(3); 00203 LEDKEY8.printf("%d", present_val); 00204 if(led1==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD1);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD1);} 00205 if(led2==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD2);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD2);} 00206 if(led3==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD3);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD3);} 00207 00208 00209 Thread::wait(delay_cycle); 00210 } 00211 } 00212 00213 /****************************************************************/ 00214 00215 // Поток работы с текущим значением 10msec 00216 void count_value() { 00217 00218 int c_inp1=0; 00219 int c_inp2=0; 00220 int c_inp3=0; 00221 int m_inp1=0; 00222 int m_inp2=0; 00223 int m_inp3=0; 00224 00225 int blnk=0; 00226 00227 while(1) { 00228 00229 if(blnk<100){blnk++;}else{blnk=0;} 00230 00231 // фиксируем значения 00232 if(in1==0){c_inp1=1;}else{c_inp1=0;} 00233 if(in2==0){c_inp2=1;}else{c_inp2=0;} 00234 if(in3==0){c_inp3=1;}else{c_inp3=0;} 00235 00236 00237 // сохраняем тек.значение в 12 стр. при выкл. питания 00238 if(c_inp1==0 && m_inp1==1){ 00239 sprintf(spi_buffer, "%d", present_val); 00240 spif.page_erase(12); 00241 spif.write_page(spi_buffer, 12); 00242 } 00243 00244 // подсчет импульсов по входу 1 00245 if(c_inp2==1 && m_inp2==0 && enbl==1){ 00246 present_val++; 00247 } 00248 00249 // сбрасываем текущее значение по входу 2 00250 if(c_inp3==1 && m_inp3==0){ 00251 enbl=1; 00252 present_val=0; 00253 } 00254 00255 00256 // управление реле 00257 if(present_val<max_value && enbl==1){rel=1; }else{rel=0;} 00258 00259 00260 // управляем светодиодами 00261 if(enbl==1){ 00262 if(rel==1){led1=1;}else{led1=0;} 00263 }else{ 00264 if(blnk<50){led1=1;}else{led1=0;} 00265 } 00266 00267 00268 if(c_inp2==1){led2=1;}else{led2=0;} 00269 if(c_inp3==1){led3=1;}else{led3=0;} 00270 00271 00272 // сохраняем значени 00273 m_inp1=c_inp1; 00274 m_inp2=c_inp2; 00275 m_inp3=c_inp3; 00276 00277 00278 Thread::wait(5); 00279 } 00280 } 00281 00282
Generated on Sat Jul 16 2022 12:40:31 by
1.7.2