On the i2c bus, Arduino Nano with address 2, transmits the weight value with a resolution of 1 kg.

Dependencies:   _24LCXXX

Revision:
7:97881cd71b31
Parent:
6:fe0a7180ebb7
Child:
8:bf73cc68a823
--- a/main.cpp	Thu Jun 11 20:22:11 2020 +0000
+++ b/main.cpp	Fri Jun 19 10:33:01 2020 +0000
@@ -1,5 +1,6 @@
-// 11.06.2020 Продолжение (клон )mbed-os5-press9
-// Сделан дополнительный блок в парсере для декодирования приходящих аварийных уставок для EEPROM
+// 19.06.2020 Продолжение (клон )mbed-os5-press12
+// значения уставок EEPROM2  выводяться в pc.print в специальной строке с текущими данными диагностики
+// Сделан дополнительный блок в парсере для декодирования приходящих аварийных уставок, они пишутся в  EEPROM2
 // Сделан timer_2 для отсчёта времени открытого состояния вентиля 1
 // Сделан timer_3 для отсчёта времени открытого состояния вентиля 2
 // Подключены цифровые входы D11,D12,D13. Реализованы условия остановки по 10 аварийным событиям.
@@ -33,7 +34,7 @@
 DigitalOut digital_6(PB_10);                                                    //initialize digital pin 6 as an output (compressor on/off)
 DigitalIn idigital_11(PA_7);                                                     //initialize digital pin 11 as an input концевик при растяжении сильфона
 DigitalIn idigital_12(PA_6);                                                     //initialize digital pin 12 as an input концевик при сжатии сильфона
-DigitalIn idigital_13(PA_5);                                                     //initialize digital pin 12 as an input внутрь опрессовщика попала вода 
+DigitalIn idigital_13(PA_5);                                                     //initialize digital pin 13 as an input внутрь опрессовщика попала вода 
 
 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
@@ -56,6 +57,7 @@
 int T_1 = 4000;                                                                 // ms, максимальное время открытого состояния для клапана 1 
 int T_2 = 4000;                                                                 // ms, максимальное время открытого состояния для клапана 2 
 uint8_t event_N = 255;                                                          // номер события , по умолчанию 255 - событий нет
+uint8_t flag_stopRegulatorEEPROM = 0;                                           //если 1 остановка регулятора, когда вручную управляют клапанами через программу SetUp_EEPROM
 //======temporary set=====
 int numSet, anySet;
 //=================================
@@ -96,6 +98,46 @@
     data2 = value;
     eeprom.nbyte_write( 10, &data2, sizeof(int));
 }
+void save_EEPROM2 () {
+    int data2;
+    plotter.printf("EEPROM2 write------\r\n"); 
+   eeprom.nbyte_read( 100, &data2, sizeof(int) );    
+   if (data2 != Pd_eeprom) {                                                    //записываем в eeprom только изменившиеся значения (одна из семи уставок) 
+     data2 = Pd_eeprom;
+     eeprom.nbyte_write( 100, &data2, sizeof(int));
+   }
+   eeprom.nbyte_read( 110, &data2, sizeof(int) );
+   if (data2 != frequencyValve1_eeprom){
+     data2 = frequencyValve1_eeprom;
+     eeprom.nbyte_write( 110, &data2, sizeof(int));
+   }
+   eeprom.nbyte_read( 120, &data2, sizeof(int) );
+   if (data2 != frequencyValve2_eeprom){
+     data2 = frequencyValve2_eeprom;
+     eeprom.nbyte_write( 120, &data2, sizeof(int));
+   }
+   eeprom.nbyte_read( 130, &data2, sizeof(int) );
+   if (data2 != WL01_eeprom){
+     data2 = WL01_eeprom;
+     eeprom.nbyte_write( 130, &data2, sizeof(int));
+   }
+   eeprom.nbyte_read( 140, &data2, sizeof(int) );
+   if (data2 != WL99_eeprom){
+     data2 = WL99_eeprom;
+     eeprom.nbyte_write( 140, &data2, sizeof(int));
+   }
+   eeprom.nbyte_read( 180, &data2, sizeof(int) );
+   if (data2 != T_1){
+     data2 = T_1;
+     eeprom.nbyte_write( 180, &data2, sizeof(int));
+   }
+   eeprom.nbyte_read( 190, &data2, sizeof(int) );
+   if (data2 != T_2){
+     data2 = T_2;
+     eeprom.nbyte_write( 190, &data2, sizeof(int));
+   }
+   
+}
 //_____________________________________________________________________________
 void load_EEPROM () {
     uint8_t data1;
@@ -117,6 +159,32 @@
     plotter.printf("adress 10  = %d \r\n",data2);
     value=data2;
     }
