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

Dependencies:   _24LCXXX

Revision:
5:bb595cde0c82
Parent:
4:c34b84bfa2fb
Child:
6:fe0a7180ebb7
--- a/main.cpp	Wed May 27 16:01:15 2020 +0000
+++ b/main.cpp	Thu Jun 04 22:55:40 2020 +0000
@@ -1,5 +1,9 @@
-// 27.05.2020 Продолжение (клон )mbed-os5-press4
-// включены все шесть аналоговых входа, читаются пять
+// 05.06.2020 Продолжение (клон )mbed-os5-press6
+// Принимается флаг от кнопки Стоп - полной остановки регулятора - закрытие всех 4-х клапанов и передача статуса кнопки в программу оператора
+// Принимается флаг от кнопок включения - выключения компрессора, - идет команда на дискретный выход digital_6(PB_10)
+// Принимается новая уставка num_chan - переключение номера  активного измерительного канала для обратной связи регулятора. 
+// Эта уставка, как и все остальные,  пишется в EEPROM.
+// Включены все шесть аналоговых входа, читаются пять
 // при получении командной строки с нулевой суммой, по новому флагу flag_zerostart, передаётся в сериал текущие уставки и величины
 // (важно для старта программы на PC), эти нулевые уставки не вводятся в регулятор и не записываются в EEPROM.
 // сторожевой таймер,  истекает через 100мс
@@ -28,10 +32,12 @@
 EventQueue *queue = mbed_event_queue();                                         //инициализация очереди событий RTOS mbed5
 Timer timer;                                                                    //инициализация таймера
 //========УСТАВКИ========
-uint8_t flag_autoset = 0;                                                       //отладочный флаг. При 0 - запрет автоуставки давления, при 1 - разрешение
+uint8_t delta_value = 0;                                                        //set delta pressure 1...99
+uint8_t flag_autoset = 0;                                                       //флаг компрессора. При 0 - выключение компрессора, при 1 - включение компрессора
 uint8_t flag_plotter = 0;                                                       //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов
+uint8_t num_chan = 1;                                                           //set номер аналогового канала 0...5 (1-as default = Pa)
 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 WL = 0;                                                                     //напряжение с аналогового входа А0 (WL - вес опресовщика)
@@ -44,9 +50,9 @@
 int counter_cycle2 = 0;                                                         //счётчик внутри функции auto_set
 int sig = 1;                                                                    //знак инкримента для автоустаки
 //                       FIFO_buffer must be full (only char  and '\0') 
-//#define maxnsym 24                                                             // maximum nbr of symbols FIFO_buffer (вариант без символов окончания)
-#define maxnsym 26                                     // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче)
-char Source[maxnsym]="$press,1000,25,0,0,2050**";      //23 char- string ,весь массив со строкой для поиска 23+1(null terminal)=24 
+//#define maxnsym 26                                                             // maximum nbr of symbols FIFO_buffer (вариант без символов окончания)
+#define maxnsym 28                                     // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче)
+char Source[maxnsym]="$press,1000,25,0,0,1,2050**";      //25 char- string ,весь массив со строкой для поиска 25+1(null terminal)=26 
                                                       //уставки и контрольная сумма умноженная на два, должны быть больше нуля  
 char trueSource[maxnsym];                             //верифицированная строка для callback
 char trueSourceOld[maxnsym];                          //предыдущая верифицированная строка для callback
@@ -62,6 +68,7 @@
     eeprom.byte_write(0, delta_value);
     eeprom.byte_write(1, flag_autoset);
     eeprom.byte_write(2, flag_plotter);
+    eeprom.byte_write(3, num_chan);
     data2 = value;
     eeprom.nbyte_write( 10, &data2, sizeof(int));
 }
@@ -79,6 +86,9 @@
     eeprom.nbyte_read( 2, &data1, 1 );
     plotter.printf("adress 2  =%d \r\n",data1);
     flag_plotter=data1;
+    eeprom.nbyte_read( 3, &data1, 1 );
+    plotter.printf("adress 3  =%d \r\n",data1);
+    num_chan=data1;
     eeprom.nbyte_read( 10, &data2, sizeof(int) );
     plotter.printf("adress 10  = %d \r\n",data2);
     value=data2;
@@ -103,7 +113,7 @@
   char Destination[50];
   int pos,len;
   int controlSum1, controlSum2;
-  int value_, delta_value_, flag_autoset_, flag_plotter_;
+  int value_, delta_value_, flag_autoset_, flag_plotter_, num_chan_;
   int ch = '$';    // Код искомого символа
   int indexCh;       // Char on position
   char *ach;       // Указатель на искомую переменную в строке, по которой осуществляется поиск.
@@ -168,16 +178,24 @@
     substring(Source,Destination,pos,len);
     flag_plotter_=atoi(Destination);
     //pc.printf("for pos=%d and  len=%d  resultat is  d= %s atoi=%d\r\n", pos, len, Destination, flag_plotter_);
-    pos=20;  //начало подстроки 1025 - на 18 позиции
+    
+    pos=20;  //начало подстроки 1 - на 20 позиции
+    len=1;   //длина подстроки 1 равна 1
+    substring(Source,Destination,pos,len);
+    num_chan_=atoi(Destination);
+    //pc.printf("for pos=%d and  len=%d  resultat is  d= %s atoi=%d\r\n", pos, len, Destination, num_chan_);
+    
+    pos=22;  //начало подстроки 1025 - на 22 позиции
     len=4;   //длина подстроки 1025 равна 4
     substring(Source,Destination,pos,len);
     controlSum1=atoi(Destination);
