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

Dependencies:   _24LCXXX

Committer:
Aleksk
Date:
Fri Oct 08 11:53:23 2021 +0000
Revision:
11:86a18c130515
Parent:
10:b6de15a30716
On the i2c bus, Arduino Nano with address 2, transmits the weight value with a resolution of 1 kg.

Who changed what in which revision?

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