+void load_EEPROM2 () {
+    int data2;
+    plotter.printf("EEPROM2 read------\r\n");
+    eeprom.nbyte_read( 100, &data2, sizeof(int) );
+    //pc.printf("$adress,100,%d,*\r\n",data2);
+    Pd_eeprom=data2;
+    eeprom.nbyte_read( 110, &data2, sizeof(int) );
+    //pc.printf("$adress,110,%d,*\r\n",data2);
+    frequencyValve1_eeprom=data2;
+    eeprom.nbyte_read( 120, &data2, sizeof(int) );
+    //pc.printf("$adress,120,%d,*\r\n",data2);
+    frequencyValve2_eeprom=data2;
+    eeprom.nbyte_read( 130, &data2, sizeof(int) );
+    //pc.printf("$adress,130,%d,*\r\n",data2);
+    WL01_eeprom=data2;
+    eeprom.nbyte_read( 140, &data2, sizeof(int) );
+    //pc.printf("$adress,140,%d,*\r\n",data2);
+    WL99_eeprom=data2;
+    eeprom.nbyte_read( 180, &data2, sizeof(int) );
+    //pc.printf("$adress,180,%d,*\r\n",data2);
+    T_1=data2;
+    eeprom.nbyte_read( 190, &data2, sizeof(int) );
+    //pc.printf("$adress,190,%d,*\r\n",data2);
+    T_2=data2;
+    //pc.printf("$adress,%d,%d,%d,%d,%d,%d,%d,*\r\n",Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2);
+    }
 //______________________________________________________________________________
 void substring(char *s,char *d,int pos,int len) {
 //usage: substring(Source,Destination,pos,len);
@@ -239,7 +307,7 @@
       flag_stopRegulator=flag_stopRegulator_;
       num_chan=num_chan_;  
     }      
-    
+    flag_stopRegulatorEEPROM = 0;                                               //флаг остановки только релейного  регулятора (теперь регулятор управляет клапанами!)
     flag_comand_detected=true;        //если флаг true, то всем переменным  присвоены новые значения уставок
  goto endParsing ;                    //завершение блока приема рабочих уставок для работяющего релейного регулятора  
 
@@ -274,21 +342,39 @@
       numSet=numSet_;
       anySet=anySet_;  
     }      
+    //При первом входе в режим $setup из режима $press - Закрываются все клапана
+    if (flag_stopRegulatorEEPROM == 0) {
+      digital_4.write(0);                                                       //valve1  off
+      digital_7.write(0);                                                       //valve2  off
+      digital_5.write(0);                                                       //valve3,4 off
+      digital_6.write(0);                                                       //выключение компрессора
+    }
     
     switch ( numSet ) {
         case 1:            // это двоеточие
-            
+            digital_4.write(anySet);                                            //valve1
             plotter.printf("1 Valve1=%d\r\n",anySet);
             break;
         case 2:
+            digital_7.write(anySet);                                            //valve2
             plotter.printf("2 Valve2=%d\r\n",anySet);
             break;
         case 3:
+            digital_5.write(anySet);                                            //valve3,4
             plotter.printf("3 Valve3,4=%d\r\n",anySet);
             break;
         case 4:
+            digital_6.write(anySet);                                            //компрессор
             plotter.printf("4 Compressor=%d\r\n",anySet );
             break;
+        case 9:
+            if (anySet == 0) {
+              flag_stopRegulator=0;
+              pc.printf("Reset ALARM \r\n");
+            } else {
+              flag_stopRegulator = 1;       
+            }  
+            break;  
         case 10:
             Pd_eeprom = anySet;
             plotter.printf( "10 Pd_eeprom=%d\r\n",anySet );
@@ -321,14 +407,8 @@
             plotter.printf( "Wrong case.\r\n" );
     } 
  
-
-
-
-
-
-
-    
-    flag_comand2_detected=true;        //если флаг true, то всем переменным  присвоены новые значения уставок
+    flag_stopRegulatorEEPROM = 1;                                               //флаг остановки только релейного  регулятора (теперь оператор вручную управляет клапанами!)  
+    flag_comand2_detected=true;                                                 //если флаг true, то всем переменным  присвоены новые значения уставок
   //========Конец блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM ===================
  
  endParsing:   
@@ -344,11 +424,12 @@
 //______________________________________________________________________________
 void auto_set () {                                                              //подпрограмма управления компрессором
     
-    digital_6.write(flag_compressor);                                              //включение-выкючение компрессора   
- 
+    if (flag_stopRegulatorEEPROM == 0) {
+      digital_6.write(flag_compressor);                                              //включение-выкючение компрессора   
+    }
 }
