The values of the EEPROM2 settings are displayed in pc.print in a special line with the current diagnostic data. An additional block has been made in the parser for decoding incoming alarm settings; they are written in EEPROM2.

Dependencies:   _24LCXXX

Revision:
4:c34b84bfa2fb
Parent:
3:712f751b4974
Child:
5:bb595cde0c82
--- a/main.cpp	Fri May 15 08:37:36 2020 +0000
+++ b/main.cpp	Wed May 27 16:01:15 2020 +0000
@@ -1,28 +1,45 @@
-// Продолжение (клон )mbed-os5-inerrupt_serial_readable_FIFO_12
-// Подключена EEPROM. Теперь уставки извлекаются из неё при перезагрузке. 
-// Создан сторожевой таймер, который истекает через 100мс
+// 27.05.2020 Продолжение (клон )mbed-os5-press4
+// включены все шесть аналоговых входа, читаются пять
+// при получении командной строки с нулевой суммой, по новому флагу flag_zerostart, передаётся в сериал текущие уставки и величины
+// (важно для старта программы на PC), эти нулевые уставки не вводятся в регулятор и не записываются в EEPROM.
+// сторожевой таймер,  истекает через 100мс
+// 
+
 #include "mbed.h"
 #include "_24LCXXX.h"
 
 I2C i2c(PB_9,PB_8);        // sda, scl
 _24LCXXX eeprom(&i2c, 0x50);
 
-AnalogIn analog_value(A0);                                                      //подключение аналогового входа A0
+AnalogIn analog_value_0(A0);                                                      //подключение аналогового входа A0
+AnalogIn analog_value_1(A1);                                                      //подключение аналогового входа A1
+AnalogIn analog_value_2(A2);                                                      //подключение аналогового входа A2
+AnalogIn analog_value_3(A3);                                                      //подключение аналогового входа A3
+AnalogIn analog_value_4(A4);                                                      //подключение аналогового входа A4
+AnalogIn analog_value_5(A5);                                                      //подключение аналогового входа A5
 DigitalOut led(LED1);
 DigitalOut digital_4(PB_5);                                                     //initialize digital pin 4 as an output (high pressure air bulb charge).
-DigitalOut digital_7(PA_8);                                                     //initialize digital pin 7 as an output. (high pressure air bulb discharge
-RawSerial pc(USBTX, USBRX, 115200);                                             // tx, rx for F411RE    in port command string
-RawSerial plotter(PA_9, PA_10, 115200);                                         // tx, rx for F411RE    out port  for serial_plotter
+DigitalOut digital_7(PA_8);                                                     //initialize digital pin 7 as an output. (high pressure air bulb discharge)
+DigitalOut digital_5(PB_4);                                                     //initialize digital pin 5 as an output (valve3,4)
+DigitalOut digital_6(PB_10);                                                    //initialize digital pin 6 as an output (compressor on/off)
+
+RawSerial plotter(USBTX, USBRX, 115200);                                        // tx, rx for F411RE    port for serial_plotter and temporary messages
+RawSerial pc(PA_9, PA_10, 115200);                                              // tx, rx for F411RE     port  for  command string distance PC
 EventQueue *queue = mbed_event_queue();                                         //инициализация очереди событий RTOS mbed5
 Timer timer;                                                                    //инициализация таймера
 //========УСТАВКИ========
 uint8_t flag_autoset = 0;                                                       //отладочный флаг. При 0 - запрет автоуставки давления, при 1 - разрешение
-uint8_t flag_plotter = 0;                                                       //отладочный флаг. При 0 - запрет печати в плоттер, при 1 - разрешение
-int value = 0;                                                             //set begin value "pressure"   1...3300
+uint8_t flag_plotter = 0;                                                       //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов
+int value = 0;                                                                  //set begin value "pressure"   1...3300
 uint8_t delta_value = 0;                                                        //set delta pressure 1...99
 //=======================
 int value_auto=250 ;                                                            //set begin value auto "pressure"
