Added integration of analog channels, introduced three new setpoints (Pb_1, Pb_2, Tp) for automatic compressor operation.

Dependencies:   _24LCXXX

Files at this revision

API Documentation at this revision

Comitter:
Aleksk
Date:
Fri Sep 11 08:00:35 2020 +0000
Parent:
7:97881cd71b31
Child:
9:6bd6ac6ca7d4
Commit message:
Messages transmitted via pc.printf to PC are supplemented with checksums to increase the reliability of communication.The pc.printf command was introduced, which sends an empty string once per second in case of data loss (corruption) during transfer

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Fri Jun 19 10:33:01 2020 +0000
+++ b/main.cpp	Fri Sep 11 08:00:35 2020 +0000
@@ -1,5 +1,9 @@
-// 19.06.2020 Продолжение (клон )mbed-os5-press12
-// значения уставок EEPROM2  выводяться в pc.print в специальной строке с текущими данными диагностики
+// 10.09.2020 Продолжение (клон )mbed-os5-press15
+// Суммирование значений каналов А0 А1 А2 было 9 раз, исправлено на 10.
+// Передаваемые через pc.printf сообщения в РС дополнены контрольными суммами для увеличения надёжности связи.
+// Введена команда pc.printf, посылающая пустую строку раз в секунду, на случай потери (порчи )данных при пересылке и
+// возможного зависания программы оператора при ожидании символа из serial порта (для этого добавлен timer_4).
+// Значения уставок EEPROM2  выводяться в pc.print в специальной строке с текущими данными диагностики
 // Сделан дополнительный блок в парсере для декодирования приходящих аварийных уставок, они пишутся в  EEPROM2
 // Сделан timer_2 для отсчёта времени открытого состояния вентиля 1
 // Сделан timer_3 для отсчёта времени открытого состояния вентиля 2
@@ -42,6 +46,7 @@
 Timer timer;                                                                    //инициализация таймера для определения частот переключений вентилей 1 и 2
 Timer timer_2;                                                                  //инициализация таймера 2 для отсчёта времени открытого состояния вентиля 1
 Timer timer_3;                                                                  //инициализация таймера 3 для отсчёта времени открытого состояния вентиля 2
+Timer timer_4;                                                                  //инициализация таймера 4 для отсчёта периода времени отсылки в порт компьютера пустой строки.
 //========УСТАВКИ_1 EEPROM========
 uint8_t delta_value = 0;                                                        //set delta pressure 1...99
 uint8_t flag_compressor = 0;                                                    //флаг компрессора. При 0 - выключение компрессора, при 1 - включение компрессора
@@ -434,7 +439,7 @@
 int main() {
     
     pc.attach(&onDataReceived, Serial::RxIrq);
-    int time, time_2, time_3, valve1, valve2, countValve1=0, countValve2=0, temp_valueSensor;
+    int time, time_2, time_3, time_4, ks, valve1, valve2, countValve1=0, countValve2=0, temp_valueSensor;
     int frequencyValve1, frequencyValve2;
     float raw_value_sum_0=0, raw_value_sum_1=0, raw_value_sum_2=0, raw_value_sum_3=0, raw_value_sum_4=0, raw_value_sum_5=0;
     digital_4.write(0);                                                         //valve1  off;
@@ -456,6 +461,7 @@
     timer.start();
     timer_2.start();
     timer_3.start();
+    timer_4.start();
     
   while (true){                                                                 //бесконечный цикл
     // kick watchdog regularly within provided timeout (сброс собаки в начало счёта)
@@ -471,12 +477,16 @@
     }
     
     if (flag_comand_detected) {                                                 //пришла правильная командная строка
-                                                 
-      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+      ks=(value+delta_value+flag_compressor+flag_stopRegulator+
+        sensor_value+frequencyValve1+frequencyValve2+
+        WL+Pb+Pw1+Pw2+Pd+
+        digital_4.read()+digital_7.read()+digital_5.read()+digital_6.read()+event_N+idigital_11.read()+idigital_12.read()+idigital_13.read())*2;
+      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
         value,delta_value,flag_compressor,flag_stopRegulator,
         sensor_value,frequencyValve1,frequencyValve2,
         WL,Pb,Pw1,Pw2,Pd,
-        digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read());        //передача текущих значений в РС
+        digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read(),
+        ks);        //передача текущих значений в РС
              
       //pc.printf("%s\r\n",trueSource);                                         //эхо для отладки канала связи
       flag_comand_detected = false;                                               //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта
