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").
main.cpp@5:bb595cde0c82, 2020-06-04 (annotated)
- 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?
User | Revision | Line number | New 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 | } |