-    if (controlSum1==0) {
-      flag_zerostart = true;    //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
-      goto endParsing;           //контрольная сумма должна быть больше еденицы, пропускаем парсинг
+    if (controlSum1==2) {
+      flag_zerostart = true;       //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
+      flag_autoset=flag_autoset_;  //здесь можно включать-выключать компрессор, но без записи в EEPROM
+      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;            //удвоение чтобы не было одинаковых чисел в сообщении
+    controlSum2=(value_+delta_value_+flag_autoset_+flag_plotter_+num_chan_)*2;            //удвоение чтобы не было одинаковых чисел в сообщении
     //pc.printf("controlSum1=%d   controlSum2=%d\r\n", controlSum1, controlSum2);
     if (controlSum1!=controlSum2) {                                             //не совпала контрольная сумма
       //pc.printf ("controlSum1!=controlSum2 \r\n");
@@ -192,7 +210,8 @@
       value=value_;
       delta_value=delta_value_;
       flag_autoset=flag_autoset_;
-      flag_plotter=flag_plotter_;  
+      flag_plotter=flag_plotter_;
+      num_chan=num_chan_;  
     }      
     
     flag_comand_detected=true;        //если флаг true, то всем переменным  присвоены новые значения уставок
@@ -208,16 +227,10 @@
     queue->call(read_serial);                                                   // process in a non ISR context - переход к функции приема строки -
 }                                                                               // - в статусе отключенного прерывания (учим указатели!)
 //______________________________________________________________________________
-void auto_set () {
-    if (counter_cycle2 >= 100 && flag_autoset == 1) {
-      counter_cycle2=0;
-      if (value_auto > 2800 || value_auto < 250) {
-        sig = -sig;                                                             //меняем знак для изменения направления роста/спада автоуставки
-      } 
-       value_auto = value_auto + sig * 250;
-       value=value_auto;     
-    }  
-  counter_cycle2++;                                                             //увеличиваем счетчик функции auto_set() на 1
+void auto_set () {                                                              //подпрограмма управления компрессором
+    
+    digital_6.write(flag_autoset);                                              //включение-выкючение компрессора   
+ 
 }
 //*****************************************************************************
 //***************************************************************************** 
@@ -225,14 +238,15 @@
 int main() {
     
     pc.attach(&onDataReceived, Serial::RxIrq);
-    int time, valve1, valve2, countValve1=0, countValve2=0;
+    int time, 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;
     digital_7.write(0);                                                         //valve2  off;    
-    digital_5.write(0);                                                         //valve3,4  off;                                      
+    digital_5.write(0);                                                         //valve3,4  off; 
+    digital_6.write(0);                                                         //выключение компрессора
     load_EEPROM ();                                                             //загрузка уставок из EEPROM
-    if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2) {
+    if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2 && num_chan < 6) {
       flag_stopRegulator=false;                                                 //уставки из EEPROM похожи на правду, разрешаем работу регулятора 
     } else {
       flag_stopRegulator = true;                                                //флаг остановки установлен 
@@ -253,14 +267,15 @@
       digital_4.write(0);                                                       //valve1  off
       digital_7.write(0);                                                       //valve2  off
       digital_5.write(0);                                                       //valve3,4 off
+      //digital_6.write(0);                                                       //выключение компрессора
     }
     
     if (flag_comand_detected) {                                                 //пришла правильная командная строка
-      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+      pc.printf("$press,%d,%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());                                     //передача текущих значений в РС
+        digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read());        //передача текущих значений в РС
         
     //    pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n",
     //    value,delta_value,flag_autoset,flag_plotter,
@@ -280,11 +295,11 @@
     }
     
     if (flag_zerostart) {                                            //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске)
-      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+      pc.printf("$press,%d,%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());                                     //передача текущих значений в РС  
+        digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read());        //передача текущих значений в РС  
         flag_zerostart = false;
     }   
     
@@ -316,20 +331,24 @@
       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  с усреднением
+      Pw2 = raw_value_sum_4/10 * 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 (num_chan == 1) {temp_valueSensor = sensor_value;}                     //теперь источник сигнала для регулятора - канал 1
+      if (num_chan == 3) {temp_valueSensor = Pw1;}                              //теперь источник сигнала для регулятора - канал 3
+      if (num_chan == 4) {temp_valueSensor = Pw2;}                              //теперь источник сигнала для регулятора - канал 4
+      
       if (flag_stopRegulator == false) {                                        // можно запускать регулятор
         digital_5.write(1);                                                     //valve3,4 открыты - подключаемся к контуру охлаждения макета
         //--------------regulator begin-----------------------
-        if (sensor_value > value + delta_value) {
+        if (temp_valueSensor > value + delta_value) {
           valve2 = digital_7.read();
           digital_7.write(1);                                                     //valve2  on;
           if (valve2 < digital_7.read()) {countValve2++;}                         //счётчик передних фронтов напряжения (срабатывания клапана 2)
           digital_4.write(0);                                                     //valve1  off;
-        } else  if (sensor_value < value - delta_value) {
+        } else  if (temp_valueSensor < value - delta_value) {
           valve1 = digital_4.read();
           digital_4.write(1);                                                     //valve1  on;
           if (valve1 < digital_4.read()) {countValve1++;}                         //счётчик передних фронтов напряжения (срабатывания клапана 1)
@@ -349,12 +368,7 @@
         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 );   //печать в плоттер в другой СОМ-порт (только для отладки)   
-     // }
-    
-      auto_set();                                                  //Ступенчатое увеличение и уменьшение уставки value (для отладки если flag_autoset =1)
+      auto_set();                                                               //включение-выкючение компрессора  через flag_autoset
       led = !led;                                                               //гасим/зажигаем индикаторный светодиод
     } 
     ThisThread::sleep_for(1);                                                   // (mc) правильный оператор задержки для mbed5