-//*****************************************************************************
-//***************************************************************************** 
+//******************************************************************************************************************
+//****************************************************************************************************************** 
 
 int main() {
     
@@ -361,16 +442,17 @@
     digital_5.write(0);                                                         //valve3,4  off; 
     digital_6.write(0);                                                         //выключение компрессора
     load_EEPROM ();                                                             //загрузка уставок из EEPROM
+    load_EEPROM2 ();                                                            //загрузка граничных уставок (аварийных событий)из EEPROM2
     if (value >= 1 && delta_value >= 1 && flag_compressor < 2 && flag_stopRegulator < 2 && num_chan < 6) {
-      flag_stopRegulator=false;                                                 //уставки из EEPROM похожи на правду, разрешаем работу регулятора 
+      flag_stopRegulator=0;                                                     //уставки из EEPROM похожи на правду, разрешаем работу регулятора 
     } else {
-      flag_stopRegulator = true;                                                //флаг остановки установлен 
+      flag_stopRegulator = 1;                                                   //флаг остановки установлен 
       pc.printf("Regulator stopped, error in EEPROM \r\n");       
     }
       
     pc.printf("Program started \r\n");
     Watchdog &watchdog = Watchdog::get_instance();
-    watchdog.start(100);                         //WDlimit = 100  ms
+    watchdog.start(100);                                                        //WDlimit = 100  ms 
     timer.start();
     timer_2.start();
     timer_3.start();
@@ -395,16 +477,10 @@
         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());        //передача текущих значений в РС
-        
-    //    pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n",
-    //    value,delta_value,flag_compressor,flag_stopRegulator,
-    //    sensor_value,frequencyValve1,frequencyValve2);                                     //передача текущих значений в РС
-        
+             
       //pc.printf("%s\r\n",trueSource);                                         //эхо для отладки канала связи
       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) {                              //функция возвращает ноль если командные строки совпадают
         save_EEPROM ();                                                         //пишем в память уставки отличные от старых
         load_EEPROM ();
@@ -413,6 +489,25 @@
       strcpy(trueSourceOld,trueSource);        //копировать из trueSource в trueSourceOld 
     }
     
+    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",
+        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
+      flag_comand2_detected = false;                                            //в последующих обращениях не печатать пока нет нового сообщения из СОМ-порта
+      
+      if (strcmp(trueSource2Old,trueSource2) != 0 && numSet >= 10) {            //функция возвращает ноль если командные строки совпадают
+      
+        save_EEPROM2 ();                                                        //пишем в память все уставки от SetUp_EEPROM если хоть одна изменилась
+        load_EEPROM2 ();
+      }
+    strcpy(trueSource2Old,trueSource2);        //копировать из trueSource2 в trueSource2Old 
+    //pc.printf("$adress,%d,%d,%d,%d,%d,%d,%d,*\r\n",Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2);
+    }
+    
     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",
         value,delta_value,flag_compressor,flag_stopRegulator,
@@ -460,8 +555,8 @@
       if (num_chan == 3) {temp_valueSensor = Pw1;}                              //теперь источник сигнала для регулятора - канал 3
       if (num_chan == 4) {temp_valueSensor = Pw2;}                              //теперь источник сигнала для регулятора - канал 4
       
-      if (flag_stopRegulator == 0 && event_N == 255) {                          // можно запускать регулятор
-        digital_5.write(1);                                                     //valve3,4 открыты - подключаемся к контуру охлаждения макета
+      if (flag_stopRegulator == 0 && event_N == 255 && flag_stopRegulatorEEPROM == 0) {                          // можно запускать регулятор
+        digital_5.write(1);                                                                //valve3,4 открыты - подключаемся к контуру охлаждения макета
         //--------------regulator begin-----------------------
         if (temp_valueSensor > value + delta_value) {
           valve2 = digital_7.read();
@@ -503,18 +598,18 @@
        if (WL >= WL99_eeprom) {
              event_N = 4;
        }
-       if (idigital_11.read()==1) {
+       if (idigital_11.read()==0) {
              event_N = 5;
        }
-       if (idigital_12.read()==1) {
+       if (idigital_12.read()==0) {
              event_N = 6;
        }
-       if (idigital_13.read()==1) {
+       if (idigital_13.read()==0) {
              event_N = 7;
        }
       
       //-----------------Valve1 open time----------------------
-        if (digital_4.read() == 0) {
+        if (digital_4.read() == 0 || flag_stopRegulatorEEPROM == 1 ) {          // для режима $setup отключаем счёт времени
             timer_2.reset(); 
             time_2 = 0;
         } else {
@@ -524,7 +619,7 @@
              event_N = 8;
         }
      //-----------------Valve2 open time----------------------
-        if (digital_7.read() == 0) {
+        if (digital_7.read() == 0 || flag_stopRegulatorEEPROM == 1) {           // для режима $setup отключаем счёт времен
             timer_3.reset();
             time_3 = 0;
         } else {