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