Помогите разобраться с включением насоса ( последний кусок кода ) |
|
|
Включается только после уставки для тэнов т.е. после выключения тэнов и выключается после их включения , а должен включатся после 55 гр.С и выключатся после падения |
#include <Wire.h>
#include <OneWire.h>
#define ONE_WIRE_BUS 9 //задаем контакт для датчика
#define RES_TEMP 12 // разрешение (точность) темп. датчика в битах
OneWire oneWire(ONE_WIRE_BUS);
//Подключаем библиотеку для работы с термометром
#include <DallasTemperature.h>
//Создаем объект sensors, подключенный по OneWire
DallasTemperature sensors(&oneWire);
//Создаем переменные для работы с термометром
DeviceAddress temp1DeviceAddress;//переменная для хранения адреса датчика
float temp1 = 0; //переменная для текущего значения температуры 1
int setTmp = 0; // переменная для заданного значения температуры
//Подключаем LCD-дисплей
#include <LiquidCrystal_I2C.h>
//#include <LCD_1602_RUS.h>
//LCD_1602_RUS lcd(0x27,16,2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
//Подсветка управляется через пин D10
//#define BACKLIGHT_PIN 10
//Создаем переменную для хранения состояния подсветки
boolean backlightStatus = 1;
// Подключаем библиотеку для работы с ARDUINO EEPROM
//Заданная температура будет храниться по адресу 0
#include <EEPROM2.h>
//Реле подключено к пину D11
#define RELAY1 11
#define RELAY2 12
#define RELAY3 7
#define RELAY4 8
#define ledPin 13
//Объявим переменную для хранения состояния реле
boolean relayStatus1 = LOW;
boolean relayStatus2 = LOW;
boolean relayStatus3 = LOW;
boolean relayStatus4 = LOW;
//Объявим переменные для задания задержки
long previousMillis1 = 0;
long interval1 = 2000; // интервал опроса датчиков температуры
//Аналоговая клавиатура подключена к пину A0
#define KEYPAD_PIN A0
//Определим значения на аналоговом входе для клавиатуры
#define ButtonUp_LOW 140
#define ButtonUp_HIGH 145
#define ButtonDown_LOW 324
#define ButtonDown_HIGH 330
#define ButtonLeft_LOW 503
#define ButtonLeft_HIGH 509
#define ButtonRight_LOW 0
#define ButtonRight_HIGH 5
#define ButtonSelect_LOW 740
#define ButtonSelect_HIGH 745
void setup()
{
//Настроим пин для управления реле
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(RELAY4, OUTPUT);
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, LOW);
digitalWrite(RELAY3, LOW);
digitalWrite(RELAY4, LOW);
//Считаем из постоянной памяти заданную температуру
setTmp = EEPROM_read_byte(0);
//Инициализируем термодатчик и установим разрешающую способность 12 бит
//(обычно она установлена по умолчанию, так что последнюю строчку
//можно опустить)
sensors.begin();
sensors.getAddress(temp1DeviceAddress, 0);
temp1 = sensors.getTempC(temp1DeviceAddress);
//Выведем на дисплей стартовое сообщение на 2 секунды
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Temp. Controller");
lcd.setCursor(0, 1);
lcd.print(" v1.1 ");
delay(1500);
// выведем на дисплей заданное значение температуры на 2 секунды
lcd.setCursor(0, 1);
lcd.print(" Set temp: ");
lcd.setCursor(12, 1);
lcd.print(setTmp);
delay(1500);
//Очистим дисплей
lcd.begin(16, 2);
}
//Определим функцию для опроса аналоговой клавиатуры
//Функция опроса клавиатуры, принимает адрес пина, к которому
//подключена клавиатура, и возвращает код клавиши:
// 1 - UP
// 2 - DOWN
// 3 - LEFT
// 4 - RIGHT
// 5 - SELECT
int ReadKey(int keyPin)
{
int KeyNum = 0;
int KeyValue1 = 0;
int KeyValue2 = 0;
//Читаем в цикле аналоговый вход, для подавления дребезга
//и нестабильности читаем по два раза подряд, пока значения
//не будут равны.
//Если значения равны 1023 – значит не была нажата ни одна клавиша.
do {
KeyValue1 = analogRead(keyPin);
KeyValue2 = analogRead(keyPin);
} while (KeyValue1 == KeyValue2 && KeyValue2 != 1023);
//Интерпретируем полученное значение и определяем код нажатой клавиши
if (KeyValue2 < ButtonUp_HIGH && KeyValue2 > ButtonUp_LOW) {
KeyNum = 1; //Up
}
if (KeyValue2 < ButtonDown_HIGH && KeyValue2 > ButtonDown_LOW) {
KeyNum = 2; //Down
}
if (KeyValue2 < ButtonLeft_HIGH && KeyValue2 > ButtonLeft_LOW) {
KeyNum = 3; //Left
}
if (KeyValue2 < ButtonRight_HIGH && KeyValue2 > ButtonRight_LOW) {
KeyNum = 4; //Right
}
if (KeyValue2 < ButtonSelect_HIGH && KeyValue2 > ButtonSelect_LOW) {
KeyNum = 5; //Select
}
//Возвращаем код нажатой клавиши
return KeyNum;
}
//Определим процедуру редактирования заданной температуры
//Вызывается по нажатию клавиши Select, отображает на дисплее
//заданную температуру и позволяет изменять ее клавишами Up и Down
void setTemperature()
{
lcd.begin(16, 2);
int keyCode = 0;
//выводим на дисплей заданное значение температуры
lcd.setCursor(0, 0);
lcd.print(" Setting temp ");
lcd.setCursor(7, 1);
lcd.print(setTmp);
//Опрашиваем клавиатуру, если нажата клавиша Up увеличиваем
//значение на 1, если Down – уменьшаем на 1
//Если нажаты клавиши Select или Right – цикл опроса прерывается
//Задержки введены для борьбы с дребезгом, если клавиши срабатывают
//четко – можно уменьшить время задержек или вообще их убрать
do
{
keyCode = ReadKey(KEYPAD_PIN);
if (keyCode == 1) {
setTmp++;
delay(150);
lcd.setCursor(7, 1);
lcd.print(setTmp);
}
if (keyCode == 2) {
setTmp--;
delay(150);
lcd.setCursor(7, 1);
lcd.print(setTmp);
}
//lcd.begin(16,2);
}
while (keyCode != 5 && keyCode != 4);
delay(200);
//lcd.begin(16, 2);
//По клавише Select – созраняем в EEPROM измененное значение
//По клавише Right – восстанавливаем старое значение
if (keyCode == 5) {
EEPROM_write_byte(0, setTmp);
}
if (keyCode == 4) {
setTmp = EEPROM_read_byte(0);
}
}
void loop()
{
//Модуль опроса датчиков и получения сведений о температуре
//Вызывается 1 раз в секунду
unsigned long currentMillis1 = millis();
if (currentMillis1 - previousMillis1 > interval1) {
previousMillis1 = currentMillis1;
//Запуск процедуры измерения температуры
// sensors.setWaitForConversion(false);
sensors.requestTemperatures();
//sensors.setWaitForConversion(true);
//Delay(250) // задержка для обработки информации внутри термометра,
//в данном случае можно не задавать
//Считывание значения температуры
sensors.getAddress(temp1DeviceAddress, 0);
temp1 = sensors.getTempC(temp1DeviceAddress);
// Вывод текущего значения температуры на дисплей
lcd.setCursor(0, 0);
lcd.print("Power");
lcd.setCursor(0, 1);
lcd.print("T=");
lcd.print(temp1);
lcd.print("C");
}
//Проверка условия включения/выключения нагревателя
if (temp1 < setTmp && relayStatus1 == LOW)
{ relayStatus1 = HIGH; digitalWrite(RELAY1, HIGH);
lcd.setCursor(10, 0);
lcd.print("P= 35%");
}
if (temp1 > setTmp && relayStatus1 == HIGH)
{ relayStatus1 = LOW; digitalWrite(RELAY1, LOW);
lcd.setCursor(10, 0);
lcd.print("P= 0%");
}
delay(500);
if (temp1 + 1 < setTmp && relayStatus2 == LOW)
{ relayStatus2 = HIGH; digitalWrite(RELAY2, HIGH);
lcd.setCursor(10, 0);
lcd.print("P= 70%");
}
if (temp1 > setTmp && relayStatus2 == HIGH)
{ relayStatus2 = LOW; digitalWrite(RELAY2, LOW);
//lcd.begin(10, 2);
}
delay(500);
if (temp1 + 2 < setTmp && relayStatus3 == LOW)
{ relayStatus3 = HIGH; digitalWrite(RELAY3, HIGH);
lcd.setCursor(10, 0);
lcd.print("P=100%");
}
if (temp1 > setTmp && relayStatus3 == HIGH)
{ relayStatus3 = LOW; digitalWrite(RELAY3, LOW);
//lcd.begin(16, 2);
}
delay(200);
// Опрос клавиатуры
int Feature = ReadKey(KEYPAD_PIN);
//Включение подсветки
if (Feature == 1 )
{
backlightStatus = 1;
}
//Отключение подсветки
if (Feature == 2 )
{
backlightStatus = 0;
}
//Переход к редактированию заданной температуры
if (Feature == 5 )
{ delay(200); setTemperature();
}
if(temp1>10&&temp1<95){
if (temp1 >=55&&relayStatus4==LOW){relayStatus4=HIGH; digitalWrite(RELAY4, HIGH);} //температура включения
if (temp1 <=40&&relayStatus4==HIGH){relayStatus4=LOW; digitalWrite(RELAY4, LOW);}} //температура выключения
if (temp1 ==(-127)){lcd.init();lcd.setCursor(0,0);lcd.print("Avaria Sensor");digitalWrite(RELAY4, HIGH);
} //при потере датчика включаем насос
//if(temp1 !=(-127)){avaria2=LOW;}
if (temp1 <=-127 )digitalWrite(ledPin, HIGH); //при потере датчика включаем светодиод
delay(200); // помигаем светодиодом при потери датчика
// delay(50);
}
Ну почему все пишут подобные сообщения - помогите разобраться с включением насоса , а не разобраться например с лишним пивом, или избытком денег, ну или с лишними шашлыками .
А автору кода писали? Чо он говорит?
Автор почти я , слепил из трех программ под мои интересы .
Почти уже сегодня написал свой с более сложной работой .Завтра выложу.
Автор почти я , слепил из трех программ под мои интересы .
Почти уже сегодня написал свой с более сложной работой .Завтра выложу.
в более сложном коде обратите внимание на большое кол-во делеев и использование далласовской библиотеки - тормоза и проблемки в работе вам обеспечены.
Как и обещал выкладываю ещё пока сырой код , прошу помочь поправить если можно чтото изменить . Закоментированные части кода для дальнейшего апгрейда пропускаем .
[code] /*Программа для автоматики управления тэнами и насосом ТТ котла Входа аналоговые : А0-вход для подключения клавиатуры А4 - подключение дисплея I2C А5 - подключение дисплея А1 - температура подачи в бак Входа дискретные: D9 -вход шины OneWire для подключения цифрового датчика температуры D18B20 D6 - вход прерывание для регулятора Выхода: D2 - выход на подключение насоса СО D3 - выход на реле 1 тэна D4 - выход на реле 2 тэна D5 - выход на реле 3 тэна */ //подключаем библиотеки #include <Wire.h> #include <EEPROM2.h> #include <LiquidCrystal_I2C.h> #include <OneWire.h> #include <DallasTemperature.h> #include <CyberLib.h> //Библиотека от Cyber-Place.ru volatile uint8_t tic, Dimmer1; uint8_t data; LiquidCrystal_I2C lcd(0x27,16,2); //задаём адрес и тип дисплея // опрос цифровых датчиков температуры #define ONE_WIRE_BUS 9 //шина опроса датчиков на пин9 #define RES_TEMP 12 // разрешение (точность) темп. датчика в битах OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); //создаём объект sensors, подключенный по oneWire DeviceAddress Thermometer; // адрес устройства int a1=0; // обновление экранов int a2=0; // обновление экранов int a3=0; // Авария закипание котла float temp1=0; //заданые температуры int setTmp1=0; // температура поддержания теплоносителя int setTmp3=0; // температура включения насоса отопления //булевые переменые boolean pusk=LOW; //Объявим переменную для хранения команды пуск boolean avaria=LOW; // объявим переменую для хранения состояния аварии boolean avaria1=LOW; // объявим переменую для хранения состояния аварии датчик1 boolean set=LOW; // объявим переменую для переключения экранов // лонг переменые для работы таймеров unsigned long currentTime; // текущее время unsigned long time1; // обновление экранов // релейные выходы #define RELAY0_PIN 2 //Реле подключено к пину D2 boolean relayStatus0=LOW; //Объявим переменную для хранения состояния реле #define RELAY1_PIN 3 //Реле подключено к пину D3 boolean relayStatus1=LOW; //Объявим переменную для хранения состояния реле #define RELAY2_PIN 4 //Реле подключено к пину D4 boolean relayStatus2=LOW; //Объявим переменную для хранения состояния реле #define RELAY3_PIN 5 //Реле подключено к пину D5 boolean relayStatus3=LOW; //Объявим переменную для хранения состояния реле //Аналоговая клавиатура подключена к пину A0 #define KEYPAD_PIN A0 //Определим значения на аналоговом входе для клавиатуры #define ButtonUP_LOW 650 #define ButtonUP_HIGH 700 #define ButtonDOWN_LOW 480 #define ButtonDOWN_HIGH 550 #define ButtonLEFT_LOW 800 #define ButtonLEFT_HIGH 850 #define ButtonRIGHT_LOW 750 #define ButtonRIGHT_HIGH 790 #define ButtonSELECT_LOW 0 #define ButtonSELECT_HIGH 50 void setup() { //D6_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль // запуск библиотеки датчиков sensors.begin(); // Start up the library sensors.getAddress(Thermometer, 0); // получить адрес DS18B20 (0 - 1 датчик) // sensors.setResolution(Thermometer, RES_TEMP); // установить разрешение (точность) sensors.setWaitForConversion(false); // отключить ожидание при изм.темп. // время на изм. должно быть > 750ms // выборка произойдет по прерыванию таймера через 2 сек (первый раз) //считываем время с момента запуска программы currentTime=millis(); time1=currentTime; //time2=currentTime; // считаем из память уставки температуры setTmp1=EEPROM_read_byte(0); setTmp3=EEPROM_read_byte(2); // считываем из памяти значение болеан pusk=EEPROM_read_byte(7); //Настроим пин для управления реле pinMode(RELAY0_PIN,OUTPUT); digitalWrite(RELAY0_PIN,LOW); // насос отопления pinMode(RELAY1_PIN,OUTPUT); digitalWrite(RELAY1_PIN,LOW); //Тэн1 pinMode(RELAY2_PIN,OUTPUT); digitalWrite(RELAY2_PIN,LOW); //Тэн2 pinMode(RELAY3_PIN,OUTPUT); digitalWrite(RELAY3_PIN,LOW); //Тэн3 lcd.init(); lcd.backlight(); //Выведем на дисплей стартовое сообщение на 3 секунды lcd.setCursor(3, 0); lcd.print("Razrabotal"); lcd.setCursor(3, 1); lcd.print("Gorbachev O.N."); delay_ms(1000); lcd.init(); lcd.setCursor(4, 0); lcd.print("BALOMUT"); lcd.setCursor(5, 1); lcd.print("V-1.0"); delay_ms(2000); // выведем на дисплей заданное значение температуры на 3 секунды lcd.init(); lcd.setCursor(0, 0); lcd.print("Zad T(v)"); lcd.setCursor(11,0); lcd.print(setTmp1); lcd.setCursor(0, 1); lcd.print("Kotel"); if(pusk==HIGH){ lcd.setCursor(7,1); lcd.print("v rabote");Dimmer1=0;} else{ lcd.setCursor(6,1); lcd.print("ostanovlen");} delay_ms(500); } int ReadKey(int keyPin) { int KeyNum=0; int KeyValue1=0; int KeyValue2=0; int KeyValue3=0; //Читаем в цикле аналоговый вход, для подавления дребезга и нестабильности читаем по два раза подряд, пока значения не будут равны. //Если значения равны 1023 – значит не была нажата ни одна клавиша. do { //delay(20); KeyValue1=analogRead(keyPin); KeyValue2=analogRead(keyPin); } while (KeyValue1==KeyValue2&&KeyValue2!=1023); //Интерпретируем полученное значение и определяем код нажатой клавиши if (KeyValue2<ButtonUP_HIGH&&KeyValue2>ButtonUP_LOW) {KeyNum=1;} //Up if (KeyValue2<ButtonDOWN_HIGH&&KeyValue2>ButtonDOWN_LOW) {KeyNum=2;} //Down if (KeyValue2<ButtonLEFT_HIGH&&KeyValue2>=ButtonLEFT_LOW) {KeyNum=3;} //left if (KeyValue2<ButtonRIGHT_HIGH&&KeyValue2>ButtonRIGHT_LOW) {KeyNum=4;} //right if (KeyValue2<ButtonSELECT_HIGH&&KeyValue2>ButtonSELECT_LOW) {KeyNum=5;} //Select //Возвращаем код нажатой клавиши return KeyNum; } //void halfcycle() //прерывания таймера //{ // tic++; //счетчик // if(Dimmer1 < tic ) D6_High; //управляем выходом //} //void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту //{ // tic=0; //обнулить счетчик // ResumeTimer1(); //запустить таймер // attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик //} //void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту //{ //StopTimer1(); //остановить таймер //D6_Low; //логический ноль на выходы //tic=0; //обнулить счетчик //attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик //} void menu() { int keyCode=0; int k=0; lcd.init(); lcd.setCursor(0,0);lcd.print("Menu Nastroyki"); lcd.setCursor(0, 1);lcd.print("Menu #"); lcd.setCursor(7, 1);lcd.print(k); delay_ms(1000); do{ keyCode=ReadKey(KEYPAD_PIN); if(keyCode==1){k++;delay(300);k=min(k,4);lcd.setCursor(7,1);lcd.print(k);} if(keyCode==2){k--;delay(300);k=max(k,0);lcd.setCursor(7,1);lcd.print(k);} }while(keyCode!=5); if(k==1){setTemperature();} // if(k==2){setTemperature2();} } //Редактирование заданой температуры теплоносителя void setTemperature(){ // выводим на дисплей заданое значение темп. lcd.init(); int keyCode=0; int t=70; lcd.setCursor(0,0);lcd.print("Zad T(v) teplon."); lcd.setCursor(15,1);lcd.print("C"); lcd.setCursor(12,1);lcd.print(setTmp1); delay_ms(100); keyCode=0; //опрашиваем клавиатуру, прибавить клавиша вверх +1, убавить клавиша вниз -1 do{ keyCode=ReadKey(KEYPAD_PIN); if(keyCode==1){setTmp1++;delay(100);lcd.setCursor(12,1);lcd.print(setTmp1);} if(keyCode==2){setTmp1--;delay(100);lcd.setCursor(12,1);lcd.print(setTmp1);} setTmp1=min(setTmp1,92); setTmp1=max(setTmp1,40); lcd.setCursor(12,1);lcd.print(setTmp1); }while(keyCode!=5); delay_ms(100); // клавиша селект сохраняем в память EEPROM_write_byte(0,setTmp1); lcd.init(); } void loop() { Start currentTime=millis(); // time2=currentTime/3600000; // опрос клавиатуры int Feature=ReadKey(KEYPAD_PIN); if(Feature==5){;menu();}// переход в меню настройки // запуск котла нажать кнопку вверх if(Feature==1){delay_ms(100);pusk=HIGH; EEPROM_write_byte(7,pusk);} // останов котла нажать кнопку вниз if(Feature==2&&pusk==HIGH){delay_ms(100);pusk=LOW;EEPROM_write_byte(7,pusk);} // получам значение температуру СО. sensors.requestTemperatures(); // Команда на измерение температуры, temp1 = sensors.getTempC(Thermometer); /****** Авария датчика-Температура подачи теплоносителя*****/ if(temp1 ==(-127)){lcd.init();lcd.setCursor(0,0);lcd.print("Avaria T1");avaria1=HIGH;delay_ms(1000);} if(temp1 !=(-127)){avaria1=LOW;} /****************************************** Отключение тэнов при аварии датчика теплоносителя **************************************/ if(avaria1==HIGH||avaria==HIGH){Dimmer1=255;} //выключаем тэны при аварии датчика температуры подачи теплоносителя //Проверка условия включения/выключения нагревателя if (pusk==HIGH&&avaria==LOW) { if (temp1 < setTmp1 && relayStatus1 == LOW) { relayStatus1 = HIGH; digitalWrite(RELAY1_PIN, HIGH); lcd.setCursor(10, 1); lcd.print("P= 35%"); } if (temp1 > setTmp1 && relayStatus1 == HIGH) { relayStatus1 = LOW; digitalWrite(RELAY1_PIN, LOW); lcd.setCursor(10, 1); lcd.print("P= 0%"); } delay(500); if (temp1 + 1 < setTmp1 && relayStatus2 == LOW) { relayStatus2 = HIGH; digitalWrite(RELAY2_PIN, HIGH); lcd.setCursor(10, 1); lcd.print("P= 70%"); } if (temp1 > setTmp1 && relayStatus2 == HIGH) { relayStatus2 = LOW; digitalWrite(RELAY2_PIN, LOW); //lcd.begin(10, 2); } delay(500); if (temp1 + 2 < setTmp1 && relayStatus3 == LOW) { relayStatus3 = HIGH; digitalWrite(RELAY3_PIN, HIGH); lcd.setCursor(10, 1); lcd.print("P=100%"); } if (temp1 > setTmp1 && relayStatus3 == HIGH) { relayStatus3 = LOW; digitalWrite(RELAY3_PIN, LOW); }} // Включение насоса отопления //блок управления насосом отопления if(temp1>45&&relayStatus0==LOW) {relayStatus0=HIGH; digitalWrite(RELAY0_PIN,HIGH);} //пуск насоса отопления в режиме термостата if(temp1<45&&relayStatus0==HIGH) {relayStatus0=LOW; digitalWrite(RELAY0_PIN,LOW);} //обработка аварии от размораживания if(temp1<10){ // выводим на дисплей аварию по низкой температуре воды lcd.init(); lcd.setCursor(0,0);lcd.print("Avaria zam"); lcd.setCursor(0,1);lcd.print("T(v) <10C"); delay_ms(500); displayBlink1(); } //обработка аварии от закипания. if(temp1>=95){ // выводим на дисплей аварию по высокой температуре воды lcd.init(); lcd.setCursor(0,0);lcd.print("Avaria"); lcd.setCursor(0,1);lcd.print("Kotel kipit"); delay_ms(500); avaria=HIGH; } // моргание экрана при аварии if(avaria==HIGH) { displayBlink2();} // Сброс флага Авария if(temp1<95){ if (temp1<(setTmp1+5)){avaria=LOW;}} // Визуализация автоматики // обновление экранов if(currentTime>=(time1+10000)){set=HIGH;time1=currentTime;} if(currentTime>=(time1+7000)){set=LOW;} // вывод значения температуры на экран if(set==HIGH){ if(a1<1){ lcd.init();a1=1;}a2=0; lcd.setCursor(0, 0);lcd.print("Kotel"); if(pusk==HIGH){ lcd.setCursor(7,0);lcd.print("v rabote");} else{ lcd.setCursor(6,0);lcd.print("ostanovlen");} lcd.setCursor(0, 1); lcd.print(temp1); lcd.setCursor(6, 1); lcd.print("C");} End } void displayBlink1(){for(int i1;i1<5;i1++){ lcd.noDisplay(); delay_ms(1000); lcd.display(); delay_ms(1000);}} void displayBlink2(){for(int i1;i1<5;i1++){ lcd.noDisplay(); delay_ms(500); lcd.display(); delay_ms(500);}} [/code]