-int sensor_value =0;                                                            //напряжение с аналогового входа А0 (текущее давление)
+int WL = 0;                                                                     //напряжение с аналогового входа А0 (WL - вес опресовщика)
+int sensor_value =0;                                                            //напряжение с аналогового входа А1 (Pa - текущее давление)
+int Pb = 0;                                                                     //напряжение с аналогового входа А2 (Pb - давление в баллоне)
+int Pw1 = 0;                                                                    //напряжение с аналогового входа А3 (Pw1 - давление воды на входе опрессовщика)
+int Pw2 = 0;                                                                    //напряжение с аналогового входа А4 (Pw2 - давление воды в контуре макета)
+int Pd = 0;                                                                     //напряжение с аналогового входа А5 (Pd - дифференциальное давление опресовщика)
 int counter_cycle1 = 0;                                                         //счётчик цикла while(true)
 int counter_cycle2 = 0;                                                         //счётчик внутри функции auto_set
 int sig = 1;                                                                    //знак инкримента для автоустаки
@@ -34,13 +51,14 @@
 char trueSource[maxnsym];                             //верифицированная строка для callback
 char trueSourceOld[maxnsym];                          //предыдущая верифицированная строка для callback
 
-volatile char chr_a;                                //в прерываниях переменные должны быть защищены  при помощи volatile от оптимизации компилятором
-volatile bool flag_comand_detected = false;         //если строка декодирована правильно то true
+volatile char chr_a;                                        //в прерываниях переменные должны быть защищены  при помощи volatile от оптимизации компилятором
+volatile bool flag_comand_detected = false;                 //если строка декодирована правильно то true
+volatile bool flag_zerostart = false;                       //если строка декодирована c нулевой контрольной суммой то true
 volatile bool flag_stopRegulator = true;                    //флаг остановки , закрыть все клапана 
 //_____________________________________________________________________________
 void save_EEPROM () {
     int data2;
-    pc.printf("EEPROM write------\r\n");    
+    plotter.printf("EEPROM write------\r\n");    
     eeprom.byte_write(0, delta_value);
     eeprom.byte_write(1, flag_autoset);
     eeprom.byte_write(2, flag_plotter);
@@ -51,18 +69,18 @@
 void load_EEPROM () {
     uint8_t data1;
     int data2;
-    pc.printf("EEPROM read------\r\n");
+    plotter.printf("EEPROM read------\r\n");
     eeprom.nbyte_read( 0, &data1, 1 );
-    pc.printf("adress 0  =%d \r\n",data1);
+    plotter.printf("adress 0  =%d \r\n",data1);
     delta_value=data1;
     eeprom.nbyte_read( 1, &data1, 1 );
-    pc.printf("adress 1  =%d \r\n",data1);
+    plotter.printf("adress 1  =%d \r\n",data1);
     flag_autoset=data1;
     eeprom.nbyte_read( 2, &data1, 1 );
-    pc.printf("adress 2  =%d \r\n",data1);
+    plotter.printf("adress 2  =%d \r\n",data1);
     flag_plotter=data1;
     eeprom.nbyte_read( 10, &data2, sizeof(int) );
-    pc.printf("adress 10  = %d \r\n",data2);
+    plotter.printf("adress 10  = %d \r\n",data2);
     value=data2;
     }
 //______________________________________________________________________________
@@ -126,17 +144,19 @@
     len=4;   //длина подстроки 1000 равна 4
     substring(Source,Destination,pos,len);
     value_=atoi(Destination);
-    if (value_==0) {
-      goto endParsing;       //уставка должна быть больше еденицы, пропускаем парсинг
-    }
+    //if (value_==0) {
+    //  flag_zerostart = true;    //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
+    //  goto endParsing;          //уставка должна быть больше еденицы, пропускаем парсинг
+    //}
     //pc.printf("for pos=%d and  len=%d  resultat is  d= %s atoi=%d\r\n", pos, len, Destination, value_);
     pos=13;  //начало подстроки 25 - на 13 позиции
     len=2;   //длина подстроки 25 равна 2
     substring(Source,Destination,pos,len);
     delta_value_=atoi(Destination);
-    if (delta_value_==0) {
-      goto endParsing;       //уставка отклонения должна быть больше еденицы, пропускаем парсинг
-    }
+    //if (delta_value_==0) {
+    //  flag_zerostart = true;    //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
+    //  goto endParsing;       //уставка отклонения должна быть больше еденицы, пропускаем парсинг
+    //}
     //pc.printf("for pos=%d and  len=%d  resultat is  d= %s atoi=%d\r\n", pos, len, Destination, delta_value_);
     pos=16;  //начало подстроки 0 - на 16 позиции
     len=1;   //длина подстроки 0 равна 1
@@ -153,21 +173,28 @@
     substring(Source,Destination,pos,len);
     controlSum1=atoi(Destination);
     if (controlSum1==0) {
-      goto endParsing;       //контрольная сумма должна быть больше еденицы, пропускаем парсинг
+      flag_zerostart = true;    //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
+      goto endParsing;           //контрольная сумма должна быть больше еденицы, пропускаем парсинг
     }
     //pc.printf("for pos=%d and  len=%d  resultat is  d= %s atoi=%d\r\n", pos, len, Destination, controlSum1);
     controlSum2=(value_+delta_value_+flag_autoset_+flag_plotter_)*2;            //удвоение чтобы не было одинаковых чисел в сообщении
     //pc.printf("controlSum1=%d   controlSum2=%d\r\n", controlSum1, controlSum2);
     if (controlSum1!=controlSum2) {                                             //не совпала контрольная сумма
       //pc.printf ("controlSum1!=controlSum2 \r\n");
-      goto endParsing;       //пропускаем парсинг
+      goto endParsing;                                                          //пропускаем парсинг
     }
-    //присваиваем проверенные значения глобальным переменным
-    strcpy(trueSource,Source);        //копировать из Source в trueSource
-    value=value_;
-    delta_value=delta_value_;
-    flag_autoset=flag_autoset_;
-    flag_plotter=flag_plotter_;
+    //*********присваиваем проверенные значения глобальным переменным***********
+    strcpy(trueSource,Source);                                                  //копировать из Source в trueSource
+    if (value_==0 || delta_value_==0) {                                         //при старте с пустой уставкой не имземняем их в регуляторе и не пишем в EEPROM
+      flag_autoset=flag_autoset_;
+      flag_plotter=flag_plotter_;                                               //для работы кнопки Stop
+      } else {
+      value=value_;
+      delta_value=delta_value_;
+      flag_autoset=flag_autoset_;
+      flag_plotter=flag_plotter_;  
+    }      
+    
     flag_comand_detected=true;        //если флаг true, то всем переменным  присвоены новые значения уставок
     
  endParsing:   
@@ -200,9 +227,10 @@
     pc.attach(&onDataReceived, Serial::RxIrq);
     int time, valve1, valve2, countValve1=0, countValve2=0;
     int frequencyValve1, frequencyValve2;
-    float raw_value_sum = 0 ;
+    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;
-    digital_7.write(0);                                                         //valve2  off;                                         
+    digital_7.write(0);                                                         //valve2  off;    
+    digital_5.write(0);                                                         //valve3,4  off;                                      
     load_EEPROM ();                                                             //загрузка уставок из EEPROM
     if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2) {
       flag_stopRegulator=false;                                                 //уставки из EEPROM похожи на правду, разрешаем работу регулятора 
@@ -219,12 +247,28 @@
   while (true){                                                                 //бесконечный цикл
     // kick watchdog regularly within provided timeout (сброс собаки в начало счёта)
     watchdog.kick();
+    
+    flag_stopRegulator = flag_plotter;                                          //вывод на плоттер не актуален, теперь он будет флагом полной остановки опрессовщика
+    if (flag_stopRegulator) {                                                   //полный останов регулятора и принудительное запирание всех клапанов
+      digital_4.write(0);                                                       //valve1  off
+      digital_7.write(0);                                                       //valve2  off
+      digital_5.write(0);                                                       //valve3,4 off
+    }
+    
     if (flag_comand_detected) {                                                 //пришла правильная командная строка
-      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n",
-        value,delta_value,flag_autoset,flag_plotter,sensor_value,frequencyValve1,frequencyValve2);     //текущие данные
+      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+        value,delta_value,flag_autoset,flag_plotter,
+        sensor_value,frequencyValve1,frequencyValve2,
+        WL,Pb,Pw1,Pw2,Pd,
+        digital_4.read(),digital_7.read(),digital_5.read());                                     //передача текущих значений в РС
+        
+    //    pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+    //    value,delta_value,flag_autoset,flag_plotter,
+    //    sensor_value,frequencyValve1,frequencyValve2);                                     //передача текущих значений в РС
+        
       //pc.printf("%s\r\n",trueSource);                                         //эхо для отладки канала связи
-      flag_comand_detected=false;                                               //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта
-      flag_stopRegulator=false;                                                 //сброс флага,  регулятор ждет пока  не будет сброшен этот флаг
+      flag_comand_detected = false;                                               //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта
+      //flag_stopRegulator = false;                                                 //сброс флага,  регулятор ждет пока  не будет сброшен этот флаг
       //plotter.printf("$%d %d %d %d %d;\r\n", digital_4.read()*100-110,
       //  digital_7.read()*100-220, value, sensor_value, time );                //печать в плоттер в другой СОМ-порт
       if (strcmp(trueSourceOld,trueSource) != 0) {                              //функция возвращает ноль если командные строки совпадают
@@ -234,14 +278,51 @@
       
       strcpy(trueSourceOld,trueSource);        //копировать из trueSource в trueSourceOld 
     }
-    float  raw_value = analog_value.read();                                     // Чтение аналогового входа (0.0 to 1.0 = full ADC диапазон)
-    raw_value_sum = raw_value_sum + raw_value;
+    
+    if (flag_zerostart) {                                            //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске)
+      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+        value,delta_value,flag_autoset,flag_plotter,
+        sensor_value,frequencyValve1,frequencyValve2,
+        WL,Pb,Pw1,Pw2,Pd,
+        digital_4.read(),digital_7.read(),digital_5.read());                                     //передача текущих значений в РС  
+        flag_zerostart = false;
+    }   
+    
+    if (counter_cycle1 < 10 ) {
+      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 диапазон)
+      raw_value_sum_1 = raw_value_sum_1 + raw_value_1;
+      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 ) {
+      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 диапазон)
+      raw_value_sum_4 = raw_value_sum_4 + raw_value_4;
+      //float raw_value_5 = analog_value_5.read();                                     // Чтение аналогового входа 5 (0.0 to 1.0 = full ADC диапазон)
+      //raw_value_sum_5 = raw_value_sum_5 + raw_value_5;
+    }
        
