Relay counter

Dependencies:   TM1638 mbed mbed-rtos AT45

Committer:
Oleg_B
Date:
Mon Feb 15 04:03:12 2021 +0000
Revision:
1:36d6279f43d5
Parent:
0:1b4c0e7c9316
relay - counter

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Oleg_B 0:1b4c0e7c9316 1
Oleg_B 0:1b4c0e7c9316 2 /**************rele-counter v2 **********************************/
Oleg_B 0:1b4c0e7c9316 3 // при включении реле выключено, тек.показания и уставка как до выключения,
Oleg_B 0:1b4c0e7c9316 4 // но подсчет импульсов не работает до подачи 1го импульса на сброс.
Oleg_B 0:1b4c0e7c9316 5 // после подачи 1го имп.сброс - показания сбрасываются реле включается
Oleg_B 0:1b4c0e7c9316 6 // при достижении подсчитанных импульсов уставки - реле отключается
Oleg_B 0:1b4c0e7c9316 7 // при повторной подаче сигнала сброс, показания сбрасываются и реле включается
Oleg_B 0:1b4c0e7c9316 8 //
Oleg_B 0:1b4c0e7c9316 9 //
Oleg_B 0:1b4c0e7c9316 10
Oleg_B 0:1b4c0e7c9316 11
Oleg_B 0:1b4c0e7c9316 12 #include "mbed.h"
Oleg_B 0:1b4c0e7c9316 13 #include "rtos.h"
Oleg_B 0:1b4c0e7c9316 14 #include "TM1638.h"
Oleg_B 0:1b4c0e7c9316 15 #include "AT45.h"
Oleg_B 0:1b4c0e7c9316 16
Oleg_B 0:1b4c0e7c9316 17
Oleg_B 0:1b4c0e7c9316 18 // ------- input/output ----------------
Oleg_B 0:1b4c0e7c9316 19 DigitalOut led(PC_13);
Oleg_B 0:1b4c0e7c9316 20 DigitalOut rel(PA_15);
Oleg_B 0:1b4c0e7c9316 21 DigitalIn in1(PA_8);
Oleg_B 0:1b4c0e7c9316 22 DigitalIn in2(PA_9);
Oleg_B 0:1b4c0e7c9316 23 DigitalIn in3(PA_10);
Oleg_B 0:1b4c0e7c9316 24
Oleg_B 0:1b4c0e7c9316 25 // ------- displey --------------------
Oleg_B 0:1b4c0e7c9316 26 TM1638_LEDKEY8 LEDKEY8(PB_15,PB_14,PB_13, PB_12);
Oleg_B 0:1b4c0e7c9316 27 TM1638::KeyData_t keydata;
Oleg_B 0:1b4c0e7c9316 28
Oleg_B 0:1b4c0e7c9316 29
Oleg_B 0:1b4c0e7c9316 30 //----------- SPI FLASH ------------------------
Oleg_B 0:1b4c0e7c9316 31 SPI spi(PA_7, PA_6, PA_5); // mosi, miso, sclk
Oleg_B 0:1b4c0e7c9316 32 AT45 spif(&spi, PA_4); // NSS
Oleg_B 0:1b4c0e7c9316 33
Oleg_B 0:1b4c0e7c9316 34 char *spi_buffer = (char*) malloc(64);
Oleg_B 0:1b4c0e7c9316 35 char str[10];
Oleg_B 0:1b4c0e7c9316 36
Oleg_B 0:1b4c0e7c9316 37
Oleg_B 0:1b4c0e7c9316 38 // -------- глоб.переменные ---------------
Oleg_B 0:1b4c0e7c9316 39 int present_val = 0; // текущее заначение
Oleg_B 0:1b4c0e7c9316 40 int present_val_last = 0; // текущее значение (старое)
Oleg_B 0:1b4c0e7c9316 41 int max_value = 0; // значение вкл. реле
Oleg_B 0:1b4c0e7c9316 42
Oleg_B 0:1b4c0e7c9316 43 int led1=0; // индикация LED1
Oleg_B 0:1b4c0e7c9316 44 int led2=0; // индикация LED2
Oleg_B 0:1b4c0e7c9316 45 int led3=0; // индикация LED3
Oleg_B 0:1b4c0e7c9316 46
Oleg_B 0:1b4c0e7c9316 47 int enbl=0; // разрешение на работу
Oleg_B 0:1b4c0e7c9316 48
Oleg_B 0:1b4c0e7c9316 49 // -------- Прототипы функций: ----------
Oleg_B 0:1b4c0e7c9316 50 void count_value();
Oleg_B 0:1b4c0e7c9316 51
Oleg_B 0:1b4c0e7c9316 52
Oleg_B 0:1b4c0e7c9316 53 /********************************************************************/
Oleg_B 0:1b4c0e7c9316 54 int main() {
Oleg_B 0:1b4c0e7c9316 55
Oleg_B 0:1b4c0e7c9316 56 // предустановка значений
Oleg_B 0:1b4c0e7c9316 57 int update = 0;
Oleg_B 0:1b4c0e7c9316 58 int update2 = 0;
Oleg_B 0:1b4c0e7c9316 59 int delay_update_x10 = 2000; // задержка перед +/- x_inreasing_decreasing
Oleg_B 0:1b4c0e7c9316 60 int time_update_increase = 0; // отсчет времени до +10
Oleg_B 0:1b4c0e7c9316 61 int time_update_decrease = 0; // отсчет времени до -10
Oleg_B 0:1b4c0e7c9316 62 int delay_cycle = 25; // период вывода инф. на дисплей
Oleg_B 0:1b4c0e7c9316 63 int once_increase = 0;
Oleg_B 0:1b4c0e7c9316 64 int once_decrease = 0;
Oleg_B 0:1b4c0e7c9316 65 int x_inreasing_decreasing = 10; // +/- после удержания кнопки
Oleg_B 0:1b4c0e7c9316 66
Oleg_B 0:1b4c0e7c9316 67
Oleg_B 0:1b4c0e7c9316 68 int write_page_time = 5000; // время до записи max_value
Oleg_B 0:1b4c0e7c9316 69 int timer_to_write_page = 0; // отсчет времени до записи max_value
Oleg_B 0:1b4c0e7c9316 70 int write_page_start = 0; // старт процедуры записи
Oleg_B 0:1b4c0e7c9316 71
Oleg_B 0:1b4c0e7c9316 72
Oleg_B 0:1b4c0e7c9316 73 // Вычитываем сохраненное максимальное значение (11 стр для записи)
Oleg_B 0:1b4c0e7c9316 74 spif.read_page(spi_buffer, 11);
Oleg_B 0:1b4c0e7c9316 75 max_value = atoi(spi_buffer);
Oleg_B 0:1b4c0e7c9316 76
Oleg_B 0:1b4c0e7c9316 77 // Вычитываем сохраненное текущее значение (12 стр для записи)
Oleg_B 0:1b4c0e7c9316 78 spif.read_page(spi_buffer, 12);
Oleg_B 0:1b4c0e7c9316 79 present_val = atoi(spi_buffer);
Oleg_B 0:1b4c0e7c9316 80
Oleg_B 0:1b4c0e7c9316 81 // Делаем текущее значение != текущему прошлому значение
Oleg_B 0:1b4c0e7c9316 82 present_val_last = present_val + 10;
Oleg_B 0:1b4c0e7c9316 83
Oleg_B 0:1b4c0e7c9316 84 // Поток для работы с текущим значением
Oleg_B 0:1b4c0e7c9316 85 Thread count_thread;
Oleg_B 0:1b4c0e7c9316 86 count_thread.start(count_value);
Oleg_B 0:1b4c0e7c9316 87
Oleg_B 0:1b4c0e7c9316 88
Oleg_B 0:1b4c0e7c9316 89 while(1) {
Oleg_B 0:1b4c0e7c9316 90
Oleg_B 0:1b4c0e7c9316 91 /*** обработка нажатия кнопок ***/
Oleg_B 0:1b4c0e7c9316 92
Oleg_B 0:1b4c0e7c9316 93 LEDKEY8.getKeys(&keydata);
Oleg_B 0:1b4c0e7c9316 94
Oleg_B 0:1b4c0e7c9316 95 // Нажимаем кнопку X, текущее значение = 0
Oleg_B 0:1b4c0e7c9316 96 if(keydata[LEDKEY8_SW3_IDX] == LEDKEY8_SW3_BIT) {
Oleg_B 0:1b4c0e7c9316 97 present_val = 0;
Oleg_B 0:1b4c0e7c9316 98 enbl=1;
Oleg_B 0:1b4c0e7c9316 99 }
Oleg_B 0:1b4c0e7c9316 100
Oleg_B 0:1b4c0e7c9316 101
Oleg_B 0:1b4c0e7c9316 102 // Нажимаем кнопку увеличить
Oleg_B 0:1b4c0e7c9316 103 if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) {
Oleg_B 0:1b4c0e7c9316 104 if(keydata[LEDKEY8_SW2_IDX] != LEDKEY8_SW2_BIT) {
Oleg_B 0:1b4c0e7c9316 105 time_update_increase = time_update_increase + delay_cycle;
Oleg_B 0:1b4c0e7c9316 106
Oleg_B 0:1b4c0e7c9316 107 // Один раз делаем +1
Oleg_B 0:1b4c0e7c9316 108 if(once_increase == 0) {
Oleg_B 0:1b4c0e7c9316 109 once_increase = 1;
Oleg_B 0:1b4c0e7c9316 110 if(max_value<999){max_value = max_value + 1;}
Oleg_B 0:1b4c0e7c9316 111 update = 0;
Oleg_B 0:1b4c0e7c9316 112 }
Oleg_B 0:1b4c0e7c9316 113
Oleg_B 0:1b4c0e7c9316 114 write_page_start = 1;
Oleg_B 0:1b4c0e7c9316 115 timer_to_write_page = 0;
Oleg_B 0:1b4c0e7c9316 116 }
Oleg_B 0:1b4c0e7c9316 117 }
Oleg_B 0:1b4c0e7c9316 118 else {
Oleg_B 0:1b4c0e7c9316 119 time_update_increase = 0;
Oleg_B 0:1b4c0e7c9316 120 once_increase = 0;
Oleg_B 0:1b4c0e7c9316 121 }
Oleg_B 0:1b4c0e7c9316 122
Oleg_B 0:1b4c0e7c9316 123
Oleg_B 0:1b4c0e7c9316 124
Oleg_B 0:1b4c0e7c9316 125 // Нажимаем кнопку уменьшить
Oleg_B 0:1b4c0e7c9316 126 if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) {
Oleg_B 0:1b4c0e7c9316 127 if(keydata[LEDKEY8_SW1_IDX] != LEDKEY8_SW1_BIT) {
Oleg_B 0:1b4c0e7c9316 128 time_update_decrease = time_update_decrease + delay_cycle;
Oleg_B 0:1b4c0e7c9316 129
Oleg_B 0:1b4c0e7c9316 130 // Один раз делаем -1
Oleg_B 0:1b4c0e7c9316 131 if(once_decrease == 0) {
Oleg_B 0:1b4c0e7c9316 132 once_decrease = 1;
Oleg_B 0:1b4c0e7c9316 133 if(max_value>0){max_value = max_value - 1;}
Oleg_B 0:1b4c0e7c9316 134 update = 0;
Oleg_B 0:1b4c0e7c9316 135 }
Oleg_B 0:1b4c0e7c9316 136
Oleg_B 0:1b4c0e7c9316 137 write_page_start = 1;
Oleg_B 0:1b4c0e7c9316 138 timer_to_write_page = 0;
Oleg_B 0:1b4c0e7c9316 139 }
Oleg_B 0:1b4c0e7c9316 140 }
Oleg_B 0:1b4c0e7c9316 141 else {
Oleg_B 0:1b4c0e7c9316 142 once_decrease = 0;
Oleg_B 0:1b4c0e7c9316 143 time_update_decrease = 0;
Oleg_B 0:1b4c0e7c9316 144 }
Oleg_B 0:1b4c0e7c9316 145
Oleg_B 0:1b4c0e7c9316 146
Oleg_B 0:1b4c0e7c9316 147
Oleg_B 0:1b4c0e7c9316 148
Oleg_B 0:1b4c0e7c9316 149 // При удержании кнопки увеличить на +10
Oleg_B 0:1b4c0e7c9316 150 if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) {
Oleg_B 0:1b4c0e7c9316 151 if(time_update_increase >= delay_update_x10) {
Oleg_B 0:1b4c0e7c9316 152 time_update_increase = delay_update_x10 - delay_cycle*10;
Oleg_B 0:1b4c0e7c9316 153 if(max_value<=990){max_value = max_value + x_inreasing_decreasing;}
Oleg_B 0:1b4c0e7c9316 154 update = 0;
Oleg_B 0:1b4c0e7c9316 155 }
Oleg_B 0:1b4c0e7c9316 156 }
Oleg_B 0:1b4c0e7c9316 157
Oleg_B 0:1b4c0e7c9316 158
Oleg_B 0:1b4c0e7c9316 159
Oleg_B 0:1b4c0e7c9316 160
Oleg_B 0:1b4c0e7c9316 161 // При удержании кнопки уменьшить на -10
Oleg_B 0:1b4c0e7c9316 162 if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) {
Oleg_B 0:1b4c0e7c9316 163 if(time_update_decrease >= delay_update_x10) {
Oleg_B 0:1b4c0e7c9316 164 time_update_decrease = delay_update_x10 - delay_cycle*10;
Oleg_B 0:1b4c0e7c9316 165 if(max_value>10){max_value = max_value - x_inreasing_decreasing;}
Oleg_B 0:1b4c0e7c9316 166 update = 0;
Oleg_B 0:1b4c0e7c9316 167 }
Oleg_B 0:1b4c0e7c9316 168 }
Oleg_B 0:1b4c0e7c9316 169
Oleg_B 0:1b4c0e7c9316 170
Oleg_B 0:1b4c0e7c9316 171
Oleg_B 0:1b4c0e7c9316 172 // Записываем в память максимальное значение
Oleg_B 0:1b4c0e7c9316 173 // через время write_page_time после нажатий кнопок
Oleg_B 0:1b4c0e7c9316 174 if(write_page_start == 1) {
Oleg_B 0:1b4c0e7c9316 175 timer_to_write_page = timer_to_write_page + delay_cycle;
Oleg_B 0:1b4c0e7c9316 176
Oleg_B 0:1b4c0e7c9316 177 if(timer_to_write_page >= write_page_time) {
Oleg_B 0:1b4c0e7c9316 178 write_page_start = 0;
Oleg_B 0:1b4c0e7c9316 179 timer_to_write_page = 0;
Oleg_B 0:1b4c0e7c9316 180 sprintf(spi_buffer, "%d", max_value);
Oleg_B 0:1b4c0e7c9316 181 spif.page_erase(11);
Oleg_B 0:1b4c0e7c9316 182 spif.write_page(spi_buffer, 11);
Oleg_B 0:1b4c0e7c9316 183
Oleg_B 0:1b4c0e7c9316 184 LEDKEY8.locate(0);
Oleg_B 0:1b4c0e7c9316 185 LEDKEY8.printf(" ");
Oleg_B 0:1b4c0e7c9316 186 Thread::wait(500);
Oleg_B 0:1b4c0e7c9316 187 LEDKEY8.locate(0);
Oleg_B 0:1b4c0e7c9316 188 LEDKEY8.printf("%d", max_value);
Oleg_B 0:1b4c0e7c9316 189 }
Oleg_B 0:1b4c0e7c9316 190 }
Oleg_B 0:1b4c0e7c9316 191
Oleg_B 0:1b4c0e7c9316 192
Oleg_B 0:1b4c0e7c9316 193
Oleg_B 0:1b4c0e7c9316 194 /*** вывод на дисплей ***/
Oleg_B 0:1b4c0e7c9316 195
Oleg_B 0:1b4c0e7c9316 196 led = !led ;
Oleg_B 0:1b4c0e7c9316 197
Oleg_B 0:1b4c0e7c9316 198 LEDKEY8.cls();
Oleg_B 0:1b4c0e7c9316 199 LEDKEY8.setBrightness(TM1638_BRT1);
Oleg_B 0:1b4c0e7c9316 200 LEDKEY8.locate(0);
Oleg_B 0:1b4c0e7c9316 201 LEDKEY8.printf("%d", max_value);
Oleg_B 0:1b4c0e7c9316 202 LEDKEY8.locate(3);
Oleg_B 0:1b4c0e7c9316 203 LEDKEY8.printf("%d", present_val);
Oleg_B 0:1b4c0e7c9316 204 if(led1==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD1);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD1);}
Oleg_B 0:1b4c0e7c9316 205 if(led2==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD2);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD2);}
Oleg_B 0:1b4c0e7c9316 206 if(led3==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD3);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD3);}
Oleg_B 0:1b4c0e7c9316 207
Oleg_B 0:1b4c0e7c9316 208
Oleg_B 0:1b4c0e7c9316 209 Thread::wait(delay_cycle);
Oleg_B 0:1b4c0e7c9316 210 }
Oleg_B 0:1b4c0e7c9316 211 }
Oleg_B 0:1b4c0e7c9316 212
Oleg_B 0:1b4c0e7c9316 213 /****************************************************************/
Oleg_B 0:1b4c0e7c9316 214
Oleg_B 0:1b4c0e7c9316 215 // Поток работы с текущим значением 10msec
Oleg_B 0:1b4c0e7c9316 216 void count_value() {
Oleg_B 0:1b4c0e7c9316 217
Oleg_B 0:1b4c0e7c9316 218 int c_inp1=0;
Oleg_B 0:1b4c0e7c9316 219 int c_inp2=0;
Oleg_B 0:1b4c0e7c9316 220 int c_inp3=0;
Oleg_B 0:1b4c0e7c9316 221 int m_inp1=0;
Oleg_B 0:1b4c0e7c9316 222 int m_inp2=0;
Oleg_B 0:1b4c0e7c9316 223 int m_inp3=0;
Oleg_B 0:1b4c0e7c9316 224
Oleg_B 0:1b4c0e7c9316 225 int blnk=0;
Oleg_B 0:1b4c0e7c9316 226
Oleg_B 0:1b4c0e7c9316 227 while(1) {
Oleg_B 0:1b4c0e7c9316 228
Oleg_B 0:1b4c0e7c9316 229 if(blnk<100){blnk++;}else{blnk=0;}
Oleg_B 0:1b4c0e7c9316 230
Oleg_B 0:1b4c0e7c9316 231 // фиксируем значения
Oleg_B 0:1b4c0e7c9316 232 if(in1==0){c_inp1=1;}else{c_inp1=0;}
Oleg_B 0:1b4c0e7c9316 233 if(in2==0){c_inp2=1;}else{c_inp2=0;}
Oleg_B 0:1b4c0e7c9316 234 if(in3==0){c_inp3=1;}else{c_inp3=0;}
Oleg_B 0:1b4c0e7c9316 235
Oleg_B 0:1b4c0e7c9316 236
Oleg_B 0:1b4c0e7c9316 237 // сохраняем тек.значение в 12 стр. при выкл. питания
Oleg_B 0:1b4c0e7c9316 238 if(c_inp1==0 && m_inp1==1){
Oleg_B 0:1b4c0e7c9316 239 sprintf(spi_buffer, "%d", present_val);
Oleg_B 0:1b4c0e7c9316 240 spif.page_erase(12);
Oleg_B 0:1b4c0e7c9316 241 spif.write_page(spi_buffer, 12);
Oleg_B 0:1b4c0e7c9316 242 }
Oleg_B 0:1b4c0e7c9316 243
Oleg_B 0:1b4c0e7c9316 244 // подсчет импульсов по входу 1
Oleg_B 0:1b4c0e7c9316 245 if(c_inp2==1 && m_inp2==0 && enbl==1){
Oleg_B 0:1b4c0e7c9316 246 present_val++;
Oleg_B 0:1b4c0e7c9316 247 }
Oleg_B 0:1b4c0e7c9316 248
Oleg_B 0:1b4c0e7c9316 249 // сбрасываем текущее значение по входу 2
Oleg_B 0:1b4c0e7c9316 250 if(c_inp3==1 && m_inp3==0){
Oleg_B 0:1b4c0e7c9316 251 enbl=1;
Oleg_B 0:1b4c0e7c9316 252 present_val=0;
Oleg_B 0:1b4c0e7c9316 253 }
Oleg_B 0:1b4c0e7c9316 254
Oleg_B 0:1b4c0e7c9316 255
Oleg_B 0:1b4c0e7c9316 256 // управление реле
Oleg_B 0:1b4c0e7c9316 257 if(present_val<max_value && enbl==1){rel=1; }else{rel=0;}
Oleg_B 0:1b4c0e7c9316 258
Oleg_B 0:1b4c0e7c9316 259
Oleg_B 0:1b4c0e7c9316 260 // управляем светодиодами
Oleg_B 0:1b4c0e7c9316 261 if(enbl==1){
Oleg_B 0:1b4c0e7c9316 262 if(rel==1){led1=1;}else{led1=0;}
Oleg_B 0:1b4c0e7c9316 263 }else{
Oleg_B 0:1b4c0e7c9316 264 if(blnk<50){led1=1;}else{led1=0;}
Oleg_B 0:1b4c0e7c9316 265 }
Oleg_B 0:1b4c0e7c9316 266
Oleg_B 0:1b4c0e7c9316 267
Oleg_B 0:1b4c0e7c9316 268 if(c_inp2==1){led2=1;}else{led2=0;}
Oleg_B 0:1b4c0e7c9316 269 if(c_inp3==1){led3=1;}else{led3=0;}
Oleg_B 0:1b4c0e7c9316 270
Oleg_B 0:1b4c0e7c9316 271
Oleg_B 0:1b4c0e7c9316 272 // сохраняем значени
Oleg_B 0:1b4c0e7c9316 273 m_inp1=c_inp1;
Oleg_B 0:1b4c0e7c9316 274 m_inp2=c_inp2;
Oleg_B 0:1b4c0e7c9316 275 m_inp3=c_inp3;
Oleg_B 0:1b4c0e7c9316 276
Oleg_B 0:1b4c0e7c9316 277
Oleg_B 0:1b4c0e7c9316 278 Thread::wait(5);
Oleg_B 0:1b4c0e7c9316 279 }
Oleg_B 0:1b4c0e7c9316 280 }
Oleg_B 0:1b4c0e7c9316 281
Oleg_B 0:1b4c0e7c9316 282