Removed pc.printf command that sends empty string once per second and associated timer_4, since the operator program was changed, a new operator Loc () was introduced into it. Instead of pc.printf ("Reset ALARM \ r \ n") now plotter.printf ("Reset ALARM \ r \ n").

Dependencies:   _24LCXXX

Committer:
Aleksk
Date:
Thu Jun 04 22:55:40 2020 +0000
Revision:
5:bb595cde0c82
Parent:
4:c34b84bfa2fb
Child:
6:fe0a7180ebb7
The flag of the Stop button is accepted - closing of 4 valves,;   and the flag of the compressor buttons is a command for discrete output PB_10. The num_chan setting is switching the channel number for the feedback of the controller, written in EEPROM

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Aleksk 5:bb595cde0c82 1 // 05.06.2020 Продолжение (клон )mbed-os5-press6
Aleksk 5:bb595cde0c82 2 // Принимается флаг от кнопки Стоп - полной остановки регулятора - закрытие всех 4-х клапанов и передача статуса кнопки в программу оператора
Aleksk 5:bb595cde0c82 3 // Принимается флаг от кнопок включения - выключения компрессора, - идет команда на дискретный выход digital_6(PB_10)
Aleksk 5:bb595cde0c82 4 // Принимается новая уставка num_chan - переключение номера активного измерительного канала для обратной связи регулятора.
Aleksk 5:bb595cde0c82 5 // Эта уставка, как и все остальные, пишется в EEPROM.
Aleksk 5:bb595cde0c82 6 // Включены все шесть аналоговых входа, читаются пять
Aleksk 4:c34b84bfa2fb 7 // при получении командной строки с нулевой суммой, по новому флагу flag_zerostart, передаётся в сериал текущие уставки и величины
Aleksk 4:c34b84bfa2fb 8 // (важно для старта программы на PC), эти нулевые уставки не вводятся в регулятор и не записываются в EEPROM.
Aleksk 4:c34b84bfa2fb 9 // сторожевой таймер, истекает через 100мс
Aleksk 4:c34b84bfa2fb 10 //
Aleksk 4:c34b84bfa2fb 11
Aleksk 0:f2aaa8c6decf 12 #include "mbed.h"
Aleksk 2:8230a5a4cc13 13 #include "_24LCXXX.h"
Aleksk 2:8230a5a4cc13 14
Aleksk 2:8230a5a4cc13 15 I2C i2c(PB_9,PB_8); // sda, scl
Aleksk 2:8230a5a4cc13 16 _24LCXXX eeprom(&i2c, 0x50);
Aleksk 0:f2aaa8c6decf 17
Aleksk 4:c34b84bfa2fb 18 AnalogIn analog_value_0(A0); //подключение аналогового входа A0
Aleksk 4:c34b84bfa2fb 19 AnalogIn analog_value_1(A1); //подключение аналогового входа A1
Aleksk 4:c34b84bfa2fb 20 AnalogIn analog_value_2(A2); //подключение аналогового входа A2
Aleksk 4:c34b84bfa2fb 21 AnalogIn analog_value_3(A3); //подключение аналогового входа A3
Aleksk 4:c34b84bfa2fb 22 AnalogIn analog_value_4(A4); //подключение аналогового входа A4
Aleksk 4:c34b84bfa2fb 23 AnalogIn analog_value_5(A5); //подключение аналогового входа A5
Aleksk 0:f2aaa8c6decf 24 DigitalOut led(LED1);
Aleksk 0:f2aaa8c6decf 25 DigitalOut digital_4(PB_5); //initialize digital pin 4 as an output (high pressure air bulb charge).
Aleksk 4:c34b84bfa2fb 26 DigitalOut digital_7(PA_8); //initialize digital pin 7 as an output. (high pressure air bulb discharge)
Aleksk 4:c34b84bfa2fb 27 DigitalOut digital_5(PB_4); //initialize digital pin 5 as an output (valve3,4)
Aleksk 4:c34b84bfa2fb 28 DigitalOut digital_6(PB_10); //initialize digital pin 6 as an output (compressor on/off)
Aleksk 4:c34b84bfa2fb 29
Aleksk 4:c34b84bfa2fb 30 RawSerial plotter(USBTX, USBRX, 115200); // tx, rx for F411RE port for serial_plotter and temporary messages
Aleksk 4:c34b84bfa2fb 31 RawSerial pc(PA_9, PA_10, 115200); // tx, rx for F411RE port for command string distance PC
Aleksk 0:f2aaa8c6decf 32 EventQueue *queue = mbed_event_queue(); //инициализация очереди событий RTOS mbed5
Aleksk 0:f2aaa8c6decf 33 Timer timer; //инициализация таймера
Aleksk 2:8230a5a4cc13 34 //========УСТАВКИ========
Aleksk 5:bb595cde0c82 35 uint8_t delta_value = 0; //set delta pressure 1...99
Aleksk 5:bb595cde0c82 36 uint8_t flag_autoset = 0; //флаг компрессора. При 0 - выключение компрессора, при 1 - включение компрессора
Aleksk 4:c34b84bfa2fb 37 uint8_t flag_plotter = 0; //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов
Aleksk 5:bb595cde0c82 38 uint8_t num_chan = 1; //set номер аналогового канала 0...5 (1-as default = Pa)
Aleksk 4:c34b84bfa2fb 39 int value = 0; //set begin value "pressure" 1...3300
Aleksk 5:bb595cde0c82 40
Aleksk 2:8230a5a4cc13 41 //=======================
Aleksk 0:f2aaa8c6decf 42 int value_auto=250 ; //set begin value auto "pressure"
Aleksk 4:c34b84bfa2fb 43 int WL = 0; //напряжение с аналогового входа А0 (WL - вес опресовщика)
Aleksk 4:c34b84bfa2fb 44 int sensor_value =0; //напряжение с аналогового входа А1 (Pa - текущее давление)
Aleksk 4:c34b84bfa2fb 45 int Pb = 0; //напряжение с аналогового входа А2 (Pb - давление в баллоне)
Aleksk 4:c34b84bfa2fb 46 int Pw1 = 0; //напряжение с аналогового входа А3 (Pw1 - давление воды на входе опрессовщика)
Aleksk 4:c34b84bfa2fb 47 int Pw2 = 0; //напряжение с аналогового входа А4 (Pw2 - давление воды в контуре макета)
Aleksk 4:c34b84bfa2fb 48 int Pd = 0; //напряжение с аналогового входа А5 (Pd - дифференциальное давление опресовщика)
Aleksk 2:8230a5a4cc13 49 int counter_cycle1 = 0; //счётчик цикла while(true)
Aleksk 2:8230a5a4cc13 50 int counter_cycle2 = 0; //счётчик внутри функции auto_set
Aleksk 0:f2aaa8c6decf 51 int sig = 1; //знак инкримента для автоустаки
Aleksk 0:f2aaa8c6decf 52 // FIFO_buffer must be full (only char and '\0')
Aleksk 5:bb595cde0c82 53 //#define maxnsym 26 // maximum nbr of symbols FIFO_buffer (вариант без символов окончания)
Aleksk 5:bb595cde0c82 54 #define maxnsym 28 // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче)
Aleksk 5:bb595cde0c82 55 char Source[maxnsym]="$press,1000,25,0,0,1,2050**"; //25 char- string ,весь массив со строкой для поиска 25+1(null terminal)=26
Aleksk 0:f2aaa8c6decf 56 //уставки и контрольная сумма умноженная на два, должны быть больше нуля
Aleksk 0:f2aaa8c6decf 57 char trueSource[maxnsym]; //верифицированная строка для callback
Aleksk 2:8230a5a4cc13 58 char trueSourceOld[maxnsym]; //предыдущая верифицированная строка для callback
Aleksk 0:f2aaa8c6decf 59
Aleksk 4:c34b84bfa2fb 60 volatile char chr_a; //в прерываниях переменные должны быть защищены при помощи volatile от оптимизации компилятором
Aleksk 4:c34b84bfa2fb 61 volatile bool flag_comand_detected = false; //если строка декодирована правильно то true
Aleksk 4:c34b84bfa2fb 62 volatile bool flag_zerostart = false; //если строка декодирована c нулевой контрольной суммой то true
Aleksk 2:8230a5a4cc13 63 volatile bool flag_stopRegulator = true; //флаг остановки , закрыть все клапана
Aleksk 2:8230a5a4cc13 64 //_____________________________________________________________________________
Aleksk 2:8230a5a4cc13 65 void save_EEPROM () {
Aleksk 2:8230a5a4cc13 66 int data2;
Aleksk 4:c34b84bfa2fb 67 plotter.printf("EEPROM write------\r\n");
Aleksk 2:8230a5a4cc13 68 eeprom.byte_write(0, delta_value);
Aleksk 2:8230a5a4cc13 69 eeprom.byte_write(1, flag_autoset);
Aleksk 2:8230a5a4cc13 70 eeprom.byte_write(2, flag_plotter);
Aleksk 5:bb595cde0c82 71 eeprom.byte_write(3, num_chan);
Aleksk 2:8230a5a4cc13 72 data2 = value;
Aleksk 2:8230a5a4cc13 73 eeprom.nbyte_write( 10, &data2, sizeof(int));
Aleksk 2:8230a5a4cc13 74 }
Aleksk 2:8230a5a4cc13 75 //_____________________________________________________________________________
Aleksk 2:8230a5a4cc13 76 void load_EEPROM () {
Aleksk 2:8230a5a4cc13 77 uint8_t data1;
Aleksk 2:8230a5a4cc13 78 int data2;
Aleksk 4:c34b84bfa2fb 79 plotter.printf("EEPROM read------\r\n");
Aleksk 2:8230a5a4cc13 80 eeprom.nbyte_read( 0, &data1, 1 );
Aleksk 4:c34b84bfa2fb 81 plotter.printf("adress 0 =%d \r\n",data1);
Aleksk 2:8230a5a4cc13 82 delta_value=data1;
Aleksk 2:8230a5a4cc13 83 eeprom.nbyte_read( 1, &data1, 1 );
Aleksk 4:c34b84bfa2fb 84 plotter.printf("adress 1 =%d \r\n",data1);
Aleksk 2:8230a5a4cc13 85 flag_autoset=data1;
Aleksk 2:8230a5a4cc13 86 eeprom.nbyte_read( 2, &data1, 1 );
Aleksk 4:c34b84bfa2fb 87 plotter.printf("adress 2 =%d \r\n",data1);
Aleksk 2:8230a5a4cc13 88 flag_plotter=data1;
Aleksk 5:bb595cde0c82 89 eeprom.nbyte_read( 3, &data1, 1 );
Aleksk 5:bb595cde0c82 90 plotter.printf("adress 3 =%d \r\n",data1);
Aleksk 5:bb595cde0c82 91 num_chan=data1;
Aleksk 2:8230a5a4cc13 92 eeprom.nbyte_read( 10, &data2, sizeof(int) );
Aleksk 4:c34b84bfa2fb 93 plotter.printf("adress 10 = %d \r\n",data2);
Aleksk 2:8230a5a4cc13 94 value=data2;
Aleksk 2:8230a5a4cc13 95 }
Aleksk 0:f2aaa8c6decf 96 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 97 void substring(char *s,char *d,int pos,int len) {
Aleksk 0:f2aaa8c6decf 98 //usage: substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 99 char *t;
Aleksk 0:f2aaa8c6decf 100 s=s+(pos-1);
Aleksk 0:f2aaa8c6decf 101 t=s+len;
Aleksk 0:f2aaa8c6decf 102 while (s!=t) {
Aleksk 0:f2aaa8c6decf 103 *d=*s;
Aleksk 0:f2aaa8c6decf 104 s++;
Aleksk 0:f2aaa8c6decf 105 d++;
Aleksk 0:f2aaa8c6decf 106 }
Aleksk 0:f2aaa8c6decf 107 *d='\0';
Aleksk 0:f2aaa8c6decf 108 }
Aleksk 0:f2aaa8c6decf 109 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 110 void onDataReceived(); // callback
Aleksk 0:f2aaa8c6decf 111 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 112 void read_serial(void) {
Aleksk 0:f2aaa8c6decf 113 char Destination[50];
Aleksk 0:f2aaa8c6decf 114 int pos,len;
Aleksk 0:f2aaa8c6decf 115 int controlSum1, controlSum2;
Aleksk 5:bb595cde0c82 116 int value_, delta_value_, flag_autoset_, flag_plotter_, num_chan_;
Aleksk 0:f2aaa8c6decf 117 int ch = '$'; // Код искомого символа
Aleksk 0:f2aaa8c6decf 118 int indexCh; // Char on position
Aleksk 0:f2aaa8c6decf 119 char *ach; // Указатель на искомую переменную в строке, по которой осуществляется поиск.
Aleksk 0:f2aaa8c6decf 120 while(pc.readable()) {
Aleksk 0:f2aaa8c6decf 121 chr_a = pc.getc();
Aleksk 0:f2aaa8c6decf 122 //_____FIFO_buffer_begin_____
Aleksk 0:f2aaa8c6decf 123 for ( int i = 2; i < maxnsym; i++) {
Aleksk 0:f2aaa8c6decf 124 Source[i-2]=Source[i-1];
Aleksk 0:f2aaa8c6decf 125 }
Aleksk 0:f2aaa8c6decf 126 Source[maxnsym-2]=chr_a; //предпоследний элемент
Aleksk 0:f2aaa8c6decf 127 Source[maxnsym-1] ='\0'; //последний элемент массива это нуль-терминал для формирования конца строки в Си
Aleksk 0:f2aaa8c6decf 128 //_____FIFO_buffer_end_______
Aleksk 0:f2aaa8c6decf 129 }
Aleksk 0:f2aaa8c6decf 130 ach=strchr (Source,ch); //поиск первого вхождения символа в строку , ищем указатель символа ‘$’
Aleksk 0:f2aaa8c6decf 131 if (ach==NULL) {
Aleksk 0:f2aaa8c6decf 132 //pc.printf ("Char not finded \r\n"); //Символ $ в строке не найден
Aleksk 0:f2aaa8c6decf 133 goto endParsing; //пропускаем парсинг
Aleksk 0:f2aaa8c6decf 134 }
Aleksk 0:f2aaa8c6decf 135 else {
Aleksk 0:f2aaa8c6decf 136 indexCh = ach-Source+1; //вычитаем указатель из указателя!
Aleksk 0:f2aaa8c6decf 137 //pc.printf ("Char '$' on position %d\r\n",indexCh); //Искомый символ в строке на позиции
Aleksk 0:f2aaa8c6decf 138 }
Aleksk 0:f2aaa8c6decf 139 if (indexCh!=1) { //позиция символа $ не 1
Aleksk 0:f2aaa8c6decf 140 //pc.printf ("$ position not 1 \r\n");
Aleksk 0:f2aaa8c6decf 141 goto endParsing; //пропускаем парсинг
Aleksk 0:f2aaa8c6decf 142 }
Aleksk 0:f2aaa8c6decf 143
Aleksk 0:f2aaa8c6decf 144 pos=1; //начало подстроки $press - на 1 позиции
Aleksk 0:f2aaa8c6decf 145 len=6; //длина подстроки $press равна 6
Aleksk 0:f2aaa8c6decf 146 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 147 //pc.printf("for pos=%d and len=%d resultat is d= %s\r\n", pos, len, Destination);
Aleksk 0:f2aaa8c6decf 148
Aleksk 0:f2aaa8c6decf 149 if (strcmp(Destination,"$press" ) != 0) { //функция возвращает ноль если строки совпадают
Aleksk 0:f2aaa8c6decf 150 //pc.printf("wrong Destination=%s\r\n",Destination); //печать "неправильной" нулевой строки
Aleksk 0:f2aaa8c6decf 151 goto endParsing ; //в начале сообщения нет $press пропускаем парсинг
Aleksk 0:f2aaa8c6decf 152 }
Aleksk 0:f2aaa8c6decf 153 pos=8; //начало подстроки 1000 - на 8 позиции
Aleksk 0:f2aaa8c6decf 154 len=4; //длина подстроки 1000 равна 4
Aleksk 0:f2aaa8c6decf 155 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 156 value_=atoi(Destination);
Aleksk 4:c34b84bfa2fb 157 //if (value_==0) {
Aleksk 4:c34b84bfa2fb 158 // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
Aleksk 4:c34b84bfa2fb 159 // goto endParsing; //уставка должна быть больше еденицы, пропускаем парсинг
Aleksk 4:c34b84bfa2fb 160 //}
Aleksk 0:f2aaa8c6decf 161 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, value_);
Aleksk 0:f2aaa8c6decf 162 pos=13; //начало подстроки 25 - на 13 позиции
Aleksk 0:f2aaa8c6decf 163 len=2; //длина подстроки 25 равна 2
Aleksk 0:f2aaa8c6decf 164 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 165 delta_value_=atoi(Destination);
Aleksk 4:c34b84bfa2fb 166 //if (delta_value_==0) {
Aleksk 4:c34b84bfa2fb 167 // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
Aleksk 4:c34b84bfa2fb 168 // goto endParsing; //уставка отклонения должна быть больше еденицы, пропускаем парсинг
Aleksk 4:c34b84bfa2fb 169 //}
Aleksk 0:f2aaa8c6decf 170 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, delta_value_);
Aleksk 0:f2aaa8c6decf 171 pos=16; //начало подстроки 0 - на 16 позиции
Aleksk 0:f2aaa8c6decf 172 len=1; //длина подстроки 0 равна 1
Aleksk 0:f2aaa8c6decf 173 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 174 flag_autoset_=atoi(Destination);
Aleksk 0:f2aaa8c6decf 175 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_autoset_);
Aleksk 0:f2aaa8c6decf 176 pos=18; //начало подстроки 0 - на 18 позиции
Aleksk 0:f2aaa8c6decf 177 len=1; //длина подстроки 0 равна 1
Aleksk 0:f2aaa8c6decf 178 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 179 flag_plotter_=atoi(Destination);
Aleksk 0:f2aaa8c6decf 180 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_plotter_);
Aleksk 5:bb595cde0c82 181
Aleksk 5:bb595cde0c82 182 pos=20; //начало подстроки 1 - на 20 позиции
Aleksk 5:bb595cde0c82 183 len=1; //длина подстроки 1 равна 1
Aleksk 5:bb595cde0c82 184 substring(Source,Destination,pos,len);
Aleksk 5:bb595cde0c82 185 num_chan_=atoi(Destination);
Aleksk 5:bb595cde0c82 186 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, num_chan_);
Aleksk 5:bb595cde0c82 187
Aleksk 5:bb595cde0c82 188 pos=22; //начало подстроки 1025 - на 22 позиции
Aleksk 0:f2aaa8c6decf 189 len=4; //длина подстроки 1025 равна 4
Aleksk 0:f2aaa8c6decf 190 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 191 controlSum1=atoi(Destination);
Aleksk 5:bb595cde0c82 192 if (controlSum1==2) {
Aleksk 5:bb595cde0c82 193 flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
Aleksk 5:bb595cde0c82 194 flag_autoset=flag_autoset_; //здесь можно включать-выключать компрессор, но без записи в EEPROM
Aleksk 5:bb595cde0c82 195 goto endParsing; //контрольная сумма должна быть больше двух, пропускаем парсинг
Aleksk 0:f2aaa8c6decf 196 }
Aleksk 0:f2aaa8c6decf 197 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, controlSum1);
Aleksk 5:bb595cde0c82 198 controlSum2=(value_+delta_value_+flag_autoset_+flag_plotter_+num_chan_)*2; //удвоение чтобы не было одинаковых чисел в сообщении
Aleksk 0:f2aaa8c6decf 199 //pc.printf("controlSum1=%d controlSum2=%d\r\n", controlSum1, controlSum2);
Aleksk 0:f2aaa8c6decf 200 if (controlSum1!=controlSum2) { //не совпала контрольная сумма
Aleksk 0:f2aaa8c6decf 201 //pc.printf ("controlSum1!=controlSum2 \r\n");
Aleksk 4:c34b84bfa2fb 202 goto endParsing; //пропускаем парсинг
Aleksk 0:f2aaa8c6decf 203 }
Aleksk 4:c34b84bfa2fb 204 //*********присваиваем проверенные значения глобальным переменным***********
Aleksk 4:c34b84bfa2fb 205 strcpy(trueSource,Source); //копировать из Source в trueSource
Aleksk 4:c34b84bfa2fb 206 if (value_==0 || delta_value_==0) { //при старте с пустой уставкой не имземняем их в регуляторе и не пишем в EEPROM
Aleksk 4:c34b84bfa2fb 207 flag_autoset=flag_autoset_;
Aleksk 4:c34b84bfa2fb 208 flag_plotter=flag_plotter_; //для работы кнопки Stop
Aleksk 4:c34b84bfa2fb 209 } else {
Aleksk 4:c34b84bfa2fb 210 value=value_;
Aleksk 4:c34b84bfa2fb 211 delta_value=delta_value_;
Aleksk 4:c34b84bfa2fb 212 flag_autoset=flag_autoset_;
Aleksk 5:bb595cde0c82 213 flag_plotter=flag_plotter_;
Aleksk 5:bb595cde0c82 214 num_chan=num_chan_;
Aleksk 4:c34b84bfa2fb 215 }
Aleksk 4:c34b84bfa2fb 216
Aleksk 0:f2aaa8c6decf 217 flag_comand_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок
Aleksk 0:f2aaa8c6decf 218
Aleksk 0:f2aaa8c6decf 219 endParsing:
Aleksk 0:f2aaa8c6decf 220
Aleksk 0:f2aaa8c6decf 221
Aleksk 0:f2aaa8c6decf 222 pc.attach(&onDataReceived, Serial::RxIrq); // reattach interrupt - переподключение прерывания перед выходом из функции
Aleksk 0:f2aaa8c6decf 223 }
Aleksk 0:f2aaa8c6decf 224 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 225 void onDataReceived() {
Aleksk 0:f2aaa8c6decf 226 pc.attach(nullptr, Serial::RxIrq); // detach interrupt
Aleksk 0:f2aaa8c6decf 227 queue->call(read_serial); // process in a non ISR context - переход к функции приема строки -
Aleksk 0:f2aaa8c6decf 228 } // - в статусе отключенного прерывания (учим указатели!)
Aleksk 0:f2aaa8c6decf 229 //______________________________________________________________________________
Aleksk 5:bb595cde0c82 230 void auto_set () { //подпрограмма управления компрессором
Aleksk 5:bb595cde0c82 231
Aleksk 5:bb595cde0c82 232 digital_6.write(flag_autoset); //включение-выкючение компрессора
Aleksk 5:bb595cde0c82 233
Aleksk 0:f2aaa8c6decf 234 }
Aleksk 0:f2aaa8c6decf 235 //*****************************************************************************
Aleksk 0:f2aaa8c6decf 236 //*****************************************************************************
Aleksk 0:f2aaa8c6decf 237
Aleksk 0:f2aaa8c6decf 238 int main() {
Aleksk 1:1d4ec28f17c4 239
Aleksk 0:f2aaa8c6decf 240 pc.attach(&onDataReceived, Serial::RxIrq);
Aleksk 5:bb595cde0c82 241 int time, valve1, valve2, countValve1=0, countValve2=0, temp_valueSensor;
Aleksk 0:f2aaa8c6decf 242 int frequencyValve1, frequencyValve2;
Aleksk 4:c34b84bfa2fb 243 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;
Aleksk 2:8230a5a4cc13 244 digital_4.write(0); //valve1 off;
Aleksk 4:c34b84bfa2fb 245 digital_7.write(0); //valve2 off;
Aleksk 5:bb595cde0c82 246 digital_5.write(0); //valve3,4 off;
Aleksk 5:bb595cde0c82 247 digital_6.write(0); //выключение компрессора
Aleksk 2:8230a5a4cc13 248 load_EEPROM (); //загрузка уставок из EEPROM
Aleksk 5:bb595cde0c82 249 if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2 && num_chan < 6) {
Aleksk 2:8230a5a4cc13 250 flag_stopRegulator=false; //уставки из EEPROM похожи на правду, разрешаем работу регулятора
Aleksk 2:8230a5a4cc13 251 } else {
Aleksk 2:8230a5a4cc13 252 flag_stopRegulator = true; //флаг остановки установлен
Aleksk 2:8230a5a4cc13 253 pc.printf("Regulator stopped, error in EEPROM \r\n");
Aleksk 2:8230a5a4cc13 254 }
Aleksk 2:8230a5a4cc13 255
Aleksk 1:1d4ec28f17c4 256 pc.printf("Program started \r\n");
Aleksk 2:8230a5a4cc13 257 Watchdog &watchdog = Watchdog::get_instance();
Aleksk 2:8230a5a4cc13 258 watchdog.start(100); //WDlimit = 100 ms
Aleksk 0:f2aaa8c6decf 259 timer.start();
Aleksk 1:1d4ec28f17c4 260
Aleksk 0:f2aaa8c6decf 261 while (true){ //бесконечный цикл
Aleksk 2:8230a5a4cc13 262 // kick watchdog regularly within provided timeout (сброс собаки в начало счёта)
Aleksk 2:8230a5a4cc13 263 watchdog.kick();
Aleksk 4:c34b84bfa2fb 264
Aleksk 4:c34b84bfa2fb 265 flag_stopRegulator = flag_plotter; //вывод на плоттер не актуален, теперь он будет флагом полной остановки опрессовщика
Aleksk 4:c34b84bfa2fb 266 if (flag_stopRegulator) { //полный останов регулятора и принудительное запирание всех клапанов
Aleksk 4:c34b84bfa2fb 267 digital_4.write(0); //valve1 off
Aleksk 4:c34b84bfa2fb 268 digital_7.write(0); //valve2 off
Aleksk 4:c34b84bfa2fb 269 digital_5.write(0); //valve3,4 off
Aleksk 5:bb595cde0c82 270 //digital_6.write(0); //выключение компрессора
Aleksk 4:c34b84bfa2fb 271 }
Aleksk 4:c34b84bfa2fb 272
Aleksk 1:1d4ec28f17c4 273 if (flag_comand_detected) { //пришла правильная командная строка
Aleksk 5:bb595cde0c82 274 pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
Aleksk 4:c34b84bfa2fb 275 value,delta_value,flag_autoset,flag_plotter,
Aleksk 4:c34b84bfa2fb 276 sensor_value,frequencyValve1,frequencyValve2,
Aleksk 4:c34b84bfa2fb 277 WL,Pb,Pw1,Pw2,Pd,
Aleksk 5:bb595cde0c82 278 digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read()); //передача текущих значений в РС
Aleksk 4:c34b84bfa2fb 279
Aleksk 4:c34b84bfa2fb 280 // pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n",
Aleksk 4:c34b84bfa2fb 281 // value,delta_value,flag_autoset,flag_plotter,
Aleksk 4:c34b84bfa2fb 282 // sensor_value,frequencyValve1,frequencyValve2); //передача текущих значений в РС
Aleksk 4:c34b84bfa2fb 283
Aleksk 0:f2aaa8c6decf 284 //pc.printf("%s\r\n",trueSource); //эхо для отладки канала связи
Aleksk 4:c34b84bfa2fb 285 flag_comand_detected = false; //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта
Aleksk 4:c34b84bfa2fb 286 //flag_stopRegulator = false; //сброс флага, регулятор ждет пока не будет сброшен этот флаг
Aleksk 0:f2aaa8c6decf 287 //plotter.printf("$%d %d %d %d %d;\r\n", digital_4.read()*100-110,
Aleksk 0:f2aaa8c6decf 288 // digital_7.read()*100-220, value, sensor_value, time ); //печать в плоттер в другой СОМ-порт
Aleksk 2:8230a5a4cc13 289 if (strcmp(trueSourceOld,trueSource) != 0) { //функция возвращает ноль если командные строки совпадают
Aleksk 2:8230a5a4cc13 290 save_EEPROM (); //пишем в память уставки отличные от старых
Aleksk 2:8230a5a4cc13 291 load_EEPROM ();
Aleksk 2:8230a5a4cc13 292 }
Aleksk 2:8230a5a4cc13 293
Aleksk 2:8230a5a4cc13 294 strcpy(trueSourceOld,trueSource); //копировать из trueSource в trueSourceOld
Aleksk 0:f2aaa8c6decf 295 }
Aleksk 4:c34b84bfa2fb 296
Aleksk 4:c34b84bfa2fb 297 if (flag_zerostart) { //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске)
Aleksk 5:bb595cde0c82 298 pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
Aleksk 4:c34b84bfa2fb 299 value,delta_value,flag_autoset,flag_plotter,
Aleksk 4:c34b84bfa2fb 300 sensor_value,frequencyValve1,frequencyValve2,
Aleksk 4:c34b84bfa2fb 301 WL,Pb,Pw1,Pw2,Pd,
Aleksk 5:bb595cde0c82 302 digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read()); //передача текущих значений в РС
Aleksk 4:c34b84bfa2fb 303 flag_zerostart = false;
Aleksk 4:c34b84bfa2fb 304 }
Aleksk 4:c34b84bfa2fb 305
Aleksk 4:c34b84bfa2fb 306 if (counter_cycle1 < 10 ) {
Aleksk 4:c34b84bfa2fb 307 float raw_value_0 = analog_value_0.read(); // Чтение аналогового входа 0 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 308 raw_value_sum_0 = raw_value_sum_0 + raw_value_0;
Aleksk 4:c34b84bfa2fb 309 float raw_value_1 = analog_value_1.read(); // Чтение аналогового входа 1 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 310 raw_value_sum_1 = raw_value_sum_1 + raw_value_1;
Aleksk 4:c34b84bfa2fb 311 float raw_value_2 = analog_value_2.read(); // Чтение аналогового входа 2 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 312 raw_value_sum_2 = raw_value_sum_2 + raw_value_2;
Aleksk 4:c34b84bfa2fb 313 }
Aleksk 4:c34b84bfa2fb 314 if (counter_cycle1 >= 10 ) {
Aleksk 4:c34b84bfa2fb 315 float raw_value_3 = analog_value_3.read(); // Чтение аналогового входа 3 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 316 raw_value_sum_3 = raw_value_sum_3 + raw_value_3;
Aleksk 4:c34b84bfa2fb 317 float raw_value_4 = analog_value_4.read(); // Чтение аналогового входа 4 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 318 raw_value_sum_4 = raw_value_sum_4 + raw_value_4;
Aleksk 4:c34b84bfa2fb 319 //float raw_value_5 = analog_value_5.read(); // Чтение аналогового входа 5 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 320 //raw_value_sum_5 = raw_value_sum_5 + raw_value_5;
Aleksk 4:c34b84bfa2fb 321 }
Aleksk 0:f2aaa8c6decf 322
Aleksk 4:c34b84bfa2fb 323 if (counter_cycle1 >= 19 ) {
Aleksk 0:f2aaa8c6decf 324 counter_cycle1=0;
Aleksk 4:c34b84bfa2fb 325
Aleksk 4:c34b84bfa2fb 326 WL = raw_value_sum_0/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 327 raw_value_sum_0 = 0 ;
Aleksk 4:c34b84bfa2fb 328 sensor_value = raw_value_sum_1/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 329 raw_value_sum_1 = 0 ;
Aleksk 4:c34b84bfa2fb 330 Pb = raw_value_sum_2/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 331 raw_value_sum_2 = 0 ;
Aleksk 4:c34b84bfa2fb 332 Pw1 = raw_value_sum_3/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 333 raw_value_sum_3 = 0 ;
Aleksk 5:bb595cde0c82 334 Pw2 = raw_value_sum_4/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 335 raw_value_sum_4 = 0 ;
Aleksk 4:c34b84bfa2fb 336 //Pd = raw_value_sum_5/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 337 //raw_value_sum_5 = 0 ;
Aleksk 4:c34b84bfa2fb 338
Aleksk 5:bb595cde0c82 339 if (num_chan == 1) {temp_valueSensor = sensor_value;} //теперь источник сигнала для регулятора - канал 1
Aleksk 5:bb595cde0c82 340 if (num_chan == 3) {temp_valueSensor = Pw1;} //теперь источник сигнала для регулятора - канал 3
Aleksk 5:bb595cde0c82 341 if (num_chan == 4) {temp_valueSensor = Pw2;} //теперь источник сигнала для регулятора - канал 4
Aleksk 5:bb595cde0c82 342
Aleksk 2:8230a5a4cc13 343 if (flag_stopRegulator == false) { // можно запускать регулятор
Aleksk 4:c34b84bfa2fb 344 digital_5.write(1); //valve3,4 открыты - подключаемся к контуру охлаждения макета
Aleksk 1:1d4ec28f17c4 345 //--------------regulator begin-----------------------
Aleksk 5:bb595cde0c82 346 if (temp_valueSensor > value + delta_value) {
Aleksk 1:1d4ec28f17c4 347 valve2 = digital_7.read();
Aleksk 1:1d4ec28f17c4 348 digital_7.write(1); //valve2 on;
Aleksk 1:1d4ec28f17c4 349 if (valve2 < digital_7.read()) {countValve2++;} //счётчик передних фронтов напряжения (срабатывания клапана 2)
Aleksk 1:1d4ec28f17c4 350 digital_4.write(0); //valve1 off;
Aleksk 5:bb595cde0c82 351 } else if (temp_valueSensor < value - delta_value) {
Aleksk 1:1d4ec28f17c4 352 valve1 = digital_4.read();
Aleksk 1:1d4ec28f17c4 353 digital_4.write(1); //valve1 on;
Aleksk 1:1d4ec28f17c4 354 if (valve1 < digital_4.read()) {countValve1++;} //счётчик передних фронтов напряжения (срабатывания клапана 1)
Aleksk 1:1d4ec28f17c4 355 digital_7.write(0); //valve2 off;
Aleksk 1:1d4ec28f17c4 356 } else {
Aleksk 1:1d4ec28f17c4 357 digital_4.write(0); //valve1 off;
Aleksk 1:1d4ec28f17c4 358 digital_7.write(0); //valve2 off;
Aleksk 1:1d4ec28f17c4 359 }
Aleksk 1:1d4ec28f17c4 360 //--------------regulator end-------------------------
Aleksk 0:f2aaa8c6decf 361 }
Aleksk 0:f2aaa8c6decf 362 time=timer.read_us();
Aleksk 0:f2aaa8c6decf 363 if (time > 1000000) {
Aleksk 0:f2aaa8c6decf 364 timer.reset(); //начало счёта времени
Aleksk 0:f2aaa8c6decf 365 frequencyValve1 = countValve1; //частота (Гц) срабатывания клапана 1
Aleksk 0:f2aaa8c6decf 366 frequencyValve2 = countValve2; //частота (Гц) срабатывания клапана 2
Aleksk 0:f2aaa8c6decf 367 countValve1=0;
Aleksk 0:f2aaa8c6decf 368 countValve2=0;
Aleksk 0:f2aaa8c6decf 369 }
Aleksk 0:f2aaa8c6decf 370
Aleksk 5:bb595cde0c82 371 auto_set(); //включение-выкючение компрессора через flag_autoset
Aleksk 0:f2aaa8c6decf 372 led = !led; //гасим/зажигаем индикаторный светодиод
Aleksk 0:f2aaa8c6decf 373 }
Aleksk 0:f2aaa8c6decf 374 ThisThread::sleep_for(1); // (mc) правильный оператор задержки для mbed5
Aleksk 0:f2aaa8c6decf 375 counter_cycle1++;
Aleksk 0:f2aaa8c6decf 376
Aleksk 0:f2aaa8c6decf 377 }
Aleksk 0:f2aaa8c6decf 378 }