On the i2c bus, Arduino Nano with address 2, transmits the weight value with a resolution of 1 kg.

Dependencies:   _24LCXXX

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?

UserRevisionLine numberNew 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 }