@@ -490,13 +500,20 @@
     }
     
     if (flag_comand2_detected ) {                                //пришла правильная строка из программы SetUp_EEPROM и передана уставка
-      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+      ks=(value+delta_value+flag_compressor+flag_stopRegulator+
+        sensor_value+frequencyValve1+frequencyValve2+
+        WL+Pb+Pw1+Pw2+Pd+
+        digital_4.read()+digital_7.read()+digital_5.read()+digital_6.read()+
+        event_N+idigital_11.read()+idigital_12.read()+idigital_13.read()+
+        Pd_eeprom+frequencyValve1_eeprom+frequencyValve2_eeprom+WL01_eeprom+WL99_eeprom+T_1+T_2)*2;
+      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
         value,delta_value,flag_compressor,flag_stopRegulator,                                             //1,2,3,4
         sensor_value,frequencyValve1,frequencyValve2,                                                     //5,6,7
         WL,Pb,Pw1,Pw2,Pd,                                                                                 //8,9,10,11,12
         digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),                              //13,14,15,16
         event_N,idigital_11.read(),idigital_12.read(),idigital_13.read(),                                 //17,18,19,20
-        Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2 );        //21,22,23,24,25,26,27
+        Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2,
+        ks);        //21,22,23,24,25,26,27,28
       flag_comand2_detected = false;                                            //в последующих обращениях не печатать пока нет нового сообщения из СОМ-порта
       
       if (strcmp(trueSource2Old,trueSource2) != 0 && numSet >= 10) {            //функция возвращает ноль если командные строки совпадают
@@ -509,15 +526,20 @@
     }
     
     if (flag_zerostart) {                                            //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске)
-      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+      ks=(value+delta_value+flag_compressor+flag_stopRegulator+
+        sensor_value+frequencyValve1+frequencyValve2+
+        WL+Pb+Pw1+Pw2+Pd+
+        digital_4.read()+digital_7.read()+digital_5.read()+digital_6.read()+event_N+idigital_11.read()+idigital_12.read()+idigital_13.read())*2;
+      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
         value,delta_value,flag_compressor,flag_stopRegulator,
         sensor_value,frequencyValve1,frequencyValve2,
         WL,Pb,Pw1,Pw2,Pd,
-        digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read());        //передача текущих значений в РС  
+        digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read(),
+        ks);        //передача текущих значений в РС  
         flag_zerostart = false;
     }   
-    
-    if (counter_cycle1 < 10 ) {
+    //счет counter_cycle1 идет от еденицы
+    if (counter_cycle1 < 11 ) {
       float raw_value_0 = analog_value_0.read();                                     // Чтение аналогового входа 0 (0.0 to 1.0 = full ADC диапазон)
       raw_value_sum_0 = raw_value_sum_0 + raw_value_0;
       float raw_value_1 = analog_value_1.read();                                     // Чтение аналогового входа 1 (0.0 to 1.0 = full ADC диапазон)
@@ -525,7 +547,7 @@
       float raw_value_2 = analog_value_2.read();                                     // Чтение аналогового входа 2 (0.0 to 1.0 = full ADC диапазон)
       raw_value_sum_2 = raw_value_sum_2 + raw_value_2;
     }
-    if (counter_cycle1 >= 10 ) {
+    if (counter_cycle1 >= 11 ) {
       float raw_value_3 = analog_value_3.read();                                     // Чтение аналогового входа 3 (0.0 to 1.0 = full ADC диапазон)
       raw_value_sum_3 = raw_value_sum_3 + raw_value_3;
       float raw_value_4 = analog_value_4.read();                                     // Чтение аналогового входа 4 (0.0 to 1.0 = full ADC диапазон)
@@ -534,7 +556,7 @@
       //raw_value_sum_5 = raw_value_sum_5 + raw_value_5;
     }
        
-    if (counter_cycle1 >= 19 ) {
+    if (counter_cycle1 >= 20 ) {
       counter_cycle1=0;
       
       WL = raw_value_sum_0/10 * 3300;                                           // преобразование в напряжение 0-3300 mV  с усреднением
@@ -634,6 +656,15 @@
       auto_set();                                                               //включение-выкючение компрессора  через flag_compressor
       //led = !led;                                                               //гасим/зажигаем индикаторный светодиод
     } 
+    
+    //---------------------print void string to PC----------------------------
+    time_4 = timer_4.read_ms();  
+    if (time_4 >= 1000) {
+        timer_4.reset();
+        pc.printf("$\r\n");                                                     //отправка пустой (символ $ обязателен!)строки раз в 1000 мс в PC
+    }
+    
+    
     ThisThread::sleep_for(1);                                                   // (mc) правильный оператор задержки для mbed5
     counter_cycle1++;