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@6:fe0a7180ebb7, 2020-06-11 (annotated)
- Committer:
- Aleksk
- Date:
- Thu Jun 11 20:22:11 2020 +0000
- Revision:
- 6:fe0a7180ebb7
- Parent:
- 5:bb595cde0c82
- Child:
- 7:97881cd71b31
An additional block has been made in the parser for decoding incoming alarm settings for writing to the EEPROM. Additional digital inputs are activated.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Aleksk | 6:fe0a7180ebb7 | 1 | // 11.06.2020 Продолжение (клон )mbed-os5-press9 |
Aleksk | 6:fe0a7180ebb7 | 2 | // Сделан дополнительный блок в парсере для декодирования приходящих аварийных уставок для EEPROM |
Aleksk | 6:fe0a7180ebb7 | 3 | // Сделан timer_2 для отсчёта времени открытого состояния вентиля 1 |
Aleksk | 6:fe0a7180ebb7 | 4 | // Сделан timer_3 для отсчёта времени открытого состояния вентиля 2 |
Aleksk | 6:fe0a7180ebb7 | 5 | // Подключены цифровые входы D11,D12,D13. Реализованы условия остановки по 10 аварийным событиям. |
Aleksk | 6:fe0a7180ebb7 | 6 | // Реализован сброс события (event_N = 255) через кнопку Стоп в программе оператора |
Aleksk | 5:bb595cde0c82 | 7 | // Принимается флаг от кнопки Стоп - полной остановки регулятора - закрытие всех 4-х клапанов и передача статуса кнопки в программу оператора |
Aleksk | 5:bb595cde0c82 | 8 | // Принимается флаг от кнопок включения - выключения компрессора, - идет команда на дискретный выход digital_6(PB_10) |
Aleksk | 5:bb595cde0c82 | 9 | // Принимается новая уставка num_chan - переключение номера активного измерительного канала для обратной связи регулятора. |
Aleksk | 5:bb595cde0c82 | 10 | // Эта уставка, как и все остальные, пишется в EEPROM. |
Aleksk | 5:bb595cde0c82 | 11 | // Включены все шесть аналоговых входа, читаются пять |
Aleksk | 4:c34b84bfa2fb | 12 | // при получении командной строки с нулевой суммой, по новому флагу flag_zerostart, передаётся в сериал текущие уставки и величины |
Aleksk | 4:c34b84bfa2fb | 13 | // (важно для старта программы на PC), эти нулевые уставки не вводятся в регулятор и не записываются в EEPROM. |
Aleksk | 4:c34b84bfa2fb | 14 | // сторожевой таймер, истекает через 100мс |
Aleksk | 4:c34b84bfa2fb | 15 | // |
Aleksk | 4:c34b84bfa2fb | 16 | |
Aleksk | 0:f2aaa8c6decf | 17 | #include "mbed.h" |
Aleksk | 2:8230a5a4cc13 | 18 | #include "_24LCXXX.h" |
Aleksk | 2:8230a5a4cc13 | 19 | |
Aleksk | 2:8230a5a4cc13 | 20 | I2C i2c(PB_9,PB_8); // sda, scl |
Aleksk | 2:8230a5a4cc13 | 21 | _24LCXXX eeprom(&i2c, 0x50); |
Aleksk | 0:f2aaa8c6decf | 22 | |
Aleksk | 4:c34b84bfa2fb | 23 | AnalogIn analog_value_0(A0); //подключение аналогового входа A0 |
Aleksk | 4:c34b84bfa2fb | 24 | AnalogIn analog_value_1(A1); //подключение аналогового входа A1 |
Aleksk | 4:c34b84bfa2fb | 25 | AnalogIn analog_value_2(A2); //подключение аналогового входа A2 |
Aleksk | 4:c34b84bfa2fb | 26 | AnalogIn analog_value_3(A3); //подключение аналогового входа A3 |
Aleksk | 4:c34b84bfa2fb | 27 | AnalogIn analog_value_4(A4); //подключение аналогового входа A4 |
Aleksk | 4:c34b84bfa2fb | 28 | AnalogIn analog_value_5(A5); //подключение аналогового входа A5 |
Aleksk | 6:fe0a7180ebb7 | 29 | //DigitalOut led(LED1); |
Aleksk | 0:f2aaa8c6decf | 30 | DigitalOut digital_4(PB_5); //initialize digital pin 4 as an output (high pressure air bulb charge). |
Aleksk | 4:c34b84bfa2fb | 31 | DigitalOut digital_7(PA_8); //initialize digital pin 7 as an output. (high pressure air bulb discharge) |
Aleksk | 4:c34b84bfa2fb | 32 | DigitalOut digital_5(PB_4); //initialize digital pin 5 as an output (valve3,4) |
Aleksk | 4:c34b84bfa2fb | 33 | DigitalOut digital_6(PB_10); //initialize digital pin 6 as an output (compressor on/off) |
Aleksk | 6:fe0a7180ebb7 | 34 | DigitalIn idigital_11(PA_7); //initialize digital pin 11 as an input концевик при растяжении сильфона |
Aleksk | 6:fe0a7180ebb7 | 35 | DigitalIn idigital_12(PA_6); //initialize digital pin 12 as an input концевик при сжатии сильфона |
Aleksk | 6:fe0a7180ebb7 | 36 | DigitalIn idigital_13(PA_5); //initialize digital pin 12 as an input внутрь опрессовщика попала вода |
Aleksk | 4:c34b84bfa2fb | 37 | |
Aleksk | 4:c34b84bfa2fb | 38 | RawSerial plotter(USBTX, USBRX, 115200); // tx, rx for F411RE port for serial_plotter and temporary messages |
Aleksk | 4:c34b84bfa2fb | 39 | RawSerial pc(PA_9, PA_10, 115200); // tx, rx for F411RE port for command string distance PC |
Aleksk | 0:f2aaa8c6decf | 40 | EventQueue *queue = mbed_event_queue(); //инициализация очереди событий RTOS mbed5 |
Aleksk | 6:fe0a7180ebb7 | 41 | Timer timer; //инициализация таймера для определения частот переключений вентилей 1 и 2 |
Aleksk | 6:fe0a7180ebb7 | 42 | Timer timer_2; //инициализация таймера 2 для отсчёта времени открытого состояния вентиля 1 |
Aleksk | 6:fe0a7180ebb7 | 43 | Timer timer_3; //инициализация таймера 3 для отсчёта времени открытого состояния вентиля 2 |
Aleksk | 6:fe0a7180ebb7 | 44 | //========УСТАВКИ_1 EEPROM======== |
Aleksk | 5:bb595cde0c82 | 45 | uint8_t delta_value = 0; //set delta pressure 1...99 |
Aleksk | 6:fe0a7180ebb7 | 46 | uint8_t flag_compressor = 0; //флаг компрессора. При 0 - выключение компрессора, при 1 - включение компрессора |
Aleksk | 6:fe0a7180ebb7 | 47 | uint8_t flag_stopRegulator = 0; //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов |
Aleksk | 5:bb595cde0c82 | 48 | uint8_t num_chan = 1; //set номер аналогового канала 0...5 (1-as default = Pa) |
Aleksk | 4:c34b84bfa2fb | 49 | int value = 0; //set begin value "pressure" 1...3300 |
Aleksk | 6:fe0a7180ebb7 | 50 | //========УСТАВКИ_2 EEPROM======== |
Aleksk | 6:fe0a7180ebb7 | 51 | int Pd_eeprom = 2000; // mV, максимальное дифференциальное давление (беззнаковое) |
Aleksk | 6:fe0a7180ebb7 | 52 | int frequencyValve1_eeprom = 5; // Гц, максимальная частота переключений клапана 1 |
Aleksk | 6:fe0a7180ebb7 | 53 | int frequencyValve2_eeprom = 5; // Гц, максимальная частота переключений клапана 2 |
Aleksk | 6:fe0a7180ebb7 | 54 | int WL01_eeprom = 10; // mV, минимальный вес опрессовщика |
Aleksk | 6:fe0a7180ebb7 | 55 | int WL99_eeprom = 2000; // mV, максимальный вес опрессовщика |
Aleksk | 6:fe0a7180ebb7 | 56 | int T_1 = 4000; // ms, максимальное время открытого состояния для клапана 1 |
Aleksk | 6:fe0a7180ebb7 | 57 | int T_2 = 4000; // ms, максимальное время открытого состояния для клапана 2 |
Aleksk | 6:fe0a7180ebb7 | 58 | uint8_t event_N = 255; // номер события , по умолчанию 255 - событий нет |
Aleksk | 6:fe0a7180ebb7 | 59 | //======temporary set===== |
Aleksk | 6:fe0a7180ebb7 | 60 | int numSet, anySet; |
Aleksk | 6:fe0a7180ebb7 | 61 | //================================= |
Aleksk | 0:f2aaa8c6decf | 62 | int value_auto=250 ; //set begin value auto "pressure" |
Aleksk | 4:c34b84bfa2fb | 63 | int WL = 0; //напряжение с аналогового входа А0 (WL - вес опресовщика) |
Aleksk | 4:c34b84bfa2fb | 64 | int sensor_value =0; //напряжение с аналогового входа А1 (Pa - текущее давление) |
Aleksk | 4:c34b84bfa2fb | 65 | int Pb = 0; //напряжение с аналогового входа А2 (Pb - давление в баллоне) |
Aleksk | 4:c34b84bfa2fb | 66 | int Pw1 = 0; //напряжение с аналогового входа А3 (Pw1 - давление воды на входе опрессовщика) |
Aleksk | 4:c34b84bfa2fb | 67 | int Pw2 = 0; //напряжение с аналогового входа А4 (Pw2 - давление воды в контуре макета) |
Aleksk | 4:c34b84bfa2fb | 68 | int Pd = 0; //напряжение с аналогового входа А5 (Pd - дифференциальное давление опресовщика) |
Aleksk | 2:8230a5a4cc13 | 69 | int counter_cycle1 = 0; //счётчик цикла while(true) |
Aleksk | 2:8230a5a4cc13 | 70 | int counter_cycle2 = 0; //счётчик внутри функции auto_set |
Aleksk | 0:f2aaa8c6decf | 71 | int sig = 1; //знак инкримента для автоустаки |
Aleksk | 6:fe0a7180ebb7 | 72 | |
Aleksk | 0:f2aaa8c6decf | 73 | // FIFO_buffer must be full (only char and '\0') |
Aleksk | 5:bb595cde0c82 | 74 | //#define maxnsym 26 // maximum nbr of symbols FIFO_buffer (вариант без символов окончания) |
Aleksk | 5:bb595cde0c82 | 75 | #define maxnsym 28 // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче) |
Aleksk | 5:bb595cde0c82 | 76 | char Source[maxnsym]="$press,1000,25,0,0,1,2050**"; //25 char- string ,весь массив со строкой для поиска 25+1(null terminal)=26 |
Aleksk | 0:f2aaa8c6decf | 77 | //уставки и контрольная сумма умноженная на два, должны быть больше нуля |
Aleksk | 0:f2aaa8c6decf | 78 | char trueSource[maxnsym]; //верифицированная строка для callback |
Aleksk | 2:8230a5a4cc13 | 79 | char trueSourceOld[maxnsym]; //предыдущая верифицированная строка для callback |
Aleksk | 6:fe0a7180ebb7 | 80 | char trueSource2[maxnsym]; //верифицированная строка для callback |
Aleksk | 6:fe0a7180ebb7 | 81 | char trueSource2Old[maxnsym]; //предыдущая верифицированная строка для callback |
Aleksk | 0:f2aaa8c6decf | 82 | |
Aleksk | 4:c34b84bfa2fb | 83 | volatile char chr_a; //в прерываниях переменные должны быть защищены при помощи volatile от оптимизации компилятором |
Aleksk | 4:c34b84bfa2fb | 84 | volatile bool flag_comand_detected = false; //если строка декодирована правильно то true |
Aleksk | 6:fe0a7180ebb7 | 85 | volatile bool flag_comand2_detected = false; //если строка в блоке парсинга уставок eeprom декодирована правильно то true |
Aleksk | 4:c34b84bfa2fb | 86 | volatile bool flag_zerostart = false; //если строка декодирована c нулевой контрольной суммой то true |
Aleksk | 6:fe0a7180ebb7 | 87 | //volatile bool flag_stopRegulator = true; //флаг остановки , закрыть все клапана |
Aleksk | 2:8230a5a4cc13 | 88 | //_____________________________________________________________________________ |
Aleksk | 2:8230a5a4cc13 | 89 | void save_EEPROM () { |
Aleksk | 2:8230a5a4cc13 | 90 | int data2; |
Aleksk | 4:c34b84bfa2fb | 91 | plotter.printf("EEPROM write------\r\n"); |
Aleksk | 2:8230a5a4cc13 | 92 | eeprom.byte_write(0, delta_value); |
Aleksk | 6:fe0a7180ebb7 | 93 | eeprom.byte_write(1, flag_compressor); |
Aleksk | 6:fe0a7180ebb7 | 94 | eeprom.byte_write(2, flag_stopRegulator); |
Aleksk | 5:bb595cde0c82 | 95 | eeprom.byte_write(3, num_chan); |
Aleksk | 2:8230a5a4cc13 | 96 | data2 = value; |
Aleksk | 2:8230a5a4cc13 | 97 | eeprom.nbyte_write( 10, &data2, sizeof(int)); |
Aleksk | 2:8230a5a4cc13 | 98 | } |
Aleksk | 2:8230a5a4cc13 | 99 | //_____________________________________________________________________________ |
Aleksk | 2:8230a5a4cc13 | 100 | void load_EEPROM () { |
Aleksk | 2:8230a5a4cc13 | 101 | uint8_t data1; |
Aleksk | 2:8230a5a4cc13 | 102 | int data2; |
Aleksk | 4:c34b84bfa2fb | 103 | plotter.printf("EEPROM read------\r\n"); |
Aleksk | 2:8230a5a4cc13 | 104 | eeprom.nbyte_read( 0, &data1, 1 ); |
Aleksk | 4:c34b84bfa2fb | 105 | plotter.printf("adress 0 =%d \r\n",data1); |
Aleksk | 2:8230a5a4cc13 | 106 | delta_value=data1; |
Aleksk | 2:8230a5a4cc13 | 107 | eeprom.nbyte_read( 1, &data1, 1 ); |
Aleksk | 4:c34b84bfa2fb | 108 | plotter.printf("adress 1 =%d \r\n",data1); |
Aleksk | 6:fe0a7180ebb7 | 109 | flag_compressor=data1; |
Aleksk | 2:8230a5a4cc13 | 110 | eeprom.nbyte_read( 2, &data1, 1 ); |
Aleksk | 4:c34b84bfa2fb | 111 | plotter.printf("adress 2 =%d \r\n",data1); |
Aleksk | 6:fe0a7180ebb7 | 112 | flag_stopRegulator=data1; |
Aleksk | 5:bb595cde0c82 | 113 | eeprom.nbyte_read( 3, &data1, 1 ); |
Aleksk | 5:bb595cde0c82 | 114 | plotter.printf("adress 3 =%d \r\n",data1); |
Aleksk | 5:bb595cde0c82 | 115 | num_chan=data1; |
Aleksk | 2:8230a5a4cc13 | 116 | eeprom.nbyte_read( 10, &data2, sizeof(int) ); |
Aleksk | 4:c34b84bfa2fb | 117 | plotter.printf("adress 10 = %d \r\n",data2); |
Aleksk | 2:8230a5a4cc13 | 118 | value=data2; |
Aleksk | 2:8230a5a4cc13 | 119 | } |
Aleksk | 0:f2aaa8c6decf | 120 | //______________________________________________________________________________ |
Aleksk | 0:f2aaa8c6decf | 121 | void substring(char *s,char *d,int pos,int len) { |
Aleksk | 0:f2aaa8c6decf | 122 | //usage: substring(Source,Destination,pos,len); |
Aleksk | 0:f2aaa8c6decf | 123 | char *t; |
Aleksk | 0:f2aaa8c6decf | 124 | s=s+(pos-1); |
Aleksk | 0:f2aaa8c6decf | 125 | t=s+len; |
Aleksk | 0:f2aaa8c6decf | 126 | while (s!=t) { |
Aleksk | 0:f2aaa8c6decf | 127 | *d=*s; |
Aleksk | 0:f2aaa8c6decf | 128 | s++; |
Aleksk | 0:f2aaa8c6decf | 129 | d++; |
Aleksk | 0:f2aaa8c6decf | 130 | } |
Aleksk | 0:f2aaa8c6decf | 131 | *d='\0'; |
Aleksk | 0:f2aaa8c6decf | 132 | } |
Aleksk | 0:f2aaa8c6decf | 133 | //______________________________________________________________________________ |
Aleksk | 0:f2aaa8c6decf | 134 | void onDataReceived(); // callback |
Aleksk | 0:f2aaa8c6decf | 135 | //______________________________________________________________________________ |
Aleksk | 0:f2aaa8c6decf | 136 | void read_serial(void) { |
Aleksk | 0:f2aaa8c6decf | 137 | char Destination[50]; |
Aleksk | 0:f2aaa8c6decf | 138 | int pos,len; |
Aleksk | 0:f2aaa8c6decf | 139 | int controlSum1, controlSum2; |
Aleksk | 6:fe0a7180ebb7 | 140 | int value_, delta_value_, flag_compressor_, flag_stopRegulator_, num_chan_; |
Aleksk | 6:fe0a7180ebb7 | 141 | int controlSumSet1, controlSumSet2; |
Aleksk | 6:fe0a7180ebb7 | 142 | int numSet_, anySet_; |
Aleksk | 0:f2aaa8c6decf | 143 | int ch = '$'; // Код искомого символа |
Aleksk | 0:f2aaa8c6decf | 144 | int indexCh; // Char on position |
Aleksk | 0:f2aaa8c6decf | 145 | char *ach; // Указатель на искомую переменную в строке, по которой осуществляется поиск. |
Aleksk | 0:f2aaa8c6decf | 146 | while(pc.readable()) { |
Aleksk | 0:f2aaa8c6decf | 147 | chr_a = pc.getc(); |
Aleksk | 0:f2aaa8c6decf | 148 | //_____FIFO_buffer_begin_____ |
Aleksk | 0:f2aaa8c6decf | 149 | for ( int i = 2; i < maxnsym; i++) { |
Aleksk | 0:f2aaa8c6decf | 150 | Source[i-2]=Source[i-1]; |
Aleksk | 0:f2aaa8c6decf | 151 | } |
Aleksk | 0:f2aaa8c6decf | 152 | Source[maxnsym-2]=chr_a; //предпоследний элемент |
Aleksk | 0:f2aaa8c6decf | 153 | Source[maxnsym-1] ='\0'; //последний элемент массива это нуль-терминал для формирования конца строки в Си |
Aleksk | 0:f2aaa8c6decf | 154 | //_____FIFO_buffer_end_______ |
Aleksk | 0:f2aaa8c6decf | 155 | } |
Aleksk | 0:f2aaa8c6decf | 156 | ach=strchr (Source,ch); //поиск первого вхождения символа в строку , ищем указатель символа ‘$’ |
Aleksk | 0:f2aaa8c6decf | 157 | if (ach==NULL) { |
Aleksk | 0:f2aaa8c6decf | 158 | //pc.printf ("Char not finded \r\n"); //Символ $ в строке не найден |
Aleksk | 0:f2aaa8c6decf | 159 | goto endParsing; //пропускаем парсинг |
Aleksk | 0:f2aaa8c6decf | 160 | } |
Aleksk | 0:f2aaa8c6decf | 161 | else { |
Aleksk | 0:f2aaa8c6decf | 162 | indexCh = ach-Source+1; //вычитаем указатель из указателя! |
Aleksk | 0:f2aaa8c6decf | 163 | //pc.printf ("Char '$' on position %d\r\n",indexCh); //Искомый символ в строке на позиции |
Aleksk | 0:f2aaa8c6decf | 164 | } |
Aleksk | 0:f2aaa8c6decf | 165 | if (indexCh!=1) { //позиция символа $ не 1 |
Aleksk | 0:f2aaa8c6decf | 166 | //pc.printf ("$ position not 1 \r\n"); |
Aleksk | 0:f2aaa8c6decf | 167 | goto endParsing; //пропускаем парсинг |
Aleksk | 0:f2aaa8c6decf | 168 | } |
Aleksk | 0:f2aaa8c6decf | 169 | |
Aleksk | 0:f2aaa8c6decf | 170 | pos=1; //начало подстроки $press - на 1 позиции |
Aleksk | 0:f2aaa8c6decf | 171 | len=6; //длина подстроки $press равна 6 |
Aleksk | 0:f2aaa8c6decf | 172 | substring(Source,Destination,pos,len); |
Aleksk | 0:f2aaa8c6decf | 173 | //pc.printf("for pos=%d and len=%d resultat is d= %s\r\n", pos, len, Destination); |
Aleksk | 0:f2aaa8c6decf | 174 | |
Aleksk | 0:f2aaa8c6decf | 175 | if (strcmp(Destination,"$press" ) != 0) { //функция возвращает ноль если строки совпадают |
Aleksk | 0:f2aaa8c6decf | 176 | //pc.printf("wrong Destination=%s\r\n",Destination); //печать "неправильной" нулевой строки |
Aleksk | 6:fe0a7180ebb7 | 177 | goto eepromSet ; //в начале сообщения нет $press , переход с следующему блоку приёма |
Aleksk | 0:f2aaa8c6decf | 178 | } |
Aleksk | 0:f2aaa8c6decf | 179 | pos=8; //начало подстроки 1000 - на 8 позиции |
Aleksk | 0:f2aaa8c6decf | 180 | len=4; //длина подстроки 1000 равна 4 |
Aleksk | 0:f2aaa8c6decf | 181 | substring(Source,Destination,pos,len); |
Aleksk | 0:f2aaa8c6decf | 182 | value_=atoi(Destination); |
Aleksk | 4:c34b84bfa2fb | 183 | //if (value_==0) { |
Aleksk | 4:c34b84bfa2fb | 184 | // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC |
Aleksk | 4:c34b84bfa2fb | 185 | // goto endParsing; //уставка должна быть больше еденицы, пропускаем парсинг |
Aleksk | 4:c34b84bfa2fb | 186 | //} |
Aleksk | 0:f2aaa8c6decf | 187 | //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, value_); |
Aleksk | 0:f2aaa8c6decf | 188 | pos=13; //начало подстроки 25 - на 13 позиции |
Aleksk | 0:f2aaa8c6decf | 189 | len=2; //длина подстроки 25 равна 2 |
Aleksk | 0:f2aaa8c6decf | 190 | substring(Source,Destination,pos,len); |
Aleksk | 0:f2aaa8c6decf | 191 | delta_value_=atoi(Destination); |
Aleksk | 4:c34b84bfa2fb | 192 | //if (delta_value_==0) { |
Aleksk | 4:c34b84bfa2fb | 193 | // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC |
Aleksk | 4:c34b84bfa2fb | 194 | // goto endParsing; //уставка отклонения должна быть больше еденицы, пропускаем парсинг |
Aleksk | 4:c34b84bfa2fb | 195 | //} |
Aleksk | 0:f2aaa8c6decf | 196 | //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, delta_value_); |
Aleksk | 0:f2aaa8c6decf | 197 | pos=16; //начало подстроки 0 - на 16 позиции |
Aleksk | 0:f2aaa8c6decf | 198 | len=1; //длина подстроки 0 равна 1 |
Aleksk | 0:f2aaa8c6decf | 199 | substring(Source,Destination,pos,len); |
Aleksk | 6:fe0a7180ebb7 | 200 | flag_compressor_=atoi(Destination); |
Aleksk | 6:fe0a7180ebb7 | 201 | //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_compressor_); |
Aleksk | 0:f2aaa8c6decf | 202 | pos=18; //начало подстроки 0 - на 18 позиции |
Aleksk | 0:f2aaa8c6decf | 203 | len=1; //длина подстроки 0 равна 1 |
Aleksk | 0:f2aaa8c6decf | 204 | substring(Source,Destination,pos,len); |
Aleksk | 6:fe0a7180ebb7 | 205 | flag_stopRegulator_=atoi(Destination); |
Aleksk | 6:fe0a7180ebb7 | 206 | //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_stopRegulator_); |
Aleksk | 5:bb595cde0c82 | 207 | |
Aleksk | 5:bb595cde0c82 | 208 | pos=20; //начало подстроки 1 - на 20 позиции |
Aleksk | 5:bb595cde0c82 | 209 | len=1; //длина подстроки 1 равна 1 |
Aleksk | 5:bb595cde0c82 | 210 | substring(Source,Destination,pos,len); |
Aleksk | 5:bb595cde0c82 | 211 | num_chan_=atoi(Destination); |
Aleksk | 5:bb595cde0c82 | 212 | //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, num_chan_); |
Aleksk | 5:bb595cde0c82 | 213 | |
Aleksk | 5:bb595cde0c82 | 214 | pos=22; //начало подстроки 1025 - на 22 позиции |
Aleksk | 0:f2aaa8c6decf | 215 | len=4; //длина подстроки 1025 равна 4 |
Aleksk | 0:f2aaa8c6decf | 216 | substring(Source,Destination,pos,len); |
Aleksk | 0:f2aaa8c6decf | 217 | controlSum1=atoi(Destination); |
Aleksk | 5:bb595cde0c82 | 218 | if (controlSum1==2) { |
Aleksk | 5:bb595cde0c82 | 219 | flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC |
Aleksk | 6:fe0a7180ebb7 | 220 | flag_compressor=flag_compressor_; //здесь можно включать-выключать компрессор, но без записи в EEPROM |
Aleksk | 5:bb595cde0c82 | 221 | goto endParsing; //контрольная сумма должна быть больше двух, пропускаем парсинг |
Aleksk | 0:f2aaa8c6decf | 222 | } |
Aleksk | 0:f2aaa8c6decf | 223 | //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, controlSum1); |
Aleksk | 6:fe0a7180ebb7 | 224 | controlSum2=(value_+delta_value_+flag_compressor_+flag_stopRegulator_+num_chan_)*2; //удвоение чтобы не было одинаковых чисел в сообщении |
Aleksk | 0:f2aaa8c6decf | 225 | //pc.printf("controlSum1=%d controlSum2=%d\r\n", controlSum1, controlSum2); |
Aleksk | 0:f2aaa8c6decf | 226 | if (controlSum1!=controlSum2) { //не совпала контрольная сумма |
Aleksk | 0:f2aaa8c6decf | 227 | //pc.printf ("controlSum1!=controlSum2 \r\n"); |
Aleksk | 4:c34b84bfa2fb | 228 | goto endParsing; //пропускаем парсинг |
Aleksk | 0:f2aaa8c6decf | 229 | } |
Aleksk | 4:c34b84bfa2fb | 230 | //*********присваиваем проверенные значения глобальным переменным*********** |
Aleksk | 4:c34b84bfa2fb | 231 | strcpy(trueSource,Source); //копировать из Source в trueSource |
Aleksk | 6:fe0a7180ebb7 | 232 | if (value_==0 || delta_value_==0) { //при старте с пустой уставкой не изменяем их в регуляторе и не пишем в EEPROM |
Aleksk | 6:fe0a7180ebb7 | 233 | flag_compressor=flag_compressor_; |
Aleksk | 6:fe0a7180ebb7 | 234 | flag_stopRegulator=flag_stopRegulator_; //для работы кнопки Stop |
Aleksk | 4:c34b84bfa2fb | 235 | } else { |
Aleksk | 4:c34b84bfa2fb | 236 | value=value_; |
Aleksk | 4:c34b84bfa2fb | 237 | delta_value=delta_value_; |
Aleksk | 6:fe0a7180ebb7 | 238 | flag_compressor=flag_compressor_; |
Aleksk | 6:fe0a7180ebb7 | 239 | flag_stopRegulator=flag_stopRegulator_; |
Aleksk | 5:bb595cde0c82 | 240 | num_chan=num_chan_; |
Aleksk | 4:c34b84bfa2fb | 241 | } |
Aleksk | 4:c34b84bfa2fb | 242 | |
Aleksk | 0:f2aaa8c6decf | 243 | flag_comand_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок |
Aleksk | 6:fe0a7180ebb7 | 244 | goto endParsing ; //завершение блока приема рабочих уставок для работяющего релейного регулятора |
Aleksk | 6:fe0a7180ebb7 | 245 | |
Aleksk | 6:fe0a7180ebb7 | 246 | //========Начало блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM =================== |
Aleksk | 6:fe0a7180ebb7 | 247 | eepromSet: |
Aleksk | 6:fe0a7180ebb7 | 248 | if (strcmp(Destination,"$setup" ) != 0) { //функция возвращает ноль если строки совпадают |
Aleksk | 6:fe0a7180ebb7 | 249 | //pc.printf("wrong Destination=%s\r\n",Destination); //печать "неправильной" нулевой строки |
Aleksk | 6:fe0a7180ebb7 | 250 | goto endParsing ; //в начале сообщения нет $setup , пропускаем парсинг |
Aleksk | 6:fe0a7180ebb7 | 251 | } |
Aleksk | 6:fe0a7180ebb7 | 252 | pos=8; //начало подстроки 123 - на 8 позиции |
Aleksk | 6:fe0a7180ebb7 | 253 | len=3; //длина подстроки 123 равна 3 |
Aleksk | 6:fe0a7180ebb7 | 254 | substring(Source,Destination,pos,len); |
Aleksk | 6:fe0a7180ebb7 | 255 | numSet_=atoi(Destination); |
Aleksk | 6:fe0a7180ebb7 | 256 | pos=12; //начало подстроки 123456 - на 12 позиции |
Aleksk | 6:fe0a7180ebb7 | 257 | len=6; //длина подстроки 123456 равна 6 |
Aleksk | 6:fe0a7180ebb7 | 258 | substring(Source,Destination,pos,len); |
Aleksk | 6:fe0a7180ebb7 | 259 | anySet_ =atoi(Destination); |
Aleksk | 6:fe0a7180ebb7 | 260 | pos=19; //начало подстроки 1234567 - на 19 позиции |
Aleksk | 6:fe0a7180ebb7 | 261 | len=7; //длина подстроки 1234567 равна 7 |
Aleksk | 6:fe0a7180ebb7 | 262 | substring(Source,Destination,pos,len); |
Aleksk | 6:fe0a7180ebb7 | 263 | controlSumSet1 =atoi(Destination); |
Aleksk | 6:fe0a7180ebb7 | 264 | controlSumSet2=(numSet_+anySet_)*2; |
Aleksk | 6:fe0a7180ebb7 | 265 | if (controlSumSet1!=controlSumSet2) { //не совпала контрольная сумма |
Aleksk | 6:fe0a7180ebb7 | 266 | //pc.printf ("controlSumSet1!=controlSumSet2 \r\n"); |
Aleksk | 6:fe0a7180ebb7 | 267 | goto endParsing; //пропускаем парсинг |
Aleksk | 6:fe0a7180ebb7 | 268 | } |
Aleksk | 6:fe0a7180ebb7 | 269 | //*********присваиваем проверенные значения глобальным переменным*********** |
Aleksk | 6:fe0a7180ebb7 | 270 | strcpy(trueSource2,Source); //копировать из Source в trueSource2 |
Aleksk | 6:fe0a7180ebb7 | 271 | if (numSet_==0) { //при старте с пустым номером не изменяем уставки и не пишем в EEPROM |
Aleksk | 6:fe0a7180ebb7 | 272 | goto endParsing; //пропускаем парсинг |
Aleksk | 6:fe0a7180ebb7 | 273 | } else { |
Aleksk | 6:fe0a7180ebb7 | 274 | numSet=numSet_; |
Aleksk | 6:fe0a7180ebb7 | 275 | anySet=anySet_; |
Aleksk | 6:fe0a7180ebb7 | 276 | } |
Aleksk | 0:f2aaa8c6decf | 277 | |
Aleksk | 6:fe0a7180ebb7 | 278 | switch ( numSet ) { |
Aleksk | 6:fe0a7180ebb7 | 279 | case 1: // это двоеточие |
Aleksk | 6:fe0a7180ebb7 | 280 | |
Aleksk | 6:fe0a7180ebb7 | 281 | plotter.printf("1 Valve1=%d\r\n",anySet); |
Aleksk | 6:fe0a7180ebb7 | 282 | break; |
Aleksk | 6:fe0a7180ebb7 | 283 | case 2: |
Aleksk | 6:fe0a7180ebb7 | 284 | plotter.printf("2 Valve2=%d\r\n",anySet); |
Aleksk | 6:fe0a7180ebb7 | 285 | break; |
Aleksk | 6:fe0a7180ebb7 | 286 | case 3: |
Aleksk | 6:fe0a7180ebb7 | 287 | plotter.printf("3 Valve3,4=%d\r\n",anySet); |
Aleksk | 6:fe0a7180ebb7 | 288 | break; |
Aleksk | 6:fe0a7180ebb7 | 289 | case 4: |
Aleksk | 6:fe0a7180ebb7 | 290 | plotter.printf("4 Compressor=%d\r\n",anySet ); |
Aleksk | 6:fe0a7180ebb7 | 291 | break; |
Aleksk | 6:fe0a7180ebb7 | 292 | case 10: |
Aleksk | 6:fe0a7180ebb7 | 293 | Pd_eeprom = anySet; |
Aleksk | 6:fe0a7180ebb7 | 294 | plotter.printf( "10 Pd_eeprom=%d\r\n",anySet ); |
Aleksk | 6:fe0a7180ebb7 | 295 | break; |
Aleksk | 6:fe0a7180ebb7 | 296 | case 11: |
Aleksk | 6:fe0a7180ebb7 | 297 | frequencyValve1_eeprom = anySet; |
Aleksk | 6:fe0a7180ebb7 | 298 | plotter.printf( "11 frequencyValve1_eeprom=%d\r\n",anySet ); |
Aleksk | 6:fe0a7180ebb7 | 299 | break; |
Aleksk | 6:fe0a7180ebb7 | 300 | case 12: |
Aleksk | 6:fe0a7180ebb7 | 301 | frequencyValve2_eeprom = anySet; |
Aleksk | 6:fe0a7180ebb7 | 302 | plotter.printf( "12 frequencyValve2_eeprom=%d\r\n",anySet ); |
Aleksk | 6:fe0a7180ebb7 | 303 | break; |
Aleksk | 6:fe0a7180ebb7 | 304 | case 13: |
Aleksk | 6:fe0a7180ebb7 | 305 | WL01_eeprom = anySet; |
Aleksk | 6:fe0a7180ebb7 | 306 | plotter.printf( "13 WL01_eeprom=%d\r\n",anySet ); |
Aleksk | 6:fe0a7180ebb7 | 307 | break; |
Aleksk | 6:fe0a7180ebb7 | 308 | case 14: |
Aleksk | 6:fe0a7180ebb7 | 309 | WL99_eeprom = anySet; |
Aleksk | 6:fe0a7180ebb7 | 310 | plotter.printf( "14 WL99_eeprom=%d\r\n",anySet ); |
Aleksk | 6:fe0a7180ebb7 | 311 | break; |
Aleksk | 6:fe0a7180ebb7 | 312 | case 18: |
Aleksk | 6:fe0a7180ebb7 | 313 | T_1 = anySet; |
Aleksk | 6:fe0a7180ebb7 | 314 | plotter.printf( "18 T_1=%d\r\n",anySet ); |
Aleksk | 6:fe0a7180ebb7 | 315 | break; |
Aleksk | 6:fe0a7180ebb7 | 316 | case 19: |
Aleksk | 6:fe0a7180ebb7 | 317 | T_2 = anySet; |
Aleksk | 6:fe0a7180ebb7 | 318 | plotter.printf( "19 T_2=%d\r\n",anySet ); |
Aleksk | 6:fe0a7180ebb7 | 319 | break; |
Aleksk | 6:fe0a7180ebb7 | 320 | default: |
Aleksk | 6:fe0a7180ebb7 | 321 | plotter.printf( "Wrong case.\r\n" ); |
Aleksk | 6:fe0a7180ebb7 | 322 | } |
Aleksk | 6:fe0a7180ebb7 | 323 | |
Aleksk | 6:fe0a7180ebb7 | 324 | |
Aleksk | 6:fe0a7180ebb7 | 325 | |
Aleksk | 6:fe0a7180ebb7 | 326 | |
Aleksk | 6:fe0a7180ebb7 | 327 | |
Aleksk | 6:fe0a7180ebb7 | 328 | |
Aleksk | 6:fe0a7180ebb7 | 329 | |
Aleksk | 6:fe0a7180ebb7 | 330 | |
Aleksk | 6:fe0a7180ebb7 | 331 | flag_comand2_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок |
Aleksk | 6:fe0a7180ebb7 | 332 | //========Конец блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM =================== |
Aleksk | 6:fe0a7180ebb7 | 333 | |
Aleksk | 0:f2aaa8c6decf | 334 | endParsing: |
Aleksk | 0:f2aaa8c6decf | 335 | |
Aleksk | 0:f2aaa8c6decf | 336 | |
Aleksk | 0:f2aaa8c6decf | 337 | pc.attach(&onDataReceived, Serial::RxIrq); // reattach interrupt - переподключение прерывания перед выходом из функции |
Aleksk | 0:f2aaa8c6decf | 338 | } |
Aleksk | 0:f2aaa8c6decf | 339 | //______________________________________________________________________________ |
Aleksk | 0:f2aaa8c6decf | 340 | void onDataReceived() { |
Aleksk | 0:f2aaa8c6decf | 341 | pc.attach(nullptr, Serial::RxIrq); // detach interrupt |
Aleksk | 0:f2aaa8c6decf | 342 | queue->call(read_serial); // process in a non ISR context - переход к функции приема строки - |
Aleksk | 0:f2aaa8c6decf | 343 | } // - в статусе отключенного прерывания (учим указатели!) |
Aleksk | 0:f2aaa8c6decf | 344 | //______________________________________________________________________________ |
Aleksk | 5:bb595cde0c82 | 345 | void auto_set () { //подпрограмма управления компрессором |
Aleksk | 5:bb595cde0c82 | 346 | |
Aleksk | 6:fe0a7180ebb7 | 347 | digital_6.write(flag_compressor); //включение-выкючение компрессора |
Aleksk | 5:bb595cde0c82 | 348 | |
Aleksk | 0:f2aaa8c6decf | 349 | } |
Aleksk | 0:f2aaa8c6decf | 350 | //***************************************************************************** |
Aleksk | 0:f2aaa8c6decf | 351 | //***************************************************************************** |
Aleksk | 0:f2aaa8c6decf | 352 | |
Aleksk | 0:f2aaa8c6decf | 353 | int main() { |
Aleksk | 1:1d4ec28f17c4 | 354 | |
Aleksk | 0:f2aaa8c6decf | 355 | pc.attach(&onDataReceived, Serial::RxIrq); |
Aleksk | 6:fe0a7180ebb7 | 356 | int time, time_2, time_3, valve1, valve2, countValve1=0, countValve2=0, temp_valueSensor; |
Aleksk | 0:f2aaa8c6decf | 357 | int frequencyValve1, frequencyValve2; |
Aleksk | 4:c34b84bfa2fb | 358 | 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 | 359 | digital_4.write(0); //valve1 off; |
Aleksk | 4:c34b84bfa2fb | 360 | digital_7.write(0); //valve2 off; |
Aleksk | 5:bb595cde0c82 | 361 | digital_5.write(0); //valve3,4 off; |
Aleksk | 5:bb595cde0c82 | 362 | digital_6.write(0); //выключение компрессора |
Aleksk | 2:8230a5a4cc13 | 363 | load_EEPROM (); //загрузка уставок из EEPROM |
Aleksk | 6:fe0a7180ebb7 | 364 | if (value >= 1 && delta_value >= 1 && flag_compressor < 2 && flag_stopRegulator < 2 && num_chan < 6) { |
Aleksk | 2:8230a5a4cc13 | 365 | flag_stopRegulator=false; //уставки из EEPROM похожи на правду, разрешаем работу регулятора |
Aleksk | 2:8230a5a4cc13 | 366 | } else { |
Aleksk | 2:8230a5a4cc13 | 367 | flag_stopRegulator = true; //флаг остановки установлен |
Aleksk | 2:8230a5a4cc13 | 368 | pc.printf("Regulator stopped, error in EEPROM \r\n"); |
Aleksk | 2:8230a5a4cc13 | 369 | } |
Aleksk | 2:8230a5a4cc13 | 370 | |
Aleksk | 1:1d4ec28f17c4 | 371 | pc.printf("Program started \r\n"); |
Aleksk | 2:8230a5a4cc13 | 372 | Watchdog &watchdog = Watchdog::get_instance(); |
Aleksk | 2:8230a5a4cc13 | 373 | watchdog.start(100); //WDlimit = 100 ms |
Aleksk | 0:f2aaa8c6decf | 374 | timer.start(); |
Aleksk | 6:fe0a7180ebb7 | 375 | timer_2.start(); |
Aleksk | 6:fe0a7180ebb7 | 376 | timer_3.start(); |
Aleksk | 1:1d4ec28f17c4 | 377 | |
Aleksk | 0:f2aaa8c6decf | 378 | while (true){ //бесконечный цикл |
Aleksk | 2:8230a5a4cc13 | 379 | // kick watchdog regularly within provided timeout (сброс собаки в начало счёта) |
Aleksk | 2:8230a5a4cc13 | 380 | watchdog.kick(); |
Aleksk | 4:c34b84bfa2fb | 381 | |
Aleksk | 6:fe0a7180ebb7 | 382 | if (flag_stopRegulator == 1){ event_N = 255;} //сброс события через кнопку Стоп в программе оператора |
Aleksk | 6:fe0a7180ebb7 | 383 | |
Aleksk | 6:fe0a7180ebb7 | 384 | if (flag_stopRegulator == 1 || event_N < 255) { //полный останов регулятора и принудительное запирание всех клапанов |
Aleksk | 4:c34b84bfa2fb | 385 | digital_4.write(0); //valve1 off |
Aleksk | 4:c34b84bfa2fb | 386 | digital_7.write(0); //valve2 off |
Aleksk | 4:c34b84bfa2fb | 387 | digital_5.write(0); //valve3,4 off |
Aleksk | 5:bb595cde0c82 | 388 | //digital_6.write(0); //выключение компрессора |
Aleksk | 4:c34b84bfa2fb | 389 | } |
Aleksk | 4:c34b84bfa2fb | 390 | |
Aleksk | 1:1d4ec28f17c4 | 391 | if (flag_comand_detected) { //пришла правильная командная строка |
Aleksk | 6:fe0a7180ebb7 | 392 | |
Aleksk | 6:fe0a7180ebb7 | 393 | 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", |
Aleksk | 6:fe0a7180ebb7 | 394 | value,delta_value,flag_compressor,flag_stopRegulator, |
Aleksk | 4:c34b84bfa2fb | 395 | sensor_value,frequencyValve1,frequencyValve2, |
Aleksk | 4:c34b84bfa2fb | 396 | WL,Pb,Pw1,Pw2,Pd, |
Aleksk | 6:fe0a7180ebb7 | 397 | digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read()); //передача текущих значений в РС |
Aleksk | 4:c34b84bfa2fb | 398 | |
Aleksk | 4:c34b84bfa2fb | 399 | // pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n", |
Aleksk | 6:fe0a7180ebb7 | 400 | // value,delta_value,flag_compressor,flag_stopRegulator, |
Aleksk | 4:c34b84bfa2fb | 401 | // sensor_value,frequencyValve1,frequencyValve2); //передача текущих значений в РС |
Aleksk | 4:c34b84bfa2fb | 402 | |
Aleksk | 0:f2aaa8c6decf | 403 | //pc.printf("%s\r\n",trueSource); //эхо для отладки канала связи |
Aleksk | 4:c34b84bfa2fb | 404 | flag_comand_detected = false; //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта |
Aleksk | 4:c34b84bfa2fb | 405 | //flag_stopRegulator = false; //сброс флага, регулятор ждет пока не будет сброшен этот флаг |
Aleksk | 0:f2aaa8c6decf | 406 | //plotter.printf("$%d %d %d %d %d;\r\n", digital_4.read()*100-110, |
Aleksk | 0:f2aaa8c6decf | 407 | // digital_7.read()*100-220, value, sensor_value, time ); //печать в плоттер в другой СОМ-порт |
Aleksk | 2:8230a5a4cc13 | 408 | if (strcmp(trueSourceOld,trueSource) != 0) { //функция возвращает ноль если командные строки совпадают |
Aleksk | 2:8230a5a4cc13 | 409 | save_EEPROM (); //пишем в память уставки отличные от старых |
Aleksk | 2:8230a5a4cc13 | 410 | load_EEPROM (); |
Aleksk | 2:8230a5a4cc13 | 411 | } |
Aleksk | 2:8230a5a4cc13 | 412 | |
Aleksk | 2:8230a5a4cc13 | 413 | strcpy(trueSourceOld,trueSource); //копировать из trueSource в trueSourceOld |
Aleksk | 0:f2aaa8c6decf | 414 | } |
Aleksk | 4:c34b84bfa2fb | 415 | |
Aleksk | 4:c34b84bfa2fb | 416 | if (flag_zerostart) { //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске) |
Aleksk | 6:fe0a7180ebb7 | 417 | 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", |
Aleksk | 6:fe0a7180ebb7 | 418 | value,delta_value,flag_compressor,flag_stopRegulator, |
Aleksk | 4:c34b84bfa2fb | 419 | sensor_value,frequencyValve1,frequencyValve2, |
Aleksk | 4:c34b84bfa2fb | 420 | WL,Pb,Pw1,Pw2,Pd, |
Aleksk | 6:fe0a7180ebb7 | 421 | digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read()); //передача текущих значений в РС |
Aleksk | 4:c34b84bfa2fb | 422 | flag_zerostart = false; |
Aleksk | 4:c34b84bfa2fb | 423 | } |
Aleksk | 4:c34b84bfa2fb | 424 | |
Aleksk | 4:c34b84bfa2fb | 425 | if (counter_cycle1 < 10 ) { |
Aleksk | 4:c34b84bfa2fb | 426 | float raw_value_0 = analog_value_0.read(); // Чтение аналогового входа 0 (0.0 to 1.0 = full ADC диапазон) |
Aleksk | 4:c34b84bfa2fb | 427 | raw_value_sum_0 = raw_value_sum_0 + raw_value_0; |
Aleksk | 4:c34b84bfa2fb | 428 | float raw_value_1 = analog_value_1.read(); // Чтение аналогового входа 1 (0.0 to 1.0 = full ADC диапазон) |
Aleksk | 4:c34b84bfa2fb | 429 | raw_value_sum_1 = raw_value_sum_1 + raw_value_1; |
Aleksk | 4:c34b84bfa2fb | 430 | float raw_value_2 = analog_value_2.read(); // Чтение аналогового входа 2 (0.0 to 1.0 = full ADC диапазон) |
Aleksk | 4:c34b84bfa2fb | 431 | raw_value_sum_2 = raw_value_sum_2 + raw_value_2; |
Aleksk | 4:c34b84bfa2fb | 432 | } |
Aleksk | 4:c34b84bfa2fb | 433 | if (counter_cycle1 >= 10 ) { |
Aleksk | 4:c34b84bfa2fb | 434 | float raw_value_3 = analog_value_3.read(); // Чтение аналогового входа 3 (0.0 to 1.0 = full ADC диапазон) |
Aleksk | 4:c34b84bfa2fb | 435 | raw_value_sum_3 = raw_value_sum_3 + raw_value_3; |
Aleksk | 4:c34b84bfa2fb | 436 | float raw_value_4 = analog_value_4.read(); // Чтение аналогового входа 4 (0.0 to 1.0 = full ADC диапазон) |
Aleksk | 4:c34b84bfa2fb | 437 | raw_value_sum_4 = raw_value_sum_4 + raw_value_4; |
Aleksk | 4:c34b84bfa2fb | 438 | //float raw_value_5 = analog_value_5.read(); // Чтение аналогового входа 5 (0.0 to 1.0 = full ADC диапазон) |
Aleksk | 4:c34b84bfa2fb | 439 | //raw_value_sum_5 = raw_value_sum_5 + raw_value_5; |
Aleksk | 4:c34b84bfa2fb | 440 | } |
Aleksk | 0:f2aaa8c6decf | 441 | |
Aleksk | 4:c34b84bfa2fb | 442 | if (counter_cycle1 >= 19 ) { |
Aleksk | 0:f2aaa8c6decf | 443 | counter_cycle1=0; |
Aleksk | 4:c34b84bfa2fb | 444 | |
Aleksk | 4:c34b84bfa2fb | 445 | WL = raw_value_sum_0/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением |
Aleksk | 4:c34b84bfa2fb | 446 | raw_value_sum_0 = 0 ; |
Aleksk | 4:c34b84bfa2fb | 447 | sensor_value = raw_value_sum_1/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением |
Aleksk | 4:c34b84bfa2fb | 448 | raw_value_sum_1 = 0 ; |
Aleksk | 4:c34b84bfa2fb | 449 | Pb = raw_value_sum_2/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением |
Aleksk | 4:c34b84bfa2fb | 450 | raw_value_sum_2 = 0 ; |
Aleksk | 4:c34b84bfa2fb | 451 | Pw1 = raw_value_sum_3/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением |
Aleksk | 4:c34b84bfa2fb | 452 | raw_value_sum_3 = 0 ; |
Aleksk | 5:bb595cde0c82 | 453 | Pw2 = raw_value_sum_4/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением |
Aleksk | 4:c34b84bfa2fb | 454 | raw_value_sum_4 = 0 ; |
Aleksk | 4:c34b84bfa2fb | 455 | //Pd = raw_value_sum_5/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением |
Aleksk | 4:c34b84bfa2fb | 456 | //raw_value_sum_5 = 0 ; |
Aleksk | 6:fe0a7180ebb7 | 457 | Pd = abs(sensor_value - Pw1); |
Aleksk | 4:c34b84bfa2fb | 458 | |
Aleksk | 5:bb595cde0c82 | 459 | if (num_chan == 1) {temp_valueSensor = sensor_value;} //теперь источник сигнала для регулятора - канал 1 |
Aleksk | 5:bb595cde0c82 | 460 | if (num_chan == 3) {temp_valueSensor = Pw1;} //теперь источник сигнала для регулятора - канал 3 |
Aleksk | 5:bb595cde0c82 | 461 | if (num_chan == 4) {temp_valueSensor = Pw2;} //теперь источник сигнала для регулятора - канал 4 |
Aleksk | 5:bb595cde0c82 | 462 | |
Aleksk | 6:fe0a7180ebb7 | 463 | if (flag_stopRegulator == 0 && event_N == 255) { // можно запускать регулятор |
Aleksk | 4:c34b84bfa2fb | 464 | digital_5.write(1); //valve3,4 открыты - подключаемся к контуру охлаждения макета |
Aleksk | 1:1d4ec28f17c4 | 465 | //--------------regulator begin----------------------- |
Aleksk | 5:bb595cde0c82 | 466 | if (temp_valueSensor > value + delta_value) { |
Aleksk | 1:1d4ec28f17c4 | 467 | valve2 = digital_7.read(); |
Aleksk | 1:1d4ec28f17c4 | 468 | digital_7.write(1); //valve2 on; |
Aleksk | 1:1d4ec28f17c4 | 469 | if (valve2 < digital_7.read()) {countValve2++;} //счётчик передних фронтов напряжения (срабатывания клапана 2) |
Aleksk | 1:1d4ec28f17c4 | 470 | digital_4.write(0); //valve1 off; |
Aleksk | 5:bb595cde0c82 | 471 | } else if (temp_valueSensor < value - delta_value) { |
Aleksk | 1:1d4ec28f17c4 | 472 | valve1 = digital_4.read(); |
Aleksk | 1:1d4ec28f17c4 | 473 | digital_4.write(1); //valve1 on; |
Aleksk | 1:1d4ec28f17c4 | 474 | if (valve1 < digital_4.read()) {countValve1++;} //счётчик передних фронтов напряжения (срабатывания клапана 1) |
Aleksk | 1:1d4ec28f17c4 | 475 | digital_7.write(0); //valve2 off; |
Aleksk | 1:1d4ec28f17c4 | 476 | } else { |
Aleksk | 1:1d4ec28f17c4 | 477 | digital_4.write(0); //valve1 off; |
Aleksk | 1:1d4ec28f17c4 | 478 | digital_7.write(0); //valve2 off; |
Aleksk | 1:1d4ec28f17c4 | 479 | } |
Aleksk | 1:1d4ec28f17c4 | 480 | //--------------regulator end------------------------- |
Aleksk | 0:f2aaa8c6decf | 481 | } |
Aleksk | 0:f2aaa8c6decf | 482 | time=timer.read_us(); |
Aleksk | 0:f2aaa8c6decf | 483 | if (time > 1000000) { |
Aleksk | 0:f2aaa8c6decf | 484 | timer.reset(); //начало счёта времени |
Aleksk | 0:f2aaa8c6decf | 485 | frequencyValve1 = countValve1; //частота (Гц) срабатывания клапана 1 |
Aleksk | 0:f2aaa8c6decf | 486 | frequencyValve2 = countValve2; //частота (Гц) срабатывания клапана 2 |
Aleksk | 0:f2aaa8c6decf | 487 | countValve1=0; |
Aleksk | 0:f2aaa8c6decf | 488 | countValve2=0; |
Aleksk | 0:f2aaa8c6decf | 489 | } |
Aleksk | 6:fe0a7180ebb7 | 490 | //--------------------==_ALARM_scope_Begin==---------------------- |
Aleksk | 6:fe0a7180ebb7 | 491 | if (Pd >= Pd_eeprom) { |
Aleksk | 6:fe0a7180ebb7 | 492 | event_N = 0; |
Aleksk | 6:fe0a7180ebb7 | 493 | } |
Aleksk | 6:fe0a7180ebb7 | 494 | if (frequencyValve1 >= frequencyValve1_eeprom) { |
Aleksk | 6:fe0a7180ebb7 | 495 | event_N = 1; |
Aleksk | 6:fe0a7180ebb7 | 496 | } |
Aleksk | 6:fe0a7180ebb7 | 497 | if (frequencyValve2 >= frequencyValve2_eeprom) { |
Aleksk | 6:fe0a7180ebb7 | 498 | event_N = 2; |
Aleksk | 6:fe0a7180ebb7 | 499 | } |
Aleksk | 6:fe0a7180ebb7 | 500 | if (WL <= WL01_eeprom) { |
Aleksk | 6:fe0a7180ebb7 | 501 | event_N = 3; |
Aleksk | 6:fe0a7180ebb7 | 502 | } |
Aleksk | 6:fe0a7180ebb7 | 503 | if (WL >= WL99_eeprom) { |
Aleksk | 6:fe0a7180ebb7 | 504 | event_N = 4; |
Aleksk | 6:fe0a7180ebb7 | 505 | } |
Aleksk | 6:fe0a7180ebb7 | 506 | if (idigital_11.read()==1) { |
Aleksk | 6:fe0a7180ebb7 | 507 | event_N = 5; |
Aleksk | 6:fe0a7180ebb7 | 508 | } |
Aleksk | 6:fe0a7180ebb7 | 509 | if (idigital_12.read()==1) { |
Aleksk | 6:fe0a7180ebb7 | 510 | event_N = 6; |
Aleksk | 6:fe0a7180ebb7 | 511 | } |
Aleksk | 6:fe0a7180ebb7 | 512 | if (idigital_13.read()==1) { |
Aleksk | 6:fe0a7180ebb7 | 513 | event_N = 7; |
Aleksk | 6:fe0a7180ebb7 | 514 | } |
Aleksk | 0:f2aaa8c6decf | 515 | |
Aleksk | 6:fe0a7180ebb7 | 516 | //-----------------Valve1 open time---------------------- |
Aleksk | 6:fe0a7180ebb7 | 517 | if (digital_4.read() == 0) { |
Aleksk | 6:fe0a7180ebb7 | 518 | timer_2.reset(); |
Aleksk | 6:fe0a7180ebb7 | 519 | time_2 = 0; |
Aleksk | 6:fe0a7180ebb7 | 520 | } else { |
Aleksk | 6:fe0a7180ebb7 | 521 | time_2 = timer_2.read_ms(); |
Aleksk | 6:fe0a7180ebb7 | 522 | } |
Aleksk | 6:fe0a7180ebb7 | 523 | if (time_2 >= T_1) { |
Aleksk | 6:fe0a7180ebb7 | 524 | event_N = 8; |
Aleksk | 6:fe0a7180ebb7 | 525 | } |
Aleksk | 6:fe0a7180ebb7 | 526 | //-----------------Valve2 open time---------------------- |
Aleksk | 6:fe0a7180ebb7 | 527 | if (digital_7.read() == 0) { |
Aleksk | 6:fe0a7180ebb7 | 528 | timer_3.reset(); |
Aleksk | 6:fe0a7180ebb7 | 529 | time_3 = 0; |
Aleksk | 6:fe0a7180ebb7 | 530 | } else { |
Aleksk | 6:fe0a7180ebb7 | 531 | time_3 = timer_3.read_ms(); |
Aleksk | 6:fe0a7180ebb7 | 532 | } |
Aleksk | 6:fe0a7180ebb7 | 533 | if (time_3 >= T_2) { |
Aleksk | 6:fe0a7180ebb7 | 534 | event_N = 9; |
Aleksk | 6:fe0a7180ebb7 | 535 | } |
Aleksk | 6:fe0a7180ebb7 | 536 | //--------------------==_ALARM_scope_End==---------------------- |
Aleksk | 6:fe0a7180ebb7 | 537 | |
Aleksk | 6:fe0a7180ebb7 | 538 | |
Aleksk | 6:fe0a7180ebb7 | 539 | auto_set(); //включение-выкючение компрессора через flag_compressor |
Aleksk | 6:fe0a7180ebb7 | 540 | //led = !led; //гасим/зажигаем индикаторный светодиод |
Aleksk | 0:f2aaa8c6decf | 541 | } |
Aleksk | 0:f2aaa8c6decf | 542 | ThisThread::sleep_for(1); // (mc) правильный оператор задержки для mbed5 |
Aleksk | 0:f2aaa8c6decf | 543 | counter_cycle1++; |
Aleksk | 0:f2aaa8c6decf | 544 | |
Aleksk | 0:f2aaa8c6decf | 545 | } |
Aleksk | 0:f2aaa8c6decf | 546 | } |