C++:
#include <EncButton.h>
#include <DHT22.h>
#include <LCD_I2C.h>
Button btn1(14); // подключаем кнопку 1 на пин 14 (Обогрев)
Button btn2(15); // подключаем кнопку 1 на пин 15 (Свет (РУНН/РУВН))
Button btn3(16); // подключаем кнопку 1 на пин 16 (Свет (Т1))
Button btn4(17); // подключаем кнопку 1 на пин 17 (Свет (Т2))
Button btn5(10); // подключаем кнопку 1 на пин 10 (Вентиляция)
unsigned long last_read=millis(), period_read=8000; //Это параметры организации цикла измерения температуры и влажности (1000 = 1 сек)
unsigned long last_yes=millis(), period_yes=20000; //Это параметры организации цикла задержки включения вентиляции и отопления (1000 = 1 сек)
LCD_I2C lcd(0x27, 16, 2); // Default address of most PCF8574 modules, change according
const int maxMoisture=30; //максимальная влажность
const int minTemperature=10; //минимальня температура
int LPB1=0;
int LPB2=0;
float t1;
float h1;
#define pinDATA 6 // объявление пина для датчика температуры и влажности
DHT22 dht22(pinDATA); //выбор датчика типа DHT
void setup()
{
pinMode(11, OUTPUT); // пин как выход для светодиода 1 (Автоотопление)
pinMode(9, OUTPUT); // пин как выход для светодиода 5 (Автовентиляция)
pinMode(14, INPUT); // пин как вход для кнопки 1 (Отопление)
pinMode(15, INPUT); // пин как вход для кнопки 2 Свет РУНН РУВН
pinMode(16, INPUT); // пин как вход для кнопки 3 Свет Т1
pinMode(17, INPUT); // пин как вход для кнопки 4 Свет Т2
pinMode(10, INPUT); // пин как вход для кнопки 5 (Вентиляция)
pinMode(5, OUTPUT); // пин как выход для реле 1 (Отопление)
pinMode(4, OUTPUT); // пин как выход для реле 2 Свет РУНН РУВН
pinMode(3, OUTPUT); // пин как выход для реле 3 Свет Т1
pinMode(2, OUTPUT); // пин как выход для реле 4 Свет Т2
pinMode(7, OUTPUT); // пин как выход для реле 5 (Вентиляция)
//pinMode(6, OUTPUT); занят датчиком температуры и влажности
Serial.begin(9600);
lcd.begin(); // Инициализируем экран, включаем подсветку
lcd.backlight();
//Устанавливаем положение курсора для первой строки.
lcd.home();
//выводим строку 1
lcd.print("Welcome!");
//выводим строку 2
lcd.setCursor(0, 1);
lcd.print("AO Sam. Transf.");
Serial.println("");
//Serial.println([B]FILE[/B]);
Serial.print("DATA VERSION: 1");
// Serial.println(DHTSTABLE_LIB_VERSION);
Serial.println("");
Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
//Serial.println("");
//Serial.print("Авто обогрев включен"); // Само действие при длинном нажатии
digitalWrite(11, HIGH);
LPB1=1;
digitalWrite(9, HIGH);
LPB2=1;
}
void loop()
{
if(millis()-last_read>period_read)
{ last_read=millis(); //Если работа модуля очень длительная, то тип last_read надо изменить!
float h = dht22.getHumidity(); //Измеряем влажность
float t = dht22.getTemperature(); //Измеряем температуру
if (isnan(h) || isnan(t)) // Проверка. Если не удается считать показания, выводится «Ошибка считывания», и программа завершает работу
{
Serial.println("Ошибка считывания с датчика DHT");
return;
}
t1=t;
h1=h;
//Вывод показателей на экран
//Устанавливаем положение курсора для первой строки.
lcd.home();
//выводим строку 1
lcd.print("Temp.: ");
lcd.print(t);
lcd.print(" *C ");
//выводим строку 2
lcd.setCursor(0, 1);
lcd.print("Humid.: ");
lcd.print(h);
lcd.print(" %");
}
// опрос кнопок происходит здесь
btn1.tick();
btn2.tick();
btn3.tick();
btn4.tick();
btn5.tick();
// клик по кнопке 1
if (btn1.click())
{
digitalWrite(5, !digitalRead(5));
digitalWrite(11, LOW);
LPB1=0;
}
// удержание кнопки 1
if (btn1.hold())
{
//Serial.println("btn 1 holded!");
digitalWrite(5, LOW);
digitalWrite(11, !digitalRead(11));
LPB1=1;
last_yes=millis();
}
// клик по кнопке 2
if (btn2.click())
{
digitalWrite(4, !digitalRead(4));
}
// клик по кнопке 3
if (btn3.click())
{
digitalWrite(3, !digitalRead(3));
}
// клик по кнопке 4
if (btn4.click())
{
digitalWrite(2, !digitalRead(2));
}
// клик по кнопке 5
if (btn5.click())
{
digitalWrite(7, !digitalRead(7));
digitalWrite(9, LOW);
LPB2=0;
}
// удержание кнопки 5
if (btn5.hold())
{
//Serial.println("btn 5 holded!");
digitalWrite(7, LOW);
digitalWrite(9, !digitalRead(9));
LPB2=1;
last_yes=millis();
}
//Автоотопление
if(dht22.getTemperature()<minTemperature&&digitalRead(11)==HIGH&&millis()-last_yes>period_yes&&LPB1==1)
{
last_yes=millis();
digitalWrite(5, HIGH);
LPB1=0;
}
if(dht22.getTemperature()>minTemperature&&digitalRead(11)==HIGH&&millis()-last_yes>period_yes&&LPB1==0)
{
last_yes=millis();
digitalWrite(5,LOW);
LPB1=1;
}
if(digitalRead(11)==LOW&&LPB1==1)
{
digitalWrite(5,LOW);
LPB1=0;
}
//Автовентиляция
if(dht22.getHumidity()>maxMoisture&&digitalRead(9)==HIGH&&millis()-last_yes>period_yes&&LPB2==1)
{
last_yes=millis();
digitalWrite(7, HIGH);
LPB2=0;
}
if(dht22.getHumidity()<maxMoisture&&digitalRead(9)==HIGH&&millis()-last_yes>period_yes&&LPB2==0)
{
last_yes=millis();
digitalWrite(7,LOW);
LPB2=1;
}
if(digitalRead(9)==LOW&&LPB2==1)
{
digitalWrite(7,LOW);
LPB2=0;
}
//Вывод данных в сериал порт при отправке i
if (Serial.available())
{
char c = Serial.read() ;
switch (c) {
case 'i' :
//Serial.println("");
//Serial.println("");
Serial.println("Данные о состоянии:");
Serial.print("Температура: ");
Serial.print(t1);
Serial.print(" *C ");
Serial.println("");
Serial.print("Влажность: ");
Serial.print(h1);
Serial.println(" %\t");
if(digitalRead(5)==LOW)
{
//Serial.println("");
Serial.println("Нагреватель отключен");
}
if(digitalRead(5)==HIGH)
{
//Serial.println("");
Serial.println("Нагреватель включен");
}
if(digitalRead(11)==LOW)
{
//Serial.println("");
Serial.println("Авто отопление отключено");
}
if(digitalRead(11)==HIGH)
{
//Serial.println("");
Serial.println("Авто отопление включено");
}
if(digitalRead(7)==LOW)
{
//Serial.println("");
Serial.println("Вентилятор отключен (закрыты жалюзи)");
}
if(digitalRead(7)==HIGH)
{
//Serial.println("");
Serial.println("Вентилятор включен (открыты жалюзи)");
}
if(digitalRead(9)==LOW)
{
//Serial.println("");
Serial.println("Авто вентиляция отключена");
}
if(digitalRead(9)==HIGH)
{
//Serial.println("");
Serial.println("Авто вентиляция включена");
}
if(digitalRead(4)==LOW)
{
//Serial.println("");
Serial.println("Свет РУНН(РУВН) отключен");
}
if(digitalRead(4)==HIGH)
{
//Serial.println("");
Serial.println("Свет РУНН(РУВН) включен");
}
if(digitalRead(3)==LOW)
{
//Serial.println("");
Serial.println("Свет T1 отключен");
}
if(digitalRead(3)==HIGH)
{
//Serial.println("");
Serial.println("Свет T1 включен");
}
if(digitalRead(2)==LOW)
{
//Serial.println("");
Serial.println("Свет T2 отключен");
}
if(digitalRead(2)==HIGH)
{
//Serial.println("");
Serial.println("Свет T2 включен");
}
break;
case 't' :
digitalWrite(5, LOW);
digitalWrite(11, !digitalRead(11));
LPB1=1;
last_yes=millis();
//Serial.println("Исполнено");
if(digitalRead(11)==LOW)
{
//Serial.println("");
Serial.println("Авто отопление отключено");
}
if(digitalRead(11)==HIGH)
{
//Serial.println("");
Serial.println("Авто отопление включено");
}
break;
case 'h' :
digitalWrite(7, LOW);
digitalWrite(9, !digitalRead(9));
LPB2=1;
last_yes=millis();
//Serial.println("Исполнено");
if(digitalRead(9)==LOW)
{
//Serial.println("");
Serial.println("Авто вентиляция отключена");
}
if(digitalRead(9)==HIGH)
{
//Serial.println("");
Serial.println("Авто вентиляция включена");
}
break;
}
}
}
Собственно в строках 322-340 проблема
При отправке "t" все работает корректно для Авто отопления
Отправил t
пришло - Авто отопление отключено
Отправил t
пришло - Авто отопление включено
А вот с точно таким же кодом на Авто вентиляцию все не так .....
Отправил h
пришло - Авто вентиляция включена (но должен написать что Авто вентиляция отключена)
Отправил h
пришло - Авто вентиляция отключена (это вообще не должно приходить)
и сразу пришло - Авто вентиляция включена (это в принципе пришло верно)
Сменил пин 9 на пин 8 ..... не помогло
C++:
#include <EncButton.h>
#include <DHT22.h>
#include <LCD_I2C.h>
Button btn1(14); // подключаем кнопку 1 на пин 14 (Обогрев)
Button btn2(15); // подключаем кнопку 1 на пин 15 (Свет (РУНН/РУВН))
Button btn3(16); // подключаем кнопку 1 на пин 16 (Свет (Т1))
Button btn4(17); // подключаем кнопку 1 на пин 17 (Свет (Т2))
Button btn5(10); // подключаем кнопку 1 на пин 10 (Вентиляция)
unsigned long last_read=millis(), period_read=8000; //Это параметры организации цикла измерения температуры и влажности (1000 = 1 сек)
unsigned long last_yes=millis(), period_yes=20000; //Это параметры организации цикла задержки включения вентиляции и отопления (1000 = 1 сек)
LCD_I2C lcd(0x27, 16, 2); // Default address of most PCF8574 modules, change according
const int maxMoisture=30; //максимальная влажность
const int minTemperature=10; //минимальня температура
int LPB1=0;
int LPB2=0;
int hhh=0;
float t1;
float h1;
#define pinDATA 6 // объявление пина для датчика температуры и влажности
DHT22 dht22(pinDATA); //выбор датчика типа DHT
void setup()
{
pinMode(11, OUTPUT); // пин как выход для светодиода 1 (Автоотопление)
pinMode(8, OUTPUT); // пин как выход для светодиода 5 (Автовентиляция)
pinMode(14, INPUT); // пин как вход для кнопки 1 (Отопление)
pinMode(15, INPUT); // пин как вход для кнопки 2 Свет РУНН РУВН
pinMode(16, INPUT); // пин как вход для кнопки 3 Свет Т1
pinMode(17, INPUT); // пин как вход для кнопки 4 Свет Т2
pinMode(10, INPUT); // пин как вход для кнопки 5 (Вентиляция)
pinMode(5, OUTPUT); // пин как выход для реле 1 (Отопление)
pinMode(4, OUTPUT); // пин как выход для реле 2 Свет РУНН РУВН
pinMode(3, OUTPUT); // пин как выход для реле 3 Свет Т1
pinMode(2, OUTPUT); // пин как выход для реле 4 Свет Т2
pinMode(7, OUTPUT); // пин как выход для реле 5 (Вентиляция)
//pinMode(6, OUTPUT); занят датчиком температуры и влажности
Serial.begin(9600);
lcd.begin(); // Инициализируем экран, включаем подсветку
lcd.backlight();
//Устанавливаем положение курсора для первой строки.
lcd.home();
//выводим строку 1
lcd.print("Welcome!");
//выводим строку 2
lcd.setCursor(0, 1);
lcd.print("AO Sam. Transf.");
Serial.println("");
//Serial.println(__FILE__);
Serial.print("DATA VERSION: 1");
// Serial.println(DHTSTABLE_LIB_VERSION);
Serial.println("");
Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
//Serial.println("");
//Serial.print("Авто обогрев включен"); // Само действие при длинном нажатии
digitalWrite(11, HIGH);
LPB1=1;
digitalWrite(8, HIGH);
LPB2=1;
hhh=1;
}
void loop()
{
if(millis()-last_read>period_read)
{ last_read=millis(); //Если работа модуля очень длительная, то тип last_read надо изменить!
float h = dht22.getHumidity(); //Измеряем влажность
float t = dht22.getTemperature(); //Измеряем температуру
if (isnan(h) || isnan(t)) // Проверка. Если не удается считать показания, выводится «Ошибка считывания», и программа завершает работу
{
Serial.println("Ошибка считывания с датчика DHT");
return;
}
t1=t;
h1=h;
//Вывод показателей на экран
//Устанавливаем положение курсора для первой строки.
lcd.home();
//выводим строку 1
lcd.print("Temp.: ");
lcd.print(t);
lcd.print(" *C ");
//выводим строку 2
lcd.setCursor(0, 1);
lcd.print("Humid.: ");
lcd.print(h);
lcd.print(" %");
}
// опрос кнопок происходит здесь
btn1.tick();
btn2.tick();
btn3.tick();
btn4.tick();
btn5.tick();
// клик по кнопке 1
if (btn1.click())
{
digitalWrite(5, !digitalRead(5));
digitalWrite(11, LOW);
LPB1=0;
}
// удержание кнопки 1
if (btn1.hold())
{
//Serial.println("btn 1 holded!");
digitalWrite(5, LOW);
digitalWrite(11, !digitalRead(11));
LPB1=1;
last_yes=millis();
}
// клик по кнопке 2
if (btn2.click())
{
digitalWrite(4, !digitalRead(4));
}
// клик по кнопке 3
if (btn3.click())
{
digitalWrite(3, !digitalRead(3));
}
// клик по кнопке 4
if (btn4.click())
{
digitalWrite(2, !digitalRead(2));
}
// клик по кнопке 5
if (btn5.click())
{
digitalWrite(7, !digitalRead(7));
digitalWrite(8, LOW);
LPB2=0;
hhh=0;
}
// удержание кнопки 5
if (btn5.hold())
{
//Serial.println("btn 5 holded!");
digitalWrite(7, LOW);
digitalWrite(8, !digitalRead(8));
LPB2=1;
if (digitalRead(8)==HIGH)
{hhh=1;}
if (digitalRead(8)==LOW)
{hhh=0;}
last_yes=millis();
}
//Автоотопление
if(dht22.getTemperature()<minTemperature&&digitalRead(11)==HIGH&&millis()-last_yes>period_yes&&LPB1==1)
{
last_yes=millis();
digitalWrite(5, HIGH);
LPB1=0;
}
if(dht22.getTemperature()>minTemperature&&digitalRead(11)==HIGH&&millis()-last_yes>period_yes&&LPB1==0)
{
last_yes=millis();
digitalWrite(5,LOW);
LPB1=1;
}
if(digitalRead(11)==LOW&&LPB1==1)
{
digitalWrite(5,LOW);
LPB1=0;
}
//Автовентиляция
if(dht22.getHumidity()>maxMoisture&&digitalRead(8)==HIGH&&millis()-last_yes>period_yes&&LPB2==1)
{
last_yes=millis();
digitalWrite(7, HIGH);
LPB2=0;
}
if(dht22.getHumidity()<maxMoisture&&digitalRead(8)==HIGH&&millis()-last_yes>period_yes&&LPB2==0)
{
last_yes=millis();
digitalWrite(7,LOW);
LPB2=1;
}
if(digitalRead(8)==LOW&&LPB2==1)
{
digitalWrite(7,LOW);
LPB2=0;
}
//Вывод данных в сериал порт при отправке i
if (Serial.available())
{
char c = Serial.read() ;
switch (c) {
case 'i' :
//Serial.println("");
//Serial.println("");
Serial.println("Данные о состоянии:");
Serial.print("Температура: ");
Serial.print(t1);
Serial.print(" *C ");
Serial.println("");
Serial.print("Влажность: ");
Serial.print(h1);
Serial.println(" %\t");
if(digitalRead(5)==LOW)
{
//Serial.println("");
Serial.println("Нагреватель отключен");
}
if(digitalRead(5)==HIGH)
{
//Serial.println("");
Serial.println("Нагреватель включен");
}
if(digitalRead(11)==LOW)
{
//Serial.println("");
Serial.println("Авто отопление отключено");
}
if(digitalRead(11)==HIGH)
{
//Serial.println("");
Serial.println("Авто отопление включено");
}
if(digitalRead(7)==LOW)
{
//Serial.println("");
Serial.println("Вентилятор отключен (закрыты жалюзи)");
}
if(digitalRead(7)==HIGH)
{
//Serial.println("");
Serial.println("Вентилятор включен (открыты жалюзи)");
}
if(digitalRead(8)==LOW)
{
//Serial.println("");
Serial.println("Авто вентиляция отключена");
}
if(digitalRead(8)==HIGH)
{
//Serial.println("");
Serial.println("Авто вентиляция включена");
}
if(digitalRead(4)==LOW)
{
//Serial.println("");
Serial.println("Свет РУНН(РУВН) отключен");
}
if(digitalRead(4)==HIGH)
{
//Serial.println("");
Serial.println("Свет РУНН(РУВН) включен");
}
if(digitalRead(3)==LOW)
{
//Serial.println("");
Serial.println("Свет T1 отключен");
}
if(digitalRead(3)==HIGH)
{
//Serial.println("");
Serial.println("Свет T1 включен");
}
if(digitalRead(2)==LOW)
{
//Serial.println("");
Serial.println("Свет T2 отключен");
}
if(digitalRead(2)==HIGH)
{
//Serial.println("");
Serial.println("Свет T2 включен");
}
break;
case 't' :
digitalWrite(5, LOW);
digitalWrite(11, !digitalRead(11));
LPB1=1;
last_yes=millis();
//Serial.println("Исполнено");
if(digitalRead(11)==LOW)
{
//Serial.println("");
Serial.println("Авто отопление отключено");
}
if(digitalRead(11)==HIGH)
{
//Serial.println("");
Serial.println("Авто отопление включено");
}
break;
case 'h' :
digitalWrite(7, LOW);
digitalWrite(8, !digitalRead(8));
LPB2=1;
if (digitalRead(8)==HIGH)
{hhh=1;}
if (digitalRead(8)==LOW)
{hhh=0;}
last_yes=millis();
//Serial.println("Исполнено");
if(hhh==1) // Бл... ну почему????
{
//Serial.println("");
Serial.println("Авто вентиляция отключена"); // Бл... ну почему????
}
if(hhh==0) // Бл... ну почему????
{
//Serial.println("");
Serial.println("Авто вентиляция включена"); // Бл... ну почему????
}
break;
}
}
}
Я не понимаю ..... но вот так заработало ......
Ну это же инверсно получается ?????