The weight is now transmitted in Newtons. For this, two bytes are transferred over the i2c bus instead of one.

Dependencies:   _24LCXXX

Committer:
Aleksk
Date:
Fri Oct 15 10:15:22 2021 +0000
Revision:
12:de8c39bf5da3
Parent:
11:86a18c130515
The weight is now transmitted in Newtons. For this, two bytes are transferred over the i2c bus instead of one.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Aleksk 12:de8c39bf5da3 1 // 11.10.2021 Продолжение (клон )mbed-os5-press22
Aleksk 12:de8c39bf5da3 2 //19. Теперь вес принимается по шине i2c в Ньютонах, как на дисплее динамометра.
Aleksk 12:de8c39bf5da3 3 //18. По шине i2c Arduino Nano с адресом 2, передает значение веса с дискретностью 1 кг, приём происходит раз в секунду, используется timer.
Aleksk 12:de8c39bf5da3 4 //17. digital pin 11, pin 12 as an input концевики теперь нормально замкнутые.
Aleksk 12:de8c39bf5da3 5 //16. Вернул timer_4. Теперь он периодически открывает выпускной клапан для контроля утечек воды.
Aleksk 12:de8c39bf5da3 6 //15. Вместо pc.printf("Reset ALARM \r\n") теперь plotter.printf("Reset ALARM \r\n") это нужно для парсера программы Setup_EEPROM.
Aleksk 12:de8c39bf5da3 7 //14. Удалена команда pc.printf, посылающая пустую строку раз в секунду и связанный с ней timer_4, т.к. изменена программа оператора (Loc()).
Aleksk 12:de8c39bf5da3 8 //13. Суммирование значений каналов А0 А1 А2 было 9 раз, исправлено на 10.
Aleksk 12:de8c39bf5da3 9 //12. Передаваемые через pc.printf сообщения в РС дополнены контрольными суммами для увеличения надёжности связи.
Aleksk 12:de8c39bf5da3 10 //11. Введена команда pc.printf, посылающая пустую строку раз в секунду, на случай потери (порчи )данных при пересылке и
Aleksk 9:6bd6ac6ca7d4 11 // возможного зависания программы оператора при ожидании символа из serial порта (для этого добавлен timer_4).
Aleksk 12:de8c39bf5da3 12 //10. Значения уставок EEPROM2 выводяться в pc.print в специальной строке с текущими данными диагностики.
Aleksk 12:de8c39bf5da3 13 //9. Сделан дополнительный блок в парсере для декодирования приходящих аварийных уставок, они пишутся в EEPROM2.
Aleksk 12:de8c39bf5da3 14 //8. Сделан timer_2 для отсчёта времени открытого состояния вентиля 1.
Aleksk 12:de8c39bf5da3 15 // Сделан timer_3 для отсчёта времени открытого состояния вентиля 2.
Aleksk 12:de8c39bf5da3 16 //7. Подключены цифровые входы D11,D12,D13. Реализованы условия остановки по 10 аварийным событиям.
Aleksk 12:de8c39bf5da3 17 //6. Реализован сброс события (event_N = 255) через кнопку Стоп в программе оператора .
Aleksk 12:de8c39bf5da3 18 //5. Принимается флаг от кнопки Стоп - полной остановки регулятора - закрытие всех 4-х клапанов и передача статуса кнопки в программу оператора.
Aleksk 12:de8c39bf5da3 19 // Принимается флаг от кнопок включения - выключения компрессора, - идет команда на дискретный выход digital_6(PB_10)
Aleksk 12:de8c39bf5da3 20 //4. Принимается новая уставка num_chan - переключение номера активного измерительного канала для обратной связи регулятора.
Aleksk 12:de8c39bf5da3 21 // эта уставка, как и все остальные, пишется в EEPROM.
Aleksk 12:de8c39bf5da3 22 //3. Включены все шесть аналоговых входа, читаются пять.
Aleksk 12:de8c39bf5da3 23 //2. При получении командной строки с нулевой суммой, по новому флагу flag_zerostart, передаётся в сериал текущие уставки и величины
Aleksk 12:de8c39bf5da3 24 // (важно для старта программы на PC), эти нулевые уставки не вводятся в регулятор и не записываются в EEPROM.
Aleksk 12:de8c39bf5da3 25 //1. Сторожевой таймер, истекает через 100мс.
Aleksk 4:c34b84bfa2fb 26 //
Aleksk 4:c34b84bfa2fb 27
Aleksk 0:f2aaa8c6decf 28 #include "mbed.h"
Aleksk 2:8230a5a4cc13 29 #include "_24LCXXX.h"
Aleksk 2:8230a5a4cc13 30
Aleksk 2:8230a5a4cc13 31 I2C i2c(PB_9,PB_8); // sda, scl
Aleksk 2:8230a5a4cc13 32 _24LCXXX eeprom(&i2c, 0x50);
Aleksk 11:86a18c130515 33 const int addr7bit = 0x02; // 7 bit I2C address slave Arduino_Nano
Aleksk 11:86a18c130515 34 const int addr8bit = 0x02 << 1; // 8bit I2C address, 0x90
Aleksk 0:f2aaa8c6decf 35
Aleksk 4:c34b84bfa2fb 36 AnalogIn analog_value_0(A0); //подключение аналогового входа A0
Aleksk 4:c34b84bfa2fb 37 AnalogIn analog_value_1(A1); //подключение аналогового входа A1
Aleksk 4:c34b84bfa2fb 38 AnalogIn analog_value_2(A2); //подключение аналогового входа A2
Aleksk 4:c34b84bfa2fb 39 AnalogIn analog_value_3(A3); //подключение аналогового входа A3
Aleksk 4:c34b84bfa2fb 40 AnalogIn analog_value_4(A4); //подключение аналогового входа A4
Aleksk 4:c34b84bfa2fb 41 AnalogIn analog_value_5(A5); //подключение аналогового входа A5
Aleksk 6:fe0a7180ebb7 42 //DigitalOut led(LED1);
Aleksk 0:f2aaa8c6decf 43 DigitalOut digital_4(PB_5); //initialize digital pin 4 as an output (high pressure air bulb charge).
Aleksk 4:c34b84bfa2fb 44 DigitalOut digital_7(PA_8); //initialize digital pin 7 as an output. (high pressure air bulb discharge)
Aleksk 4:c34b84bfa2fb 45 DigitalOut digital_5(PB_4); //initialize digital pin 5 as an output (valve3,4)
Aleksk 4:c34b84bfa2fb 46 DigitalOut digital_6(PB_10); //initialize digital pin 6 as an output (compressor on/off)
Aleksk 6:fe0a7180ebb7 47 DigitalIn idigital_11(PA_7); //initialize digital pin 11 as an input концевик при растяжении сильфона
Aleksk 6:fe0a7180ebb7 48 DigitalIn idigital_12(PA_6); //initialize digital pin 12 as an input концевик при сжатии сильфона
Aleksk 7:97881cd71b31 49 DigitalIn idigital_13(PA_5); //initialize digital pin 13 as an input внутрь опрессовщика попала вода
Aleksk 4:c34b84bfa2fb 50
Aleksk 4:c34b84bfa2fb 51 RawSerial plotter(USBTX, USBRX, 115200); // tx, rx for F411RE port for serial_plotter and temporary messages
Aleksk 4:c34b84bfa2fb 52 RawSerial pc(PA_9, PA_10, 115200); // tx, rx for F411RE port for command string distance PC
Aleksk 0:f2aaa8c6decf 53 EventQueue *queue = mbed_event_queue(); //инициализация очереди событий RTOS mbed5
Aleksk 6:fe0a7180ebb7 54 Timer timer; //инициализация таймера для определения частот переключений вентилей 1 и 2
Aleksk 6:fe0a7180ebb7 55 Timer timer_2; //инициализация таймера 2 для отсчёта времени открытого состояния вентиля 1
Aleksk 6:fe0a7180ebb7 56 Timer timer_3; //инициализация таймера 3 для отсчёта времени открытого состояния вентиля 2
Aleksk 10:b6de15a30716 57 Timer timer_4; //инициализация таймера 4 для отсчёта периода времени между контрольными открываниями вентиля 2
Aleksk 6:fe0a7180ebb7 58 //========УСТАВКИ_1 EEPROM========
Aleksk 5:bb595cde0c82 59 uint8_t delta_value = 0; //set delta pressure 1...99
Aleksk 6:fe0a7180ebb7 60 uint8_t flag_compressor = 0; //флаг компрессора. При 0 - выключение компрессора, при 1 - включение компрессора
Aleksk 6:fe0a7180ebb7 61 uint8_t flag_stopRegulator = 0; //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов
Aleksk 5:bb595cde0c82 62 uint8_t num_chan = 1; //set номер аналогового канала 0...5 (1-as default = Pa)
Aleksk 4:c34b84bfa2fb 63 int value = 0; //set begin value "pressure" 1...3300
Aleksk 6:fe0a7180ebb7 64 //========УСТАВКИ_2 EEPROM========
Aleksk 6:fe0a7180ebb7 65 int Pd_eeprom = 2000; // mV, максимальное дифференциальное давление (беззнаковое)
Aleksk 6:fe0a7180ebb7 66 int frequencyValve1_eeprom = 5; // Гц, максимальная частота переключений клапана 1
Aleksk 6:fe0a7180ebb7 67 int frequencyValve2_eeprom = 5; // Гц, максимальная частота переключений клапана 2
Aleksk 6:fe0a7180ebb7 68 int WL01_eeprom = 10; // mV, минимальный вес опрессовщика
Aleksk 6:fe0a7180ebb7 69 int WL99_eeprom = 2000; // mV, максимальный вес опрессовщика
Aleksk 6:fe0a7180ebb7 70 int T_1 = 4000; // ms, максимальное время открытого состояния для клапана 1
Aleksk 6:fe0a7180ebb7 71 int T_2 = 4000; // ms, максимальное время открытого состояния для клапана 2
Aleksk 6:fe0a7180ebb7 72 uint8_t event_N = 255; // номер события , по умолчанию 255 - событий нет
Aleksk 7:97881cd71b31 73 uint8_t flag_stopRegulatorEEPROM = 0; //если 1 остановка регулятора, когда вручную управляют клапанами через программу SetUp_EEPROM
Aleksk 10:b6de15a30716 74 int openTimeV2_H2O = 2; // ms, Время открытого состояния вентиля V2 для датчика влаги должно быть меньше WDlimit=100ms
Aleksk 10:b6de15a30716 75 int periodV2_H2O = 10000; // ms, Период открывания вентиля V2 для датчика влаги
Aleksk 10:b6de15a30716 76
Aleksk 6:fe0a7180ebb7 77 //======temporary set=====
Aleksk 6:fe0a7180ebb7 78 int numSet, anySet;
Aleksk 6:fe0a7180ebb7 79 //=================================
Aleksk 0:f2aaa8c6decf 80 int value_auto=250 ; //set begin value auto "pressure"
Aleksk 12:de8c39bf5da3 81 int WL = 0; // WL - вес опресовщика
Aleksk 4:c34b84bfa2fb 82 int sensor_value =0; //напряжение с аналогового входа А1 (Pa - текущее давление)
Aleksk 4:c34b84bfa2fb 83 int Pb = 0; //напряжение с аналогового входа А2 (Pb - давление в баллоне)
Aleksk 4:c34b84bfa2fb 84 int Pw1 = 0; //напряжение с аналогового входа А3 (Pw1 - давление воды на входе опрессовщика)
Aleksk 4:c34b84bfa2fb 85 int Pw2 = 0; //напряжение с аналогового входа А4 (Pw2 - давление воды в контуре макета)
Aleksk 4:c34b84bfa2fb 86 int Pd = 0; //напряжение с аналогового входа А5 (Pd - дифференциальное давление опресовщика)
Aleksk 2:8230a5a4cc13 87 int counter_cycle1 = 0; //счётчик цикла while(true)
Aleksk 2:8230a5a4cc13 88 int counter_cycle2 = 0; //счётчик внутри функции auto_set
Aleksk 0:f2aaa8c6decf 89 int sig = 1; //знак инкримента для автоустаки
Aleksk 6:fe0a7180ebb7 90
Aleksk 0:f2aaa8c6decf 91 // FIFO_buffer must be full (only char and '\0')
Aleksk 5:bb595cde0c82 92 //#define maxnsym 26 // maximum nbr of symbols FIFO_buffer (вариант без символов окончания)
Aleksk 5:bb595cde0c82 93 #define maxnsym 28 // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче)
Aleksk 5:bb595cde0c82 94 char Source[maxnsym]="$press,1000,25,0,0,1,2050**"; //25 char- string ,весь массив со строкой для поиска 25+1(null terminal)=26
Aleksk 0:f2aaa8c6decf 95 //уставки и контрольная сумма умноженная на два, должны быть больше нуля
Aleksk 0:f2aaa8c6decf 96 char trueSource[maxnsym]; //верифицированная строка для callback
Aleksk 2:8230a5a4cc13 97 char trueSourceOld[maxnsym]; //предыдущая верифицированная строка для callback
Aleksk 6:fe0a7180ebb7 98 char trueSource2[maxnsym]; //верифицированная строка для callback
Aleksk 6:fe0a7180ebb7 99 char trueSource2Old[maxnsym]; //предыдущая верифицированная строка для callback
Aleksk 0:f2aaa8c6decf 100
Aleksk 4:c34b84bfa2fb 101 volatile char chr_a; //в прерываниях переменные должны быть защищены при помощи volatile от оптимизации компилятором
Aleksk 4:c34b84bfa2fb 102 volatile bool flag_comand_detected = false; //если строка декодирована правильно то true
Aleksk 6:fe0a7180ebb7 103 volatile bool flag_comand2_detected = false; //если строка в блоке парсинга уставок eeprom декодирована правильно то true
Aleksk 4:c34b84bfa2fb 104 volatile bool flag_zerostart = false; //если строка декодирована c нулевой контрольной суммой то true
Aleksk 6:fe0a7180ebb7 105 //volatile bool flag_stopRegulator = true; //флаг остановки , закрыть все клапана
Aleksk 2:8230a5a4cc13 106 //_____________________________________________________________________________
Aleksk 2:8230a5a4cc13 107 void save_EEPROM () {
Aleksk 2:8230a5a4cc13 108 int data2;
Aleksk 4:c34b84bfa2fb 109 plotter.printf("EEPROM write------\r\n");
Aleksk 2:8230a5a4cc13 110 eeprom.byte_write(0, delta_value);
Aleksk 6:fe0a7180ebb7 111 eeprom.byte_write(1, flag_compressor);
Aleksk 6:fe0a7180ebb7 112 eeprom.byte_write(2, flag_stopRegulator);
Aleksk 5:bb595cde0c82 113 eeprom.byte_write(3, num_chan);
Aleksk 2:8230a5a4cc13 114 data2 = value;
Aleksk 2:8230a5a4cc13 115 eeprom.nbyte_write( 10, &data2, sizeof(int));
Aleksk 2:8230a5a4cc13 116 }
Aleksk 7:97881cd71b31 117 void save_EEPROM2 () {
Aleksk 7:97881cd71b31 118 int data2;
Aleksk 7:97881cd71b31 119 plotter.printf("EEPROM2 write------\r\n");
Aleksk 7:97881cd71b31 120 eeprom.nbyte_read( 100, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 121 if (data2 != Pd_eeprom) { //записываем в eeprom только изменившиеся значения (одна из семи уставок)
Aleksk 7:97881cd71b31 122 data2 = Pd_eeprom;
Aleksk 7:97881cd71b31 123 eeprom.nbyte_write( 100, &data2, sizeof(int));
Aleksk 7:97881cd71b31 124 }
Aleksk 7:97881cd71b31 125 eeprom.nbyte_read( 110, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 126 if (data2 != frequencyValve1_eeprom){
Aleksk 7:97881cd71b31 127 data2 = frequencyValve1_eeprom;
Aleksk 7:97881cd71b31 128 eeprom.nbyte_write( 110, &data2, sizeof(int));
Aleksk 7:97881cd71b31 129 }
Aleksk 7:97881cd71b31 130 eeprom.nbyte_read( 120, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 131 if (data2 != frequencyValve2_eeprom){
Aleksk 7:97881cd71b31 132 data2 = frequencyValve2_eeprom;
Aleksk 7:97881cd71b31 133 eeprom.nbyte_write( 120, &data2, sizeof(int));
Aleksk 7:97881cd71b31 134 }
Aleksk 7:97881cd71b31 135 eeprom.nbyte_read( 130, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 136 if (data2 != WL01_eeprom){
Aleksk 7:97881cd71b31 137 data2 = WL01_eeprom;
Aleksk 7:97881cd71b31 138 eeprom.nbyte_write( 130, &data2, sizeof(int));
Aleksk 7:97881cd71b31 139 }
Aleksk 7:97881cd71b31 140 eeprom.nbyte_read( 140, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 141 if (data2 != WL99_eeprom){
Aleksk 7:97881cd71b31 142 data2 = WL99_eeprom;
Aleksk 7:97881cd71b31 143 eeprom.nbyte_write( 140, &data2, sizeof(int));
Aleksk 7:97881cd71b31 144 }
Aleksk 7:97881cd71b31 145 eeprom.nbyte_read( 180, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 146 if (data2 != T_1){
Aleksk 7:97881cd71b31 147 data2 = T_1;
Aleksk 7:97881cd71b31 148 eeprom.nbyte_write( 180, &data2, sizeof(int));
Aleksk 7:97881cd71b31 149 }
Aleksk 7:97881cd71b31 150 eeprom.nbyte_read( 190, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 151 if (data2 != T_2){
Aleksk 7:97881cd71b31 152 data2 = T_2;
Aleksk 7:97881cd71b31 153 eeprom.nbyte_write( 190, &data2, sizeof(int));
Aleksk 7:97881cd71b31 154 }
Aleksk 10:b6de15a30716 155 eeprom.nbyte_read( 200, &data2, sizeof(int) );
Aleksk 10:b6de15a30716 156 if (data2 != openTimeV2_H2O){
Aleksk 10:b6de15a30716 157 data2 = openTimeV2_H2O;
Aleksk 10:b6de15a30716 158 eeprom.nbyte_write( 200, &data2, sizeof(int));
Aleksk 10:b6de15a30716 159 }
Aleksk 10:b6de15a30716 160 eeprom.nbyte_read( 210, &data2, sizeof(int) );
Aleksk 10:b6de15a30716 161 if (data2 != periodV2_H2O){
Aleksk 10:b6de15a30716 162 data2 = periodV2_H2O;
Aleksk 10:b6de15a30716 163 eeprom.nbyte_write( 210, &data2, sizeof(int));
Aleksk 10:b6de15a30716 164 }
Aleksk 7:97881cd71b31 165 }
Aleksk 2:8230a5a4cc13 166 //_____________________________________________________________________________
Aleksk 2:8230a5a4cc13 167 void load_EEPROM () {
Aleksk 2:8230a5a4cc13 168 uint8_t data1;
Aleksk 2:8230a5a4cc13 169 int data2;
Aleksk 4:c34b84bfa2fb 170 plotter.printf("EEPROM read------\r\n");
Aleksk 2:8230a5a4cc13 171 eeprom.nbyte_read( 0, &data1, 1 );
Aleksk 4:c34b84bfa2fb 172 plotter.printf("adress 0 =%d \r\n",data1);
Aleksk 2:8230a5a4cc13 173 delta_value=data1;
Aleksk 2:8230a5a4cc13 174 eeprom.nbyte_read( 1, &data1, 1 );
Aleksk 4:c34b84bfa2fb 175 plotter.printf("adress 1 =%d \r\n",data1);
Aleksk 6:fe0a7180ebb7 176 flag_compressor=data1;
Aleksk 2:8230a5a4cc13 177 eeprom.nbyte_read( 2, &data1, 1 );
Aleksk 4:c34b84bfa2fb 178 plotter.printf("adress 2 =%d \r\n",data1);
Aleksk 6:fe0a7180ebb7 179 flag_stopRegulator=data1;
Aleksk 5:bb595cde0c82 180 eeprom.nbyte_read( 3, &data1, 1 );
Aleksk 5:bb595cde0c82 181 plotter.printf("adress 3 =%d \r\n",data1);
Aleksk 5:bb595cde0c82 182 num_chan=data1;
Aleksk 2:8230a5a4cc13 183 eeprom.nbyte_read( 10, &data2, sizeof(int) );
Aleksk 4:c34b84bfa2fb 184 plotter.printf("adress 10 = %d \r\n",data2);
Aleksk 2:8230a5a4cc13 185 value=data2;
Aleksk 2:8230a5a4cc13 186 }
Aleksk 7:97881cd71b31 187 void load_EEPROM2 () {
Aleksk 7:97881cd71b31 188 int data2;
Aleksk 7:97881cd71b31 189 plotter.printf("EEPROM2 read------\r\n");
Aleksk 7:97881cd71b31 190 eeprom.nbyte_read( 100, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 191 //pc.printf("$adress,100,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 192 Pd_eeprom=data2;
Aleksk 7:97881cd71b31 193 eeprom.nbyte_read( 110, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 194 //pc.printf("$adress,110,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 195 frequencyValve1_eeprom=data2;
Aleksk 7:97881cd71b31 196 eeprom.nbyte_read( 120, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 197 //pc.printf("$adress,120,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 198 frequencyValve2_eeprom=data2;
Aleksk 7:97881cd71b31 199 eeprom.nbyte_read( 130, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 200 //pc.printf("$adress,130,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 201 WL01_eeprom=data2;
Aleksk 7:97881cd71b31 202 eeprom.nbyte_read( 140, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 203 //pc.printf("$adress,140,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 204 WL99_eeprom=data2;
Aleksk 7:97881cd71b31 205 eeprom.nbyte_read( 180, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 206 //pc.printf("$adress,180,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 207 T_1=data2;
Aleksk 7:97881cd71b31 208 eeprom.nbyte_read( 190, &data2, sizeof(int) );
Aleksk 7:97881cd71b31 209 //pc.printf("$adress,190,%d,*\r\n",data2);
Aleksk 7:97881cd71b31 210 T_2=data2;
Aleksk 10:b6de15a30716 211 eeprom.nbyte_read( 200, &data2, sizeof(int) );
Aleksk 10:b6de15a30716 212 //pc.printf("$adress,200,%d,*\r\n",data2);
Aleksk 10:b6de15a30716 213 openTimeV2_H2O=data2;
Aleksk 10:b6de15a30716 214 eeprom.nbyte_read( 210, &data2, sizeof(int) );
Aleksk 10:b6de15a30716 215 //pc.printf("$adress,210,%d,*\r\n",data2);
Aleksk 10:b6de15a30716 216 periodV2_H2O=data2;
Aleksk 10:b6de15a30716 217 //pc.printf("$adress,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2,openTimeV2_H2O,periodV2_H2O);
Aleksk 7:97881cd71b31 218 }
Aleksk 0:f2aaa8c6decf 219 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 220 void substring(char *s,char *d,int pos,int len) {
Aleksk 0:f2aaa8c6decf 221 //usage: substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 222 char *t;
Aleksk 0:f2aaa8c6decf 223 s=s+(pos-1);
Aleksk 0:f2aaa8c6decf 224 t=s+len;
Aleksk 0:f2aaa8c6decf 225 while (s!=t) {
Aleksk 0:f2aaa8c6decf 226 *d=*s;
Aleksk 0:f2aaa8c6decf 227 s++;
Aleksk 0:f2aaa8c6decf 228 d++;
Aleksk 0:f2aaa8c6decf 229 }
Aleksk 0:f2aaa8c6decf 230 *d='\0';
Aleksk 0:f2aaa8c6decf 231 }
Aleksk 0:f2aaa8c6decf 232 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 233 void onDataReceived(); // callback
Aleksk 0:f2aaa8c6decf 234 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 235 void read_serial(void) {
Aleksk 0:f2aaa8c6decf 236 char Destination[50];
Aleksk 0:f2aaa8c6decf 237 int pos,len;
Aleksk 0:f2aaa8c6decf 238 int controlSum1, controlSum2;
Aleksk 6:fe0a7180ebb7 239 int value_, delta_value_, flag_compressor_, flag_stopRegulator_, num_chan_;
Aleksk 6:fe0a7180ebb7 240 int controlSumSet1, controlSumSet2;
Aleksk 6:fe0a7180ebb7 241 int numSet_, anySet_;
Aleksk 0:f2aaa8c6decf 242 int ch = '$'; // Код искомого символа
Aleksk 0:f2aaa8c6decf 243 int indexCh; // Char on position
Aleksk 0:f2aaa8c6decf 244 char *ach; // Указатель на искомую переменную в строке, по которой осуществляется поиск.
Aleksk 0:f2aaa8c6decf 245 while(pc.readable()) {
Aleksk 0:f2aaa8c6decf 246 chr_a = pc.getc();
Aleksk 0:f2aaa8c6decf 247 //_____FIFO_buffer_begin_____
Aleksk 0:f2aaa8c6decf 248 for ( int i = 2; i < maxnsym; i++) {
Aleksk 0:f2aaa8c6decf 249 Source[i-2]=Source[i-1];
Aleksk 0:f2aaa8c6decf 250 }
Aleksk 0:f2aaa8c6decf 251 Source[maxnsym-2]=chr_a; //предпоследний элемент
Aleksk 0:f2aaa8c6decf 252 Source[maxnsym-1] ='\0'; //последний элемент массива это нуль-терминал для формирования конца строки в Си
Aleksk 0:f2aaa8c6decf 253 //_____FIFO_buffer_end_______
Aleksk 0:f2aaa8c6decf 254 }
Aleksk 0:f2aaa8c6decf 255 ach=strchr (Source,ch); //поиск первого вхождения символа в строку , ищем указатель символа ‘$’
Aleksk 0:f2aaa8c6decf 256 if (ach==NULL) {
Aleksk 0:f2aaa8c6decf 257 //pc.printf ("Char not finded \r\n"); //Символ $ в строке не найден
Aleksk 0:f2aaa8c6decf 258 goto endParsing; //пропускаем парсинг
Aleksk 0:f2aaa8c6decf 259 }
Aleksk 0:f2aaa8c6decf 260 else {
Aleksk 0:f2aaa8c6decf 261 indexCh = ach-Source+1; //вычитаем указатель из указателя!
Aleksk 0:f2aaa8c6decf 262 //pc.printf ("Char '$' on position %d\r\n",indexCh); //Искомый символ в строке на позиции
Aleksk 0:f2aaa8c6decf 263 }
Aleksk 0:f2aaa8c6decf 264 if (indexCh!=1) { //позиция символа $ не 1
Aleksk 0:f2aaa8c6decf 265 //pc.printf ("$ position not 1 \r\n");
Aleksk 0:f2aaa8c6decf 266 goto endParsing; //пропускаем парсинг
Aleksk 0:f2aaa8c6decf 267 }
Aleksk 0:f2aaa8c6decf 268
Aleksk 0:f2aaa8c6decf 269 pos=1; //начало подстроки $press - на 1 позиции
Aleksk 0:f2aaa8c6decf 270 len=6; //длина подстроки $press равна 6
Aleksk 0:f2aaa8c6decf 271 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 272 //pc.printf("for pos=%d and len=%d resultat is d= %s\r\n", pos, len, Destination);
Aleksk 0:f2aaa8c6decf 273
Aleksk 0:f2aaa8c6decf 274 if (strcmp(Destination,"$press" ) != 0) { //функция возвращает ноль если строки совпадают
Aleksk 0:f2aaa8c6decf 275 //pc.printf("wrong Destination=%s\r\n",Destination); //печать "неправильной" нулевой строки
Aleksk 6:fe0a7180ebb7 276 goto eepromSet ; //в начале сообщения нет $press , переход с следующему блоку приёма
Aleksk 0:f2aaa8c6decf 277 }
Aleksk 0:f2aaa8c6decf 278 pos=8; //начало подстроки 1000 - на 8 позиции
Aleksk 0:f2aaa8c6decf 279 len=4; //длина подстроки 1000 равна 4
Aleksk 0:f2aaa8c6decf 280 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 281 value_=atoi(Destination);
Aleksk 4:c34b84bfa2fb 282 //if (value_==0) {
Aleksk 4:c34b84bfa2fb 283 // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
Aleksk 4:c34b84bfa2fb 284 // goto endParsing; //уставка должна быть больше еденицы, пропускаем парсинг
Aleksk 4:c34b84bfa2fb 285 //}
Aleksk 0:f2aaa8c6decf 286 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, value_);
Aleksk 0:f2aaa8c6decf 287 pos=13; //начало подстроки 25 - на 13 позиции
Aleksk 0:f2aaa8c6decf 288 len=2; //длина подстроки 25 равна 2
Aleksk 0:f2aaa8c6decf 289 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 290 delta_value_=atoi(Destination);
Aleksk 4:c34b84bfa2fb 291 //if (delta_value_==0) {
Aleksk 4:c34b84bfa2fb 292 // flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
Aleksk 4:c34b84bfa2fb 293 // goto endParsing; //уставка отклонения должна быть больше еденицы, пропускаем парсинг
Aleksk 4:c34b84bfa2fb 294 //}
Aleksk 0:f2aaa8c6decf 295 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, delta_value_);
Aleksk 0:f2aaa8c6decf 296 pos=16; //начало подстроки 0 - на 16 позиции
Aleksk 0:f2aaa8c6decf 297 len=1; //длина подстроки 0 равна 1
Aleksk 0:f2aaa8c6decf 298 substring(Source,Destination,pos,len);
Aleksk 6:fe0a7180ebb7 299 flag_compressor_=atoi(Destination);
Aleksk 6:fe0a7180ebb7 300 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_compressor_);
Aleksk 0:f2aaa8c6decf 301 pos=18; //начало подстроки 0 - на 18 позиции
Aleksk 0:f2aaa8c6decf 302 len=1; //длина подстроки 0 равна 1
Aleksk 0:f2aaa8c6decf 303 substring(Source,Destination,pos,len);
Aleksk 6:fe0a7180ebb7 304 flag_stopRegulator_=atoi(Destination);
Aleksk 6:fe0a7180ebb7 305 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, flag_stopRegulator_);
Aleksk 5:bb595cde0c82 306
Aleksk 5:bb595cde0c82 307 pos=20; //начало подстроки 1 - на 20 позиции
Aleksk 5:bb595cde0c82 308 len=1; //длина подстроки 1 равна 1
Aleksk 5:bb595cde0c82 309 substring(Source,Destination,pos,len);
Aleksk 5:bb595cde0c82 310 num_chan_=atoi(Destination);
Aleksk 5:bb595cde0c82 311 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, num_chan_);
Aleksk 5:bb595cde0c82 312
Aleksk 5:bb595cde0c82 313 pos=22; //начало подстроки 1025 - на 22 позиции
Aleksk 0:f2aaa8c6decf 314 len=4; //длина подстроки 1025 равна 4
Aleksk 0:f2aaa8c6decf 315 substring(Source,Destination,pos,len);
Aleksk 0:f2aaa8c6decf 316 controlSum1=atoi(Destination);
Aleksk 5:bb595cde0c82 317 if (controlSum1==2) {
Aleksk 5:bb595cde0c82 318 flag_zerostart = true; //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
Aleksk 6:fe0a7180ebb7 319 flag_compressor=flag_compressor_; //здесь можно включать-выключать компрессор, но без записи в EEPROM
Aleksk 5:bb595cde0c82 320 goto endParsing; //контрольная сумма должна быть больше двух, пропускаем парсинг
Aleksk 0:f2aaa8c6decf 321 }
Aleksk 0:f2aaa8c6decf 322 //pc.printf("for pos=%d and len=%d resultat is d= %s atoi=%d\r\n", pos, len, Destination, controlSum1);
Aleksk 6:fe0a7180ebb7 323 controlSum2=(value_+delta_value_+flag_compressor_+flag_stopRegulator_+num_chan_)*2; //удвоение чтобы не было одинаковых чисел в сообщении
Aleksk 0:f2aaa8c6decf 324 //pc.printf("controlSum1=%d controlSum2=%d\r\n", controlSum1, controlSum2);
Aleksk 0:f2aaa8c6decf 325 if (controlSum1!=controlSum2) { //не совпала контрольная сумма
Aleksk 0:f2aaa8c6decf 326 //pc.printf ("controlSum1!=controlSum2 \r\n");
Aleksk 4:c34b84bfa2fb 327 goto endParsing; //пропускаем парсинг
Aleksk 0:f2aaa8c6decf 328 }
Aleksk 4:c34b84bfa2fb 329 //*********присваиваем проверенные значения глобальным переменным***********
Aleksk 4:c34b84bfa2fb 330 strcpy(trueSource,Source); //копировать из Source в trueSource
Aleksk 6:fe0a7180ebb7 331 if (value_==0 || delta_value_==0) { //при старте с пустой уставкой не изменяем их в регуляторе и не пишем в EEPROM
Aleksk 6:fe0a7180ebb7 332 flag_compressor=flag_compressor_;
Aleksk 6:fe0a7180ebb7 333 flag_stopRegulator=flag_stopRegulator_; //для работы кнопки Stop
Aleksk 4:c34b84bfa2fb 334 } else {
Aleksk 4:c34b84bfa2fb 335 value=value_;
Aleksk 4:c34b84bfa2fb 336 delta_value=delta_value_;
Aleksk 6:fe0a7180ebb7 337 flag_compressor=flag_compressor_;
Aleksk 6:fe0a7180ebb7 338 flag_stopRegulator=flag_stopRegulator_;
Aleksk 5:bb595cde0c82 339 num_chan=num_chan_;
Aleksk 4:c34b84bfa2fb 340 }
Aleksk 7:97881cd71b31 341 flag_stopRegulatorEEPROM = 0; //флаг остановки только релейного регулятора (теперь регулятор управляет клапанами!)
Aleksk 0:f2aaa8c6decf 342 flag_comand_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок
Aleksk 6:fe0a7180ebb7 343 goto endParsing ; //завершение блока приема рабочих уставок для работяющего релейного регулятора
Aleksk 6:fe0a7180ebb7 344
Aleksk 6:fe0a7180ebb7 345 //========Начало блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM ===================
Aleksk 6:fe0a7180ebb7 346 eepromSet:
Aleksk 6:fe0a7180ebb7 347 if (strcmp(Destination,"$setup" ) != 0) { //функция возвращает ноль если строки совпадают
Aleksk 6:fe0a7180ebb7 348 //pc.printf("wrong Destination=%s\r\n",Destination); //печать "неправильной" нулевой строки
Aleksk 6:fe0a7180ebb7 349 goto endParsing ; //в начале сообщения нет $setup , пропускаем парсинг
Aleksk 6:fe0a7180ebb7 350 }
Aleksk 6:fe0a7180ebb7 351 pos=8; //начало подстроки 123 - на 8 позиции
Aleksk 6:fe0a7180ebb7 352 len=3; //длина подстроки 123 равна 3
Aleksk 6:fe0a7180ebb7 353 substring(Source,Destination,pos,len);
Aleksk 6:fe0a7180ebb7 354 numSet_=atoi(Destination);
Aleksk 6:fe0a7180ebb7 355 pos=12; //начало подстроки 123456 - на 12 позиции
Aleksk 6:fe0a7180ebb7 356 len=6; //длина подстроки 123456 равна 6
Aleksk 6:fe0a7180ebb7 357 substring(Source,Destination,pos,len);
Aleksk 6:fe0a7180ebb7 358 anySet_ =atoi(Destination);
Aleksk 6:fe0a7180ebb7 359 pos=19; //начало подстроки 1234567 - на 19 позиции
Aleksk 6:fe0a7180ebb7 360 len=7; //длина подстроки 1234567 равна 7
Aleksk 6:fe0a7180ebb7 361 substring(Source,Destination,pos,len);
Aleksk 6:fe0a7180ebb7 362 controlSumSet1 =atoi(Destination);
Aleksk 6:fe0a7180ebb7 363 controlSumSet2=(numSet_+anySet_)*2;
Aleksk 6:fe0a7180ebb7 364 if (controlSumSet1!=controlSumSet2) { //не совпала контрольная сумма
Aleksk 6:fe0a7180ebb7 365 //pc.printf ("controlSumSet1!=controlSumSet2 \r\n");
Aleksk 6:fe0a7180ebb7 366 goto endParsing; //пропускаем парсинг
Aleksk 6:fe0a7180ebb7 367 }
Aleksk 6:fe0a7180ebb7 368 //*********присваиваем проверенные значения глобальным переменным***********
Aleksk 6:fe0a7180ebb7 369 strcpy(trueSource2,Source); //копировать из Source в trueSource2
Aleksk 6:fe0a7180ebb7 370 if (numSet_==0) { //при старте с пустым номером не изменяем уставки и не пишем в EEPROM
Aleksk 6:fe0a7180ebb7 371 goto endParsing; //пропускаем парсинг
Aleksk 6:fe0a7180ebb7 372 } else {
Aleksk 6:fe0a7180ebb7 373 numSet=numSet_;
Aleksk 6:fe0a7180ebb7 374 anySet=anySet_;
Aleksk 6:fe0a7180ebb7 375 }
Aleksk 7:97881cd71b31 376 //При первом входе в режим $setup из режима $press - Закрываются все клапана
Aleksk 7:97881cd71b31 377 if (flag_stopRegulatorEEPROM == 0) {
Aleksk 7:97881cd71b31 378 digital_4.write(0); //valve1 off
Aleksk 7:97881cd71b31 379 digital_7.write(0); //valve2 off
Aleksk 7:97881cd71b31 380 digital_5.write(0); //valve3,4 off
Aleksk 7:97881cd71b31 381 digital_6.write(0); //выключение компрессора
Aleksk 7:97881cd71b31 382 }
Aleksk 0:f2aaa8c6decf 383
Aleksk 6:fe0a7180ebb7 384 switch ( numSet ) {
Aleksk 6:fe0a7180ebb7 385 case 1: // это двоеточие
Aleksk 7:97881cd71b31 386 digital_4.write(anySet); //valve1
Aleksk 6:fe0a7180ebb7 387 plotter.printf("1 Valve1=%d\r\n",anySet);
Aleksk 6:fe0a7180ebb7 388 break;
Aleksk 6:fe0a7180ebb7 389 case 2:
Aleksk 7:97881cd71b31 390 digital_7.write(anySet); //valve2
Aleksk 6:fe0a7180ebb7 391 plotter.printf("2 Valve2=%d\r\n",anySet);
Aleksk 6:fe0a7180ebb7 392 break;
Aleksk 6:fe0a7180ebb7 393 case 3:
Aleksk 7:97881cd71b31 394 digital_5.write(anySet); //valve3,4
Aleksk 6:fe0a7180ebb7 395 plotter.printf("3 Valve3,4=%d\r\n",anySet);
Aleksk 6:fe0a7180ebb7 396 break;
Aleksk 6:fe0a7180ebb7 397 case 4:
Aleksk 7:97881cd71b31 398 digital_6.write(anySet); //компрессор
Aleksk 6:fe0a7180ebb7 399 plotter.printf("4 Compressor=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 400 break;
Aleksk 7:97881cd71b31 401 case 9:
Aleksk 7:97881cd71b31 402 if (anySet == 0) {
Aleksk 7:97881cd71b31 403 flag_stopRegulator=0;
Aleksk 9:6bd6ac6ca7d4 404 plotter.printf("Reset ALARM \r\n");
Aleksk 7:97881cd71b31 405 } else {
Aleksk 7:97881cd71b31 406 flag_stopRegulator = 1;
Aleksk 7:97881cd71b31 407 }
Aleksk 7:97881cd71b31 408 break;
Aleksk 6:fe0a7180ebb7 409 case 10:
Aleksk 6:fe0a7180ebb7 410 Pd_eeprom = anySet;
Aleksk 6:fe0a7180ebb7 411 plotter.printf( "10 Pd_eeprom=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 412 break;
Aleksk 6:fe0a7180ebb7 413 case 11:
Aleksk 6:fe0a7180ebb7 414 frequencyValve1_eeprom = anySet;
Aleksk 6:fe0a7180ebb7 415 plotter.printf( "11 frequencyValve1_eeprom=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 416 break;
Aleksk 6:fe0a7180ebb7 417 case 12:
Aleksk 6:fe0a7180ebb7 418 frequencyValve2_eeprom = anySet;
Aleksk 6:fe0a7180ebb7 419 plotter.printf( "12 frequencyValve2_eeprom=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 420 break;
Aleksk 6:fe0a7180ebb7 421 case 13:
Aleksk 6:fe0a7180ebb7 422 WL01_eeprom = anySet;
Aleksk 6:fe0a7180ebb7 423 plotter.printf( "13 WL01_eeprom=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 424 break;
Aleksk 6:fe0a7180ebb7 425 case 14:
Aleksk 6:fe0a7180ebb7 426 WL99_eeprom = anySet;
Aleksk 6:fe0a7180ebb7 427 plotter.printf( "14 WL99_eeprom=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 428 break;
Aleksk 6:fe0a7180ebb7 429 case 18:
Aleksk 6:fe0a7180ebb7 430 T_1 = anySet;
Aleksk 6:fe0a7180ebb7 431 plotter.printf( "18 T_1=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 432 break;
Aleksk 6:fe0a7180ebb7 433 case 19:
Aleksk 6:fe0a7180ebb7 434 T_2 = anySet;
Aleksk 6:fe0a7180ebb7 435 plotter.printf( "19 T_2=%d\r\n",anySet );
Aleksk 6:fe0a7180ebb7 436 break;
Aleksk 10:b6de15a30716 437 case 20:
Aleksk 10:b6de15a30716 438 openTimeV2_H2O = anySet;
Aleksk 10:b6de15a30716 439 plotter.printf( "20 openTimeV2_H2O=%d\r\n",anySet );
Aleksk 10:b6de15a30716 440 break;
Aleksk 10:b6de15a30716 441 case 21:
Aleksk 10:b6de15a30716 442 periodV2_H2O = anySet;
Aleksk 10:b6de15a30716 443 plotter.printf( "21 periodV2_H2O=%d\r\n",anySet );
Aleksk 10:b6de15a30716 444 break;
Aleksk 6:fe0a7180ebb7 445 default:
Aleksk 6:fe0a7180ebb7 446 plotter.printf( "Wrong case.\r\n" );
Aleksk 6:fe0a7180ebb7 447 }
Aleksk 6:fe0a7180ebb7 448
Aleksk 7:97881cd71b31 449 flag_stopRegulatorEEPROM = 1; //флаг остановки только релейного регулятора (теперь оператор вручную управляет клапанами!)
Aleksk 7:97881cd71b31 450 flag_comand2_detected=true; //если флаг true, то всем переменным присвоены новые значения уставок
Aleksk 6:fe0a7180ebb7 451 //========Конец блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM ===================
Aleksk 6:fe0a7180ebb7 452
Aleksk 0:f2aaa8c6decf 453 endParsing:
Aleksk 0:f2aaa8c6decf 454
Aleksk 0:f2aaa8c6decf 455
Aleksk 0:f2aaa8c6decf 456 pc.attach(&onDataReceived, Serial::RxIrq); // reattach interrupt - переподключение прерывания перед выходом из функции
Aleksk 0:f2aaa8c6decf 457 }
Aleksk 0:f2aaa8c6decf 458 //______________________________________________________________________________
Aleksk 0:f2aaa8c6decf 459 void onDataReceived() {
Aleksk 0:f2aaa8c6decf 460 pc.attach(nullptr, Serial::RxIrq); // detach interrupt
Aleksk 0:f2aaa8c6decf 461 queue->call(read_serial); // process in a non ISR context - переход к функции приема строки -
Aleksk 0:f2aaa8c6decf 462 } // - в статусе отключенного прерывания (учим указатели!)
Aleksk 0:f2aaa8c6decf 463 //______________________________________________________________________________
Aleksk 5:bb595cde0c82 464 void auto_set () { //подпрограмма управления компрессором
Aleksk 5:bb595cde0c82 465
Aleksk 7:97881cd71b31 466 if (flag_stopRegulatorEEPROM == 0) {
Aleksk 7:97881cd71b31 467 digital_6.write(flag_compressor); //включение-выкючение компрессора
Aleksk 7:97881cd71b31 468 }
Aleksk 0:f2aaa8c6decf 469 }
Aleksk 7:97881cd71b31 470 //******************************************************************************************************************
Aleksk 7:97881cd71b31 471 //******************************************************************************************************************
Aleksk 0:f2aaa8c6decf 472
Aleksk 0:f2aaa8c6decf 473 int main() {
Aleksk 1:1d4ec28f17c4 474
Aleksk 0:f2aaa8c6decf 475 pc.attach(&onDataReceived, Serial::RxIrq);
Aleksk 8:bf73cc68a823 476 int time, time_2, time_3, time_4, ks, valve1, valve2, countValve1=0, countValve2=0, temp_valueSensor;
Aleksk 0:f2aaa8c6decf 477 int frequencyValve1, frequencyValve2;
Aleksk 4:c34b84bfa2fb 478 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 12:de8c39bf5da3 479 char cmd[2]; //массив с весом, принятым от slave
Aleksk 11:86a18c130515 480 //i2c.read( addr8bit, cmd, 1); //читаем вес по шине i2c из slave Arduino_Nano
Aleksk 11:86a18c130515 481 //pc.printf("cmd[0] = %x\n", cmd[0]);
Aleksk 11:86a18c130515 482
Aleksk 2:8230a5a4cc13 483 digital_4.write(0); //valve1 off;
Aleksk 4:c34b84bfa2fb 484 digital_7.write(0); //valve2 off;
Aleksk 5:bb595cde0c82 485 digital_5.write(0); //valve3,4 off;
Aleksk 5:bb595cde0c82 486 digital_6.write(0); //выключение компрессора
Aleksk 10:b6de15a30716 487 //eeprom.nbyte_write( 200, &openTimeV2_H2O, sizeof(int)); //debug set
Aleksk 10:b6de15a30716 488 //eeprom.nbyte_write( 210, &periodV2_H2O, sizeof(int)); //debug set
Aleksk 2:8230a5a4cc13 489 load_EEPROM (); //загрузка уставок из EEPROM
Aleksk 7:97881cd71b31 490 load_EEPROM2 (); //загрузка граничных уставок (аварийных событий)из EEPROM2
Aleksk 6:fe0a7180ebb7 491 if (value >= 1 && delta_value >= 1 && flag_compressor < 2 && flag_stopRegulator < 2 && num_chan < 6) {
Aleksk 7:97881cd71b31 492 flag_stopRegulator=0; //уставки из EEPROM похожи на правду, разрешаем работу регулятора
Aleksk 2:8230a5a4cc13 493 } else {
Aleksk 7:97881cd71b31 494 flag_stopRegulator = 1; //флаг остановки установлен
Aleksk 2:8230a5a4cc13 495 pc.printf("Regulator stopped, error in EEPROM \r\n");
Aleksk 2:8230a5a4cc13 496 }
Aleksk 2:8230a5a4cc13 497
Aleksk 1:1d4ec28f17c4 498 pc.printf("Program started \r\n");
Aleksk 2:8230a5a4cc13 499 Watchdog &watchdog = Watchdog::get_instance();
Aleksk 7:97881cd71b31 500 watchdog.start(100); //WDlimit = 100 ms
Aleksk 0:f2aaa8c6decf 501 timer.start();
Aleksk 6:fe0a7180ebb7 502 timer_2.start();
Aleksk 6:fe0a7180ebb7 503 timer_3.start();
Aleksk 10:b6de15a30716 504 timer_4.start();
Aleksk 11:86a18c130515 505
Aleksk 0:f2aaa8c6decf 506 while (true){ //бесконечный цикл
Aleksk 2:8230a5a4cc13 507 // kick watchdog regularly within provided timeout (сброс собаки в начало счёта)
Aleksk 2:8230a5a4cc13 508 watchdog.kick();
Aleksk 11:86a18c130515 509
Aleksk 6:fe0a7180ebb7 510 if (flag_stopRegulator == 1){ event_N = 255;} //сброс события через кнопку Стоп в программе оператора
Aleksk 6:fe0a7180ebb7 511
Aleksk 6:fe0a7180ebb7 512 if (flag_stopRegulator == 1 || event_N < 255) { //полный останов регулятора и принудительное запирание всех клапанов
Aleksk 4:c34b84bfa2fb 513 digital_4.write(0); //valve1 off
Aleksk 4:c34b84bfa2fb 514 digital_7.write(0); //valve2 off
Aleksk 4:c34b84bfa2fb 515 digital_5.write(0); //valve3,4 off
Aleksk 5:bb595cde0c82 516 //digital_6.write(0); //выключение компрессора
Aleksk 4:c34b84bfa2fb 517 }
Aleksk 4:c34b84bfa2fb 518
Aleksk 1:1d4ec28f17c4 519 if (flag_comand_detected) { //пришла правильная командная строка
Aleksk 8:bf73cc68a823 520 ks=(value+delta_value+flag_compressor+flag_stopRegulator+
Aleksk 8:bf73cc68a823 521 sensor_value+frequencyValve1+frequencyValve2+
Aleksk 8:bf73cc68a823 522 WL+Pb+Pw1+Pw2+Pd+
Aleksk 8:bf73cc68a823 523 digital_4.read()+digital_7.read()+digital_5.read()+digital_6.read()+event_N+idigital_11.read()+idigital_12.read()+idigital_13.read())*2;
Aleksk 8:bf73cc68a823 524 pc.printf("$press,%d,%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 525 value,delta_value,flag_compressor,flag_stopRegulator,
Aleksk 4:c34b84bfa2fb 526 sensor_value,frequencyValve1,frequencyValve2,
Aleksk 4:c34b84bfa2fb 527 WL,Pb,Pw1,Pw2,Pd,
Aleksk 8:bf73cc68a823 528 digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read(),
Aleksk 8:bf73cc68a823 529 ks); //передача текущих значений в РС
Aleksk 7:97881cd71b31 530
Aleksk 0:f2aaa8c6decf 531 //pc.printf("%s\r\n",trueSource); //эхо для отладки канала связи
Aleksk 4:c34b84bfa2fb 532 flag_comand_detected = false; //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта
Aleksk 7:97881cd71b31 533
Aleksk 2:8230a5a4cc13 534 if (strcmp(trueSourceOld,trueSource) != 0) { //функция возвращает ноль если командные строки совпадают
Aleksk 2:8230a5a4cc13 535 save_EEPROM (); //пишем в память уставки отличные от старых
Aleksk 2:8230a5a4cc13 536 load_EEPROM ();
Aleksk 2:8230a5a4cc13 537 }
Aleksk 2:8230a5a4cc13 538
Aleksk 2:8230a5a4cc13 539 strcpy(trueSourceOld,trueSource); //копировать из trueSource в trueSourceOld
Aleksk 0:f2aaa8c6decf 540 }
Aleksk 4:c34b84bfa2fb 541
Aleksk 7:97881cd71b31 542 if (flag_comand2_detected ) { //пришла правильная строка из программы SetUp_EEPROM и передана уставка
Aleksk 8:bf73cc68a823 543 ks=(value+delta_value+flag_compressor+flag_stopRegulator+
Aleksk 8:bf73cc68a823 544 sensor_value+frequencyValve1+frequencyValve2+
Aleksk 8:bf73cc68a823 545 WL+Pb+Pw1+Pw2+Pd+
Aleksk 8:bf73cc68a823 546 digital_4.read()+digital_7.read()+digital_5.read()+digital_6.read()+
Aleksk 8:bf73cc68a823 547 event_N+idigital_11.read()+idigital_12.read()+idigital_13.read()+
Aleksk 10:b6de15a30716 548 Pd_eeprom+frequencyValve1_eeprom+frequencyValve2_eeprom+WL01_eeprom+WL99_eeprom+T_1+T_2+openTimeV2_H2O+periodV2_H2O)*2;
Aleksk 10:b6de15a30716 549 pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
Aleksk 7:97881cd71b31 550 value,delta_value,flag_compressor,flag_stopRegulator, //1,2,3,4
Aleksk 7:97881cd71b31 551 sensor_value,frequencyValve1,frequencyValve2, //5,6,7
Aleksk 7:97881cd71b31 552 WL,Pb,Pw1,Pw2,Pd, //8,9,10,11,12
Aleksk 7:97881cd71b31 553 digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(), //13,14,15,16
Aleksk 7:97881cd71b31 554 event_N,idigital_11.read(),idigital_12.read(),idigital_13.read(), //17,18,19,20
Aleksk 8:bf73cc68a823 555 Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2,
Aleksk 10:b6de15a30716 556 openTimeV2_H2O,periodV2_H2O,ks); //21,22,23,24,25,26,27,28,29,30
Aleksk 7:97881cd71b31 557 flag_comand2_detected = false; //в последующих обращениях не печатать пока нет нового сообщения из СОМ-порта
Aleksk 7:97881cd71b31 558
Aleksk 7:97881cd71b31 559 if (strcmp(trueSource2Old,trueSource2) != 0 && numSet >= 10) { //функция возвращает ноль если командные строки совпадают
Aleksk 7:97881cd71b31 560
Aleksk 7:97881cd71b31 561 save_EEPROM2 (); //пишем в память все уставки от SetUp_EEPROM если хоть одна изменилась
Aleksk 7:97881cd71b31 562 load_EEPROM2 ();
Aleksk 7:97881cd71b31 563 }
Aleksk 7:97881cd71b31 564 strcpy(trueSource2Old,trueSource2); //копировать из trueSource2 в trueSource2Old
Aleksk 7:97881cd71b31 565 //pc.printf("$adress,%d,%d,%d,%d,%d,%d,%d,*\r\n",Pd_eeprom,frequencyValve1_eeprom,frequencyValve2_eeprom,WL01_eeprom,WL99_eeprom,T_1,T_2);
Aleksk 7:97881cd71b31 566 }
Aleksk 7:97881cd71b31 567
Aleksk 4:c34b84bfa2fb 568 if (flag_zerostart) { //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске)
Aleksk 8:bf73cc68a823 569 ks=(value+delta_value+flag_compressor+flag_stopRegulator+
Aleksk 8:bf73cc68a823 570 sensor_value+frequencyValve1+frequencyValve2+
Aleksk 8:bf73cc68a823 571 WL+Pb+Pw1+Pw2+Pd+
Aleksk 8:bf73cc68a823 572 digital_4.read()+digital_7.read()+digital_5.read()+digital_6.read()+event_N+idigital_11.read()+idigital_12.read()+idigital_13.read())*2;
Aleksk 8:bf73cc68a823 573 pc.printf("$press,%d,%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 574 value,delta_value,flag_compressor,flag_stopRegulator,
Aleksk 4:c34b84bfa2fb 575 sensor_value,frequencyValve1,frequencyValve2,
Aleksk 4:c34b84bfa2fb 576 WL,Pb,Pw1,Pw2,Pd,
Aleksk 8:bf73cc68a823 577 digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read(),
Aleksk 8:bf73cc68a823 578 ks); //передача текущих значений в РС
Aleksk 4:c34b84bfa2fb 579 flag_zerostart = false;
Aleksk 4:c34b84bfa2fb 580 }
Aleksk 8:bf73cc68a823 581 //счет counter_cycle1 идет от еденицы
Aleksk 8:bf73cc68a823 582 if (counter_cycle1 < 11 ) {
Aleksk 4:c34b84bfa2fb 583 float raw_value_0 = analog_value_0.read(); // Чтение аналогового входа 0 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 584 raw_value_sum_0 = raw_value_sum_0 + raw_value_0;
Aleksk 4:c34b84bfa2fb 585 float raw_value_1 = analog_value_1.read(); // Чтение аналогового входа 1 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 586 raw_value_sum_1 = raw_value_sum_1 + raw_value_1;
Aleksk 4:c34b84bfa2fb 587 float raw_value_2 = analog_value_2.read(); // Чтение аналогового входа 2 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 588 raw_value_sum_2 = raw_value_sum_2 + raw_value_2;
Aleksk 4:c34b84bfa2fb 589 }
Aleksk 8:bf73cc68a823 590 if (counter_cycle1 >= 11 ) {
Aleksk 4:c34b84bfa2fb 591 float raw_value_3 = analog_value_3.read(); // Чтение аналогового входа 3 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 592 raw_value_sum_3 = raw_value_sum_3 + raw_value_3;
Aleksk 4:c34b84bfa2fb 593 float raw_value_4 = analog_value_4.read(); // Чтение аналогового входа 4 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 594 raw_value_sum_4 = raw_value_sum_4 + raw_value_4;
Aleksk 4:c34b84bfa2fb 595 //float raw_value_5 = analog_value_5.read(); // Чтение аналогового входа 5 (0.0 to 1.0 = full ADC диапазон)
Aleksk 4:c34b84bfa2fb 596 //raw_value_sum_5 = raw_value_sum_5 + raw_value_5;
Aleksk 4:c34b84bfa2fb 597 }
Aleksk 0:f2aaa8c6decf 598
Aleksk 8:bf73cc68a823 599 if (counter_cycle1 >= 20 ) {
Aleksk 0:f2aaa8c6decf 600 counter_cycle1=0;
Aleksk 4:c34b84bfa2fb 601
Aleksk 11:86a18c130515 602 //WL = raw_value_sum_0/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 603 raw_value_sum_0 = 0 ;
Aleksk 4:c34b84bfa2fb 604 sensor_value = raw_value_sum_1/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 605 raw_value_sum_1 = 0 ;
Aleksk 4:c34b84bfa2fb 606 Pb = raw_value_sum_2/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 607 raw_value_sum_2 = 0 ;
Aleksk 4:c34b84bfa2fb 608 Pw1 = raw_value_sum_3/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 609 raw_value_sum_3 = 0 ;
Aleksk 5:bb595cde0c82 610 Pw2 = raw_value_sum_4/10 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 611 raw_value_sum_4 = 0 ;
Aleksk 4:c34b84bfa2fb 612 //Pd = raw_value_sum_5/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением
Aleksk 4:c34b84bfa2fb 613 //raw_value_sum_5 = 0 ;
Aleksk 6:fe0a7180ebb7 614 Pd = abs(sensor_value - Pw1);
Aleksk 4:c34b84bfa2fb 615
Aleksk 5:bb595cde0c82 616 if (num_chan == 1) {temp_valueSensor = sensor_value;} //теперь источник сигнала для регулятора - канал 1
Aleksk 5:bb595cde0c82 617 if (num_chan == 3) {temp_valueSensor = Pw1;} //теперь источник сигнала для регулятора - канал 3
Aleksk 5:bb595cde0c82 618 if (num_chan == 4) {temp_valueSensor = Pw2;} //теперь источник сигнала для регулятора - канал 4
Aleksk 5:bb595cde0c82 619
Aleksk 7:97881cd71b31 620 if (flag_stopRegulator == 0 && event_N == 255 && flag_stopRegulatorEEPROM == 0) { // можно запускать регулятор
Aleksk 7:97881cd71b31 621 digital_5.write(1); //valve3,4 открыты - подключаемся к контуру охлаждения макета
Aleksk 10:b6de15a30716 622 //-----------Контроль протечки воды через периодическое отпирание Valve2----------
Aleksk 10:b6de15a30716 623 time_4 = timer_4.read_ms();
Aleksk 10:b6de15a30716 624 if (time_4 >= periodV2_H2O) { //Время таймера достигло периода включения вентиля V2
Aleksk 10:b6de15a30716 625 timer_4.reset();
Aleksk 10:b6de15a30716 626 digital_7.write(1); //valve2 on;
Aleksk 10:b6de15a30716 627 ThisThread::sleep_for(openTimeV2_H2O); //Время открытого состояния (mc) вентиля V2 должно быть меньше WDlimit=100ms
Aleksk 10:b6de15a30716 628 digital_7.write(0); //valve2 off;
Aleksk 10:b6de15a30716 629 }
Aleksk 1:1d4ec28f17c4 630 //--------------regulator begin-----------------------
Aleksk 5:bb595cde0c82 631 if (temp_valueSensor > value + delta_value) {
Aleksk 1:1d4ec28f17c4 632 valve2 = digital_7.read();
Aleksk 1:1d4ec28f17c4 633 digital_7.write(1); //valve2 on;
Aleksk 1:1d4ec28f17c4 634 if (valve2 < digital_7.read()) {countValve2++;} //счётчик передних фронтов напряжения (срабатывания клапана 2)
Aleksk 1:1d4ec28f17c4 635 digital_4.write(0); //valve1 off;
Aleksk 5:bb595cde0c82 636 } else if (temp_valueSensor < value - delta_value) {
Aleksk 1:1d4ec28f17c4 637 valve1 = digital_4.read();
Aleksk 1:1d4ec28f17c4 638 digital_4.write(1); //valve1 on;
Aleksk 1:1d4ec28f17c4 639 if (valve1 < digital_4.read()) {countValve1++;} //счётчик передних фронтов напряжения (срабатывания клапана 1)
Aleksk 1:1d4ec28f17c4 640 digital_7.write(0); //valve2 off;
Aleksk 1:1d4ec28f17c4 641 } else {
Aleksk 1:1d4ec28f17c4 642 digital_4.write(0); //valve1 off;
Aleksk 1:1d4ec28f17c4 643 digital_7.write(0); //valve2 off;
Aleksk 1:1d4ec28f17c4 644 }
Aleksk 1:1d4ec28f17c4 645 //--------------regulator end-------------------------
Aleksk 0:f2aaa8c6decf 646 }
Aleksk 11:86a18c130515 647 time=timer.read_us(); //условие будет выполнятся ровно один раз в секунду
Aleksk 0:f2aaa8c6decf 648 if (time > 1000000) {
Aleksk 0:f2aaa8c6decf 649 timer.reset(); //начало счёта времени
Aleksk 0:f2aaa8c6decf 650 frequencyValve1 = countValve1; //частота (Гц) срабатывания клапана 1
Aleksk 0:f2aaa8c6decf 651 frequencyValve2 = countValve2; //частота (Гц) срабатывания клапана 2
Aleksk 0:f2aaa8c6decf 652 countValve1=0;
Aleksk 12:de8c39bf5da3 653 countValve2=0;
Aleksk 12:de8c39bf5da3 654 i2c.read( addr8bit, cmd, 2); //читаем вес в байтах по шине i2c из slave Arduino_Nano
Aleksk 12:de8c39bf5da3 655 WL = (cmd[0]<<8)|cmd[1]; //преобразовываем байты побитовым сдвигом влево и сложением в десятичное число Ньютонов
Aleksk 11:86a18c130515 656 //plotter.printf("cmd[0] = %x\n", cmd[0]);
Aleksk 0:f2aaa8c6decf 657 }
Aleksk 6:fe0a7180ebb7 658 //--------------------==_ALARM_scope_Begin==----------------------
Aleksk 6:fe0a7180ebb7 659 if (Pd >= Pd_eeprom) {
Aleksk 6:fe0a7180ebb7 660 event_N = 0;
Aleksk 6:fe0a7180ebb7 661 }
Aleksk 6:fe0a7180ebb7 662 if (frequencyValve1 >= frequencyValve1_eeprom) {
Aleksk 6:fe0a7180ebb7 663 event_N = 1;
Aleksk 6:fe0a7180ebb7 664 }
Aleksk 6:fe0a7180ebb7 665 if (frequencyValve2 >= frequencyValve2_eeprom) {
Aleksk 6:fe0a7180ebb7 666 event_N = 2;
Aleksk 6:fe0a7180ebb7 667 }
Aleksk 6:fe0a7180ebb7 668 if (WL <= WL01_eeprom) {
Aleksk 6:fe0a7180ebb7 669 event_N = 3;
Aleksk 6:fe0a7180ebb7 670 }
Aleksk 6:fe0a7180ebb7 671 if (WL >= WL99_eeprom) {
Aleksk 6:fe0a7180ebb7 672 event_N = 4;
Aleksk 6:fe0a7180ebb7 673 }
Aleksk 10:b6de15a30716 674 if (idigital_11.read()==1) {
Aleksk 6:fe0a7180ebb7 675 event_N = 5;
Aleksk 6:fe0a7180ebb7 676 }
Aleksk 10:b6de15a30716 677 if (idigital_12.read()==1) {
Aleksk 6:fe0a7180ebb7 678 event_N = 6;
Aleksk 6:fe0a7180ebb7 679 }
Aleksk 7:97881cd71b31 680 if (idigital_13.read()==0) {
Aleksk 6:fe0a7180ebb7 681 event_N = 7;
Aleksk 6:fe0a7180ebb7 682 }
Aleksk 0:f2aaa8c6decf 683
Aleksk 6:fe0a7180ebb7 684 //-----------------Valve1 open time----------------------
Aleksk 7:97881cd71b31 685 if (digital_4.read() == 0 || flag_stopRegulatorEEPROM == 1 ) { // для режима $setup отключаем счёт времени
Aleksk 6:fe0a7180ebb7 686 timer_2.reset();
Aleksk 6:fe0a7180ebb7 687 time_2 = 0;
Aleksk 6:fe0a7180ebb7 688 } else {
Aleksk 6:fe0a7180ebb7 689 time_2 = timer_2.read_ms();
Aleksk 6:fe0a7180ebb7 690 }
Aleksk 6:fe0a7180ebb7 691 if (time_2 >= T_1) {
Aleksk 6:fe0a7180ebb7 692 event_N = 8;
Aleksk 6:fe0a7180ebb7 693 }
Aleksk 6:fe0a7180ebb7 694 //-----------------Valve2 open time----------------------
Aleksk 7:97881cd71b31 695 if (digital_7.read() == 0 || flag_stopRegulatorEEPROM == 1) { // для режима $setup отключаем счёт времен
Aleksk 6:fe0a7180ebb7 696 timer_3.reset();
Aleksk 6:fe0a7180ebb7 697 time_3 = 0;
Aleksk 6:fe0a7180ebb7 698 } else {
Aleksk 6:fe0a7180ebb7 699 time_3 = timer_3.read_ms();
Aleksk 6:fe0a7180ebb7 700 }
Aleksk 6:fe0a7180ebb7 701 if (time_3 >= T_2) {
Aleksk 6:fe0a7180ebb7 702 event_N = 9;
Aleksk 6:fe0a7180ebb7 703 }
Aleksk 6:fe0a7180ebb7 704 //--------------------==_ALARM_scope_End==----------------------
Aleksk 6:fe0a7180ebb7 705
Aleksk 6:fe0a7180ebb7 706
Aleksk 6:fe0a7180ebb7 707 auto_set(); //включение-выкючение компрессора через flag_compressor
Aleksk 10:b6de15a30716 708 //led = !led; //гасим/зажигаем индикаторный светодиод
Aleksk 0:f2aaa8c6decf 709 }
Aleksk 8:bf73cc68a823 710
Aleksk 10:b6de15a30716 711
Aleksk 8:bf73cc68a823 712
Aleksk 0:f2aaa8c6decf 713 ThisThread::sleep_for(1); // (mc) правильный оператор задержки для mbed5
Aleksk 0:f2aaa8c6decf 714 counter_cycle1++;
Aleksk 0:f2aaa8c6decf 715
Aleksk 0:f2aaa8c6decf 716 }
Aleksk 0:f2aaa8c6decf 717 }