Relay counter

Dependencies:   TM1638 mbed mbed-rtos AT45

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main_count_v2.cpp Source File

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