When receiving a command line with a zero sum (empty lines), the flag_zerostart flag is set, and the current settings and values are transferred to the series. These zero settings are not entered into the controller and are not written to the EEPROM.

Dependencies:   _24LCXXX

Files at this revision

API Documentation at this revision

Comitter:
Aleksk
Date:
Wed May 27 16:01:15 2020 +0000
Parent:
3:712f751b4974
Commit message:
When receiving a command line with a zero sum (empty lines), the flag_zerostart flag is set, and the current settings and values are transferred to the series. These zero settings are not entered into the controller and are not written to the EEPROM.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- 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;                                                               //гасим/зажигаем индикаторный светодиод