Коллеги, пожалуйста помогите. Два дня кружу над скетчем как ворон над полем битвы, мозг сломан ![]()
//ArdinoMega2560
//ГЛОБАЛЬНЫЕ УСТАНОВКИ
//БЛОК ИНДИКАТОРОB МАХ7219_________________________________________________________________
#include <LedControl.h> //Подключение библиотеки max7219
//???Провода: VCC-синий, GND-фиолетовый, clk-черный, cs-белый, din-серый
//Пины модуля индикатора max7219
#define pin_din 23
#define pin_clk 27
#define pin_cs 25
//VCC=VCC
//GND=GND
//Создаём объект класса LedControl (din,clk,cs,X) X - количество модулей
LedControl lc_max7219 = LedControl(pin_din, pin_clk, pin_cs, 4);
// Массив с закодированными символами для надписей.
byte bukvy[39] =
{
B01110111, // А - 0
B01011111, // Б - 1
B01111111, // B - 2
B01000110, // Г - 3
B01001111, // Е - 4
B01111001, // З - 5
B00111110, // И - 6
B00110111, // Н - 7
B01111110, // О - 8
B01110110, // П - 9
B01100111, // Р – 10
B01001110, // С - 11
B00111011, // У - 12
B00110011, // Ч - 13
B00011111, // Ь - 14
B01111001, // Э - 15
B00000000, // пробел – 16
B10100000, // ! - 17
B11100000, // ? - 18
B00000101, // г - 19
B00011100, // и – 20
B00011101, // о - 21
B00010101, // п - 22
B00001101, // с – 23
B01100011, // ° - 24
B01000111, // F - 25
B01011110, // G - 26
B00110000, // I - 27
B00111000, // J - 28
B00001110, // L – 29
B01011011, // S - 30
B01101101, // Z - 31
B00111101, // d - 32
B00011000, // j - 33
B00010111, // h - 34
B00010000, // I - 35
B00011000, // j - 36
B00001100, // l - 37
B00000001, // тире - 38
};
//Переменные разрядов для индикации
volatile int tys; // Тысячи
volatile int sot; // Сотни
volatile int des; // Десятки
volatile int edi; // Единицы
//_________________________________________________________________
#include <Arduino.h>
/*// #define EB_NO_FOR // отключить поддержку pressFor/holdFor/stepFor и счётчик степов (экономит 2 байта оперативки)
// #define EB_NO_CALLBACK // отключить обработчик событий attach (экономит 2 байта оперативки)
// #define EB_NO_COUNTER // отключить счётчик энкодера (экономит 4 байта оперативки)
// #define EB_NO_BUFFER // отключить буферизацию энкодера (экономит 1 байт оперативки)
// #define EB_DEB_TIME 50 // таймаут гашения дребезга кнопки (кнопка)
// #define EB_CLICK_TIME 500 // таймаут ожидания кликов (кнопка)
// #define EB_HOLD_TIME 600 // таймаут удержания (кнопка)
// #define EB_STEP_TIME 200 // таймаут импульсного удержания (кнопка)
// #define EB_FAST_TIME 30 // таймаут быстрого поворота (энкодер)
// #define EB_TOUT_TIME 1000 // таймаут действия (кнопка и энкодер)*/
#include <GyverIO.h>
#include <EncButton.h>
//Пины и переменные энкодеров
//Энкодер настройки
#define pin_enc_setup_B 6 // пин В энкодера настройки
#define pin_enc_setup_A 4 // пин А энкодера настройки
#define pin_but_setup 2 // пин кнопки энкодера настройки
volatile int but_setup_val=0; //значение кнопки энкодера настройки
volatile int ten_volt_cur=20; //настраиваемый вольтаж рабочей мощности ТЭНа
volatile int rm2n_volt_cur=20; //настроенный вольтаж рабочей мощности ТЭНа на РМ2-н
volatile int volt_dif=0; //разница между настроенным и настраиваемым вольтажами
volatile int rm2n_auto_flag=0; //запретить автоменю РМ2-н
float zzz=0; //промежуточная переменная рабочей мощности ТЭНа
long ten_power_cur=0; //ватты рабочей мощности ТЭНа
volatile int ten_power_pas=500; //ватты паспортной мощности ТЭНа
volatile int ten_resist=0; // сопротивление ТЭНа
int exit_flag=1; // разрешение на выход из работы
//Энкодер температуры
#define pin_enc_temp_B 18 // пин В энкодера температуры
#define pin_enc_temp_A 16 // пин А энкодера температуры
#define pin_but_temp 14 // пин кнопки энкодера температуры
volatile int but_temp_val=0; //значение кнопки энкодера температуры
unsigned long ds18b20_time; //переменная периода опроса термодатчика
volatile int temp_col; //температура ректификационной колонны
volatile int temp_adj=999; // Температура отсечки хвостов
//Энкодер клапана и насоса
#define pin_enc_valve_B A12 // пин В энкодера клапана
#define pin_enc_valve_A A10 // пин А энкодера клапана
#define pin_but_valve A8 // пин кнопки энкодера клапана
volatile int but_valve_val=0; //значение кнопки энкодера клапана и насоса
volatile int valve_flag=0; //запретить работу клапана
volatile long valve_interval=1000; //время переключения клапана (исходно - 1 сек)
volatile unsigned long valve_time; //переменная периода опроса клапана
long valve_on_off;
int valve_state = LOW; //состояние клапана
volatile int pump_pwm=0; // ШИМ питания насоса
volatile int pump_volt=0; //вольтаж питания насоса
//Инициализаци библиотеки EncButton.h
EncButton eb_Setup(pin_enc_setup_B, pin_enc_setup_A, pin_but_setup, INPUT_PULLUP); // пины энкодера настройки
EncButton eb_Temp(pin_enc_temp_B, pin_enc_temp_A, pin_but_temp, INPUT_PULLUP); // пины энкодера температуры
EncButton eb_Valve(pin_enc_valve_B, pin_enc_valve_A, pin_but_valve, INPUT_PULLUP); // пины энкодера клапана
//БЛОК ДАТЧИКА ТЕМПЕРАТУРЫ DS18B20_________________________________________________________________
//Пины термодатчика колонны
#define pin_col_data A1 //(серый)Пин Data термодатчика колонны
#define pin_col_vcc A2 //(белый) Пин vcc термодатчика колонны
#define pin_col_gnd A0 //(черный)Пин gnd термодатчика колонны
#include <OneWire.h> //Подключение библиотеки термодатчика колонны
OneWire ds_col(pin_col_data); // Датчик T° колонны на пине A1
//Подвязывание рабочих переменных к библиотеке датчика
byte i;
byte present = 0;
byte data[12];
byte addr_col[8];
//________________________________________________________________
//БЛОК HY-M154_________________________________________________________________
#define pin_plus 31 //(коричневый)Пин "B+" на РМ-2н
#define pin_minus 35 // (желтый)Пин "П-" на РМ-2н
#define pin_plus_minus_gnd 33 // (красный) Пин искусственной gnd
//____________________________________________________________________________________________
//БЛОК реле HW-383_________________________________________________________________
#define pin_stop 51 //(желтый)Пин разгона
#define pin_full 53 //(зеленый)Пин стопа
//GND=GND (синий)
//VCC=VCC (оранжевый)
//________________________________________________________________
//БЛОК moc3041_________________________________________________________________
#define pin_valve 43 //(серый) Пин вентилятора
#define pin_cooler 41 // (белый) Пин клапана
#define pin_valve_cooler_gnd 39 // (черный)Пин искусственной gnd
//________________________________________________________________
//БЛОК HW-532_________________________________________________________________
#define pin_pump 13 // пин ШИМ блока насоса
//GND=GND
int pump_power=0; //Переменная ШИМ для насоса (через МАР!)
//________________________________________________________________
//БЛОК Принуждения_________________________________________________________________
#define pin_cooler_force A4 // принудительный пин вентилятора
#define pin_valve_force A5 // принудительный пин насоса
//________________________________________________________________
void setup ()
{
Serial.begin (115200);
//БЛОК ИНДИКАТОРОВ МАХ7219_________________________________________________________________
//Пины индикатора max7219 на выход
pinMode(pin_din, OUTPUT);
pinMode(pin_clk, OUTPUT);
pinMode(pin_cs, OUTPUT);
//Инициализация индикаторов с выравниванием яркости
lc_max7219.shutdown(0, false); //Выводим из спящего режима
lc_max7219.setIntensity(0,7); //Яркость дисплея на 7. Всего возможных режимов яркости от 0 до 15
lc_max7219.clearDisplay(0); //Очистить дисплей
lc_max7219.shutdown(1, false); //Выводим из спящего режима
lc_max7219.setIntensity(1,7); //Яркость дисплея на 7. Всего возможных режимов яркости от 0 до 15
lc_max7219.clearDisplay(1); //Очистить дисплей
lc_max7219.shutdown(2, false); //Выводим из спящего режима
lc_max7219.setIntensity(2,3); //Яркость дисплея на 7. Всего возможных режимов яркости от 0 до 15
lc_max7219.clearDisplay(2); //Очистить дисплей
lc_max7219.shutdown(3, false); //Выводим из спящего режима
lc_max7219.setIntensity(3,3); //Яркость дисплея на 7. Всего возможных режимов яркости от 0 до 15
lc_max7219.clearDisplay(3); //Очистить дисплей
//________________________________________________________________
//Предустановки энкодеров
// Значения по умолчанию энкодера настройки
eb_Setup.setBtnLevel(LOW);
eb_Setup.setDebTimeout(50);
eb_Setup.setEncType(EB_STEP4_LOW);
// сбросить счётчик энкодера
eb_Setup.counter = 0;
// Значения по умолчанию энкодера температуры
eb_Temp.setBtnLevel(LOW);
eb_Temp.setDebTimeout(50);
eb_Temp.setEncType(EB_STEP4_LOW);
// сбросить счётчик энкодера
eb_Temp.counter = 0;
// Значения по умолчанию энкодера клапана
eb_Valve.setBtnLevel(LOW);
eb_Valve.setDebTimeout(50);
eb_Valve.setEncType(EB_STEP4_LOW);
// сбросить счётчик энкодера
eb_Valve.counter = 0;
//БЛОК ДАТЧИКА ТЕМПЕРАТУРЫ DS18B20_________________________________________________________________
//Инициализация пинов термодатчика
pinMode(pin_col_data, INPUT); //Пин термодатчика колонны на вход
pinMode(pin_col_vcc, OUTPUT); //Пин 5v термодатчика колонны на выход
pinMode(pin_col_gnd, OUTPUT); //Пин gnd термодатчика колонны на выход
digitalWrite (pin_col_vcc, HIGH); //5v для термодатчика
digitalWrite (pin_col_gnd, LOW); //gnd для термодатчика
//Запрос термодатчику колонны на измерение температуры
if (!ds_col.search(addr_col)) {}
//Инициализация термодатчика
ds_col.reset();
ds_col.select(addr_col);
ds_col.write(0x44);
//_________________________________________________________________
//Пишем "НАЧНУ?"
lc_max7219.setRow(0, 7 , bukvy[16]); //Индикация " "
lc_max7219.setRow(0, 6 , bukvy[7]); //Индикация "Н"
lc_max7219.setRow(0, 5 , bukvy[0]); //Индикация "А"
lc_max7219.setRow(0, 4 , bukvy[13]); //Индикация "Ч"
lc_max7219.setRow(0, 3 , bukvy[7]); //Индикация "Н"
lc_max7219.setRow(0, 2 , bukvy[12]); //Индикация "У"
lc_max7219.setRow(0, 1 , bukvy[18]); //Индикация "?"
lc_max7219.setRow(0, 0 , bukvy[16]); //Индикация " "
//БЛОК HY-M154_________________________________________________________________
pinMode (pin_plus, OUTPUT);
pinMode (pin_minus, OUTPUT);
pinMode (pin_plus_minus_gnd, OUTPUT);
digitalWrite (pin_plus,LOW);
digitalWrite (pin_minus,LOW);
digitalWrite (pin_plus_minus_gnd,LOW);
//________________________________________________________________
//БЛОК реле HW-383_________________________________________________________________
pinMode (pin_full, OUTPUT);
digitalWrite (pin_full, HIGH);
pinMode (pin_stop, OUTPUT);
digitalWrite (pin_stop, HIGH);
//________________________________________________________________
//БЛОК moc3041_________________________________________________________________
pinMode (pin_valve, OUTPUT); //Пин клапана
digitalWrite (pin_valve, LOW);
pinMode (pin_cooler, OUTPUT); //Пин вентилятора
digitalWrite (pin_cooler, LOW);
pinMode (pin_valve_cooler_gnd, OUTPUT); //Пин искусственной gnd
digitalWrite (pin_valve_cooler_gnd, LOW);
//________________________________________________________________
//БЛОК HW-532 насос_________________________________________________________________
pinMode (pin_pump, OUTPUT);
analogWrite (pin_pump,0);
//________________________________________________________________
//БЛОК Принуждения_________________________________________________________________
pinMode (pin_cooler_force,INPUT_PULLUP); // принудительный пин вентилятора
pinMode (pin_valve_force,INPUT_PULLUP); // принудительный пин насоса
//________________________________________________________________
}
void loop ()
{
Serial.println (but_valve_val);
/*Serial.print (" ");
Serial.println (enc_valve_val);*/
if (!digitalRead(pin_but_temp) && !digitalRead(pin_but_valve))
{
if (exit_flag==1)
{
//Обесточивание устройств
digitalWrite(pin_stop, LOW);
digitalWrite(pin_full, HIGH);
digitalWrite(pin_valve , LOW);
digitalWrite(pin_cooler , LOW);
analogWrite(pin_pump,0);
RM2_N_EXIT ();
exit_flag=0;
}
}
else
{
goto Work;//Выполнение основного кода
}
Work:;
//ОПРОС ЭНКОДЕРОВ
//Энкодер настройки
eb_Setup.tick();
// кнопка энкодера настройки
if (eb_Setup.press()) //Serial.println("setup_press");
{
but_setup_val++;
Metka:
if (but_setup_val==1) // Настройка паспортной мощности ТЭНа
{
lc_max7219.clearDisplay(0); //Очистить дисплей настройки
//Пишем "ПАС "
lc_max7219.setRow(0, 7 , bukvy[9]); //Индикация "П "
lc_max7219.setRow(0, 6 , bukvy[0]); //Индикация "А"
lc_max7219.setRow(0, 5 , bukvy[11]); //Индикация "С"
lc_max7219.setRow(0, 4 , bukvy[16]); //Индикация " "
lc_max7219.setRow(0, 3 , bukvy[16]); //Индикация " "
//Вычисляем сопротивление ТЭНа * 10: потом это учесть!!!
zzz=48400/ten_power_pas;
ten_resist=round(zzz*10);
//Расчленяем паспортную мощность
tys = ten_power_pas / 1000;
sot = ten_power_pas % 1000/100;
des = ten_power_pas % 100 / 10;
edi = ten_power_pas % 10;
//Пишем паспортную мощность с гашением незначащих нулей
if (ten_power_pas<1000)
{
lc_max7219.setRow(0, 3 , bukvy[16]); //Индикация " "
lc_max7219.setDigit(0, 2, sot, false);
lc_max7219.setDigit(0, 1, des, false);
lc_max7219.setDigit(0, 0, edi, false);
}
if (ten_power_pas>999)
{
lc_max7219.setDigit(0, 3 , tys, false);
lc_max7219.setDigit(0, 2, sot, false);
lc_max7219.setDigit(0, 1, des, false);
lc_max7219.setDigit(0, 0, edi, false);
}
}
if (but_setup_val==2) // Настройка рабочей мощности ТЭНа
{
lc_max7219.clearDisplay(0); //Очистить дисплей настройки
lc_max7219.setRow(0, 6 , bukvy[31]); //Индикация "Z"
lc_max7219.setRow(0, 5 , bukvy[8]); //Индикация "O"
}
if (but_setup_val==3) // Передача настройки в РМ2-н
{
lc_max7219.clearDisplay(0); //Очистить дисплей настройки
//Пишем " ЗАПИСЬ "
lc_max7219.setRow(0, 7 , bukvy[16]); //Индикация " "
lc_max7219.setRow(0, 6 , bukvy[5]); //Индикация "З"
lc_max7219.setRow(0, 5 , bukvy[0]); //Индикация "А"
lc_max7219.setRow(0, 4 , bukvy[9]); //Индикация "П"
lc_max7219.setRow(0, 3 , bukvy[6]); //Индикация "И"
lc_max7219.setRow(0, 2 , bukvy[11]); //Индикация "С"
lc_max7219.setRow(0, 1 , bukvy[14]); //Индикация "Ь"
lc_max7219.setRow(0, 0 , bukvy[16]); //Индикация " "
rm2n_auto_flag=1; //Разрешаем RM2N_SETUP один раз
RM2N_SETUP ();
}
if (but_setup_val==4) // Разгон
{
lc_max7219.clearDisplay(0); //Очистить дисплей настройки
//Пишем " РАЗГОН "
lc_max7219.setRow(0, 7 , bukvy[16]); //Индикация " "
lc_max7219.setRow(0, 6 , bukvy[10]); //Индикация "Р"
lc_max7219.setRow(0, 5 , bukvy[0]); //Индикация "А"
lc_max7219.setRow(0, 4 , bukvy[5]); //Индикация "З"
lc_max7219.setRow(0, 3 , bukvy[3]); //Индикация "Г"
lc_max7219.setRow(0, 2 , bukvy[8]); //Индикация "О"
lc_max7219.setRow(0, 1 , bukvy[7]); //Индикация "Н"
lc_max7219.setRow(0, 0 , bukvy[16]); //Индикация " "
digitalWrite (pin_full, LOW); //Разгон
}
if (but_setup_val==5) // Рабочий нагрев
{
digitalWrite (pin_full, HIGH); // отключение разгона
lc_max7219.clearDisplay(0); //Очистить дисплей настройки
//Пишем " НАГРЕВ "
lc_max7219.setRow(0, 7 , bukvy[16]); //Индикация " "
lc_max7219.setRow(0, 6 , bukvy[7]); //Индикация "Н"
lc_max7219.setRow(0, 5 , bukvy[0]); //Индикация "А"
lc_max7219.setRow(0, 4 , bukvy[3]); //Индикация "Г"
lc_max7219.setRow(0, 3 , bukvy[10]); //Индикация "Р"
lc_max7219.setRow(0, 2 , bukvy[4]); //Индикация "Е"
lc_max7219.setRow(0, 1 , bukvy[2]); //Индикация "В"
lc_max7219.setRow(0, 0 , bukvy[16]); //Индикация " "
}
if (but_setup_val>5) // Возврат в настройки
{
but_setup_val=1;
goto Metka;
}
}
// обработка поворота энкодера настройки
if (eb_Setup.left()) //Serial.println("setup_left");
{
if (but_setup_val==1) // Уменьшение паспортной мощности ТЭНа
{
ten_power_pas=ten_power_pas-500;
if (ten_power_pas<500) {ten_power_pas=500;}
ENC_SETUP_FULL_PROC (); //Расчеты и индикация паспортной мощности ТЭНа
}
if (but_setup_val==2) // Уменьшение рабочей мощности ТЭНа
{
ten_volt_cur--;
if (ten_volt_cur<20) {ten_volt_cur=20;}
ENC_SETUP_CURR_PROC (); //Расчеты и индикация рабочей мощности ТЭНа
}
}
if (eb_Setup.right()) //Serial.println("setup_right");
{
if (but_setup_val==1) // Увеличение паспортной мощности ТЭНа
{
ten_power_pas=ten_power_pas+500;
if (ten_power_pas>4500) {ten_power_pas=4500;}
ENC_SETUP_FULL_PROC (); //Расчеты и индикация паспортной мощности ТЭНа
}
if (but_setup_val==2) // Увеличение рабочей мощности ТЭНа
{
ten_volt_cur++;
if (ten_volt_cur>220) {ten_volt_cur=220;}
ENC_SETUP_CURR_PROC (); //Расчеты и индикация рабочей мощности ТЭНа
}
}
//Энкодер температуры
eb_Temp.tick();
// кнопка энкодера температуры
if (eb_Temp.press()) //Serial.println("temp_press");
{
but_temp_val++;
if (but_temp_val>1) {but_temp_val=0;}
if (but_temp_val==1) {temp_adj=temp_col;}
else {temp_adj=999;}
}
// обработка поворота энкодера температуры
if (eb_Temp.left()) //Serial.println("temp_left");
{
temp_adj++;
if (temp_adj>999) {temp_adj=999;}
}
if (eb_Temp.right()) //Serial.println("temp_right");
{
temp_adj--;
if (temp_adj<100) {temp_adj=100;}
}
//Энкодер клапана
eb_Valve.tick();
// кнопка энкодера клапана
if (eb_Valve.press()) //Serial.println("valve_press");
{
but_valve_val++;
if (but_valve_val>3) {but_valve_val=1;}
if (but_valve_val==1) // настройка времени закрытого клапана
{
lc_max7219.clearDisplay(3); //Очистить дисплей
//Пишем "OFF 1-"
lc_max7219.setRow(3, 7 , bukvy[8]); //Индикация "O"
lc_max7219.setRow(3, 6 , bukvy[25]); //Индикация "F"
lc_max7219.setRow(3, 5 , bukvy[25]); //Индикация "F"
lc_max7219.setRow(3, 4 , bukvy[16]); //Индикация " "
lc_max7219.setRow(3, 3 , bukvy[27]); //Индикация "I"
lc_max7219.setRow(3, 2 , bukvy[38]); //Индикация "-"
//Раскладка по разрядам
des = (valve_interval/1000) % 100 / 10;
edi = (valve_interval/1000) % 10;
if (valve_interval<10000){lc_max7219.setRow(3, 1 , bukvy[16]);} //Индикация " "
else {lc_max7219.setDigit(3, 1, des, false);}
lc_max7219.setDigit(3, 0, edi, false);
}
if (but_valve_val==2) // включаем клапан
{
lc_max7219.clearDisplay(3); //Очистить дисплей
//Пишем "ON 1-"
lc_max7219.setRow(3, 7 , bukvy[8]); //Индикация "O"
lc_max7219.setRow(3, 6 , bukvy[9]); //Индикация "N"
lc_max7219.setRow(3, 5 , bukvy[16]); //Индикация " "
lc_max7219.setRow(3, 4 , bukvy[16]); //Индикация " "
lc_max7219.setRow(3, 3 , bukvy[27]); //Индикация "I"
lc_max7219.setRow(3, 2 , bukvy[38]); //Индикация "-"
//Раскладка по разрядам
des = (valve_interval/1000) % 100 / 10;
edi = (valve_interval/1000) % 10;
if (valve_interval<10000){lc_max7219.setRow(3, 1 , bukvy[16]);} //Индикация " "
else {lc_max7219.setDigit(3, 1, des, false);}
lc_max7219.setDigit(3, 0, edi, false);
}
if (but_valve_val==3) // настройка насоса
{
lc_max7219.clearDisplay(3); //Очистить дисплей
//Пишем "НАСОС_"
lc_max7219.setRow(3, 7 , bukvy[7]); //Индикация "Н"
lc_max7219.setRow(3, 6 , bukvy[0]); //Индикация "А"
lc_max7219.setRow(3, 5 , bukvy[11]); //Индикация "С"
lc_max7219.setRow(3, 4 , bukvy[8]); //Индикация "О"
lc_max7219.setRow(3, 3 , bukvy[11]); //Индикация "С"
lc_max7219.setRow(3, 2 , bukvy[16]); //Индикация " "
//Раскладка по разрядам
des = pump_volt % 100 / 10;
edi = pump_volt % 10;
if (pump_volt<10){lc_max7219.setRow(3, 1 , bukvy[16]);} //Индикация " "
else {lc_max7219.setDigit(3, 1, des, false);}
lc_max7219.setDigit(3, 0, edi, false);
}
}
// обработка поворота энкодера клапана
if (eb_Valve.left()) //Serial.println("valve_left");
{
if (but_valve_val==1) // настройка времени закрытого клапана увеличить
{
valve_interval=valve_interval+1000;
if (valve_interval>30000) {valve_interval=30000;}
ENC_VALVE_PROC(); //Расчеты и индикация времени закрытого клапана
}
if (but_valve_val==3) // настройка насоса увеличить
{
{pump_volt++;}
if (pump_volt>12) {pump_volt=12;}
ENC_PUMP_PROC ();
}
}
if (eb_Valve.right()) //Serial.println("valve_right");
{
if (but_valve_val==1) // настройка времени закрытого клапана уменьшить
{
valve_interval=valve_interval-1000;
if (valve_interval<1000) {valve_interval=1000;}
ENC_VALVE_PROC(); //Расчеты и индикация времени закрытого клапана
}
if (but_valve_val==3) // настройка насоса уменьшить
{
{pump_volt--;}
if (pump_volt<0) {pump_volt=0;}
ENC_PUMP_PROC ();
}
}
//БЛОК ДАТЧИКА ТЕМПЕРАТУРЫ DS18B20_________________________________________________________________
//Опрос показаний термодатчика 1 раз в 900 мсек
if (millis() - ds18b20_time > 900)
{
//Опрашиваем датчик колонны
present = ds_col.reset();
ds_col.select(addr_col);
ds_col.write(0xBE);
for ( i = 0; i < 9; i++)
{
data[i] = ds_col.read();
}
int16_t raw = (data[1] << 8) | data[0];
temp_col = raw / 1.6;
//Очередной запрос термодатчику колонны на измерение температуры
if (!ds_col.search(addr_col)) {}
//Инициируем датчик температуры колонны
ds_col.reset();
ds_col.select(addr_col);
ds_col.write(0x44);
//Раскладка данных термодатчика и индикация
sot = temp_col / 100;
des = temp_col % 100 / 10;
edi = temp_col % 10;
lc_max7219.setDigit(1, 7, sot, false);
lc_max7219.setDigit(1, 6, des, true);
lc_max7219.setDigit(1, 5, edi, false);
lc_max7219.setRow(1, 4, bukvy[24]); //Индикация "°"
ds18b20_time=millis(); //обнуляем таймер датчика
}
//Раскладка данных температуры отсечки и индикация
sot = temp_adj / 100;
des = temp_adj % 100 / 10;
edi = temp_adj % 10;
lc_max7219.setDigit(1, 3, sot, false);
lc_max7219.setDigit(1, 2, des, true);
lc_max7219.setDigit(1, 1, edi, false);
lc_max7219.setRow(1, 0 , bukvy[24]); //Индикация "°"
//_________________________________________________________________
//БЛОК РАБОТЫ ВЕНТИЛЯТОРА_________________________________________________________________
if ((temp_col >666) || (!digitalRead(pin_cooler_force))) {digitalWrite(pin_cooler,HIGH); }
else {digitalWrite(pin_cooler,LOW); }
//__________________________________________________
//БЛОК РАБОТЫ НАСОСА_________________________________________________________________
if (temp_col >666) {analogWrite (pin_pump,pump_pwm);}
else {analogWrite (pin_pump,0);}
if (!digitalRead(pin_valve_force)) {analogWrite (pin_pump,255);}
else {analogWrite (pin_pump,pump_pwm);}
//_________________________________________________________________
}
void ENC_SETUP_FULL_PROC () //Расчеты и индикация паспортной мощности ТЭНа
{
//Вычисляем сопротивление ТЭНа * 10: потом это учесть!!!
zzz=48400/ten_power_pas;
ten_resist=round(zzz*10);
//Расчленяем паспортную мощность
tys = ten_power_pas / 1000;
sot = ten_power_pas % 1000/100;
des = ten_power_pas % 100 / 10;
edi = ten_power_pas % 10;
//Пишем паспортную мощность с гашением незначащих нулей
if (ten_power_pas<1000)
{
lc_max7219.setRow(0, 3 , bukvy[16]); //Индикация " "
lc_max7219.setDigit(0, 2, sot, false);
lc_max7219.setDigit(0, 1, des, false);
lc_max7219.setDigit(0, 0, edi, false);
}
if (ten_power_pas>999)
{
lc_max7219.setDigit(0, 3 , tys, false);
lc_max7219.setDigit(0, 2, sot, false);
lc_max7219.setDigit(0, 1, des, false);
lc_max7219.setDigit(0, 0, edi, false);
}
}
void ENC_SETUP_CURR_PROC () //Расчеты и индикация рабочей мощности ТЭНа
{
//Расчленяем рабочее напряжение
sot = ten_volt_cur % 1000/100;
des = ten_volt_cur % 100 / 10;
edi = ten_volt_cur % 10;
//Пишем рабочее напряженине с гашением нуля
if (ten_volt_cur<100){lc_max7219.setRow(0, 7 , bukvy[16]);} //Индикация " ")
else {lc_max7219.setDigit(0, 7, sot, false);} //Индикация сотен
lc_max7219.setDigit(0, 6, des, false);
lc_max7219.setDigit(0, 5, edi, false);
ten_power_cur = long(ten_volt_cur) * ten_volt_cur / ten_resist * 10; //Вычисляем рабочую мощность ТЭНа
//Расчленяем рабочую мощность ТЭНа
tys = ten_power_cur / 1000;
sot = ten_power_cur % 1000/100;
des = ten_power_cur % 100 / 10;
edi = ten_power_cur % 10;
//Пишем рабочую мощность ТЭНа с гашением нулей
if (ten_power_cur<1000) {lc_max7219.setRow(0, 3 , bukvy[16]);} //Индикация " ")
else {lc_max7219.setDigit(0, 3 , tys, false);}
if (ten_power_cur<100) {lc_max7219.setRow(0, 2 , bukvy[16]);} //Индикация " ")
else {lc_max7219.setDigit(0, 2 , sot, false);}
if (ten_power_cur<10) {lc_max7219.setRow(0, 1 , bukvy[16]);} //Индикация " ")
else {lc_max7219.setDigit(0, 1 , des, false);}
lc_max7219.setDigit(0, 0, edi, false);
}
void ENC_VALVE_PROC () //Расчеты и индикация времени закрытого клапана
{
//Раскладка по разрядам
des = (valve_interval/1000) % 100 / 10;
edi = (valve_interval/1000) % 10;
if (valve_interval<10000){lc_max7219.setRow(3, 1 , bukvy[16]);} //Индикация " "
else {lc_max7219.setDigit(3, 1, des, false);}
lc_max7219.setDigit(3, 0, edi, false);
}
void ENC_PUMP_PROC () //Расчеты и индикация мощности насоса
{
//Раскладка по разрядам
des = pump_volt % 100 / 10;
edi = pump_volt % 10;
if (pump_volt<10){lc_max7219.setRow(3, 1 , bukvy[16]);} //Индикация " "
else {lc_max7219.setDigit(3, 1, des, false);}
lc_max7219.setDigit(3, 0, edi, false);
pump_pwm=map(pump_volt,0,12,0,255); //Пересчет "вольты" -> ШИМ
}
void RM2N_SETUP () //Передача настройки в РМ2-н
{
if(rm2n_auto_flag==1); //разрешить RM2N_SETUP до следующего цикла настройки
{
//Листание меню
digitalWrite (pin_plus,HIGH);
delay (200);
digitalWrite (pin_plus,LOW);
delay (200);
digitalWrite (pin_plus,HIGH);
delay (200);
digitalWrite (pin_plus,LOW);
delay (200);
digitalWrite (pin_plus,HIGH);
delay (200);
digitalWrite (pin_plus,LOW);
delay (200);
digitalWrite (pin_plus,HIGH);
delay (200);
digitalWrite (pin_plus,LOW);
delay (200);
digitalWrite (pin_minus,HIGH);
delay (200);
digitalWrite (pin_minus,LOW);
//Передача данных в РМ2-н
if (ten_volt_cur>rm2n_volt_cur)
{
for (int i=rm2n_volt_cur+1; i<=ten_volt_cur-1; i++)
{
digitalWrite (pin_plus,HIGH);
delay (200);
digitalWrite (pin_plus,LOW);
delay (200);
}
}
if (ten_volt_cur<rm2n_volt_cur)
{
for (i=rm2n_volt_cur-1; i>=ten_volt_cur+1; i--)
{
digitalWrite (pin_minus,HIGH);
delay (200);
digitalWrite (pin_minus,LOW);
delay (200);
}
}
delay (11000);
//Пишем " ЗАПИСАНО"
lc_max7219.setRow(0, 7 , bukvy[5]); //Индикация "З"
lc_max7219.setRow(0, 6 , bukvy[0]); //Индикация "А"
lc_max7219.setRow(0, 5 , bukvy[9]); //Индикация "П"
lc_max7219.setRow(0, 4 , bukvy[6]); //Индикация "И"
lc_max7219.setRow(0, 3 , bukvy[11]); //Индикация "С"
lc_max7219.setRow(0, 2 , bukvy[0]); //Индикация "А"
lc_max7219.setRow(0, 1 , bukvy[7]); //Индикация "Н"
lc_max7219.setRow(0, 0 , bukvy[8]); //Индикация "О"
rm2n_auto_flag=0; //запретить RM2N_SETUP до следующего цикла настройки
rm2n_volt_cur=ten_volt_cur; //Записываем последнее значение вольтажа на РМ2-н
}
}
void RM2_N_EXIT () //Выходим в завершение работы
{
//Очистить дисплеи
for (int i=0; i<=3; i++)
{
lc_max7219.clearDisplay(i);
}
//Пишем " ПАУЗА! " на первом дисплее
lc_max7219.setRow(0, 7 , bukvy[16]); //Индикация " "
lc_max7219.setRow(0, 6 , bukvy[9]); //Индикация "П"
lc_max7219.setRow(0, 5 , bukvy[0]); //Индикация "А"
lc_max7219.setRow(0, 4 , bukvy[12]); //Индикация "У"
lc_max7219.setRow(0, 3 , bukvy[5]); //Индикация "З"
lc_max7219.setRow(0, 2 , bukvy[0]); //Индикация "А"
lc_max7219.setRow(0, 1 , bukvy[17]); //Индикация "!"
lc_max7219.setRow(0, 0 , bukvy[16]); //Индикация " "
//Пишем " СБРОС " на втором дисплее
lc_max7219.setRow(1, 7 , bukvy[16]); //Индикация " "
lc_max7219.setRow(1, 6 , bukvy[11]); //Индикация "С"
lc_max7219.setRow(1, 5 , bukvy[1]); //Индикация "Б"
lc_max7219.setRow(1, 4 , bukvy[10]); //Индикация "Р"
lc_max7219.setRow(1, 3 , bukvy[8]); //Индикация "О"
lc_max7219.setRow(1, 2 , bukvy[11]); //Индикация "С"
lc_max7219.setRow(1, 1 , bukvy[16]); //Индикация " "
lc_max7219.setRow(1, 0 , bukvy[16]); //Индикация " "
//Пишем " НАПРУГИ" на третьем дисплее
lc_max7219.setRow(2, 7 , bukvy[7]); //Индикация "Н"
lc_max7219.setRow(2, 6 , bukvy[0]); //Индикация "А"
lc_max7219.setRow(2, 5 , bukvy[9]); //Индикация "П"
lc_max7219.setRow(2, 4 , bukvy[10]); //Индикация "Р"
lc_max7219.setRow(2, 3 , bukvy[12]); //Индикация "У"
lc_max7219.setRow(2, 2 , bukvy[3]); //Индикация "Г"
lc_max7219.setRow(2, 1 , bukvy[6]); //Индикация "И"
lc_max7219.setRow(2, 0 , bukvy[17]); //Индикация "!"
//Меню РМ2-н
digitalWrite (pin_plus,HIGH);
delay (200);
digitalWrite (pin_plus,LOW);
delay (200);
digitalWrite (pin_plus,HIGH);
delay (200);
digitalWrite (pin_plus,LOW);
delay (200);
digitalWrite (pin_plus,HIGH);
delay (200);
digitalWrite (pin_plus,LOW);
delay (200);
digitalWrite (pin_plus,HIGH);
delay (200);
digitalWrite (pin_plus,LOW);
delay (200);
digitalWrite (pin_minus,HIGH);
delay (200);
digitalWrite (pin_minus,LOW);
delay (200);
//Готовим к отключению
lc_max7219.setRow(3, 7 , bukvy[16]); //Индикация " "
lc_max7219.setRow(3, 6 , bukvy[16]); //Индикация " "
lc_max7219.setRow(3, 2 , bukvy[16]); //Индикация " "
lc_max7219.setRow(3, 1 , bukvy[16]); //Индикация " "
lc_max7219.setRow(3, 0 , bukvy[16]); //Индикация " "
for (i=220; i>=20; i--)
{
digitalWrite (pin_minus,HIGH);
delay (200);
digitalWrite (pin_minus,LOW);
delay (200);
//Раскладка вольтажа
sot = i / 100;
des = i % 100 / 10;
edi = i % 10;
//Пишем убывающий вольтаж на четвертом дисплее
if (i<100) {lc_max7219.setRow(3, 5 , bukvy[16]);}
else {lc_max7219.setDigit(3, 5, sot, false);}
lc_max7219.setDigit(3, 4, des, false);
lc_max7219.setDigit(3, 3, edi, false);
}
delay (11000);
//Очистить дисплеи
for (i=0; i<=3; i++)
{
lc_max7219.clearDisplay(i);
}
//Пишем " ЗАПИСАНО" на четвертом дисплее
lc_max7219.setRow(3, 7 , bukvy[5]); //Индикация "З"
lc_max7219.setRow(3, 6 , bukvy[0]); //Индикация "А"
lc_max7219.setRow(3, 5 , bukvy[9]); //Индикация "П"
lc_max7219.setRow(3, 4 , bukvy[6]); //Индикация "И"
lc_max7219.setRow(3, 3 , bukvy[11]); //Индикация "С"
lc_max7219.setRow(3, 2 , bukvy[0]); //Индикация "А"
lc_max7219.setRow(3, 1 , bukvy[7]); //Индикация "Н"
lc_max7219.setRow(3, 0 , bukvy[8]); //Индикация "О"
}
В строке 586 “if (temp_col >666) {analogWrite (pin_pump,pump_pwm);} “ игнорируется условие (temp_col >666). То есть, при вращении энкодера вправо-влево (строки 513,514,515 и 534,535,536) изменение подаваемой мощности в насос проходит адекватно, но в лупе “if (temp_col >666)” как будто отсутствует, насос реагирует на изменение “вольтажа”, несмотря на то, что temp_col на выше 666. Сунул во вложение весь скетч, может быть, чей-то свежий взгляд поможет?
Заранее спасибо!

