Alex K
/
mbed-os5-press_23
On the i2c bus, Arduino Nano with address 2, transmits the weight value with a resolution of 1 kg.
Diff: main.cpp
- Revision:
- 7:97881cd71b31
- Parent:
- 6:fe0a7180ebb7
- Child:
- 8:bf73cc68a823
diff -r fe0a7180ebb7 -r 97881cd71b31 main.cpp --- 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 {