-    if (counter_cycle1 > 20 ) {
+    if (counter_cycle1 >= 19 ) {
       counter_cycle1=0;
-      sensor_value = raw_value_sum/20 * 3300;                                   // преобразование в напряжение 0-3300 mV  с усреднением
-      raw_value_sum = 0 ;
+      
+      WL = raw_value_sum_0/10 * 3300;                                           // преобразование в напряжение 0-3300 mV  с усреднением
+      raw_value_sum_0 = 0 ;
+      sensor_value = raw_value_sum_1/10 * 3300;                                 // преобразование в напряжение 0-3300 mV  с усреднением
+      raw_value_sum_1 = 0 ;
+      Pb = raw_value_sum_2/10 * 3300;                                           // преобразование в напряжение 0-3300 mV  с усреднением
+      raw_value_sum_2 = 0 ;
+      Pw1 = raw_value_sum_3/10 * 3300;                                          // преобразование в напряжение 0-3300 mV  с усреднением
+      raw_value_sum_3 = 0 ;
+      Pw2 = raw_value_sum_4/20 * 3300;                                          // преобразование в напряжение 0-3300 mV  с усреднением
+      raw_value_sum_4 = 0 ;
+      //Pd = raw_value_sum_5/20 * 3300;                                           // преобразование в напряжение 0-3300 mV  с усреднением
+      //raw_value_sum_5 = 0 ;
+      
       if (flag_stopRegulator == false) {                                        // можно запускать регулятор
+        digital_5.write(1);                                                     //valve3,4 открыты - подключаемся к контуру охлаждения макета
         //--------------regulator begin-----------------------
         if (sensor_value > value + delta_value) {
           valve2 = digital_7.read();
@@ -268,10 +349,10 @@
         countValve2=0;
       }
       
-      if (flag_plotter == 1) {
-        plotter.printf("$%d %d %d %d %d %d;\r\n", digital_4.read()*100-110,
-        digital_7.read()*100-220, value, sensor_value, 100*frequencyValve1, 100*frequencyValve2 );   //печать в плоттер в другой СОМ-порт (только для отладки)   
-      }
+     // if (flag_plotter == 1) {
+     //   plotter.printf("$%d %d %d %d %d %d;\r\n", digital_4.read()*100-110,
+     //   digital_7.read()*100-220, value, sensor_value, 100*frequencyValve1, 100*frequencyValve2 );   //печать в плоттер в другой СОМ-порт (только для отладки)   
+     // }
     
       auto_set();                                                  //Ступенчатое увеличение и уменьшение уставки value (для отладки если flag_autoset =1)
       led = !led;                                                               //гасим/зажигаем индикаторный светодиод