Буду благодарен за помощь
- Войдите на сайт для отправки комментариев
Пт, 28/09/2018 - 12:28
Доброго времени суток.
Ардуино хобби и неспеша строю умный дом. Застрял на одном моменте.
В void sleep при условии отсутвия света и наличия движения плавно включается светодиодная лента, по задумке она должна работать некое время (пусть это будет 5 сек) и плавно выключатся. Помогите найти ошибку, не отрабатывает таймер на выключение светодиодной ленты, строка 242.
Также если укажите на другие ошибки или как оптимизировать код буду благодарен за помощь.
#include <SoftwareSerial.h>
#include <Nextion.h> //подключаем библиотеку экрана NEXTION
#include <Wire.h> // I2C-Library для ФМ приемника
#include <RDA5807M.h> //библиотека ФМ приемника
RDA5807M radio; //создаем переменную для радио
#define nextion Serial3
Nextion myNextion(nextion, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps
#include <iarduino_RTC.h> // библиотека с модулем реального времени.
iarduino_RTC time(RTC_DS1307); // Объявляем объект time для работы с RTC модулем на базе чипа DS3231, используется аппаратная шина I2C
//iarduino_RTC time(RTC_DS1302, 4, 5, 6);//выводам модуля RST, CLK, DAT
#include <DFPlayer_Mini_Mp3.h> //подключаем библиотеку плеера
#include <IRremote.h> //подключаем библиотеку ИК датчика
IRrecv irrecv(30); // ИК приемник подключен к 30 пину (зеленый) распиновка датчика комнаты
//IRsend irsend; //ИК датчик подключен к 39 пину серый - датчик движения
decode_results results;// зеленый - IR прием с пульта
#include "DHT.h" // подключаем библиотеку датчика температуры желтый - датчик влажности/температуры
#define DHTTYPE DHT11 // DHT 11 указываем какой у нас датчик белый - фоторезистор А6
#define DHT_1_PIN 22 // указываем пин подключения датчика влажности улицы красный - плюс 5в
#define DHT_2_PIN 32 // указываем пин подключения датчика влажности комнаты (желтый) синий - минус 5в
#define DHT_3_PIN 36 // указываем пин подключения датчика влажности коридора
DHT dht1(DHT_1_PIN, DHTTYPE); // инициализация датчика влажности и температуры улицы оранжевый - светодиод 24
DHT dht2(DHT_2_PIN, DHTTYPE); // инициализация датчика влажности и температуры комнаты черный -
DHT dht3(DHT_3_PIN, DHTTYPE); // инициализация датчика влажности и температуры коридора
int movSenseRoomPin = 26; // переменная датчика движения комнаты подключен к 26 пину (серый)
int movSenseCorrPin = 34; // переменная датчика движения коридора подключен к 34 пину
int rainSensePin= 28; // цифровой пин для подключения датчика дождя
int lightstreet; // переменная дня и ночи на улице 1-ночь, 0-день
boolean lightroom=true; // переменная освещенности комнаты
int lightWallRoom=false; // переменная реле дополнительного света комнаты
unsigned long prev = 0; // переменная для задежки вывод на экран
unsigned long prev2 = 0; // переменная для задежки для ночного освещения
int interval = 1000; // интервал 1 секунда для вывода инфы на экран
int interval2 = 10000; // интервал 20 для ночного освещения
boolean activeStat=false; // переменная для режима "АКТИВНЫЙ"
boolean sleepStat=false; // переменная для режима "СОН"
boolean securityStat=false; // переменная для режима "ОХРАНА"
String message = myNextion.listen(); // check for message
int modeStatus1 = 0; // АКТИВНЫЙ
int modeStatus2 = 0; // СОН
int modeStatus3 = 0; // ОХРАНА
boolean ledlightstatus=false; //статус ночночной подсветки в комнате
void setup()
{
//time.settime(0, 25, 13); // установить время (секунды, минуты, часы)
Serial.begin(9600); // инициализация Serial-порта
Serial2.begin (9600); // скорость бод на МП3 плеер
radio.begin(RDA5807M_BAND_WORLD); // установка ФМ приемника на волну fm
mp3_set_serial (Serial2); // подключение порта плеера
myNextion.init(); // инициализация дисплея
dht1.begin(); // запуск датчика влажности
time.begin(); // Инициируем работу с модулем реального времени
irrecv.enableIRIn();
mp3_set_volume (20); // громкость плеера
pinMode(rainSensePin, INPUT); // датчик дождя указываем как вход
pinMode(movSenseRoomPin, INPUT); // 26 пин датчика движения указываем входом
pinMode(movSenseCorrPin, INPUT); // 27 пин датчика движения указываем входом
pinMode(50, OUTPUT); digitalWrite(50, HIGH); // выход реле дополнительного освещения
pinMode(48, INPUT); // подключение кнопки реле дополнительного света комнаты
pinMode(44, OUTPUT); // подключение светодиодов в комнате
}
void loop()
{
if (activeStat==true)
{active ();} //включение режима "АКТИВНЫЙ"
if (sleepStat==true)
{sleep ();} //включение режима "СОН"
if (securityStat==true)
{security ();} //включение режима "СОН"
//Serial.println (analogRead(7));
//if(digitalRead(48)==HIGH)//если кнопка нажата дополнительного света комнаты
// {
// releintWallRoom ();
// delay(500);//небольшая защита от "дребезга" контактов кнопки
// }
if (analogRead(6)<100) //установка значения дня и ночи комнаты
{lightroom=false;}
else
{lightroom=true;}
if ( irrecv.decode( &results )) //если что-то пришло в ИК датчик
{
Serial.println(results.value, HEX);
if (results.value==0xFF22DD) //сверяем какие данные получили, если то что нам нужно
{releintWallRoom ();
results.value=0;} //меняем переменную на ноль
if (results.value==0x60D7807F) //команда переключения в режим "АКТИВНЫЙ"
{activeStat=true; //переходим в режим "АКТИВНЫЙ"
results.value=0;} //меняем переменную на ноль
if (results.value==0x60D740BF) //команда переключения в режим "СОН"
{sleepStat=true; //переходим в режим "СОН"
results.value=0;}//меняем переменную на ноль
if (results.value==0x60D7C03F) //команда переключения в режим "ОХРАНА"
{securityStat=true; //переходим в режим "ОХРАНА"
results.value=0;}//меняем переменную на ноль
if (results.value==0x60D7F00F) //выключение радио
{radio.mute();}
irrecv.resume();} // ждем следующих данных в ИК датчик
//-------------- ПОЛУЧЕНИЕ ДАННЫХ С ИК ДАТЧИКА --------------
//---------------- прием данных с экрана ----------------
String message = myNextion.listen();
if(message != "")Serial.println(message);
{
if(message == "65 0 8 1 ffff ffff ffff") //сообщение с выключателя дополнительного света комнаты
{releintWallRoom ();}
if(message == "65 0 6 1 ffff ffff ffff") //сообщение переход в режим "АКТИВНЫЙ"
{activeStat=true;} //активация режима "АКТИВНЫЙ"
if(message == "65 0 5 1 ffff ffff ffff") //сообщение переход в режим "АКТИВНЫЙ"
{activeStat=true;} //активация режима "АКТИВНЫЙ"
if(message == "65 0 6 1 ffff ffff ffff") //сообщение переход в режим "СОН"
{sleepStat=true;} //активация режима "СОН"
if(message == "65 0 9 1 ffff ffff ffff") //сообщение переход в режим "ОХРАНА"
{securityStat=true;} //активация режима "ОХРАНА"
// RADIO
if(message == "65 2 20 1 ffff ffff ffff") //сообщение ФМ модуля VOLUME -
{radio.volumeDown();} //VOLUME -
if(message == "65 2 21 1 ffff ffff ffff") //сообщение ФМ модуля VOLUME +
{radio.volumeUp();} //VOLUME +
if(message == "65 2 1e 1 ffff ffff ffff") //сообщение ФМ модуля ПОИСК СТАНЦИИ +
{radio.seekUp();} //ПОИСК СТАНЦИИ +
if(message == "65 2 1c 1 ffff ffff ffff") //сообщение ФМ модуля ВКЛ/ВЫКЛ
{radio.mute();}
if(message == "65 0 1d 1 ffff ffff ffff") //сообщение ФМ модуля ВКЛ/ВЫКЛ
{radio.unMute();}
// RADIO
//---------------- прием данных с экрана ----------------
}
}
void releintWallRoom () //действия при вкл/выкл реле дополнительно освещения комнаты
{
lightWallRoom=!lightWallRoom;
if (lightWallRoom==true)
{
mp3_play (2); //воспроизвести mp3/0002releintWallRoomOFF
digitalWrite( 50, HIGH ); //выключаем реле
myNextion.sendCommand("lightWallRoom.pic=8");//на экране изменяем картинку
}
if (lightWallRoom==false)
{
mp3_play (1); //воспроизвести mp3/0001releintWallRoomON
{digitalWrite( 50, LOW ); //включаем реле
myNextion.sendCommand("lightWallRoom.pic=7");}//на экране изменяем картинку
}
}
void active () //------------------------------------------------------------------------------
{
if (modeStatus1==0)
{sleepStat=false;
securityStat=false;
mp3_play (3);
myNextion.sendCommand("page page0");
myNextion.sendCommand("dim=80");
myNextion.setComponentText("time2", String(" ")); //на экран время
myNextion.sendCommand("activePic.pic=16"); //на экран изменяем картинку АКТИВНЫЙ ОН
myNextion.sendCommand("sleepPic.pic=14"); //на экран изменяем картинку СОН ОФ
myNextion.sendCommand("securityPic.pic=12"); //на экран изменяем картинку ОХРАНА ОФ
modeStatus1=1; //изменяем свою переменную
modeStatus2=0; //изменяем переменную "СОН"
modeStatus3=0; //изменяем переменную "ОХРАНА"
}
infoNextion ();
if (analogRead(7)<300)// если свет нет
{lightstreet=1;} //переменная дня и ночи переходит в статус ночь
else
{lightstreet=0;} //переменная дня и ночи переходит в статус день
}
void sleep () //------------------------------------------------------------------------------
{
if (modeStatus2==0)
{activeStat=false;
securityStat=false;
mp3_play (4);
myNextion.sendCommand("dim=1");
myNextion.sendCommand("activePic.pic=15"); //на экран изменяем картинку АКТИВНЫЙ ОФ
myNextion.sendCommand("sleepPic.pic=13"); //на экран изменяем картинку СОН
myNextion.sendCommand("securityPic.pic=12"); //на экран изменяем картинку ОХРАНА ОФ
modeStatus2=1; //изменяем свою переменную
modeStatus1=0; //изменяем переменную "АКТИВНЫЙ"
modeStatus3=0; //изменяем переменную "ОХРАНА"
}
infoNextion ();
boolean light=false; //переменная для хранения состояния света (вкл/выкл)
int movPinCorr=(digitalRead (movSenseCorrPin)); //переменная датчика движения корридора
int movPinroom=(digitalRead (movSenseRoomPin)); //переменная датчика движения комнаты
if (movPinroom==1&&(lightroom==false)&&ledlightstatus==false&&light==false) //если в комнате движения есть и темно
{for(int i=0; i<=155; i++) //то плавно включаем свет
{
analogWrite(44, i);
delay(50); //каждые 10мс увелияение на 1
}
light=true;
ledlightstatus=true;
myNextion.sendCommand("dim=10");
prev2 = millis(); //записываем данные для задержки подсветки
}
if (light==true)
{
if (millis() - prev2 > 5000)
{ /*for(int i=155; i>=0; i--) // плавно выключаем свет
{
analogWrite(44, i);
delay(30); //каждые мс уменьшение
}*/
digitalWrite (44, LOW);
light=false;
ledlightstatus=false;
myNextion.sendCommand("dim=1");
}
}
}
void security () //------------------------------------------------------------------------------
{
if (modeStatus3==0)
{activeStat=false;
sleepStat=false;
//mp3_play (4);
myNextion.sendCommand("dim=3");
myNextion.sendCommand("activePic.pic=15"); //на экран изменяем картинку АКТИВНЫЙ ОФ
myNextion.sendCommand("sleepPic.pic=14"); //на экран изменяем картинку СОН ОФ
myNextion.sendCommand("securityPic.pic=11"); //на экран изменяем картинку ОХРАНА ОН
modeStatus3=1; //изменяем свою переменную
modeStatus1=0; //изменяем переменную "АКТИВНЫЙ"
modeStatus2=0; //изменяем переменную "СОН"
}
}
void infoNextion ()
{
int movPinroom=(digitalRead (movSenseRoomPin));
int movPinCorr=(digitalRead (movSenseCorrPin));
//------------- получения данных с датчиков температуры и влажности -------------
int tempstreet = dht1.readTemperature(); // переменная температуры улицы
int humstreet = dht1.readHumidity(); // переменная влажности улицы
int rainSenseReading = digitalRead(rainSensePin); //переменная дождя 1-нет, 0-есть
int temproom = dht2.readTemperature(); // переменная температуры комнаты
int humroom = dht2.readHumidity(); // переменная влажности комнаты
int tempcorridor = dht3.readTemperature(); // переменная температуры коридора
int humcorridor = dht3.readHumidity(); // переменная влажности коридора
//------------- получения данных с датчиков температуры и влажности -------------
// Serial.println (rainSenseReading);
if (millis()-prev>interval) //проверка времени для вывод на экран
{
if(message == "") // если сообщений от экрана нет выводим инфу
{
//вывод инфы датчиков движения
// комната
if (lightroom==false)// если в комнате темно
{myNextion.sendCommand("t3.pco=528");}// меняем цвет букв на синий
else
{myNextion.sendCommand("t3.pco=57035");}// меняем цвет букв на желтый
if (movPinroom==1) // если в комнате есть движение
{myNextion.sendCommand("va0.val=1");}// ГОМЕР прыгает (движение есть)
// комната
//коридор
if (analogRead(5)<100)// если в коридоре темно
{myNextion.sendCommand("t11.pco=528");}// меняем цвет букв на синий
else
{myNextion.sendCommand("t11.pco=57035");}// меняем цвет букв на желтый
if (movPinCorr==1) // если в коридоре есть движение
{myNextion.sendCommand("va1.val=1");}// ГОМЕР прыгает (движение есть)
//коридор
//вывод инфы датчиков движения
//вывод температуры и влажности
myNextion.setComponentText("tempstreet", String(tempstreet)); //на экран в tempstreet вывести температуру
myNextion.setComponentText("humstreet", String(humstreet));//на экран в humstreet вывести влажность
myNextion.setComponentText("temproom", String(temproom)); //на экран в temproom вывести температуру комнаты
myNextion.setComponentText("humroom", String(humroom)); //на экран в humroom вывести влажность комнаты
myNextion.setComponentText("tempcorridor", String(tempcorridor)); //на экран в tempcorridor вывести температуру коридора
myNextion.setComponentText("humcorridor", String(humcorridor)); //на экран в humcorridor вывести влажность коридора
//вывод температуры и влажности
//вывод времени и даты
myNextion.setComponentText("time", String(time.gettime("H :i"))); //на экран время
myNextion.setComponentText("date", String(time.gettime("d.m.Y"))); //на экран дата
//вывод времени и даты
//--------------- изменения картинки дня и ночи, дождь или нет
if (lightstreet==0&rainSenseReading==0)//если на улице день и начался дождь
{myNextion.sendCommand("day.pic=1"); }//на экран изменяем картинку солнце за тучей
if (lightstreet==1&rainSenseReading==0)//если на улице ночь и начался дождь
{myNextion.sendCommand("day.pic=2");} //на экран изменяем картинку месяц за тучей
if (lightstreet==0&rainSenseReading==1)// если на улице день и нет дождя
{myNextion.sendCommand("day.pic=3");} //меняем фон на дневной
if (lightstreet==1&rainSenseReading==1)// если на улице ночь и нет дождя
{myNextion.sendCommand("day.pic=4");} //меняем фон на ночной
//--------------- изменения картинки дня и ночи, дождь или нет
prev = millis(); //сбрасываем таймер вывод на экран инфы
}
}
}
в строке 221 добавьте вначале ключевое слово static - скорее всего проблема решится, если я не пропустил других косяков
Или вынести light в определение глобалов .. только ещё просмотреть код на предмет где этот light надо ещё ставить в false принудительно..
light объявлена в
voidsleep 201 строка221 строка boolean light=false;//переменная для хранения состояния света (вкл/выкл)240
if(light==true) отрабатывает без проблем, но когда доходит доif(millis() - prev2 > 5000)продвижений увы нет (Пробывал заменить на
ifledlightstatus=trueтоже самое, доходит до таймера и тормозитИ не должна отрабатывать, потому что "как есть" - она у Вас обьявлена как локальная (внутренняя) переменная функции и ПРИ КАЖДОМ вызове устанавливается заново в false. Чтобы этого избежать (и помнить промеж вызовов что true) надо воспользоваться советом из постов №1 или 2.
light объявлена в
voidsleep 201 строка221 строка boolean light=false;//переменная для хранения состояния света (вкл/выкл)вам же написали, что делать - либо обьявите light как static. либо вынесите ее из процедуры sleep() в глобальные.
Вы по подсказкам не догадались, в чем дело? - у вас сейчас переменная light не сохраняется между вызовами функции sleep. а каждый раз ставится в false. поэтому условие для плавного выключения диодов не выполняется никогда.
Код не ваш что ли, списали где-то и ничего в нем не смыслите?
в строке 211 добавьте вначале ключевое слово static - скорее всего проблема решится, если я не пропустил других косяков
Условие
201 void sleep () //------------------------------------------------------------------------------ 202 { 203 if (modeStatus2==0) 204 {activeStat=false; 205 securityStat=false; 206 mp3_play (4); 207 myNextion.sendCommand("dim=1"); 208 myNextion.sendCommand("activePic.pic=15"); //на экран изменяем картинку АКТИВНЫЙ ОФ 209 myNextion.sendCommand("sleepPic.pic=13"); //на экран изменяем картинку СОН 210 myNextion.sendCommand("securityPic.pic=12"); //на экран изменяем картинку ОХРАНА ОФ 211 212 modeStatus2=1; //изменяем свою переменную 213 modeStatus1=0; //изменяем переменную "АКТИВНЫЙ" 214 modeStatus3=0; //изменяем переменную "ОХРАНА" 215 }для того чтобы при активации режима условие выполнялось один раз
semen741. прошу прощения, я сослепу не разглядел номер строки - не 211, а 221
Ну и советую сначала прочитать все последующие сообщения в ветке - вам уже разжевали и ЧТО надо сделать. и ПОЧЕМУ
light объявлена в
voidsleep 201 строка221 строка boolean light=false;//переменная для хранения состояния света (вкл/выкл)вам же написали, что делать - либо обьявите light как static. либо вынесите ее из процедуры sleep() в глобальные.
Вы по подсказкам не догадались, в чем дело? - у вас сейчас переменная light не сохраняется между вызовами функции sleep. а каждый раз ставится в false. поэтому условие для плавного выключения диодов не выполняется никогда.
Код не ваш что ли, списали где-то и ничего в нем не смыслите?
Я понял. Поэтому без таймера отработка была один раз (тоесть светодиод сразу выключался), а потом переменная преходила снова в false и соответсвенно таймер не отрабатывал.
Спасибо!
Не пойму почему не корректно работает прием данных с ИК пульта
Работало все нормально, чутку подправил код и добавил датчики 18В20. Датчики отрабатывает норм, но данные с ИК пульта принимаются только если есть движение от датчика комнаты const byte movSenseRoomPin = 26; когда движения нет, данные с ИК пульта не принимаются(((
#include <SoftwareSerial.h> #include <Nextion.h> //подключаем библиотеку экрана NEXTION #include <Wire.h> // I2C-Library для ФМ приемника #include <RDA5807M.h> //библиотека ФМ приемника #include <OneWire.h> //подключение библиотеки для датчика BM18B20 #include <DallasTemperature.h> //подключение библиотеки для датчика BM18B20 OneWire oneWire(25); // пин покдлючение нескольких датчиков //#define ONE_WIRE_BUS 22 //подключение пина датчика BM18B20 //OneWire oneWire(ONE_WIRE_BUS); // настроим библиотеку 1-Wire для связи с датчиком BM18B20 DallasTemperature ds(&oneWire); // создадим объект для работы с библиотекой DallasTemperature DeviceAddress sensor1 = {0x28, 0x61, 0x64, 0x11, 0xA9, 0xD5, 0x21, 0xF1}; DeviceAddress sensor2 = {0x28, 0xFF, 0x36, 0x2F, 0x2, 0x17, 0x3, 0x95}; DeviceAddress sensor3 = {0x28, 0x61, 0x64, 0x11, 0xB1, 0x88, 0xE3, 0x16}; RDA5807M radio; //создаем переменную для радио #define nextion Serial3 Nextion myNextion(nextion, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps #include <iarduino_RTC.h> // библиотека с модулем реального времени. iarduino_RTC time(RTC_DS1307); // Объявляем объект time для работы с RTC модулем на базе чипа DS3231, используется аппаратная шина I2C //iarduino_RTC time(RTC_DS1302, 4, 5, 6);//выводам модуля RST, CLK, DAT #include <DFPlayer_Mini_Mp3.h> //подключаем библиотеку плеера #include <IRremote.h> //подключаем библиотеку ИК датчика IRrecv irrecv(30); // ИК приемник подключен к 30 пину (зеленый) распиновка датчика комнаты //IRsend irsend; //ИК датчик подключен к 39 пину серый - датчик движения decode_results results;// зеленый белый - IR прием с пульта #include "DHT.h" // подключаем библиотеку датчика температуры желтый голубой - датчик влажности/температуры #define DHTTYPE DHT22 // DHT 11 указываем какой у нас датчик белый зеленый - фоторезистор А6 //#define DHT_1_PIN 22 // указываем пин подключения датчика влажности улицы красный - плюс 5в #define DHT_2_PIN 32 // указываем пин подключения датчика влажности комнаты (желтый) синий - минус 5в //#define DHT_3_PIN 36 // указываем пин подключения датчика влажности коридора //#define DHT_4_PIN 38 // указываем пин подключения датчика влажности ванной //DHT dht1(DHT_1_PIN, DHTTYPE); // инициализация датчика влажности и температуры улицы оранжевый - светодиод лента 24 +12v DHT dht2(DHT_2_PIN, DHTTYPE); // инициализация датчика влажности и температуры комнаты черный - светодиод лента -12v //88888888DHT dht3(DHT_3_PIN, DHTTYPE); // инициализация датчика влажности и температуры коридора //88888888DHT dht4(DHT_4_PIN, DHTTYPE); // инициализация датчика влажности и температуры ванной const byte movSenseRoomPin = 26; // переменная датчика движения комнаты подключен к 26 пину (серый) const byte movSenseCorrPin = 34; // переменная датчика движения коридора подключен к 34 пину const byte movSenseBathroom = 42; // переменная датчика движения ванной подключен к 42 пину const byte rainSensePin= 28; // цифровой пин для подключения датчика дождя boolean lightstreet; // переменная дня и ночи на улице. день - true, ночь - false boolean lightroom=true; // переменная освещенности комнаты true - светло, false - темно boolean lightWallRoom=true; // переменная реле дополнительного света комнаты boolean lightMainRoom=true; // переменная реле основного света комнаты unsigned long prev = 0; // переменная для задежки вывод на экран датчиков температуры unsigned long prev2 = 0; // переменная для задежки ночного освещения комнаты unsigned long prev3 = 0; // переменная для задежки вывод на экран датчиков движения boolean activeStat=false; // переменная для режима "АКТИВНЫЙ" boolean sleepStat=false; // переменная для режима "СОН" boolean securityStat=false; // переменная для режима "ОХРАНА" boolean light=false; //переменная для хранения состояния света (вкл/выкл) String message = myNextion.listen(); // check for message boolean modeStatus1 = 0; // АКТИВНЫЙ boolean modeStatus2 = 0; // СОН boolean modeStatus3 = 0; // ОХРАНА int doorBathroom = 40; //пин подключение геркона ванной void setup() { //time.settime(0, 49, 23); // установить время (секунды, минуты, часы) Serial.begin(9600); // инициализация Serial-порта Serial2.begin (9600); // скорость бод на МП3 плеер radio.begin(RDA5807M_BAND_WORLD); // установка ФМ приемника на волну fm mp3_set_serial (Serial2); // подключение порта плеера myNextion.init(); // инициализация дисплея dht2.begin(); // запуск датчика влажности //88888888dht3.begin(); //88888888dht4.begin(); ds.begin(); // запуск датчика BM18B20 time.begin(); // Инициируем работу с модулем реального времени irrecv.enableIRIn(); mp3_set_volume (15); // громкость плеера myNextion.sendCommand("settings.j0.val=48"); pinMode(rainSensePin, INPUT); // датчик дождя указываем как вход pinMode(movSenseRoomPin, INPUT); // 26 пин датчика движения комнаты указываем входом pinMode(movSenseCorrPin, INPUT); // 27 пин датчика движения коридора указываем входом pinMode(movSenseBathroom, INPUT); // 42 пин датчика движения ванной указываем входом pinMode(46, OUTPUT); digitalWrite(46, HIGH); // выход реле бокового освещения pinMode(48, OUTPUT); digitalWrite(48, HIGH); // выход реле основного освещения pinMode(47, INPUT); // подключение кнопки реле бокового света комнаты pinMode(49, INPUT); // подключение кнопки реле основного света комнаты pinMode(44, OUTPUT); // подключение светодиодов в комнате pinMode(doorBathroom, INPUT); } void loop() { if (activeStat==true)//включение режима "АКТИВНЫЙ" {active ();} if (sleepStat==true) {sleep ();} //включение режима "СОН" if (securityStat==true) {security ();} //включение режима "ОХРАНА" if (analogRead(6)<100) //установка значения дня и ночи комнаты {lightroom=false;} //если темно - false else {lightroom=true;} //если светло - true if (analogRead(7)>130)// освещение улицы день - true, ночь - false {lightstreet=true;} //переменная дня и ночи переходит в статус ночь else {lightstreet=false;} //переменная дня и ночи переходит в статус день if ( irrecv.decode( &results )) //если что-то пришло в ИК датчик { Serial.println(results.value, HEX); if (results.value==0x60D720DF) //смена режима доп освещения комнаты {releintWallRoom (); results.value=0;} //меняем переменную на ноль if (results.value==0x60D7A05F) //смена режима основного освещения комнаты {releintMainRoom (); results.value=0;} //меняем переменную на ноль if (results.value==0x60D7807F) //команда переключения в режим "АКТИВНЫЙ" {activeStat=true; //переходим в режим "АКТИВНЫЙ" results.value=0;} //меняем переменную на ноль if (results.value==0x60D740BF) //команда переключения в режим "СОН" {sleepStat=true; //переходим в режим "СОН" results.value=0;}//меняем переменную на ноль if (results.value==0x60D7C03F) //команда переключения в режим "ОХРАНА" {securityStat=true; //переходим в режим "ОХРАНА" results.value=0;}//меняем переменную на ноль if (results.value==0x60D7F00F) //выключение радио {radio.mute();} irrecv.resume(); } // ждем следующих данных в ИК датчик //-------------- ПОЛУЧЕНИЕ ДАННЫХ С ИК ДАТЧИКА -------------- //---------------- прием данных с экрана ---------------- String message = myNextion.listen(); if(message != "")Serial.println(message); { if(message == "65 3 3 1 ffff ffff ffff") //сообщение с выключателя бокового света комнаты {releintWallRoom ();} if(message == "65 3 2 1 ffff ffff ffff") //сообщение с выключателя верхнего света комнаты {releintMainRoom ();} if(message == "65 0 5 1 ffff ffff ffff") //сообщение переход в режим "АКТИВНЫЙ" {activeStat=true;} //активация режима "АКТИВНЫЙ" if(message == "65 0 6 1 ffff ffff ffff") //сообщение переход в режим "СОН" {sleepStat=true;} //активация режима "СОН" if(message == "65 0 7 1 ffff ffff ffff") //сообщение переход в режим "ОХРАНА" {securityStat=true;} //активация режима "ОХРАНА" if(message == "0") {mp3_set_volume (0);} //сообщение громкость 0 if(message == "5") {mp3_set_volume (5);} //сообщение громкость 5 if(message == "10") {mp3_set_volume (10);} //сообщение громкость 10 if(message == "15") {mp3_set_volume (15);} //сообщение громкость 15 if(message == "20") {mp3_set_volume (20);} //сообщение громкость 20 if(message == "25") {mp3_set_volume (25);} //сообщение громкость 25 if(message == "30") {mp3_set_volume (30);} //сообщение громкость 30 // ---------- настройка времени и даты с экрана if(message == "65 5 d 1 ffff ffff ffff") //сообщение настройки времени (-1 минута) {byte klc=(time.minutes)-1; time.settime(-1, klc);} if(message == "65 5 15 1 ffff ffff ffff") //сообщение настройки времени (+1 минута) {byte klc=(time.minutes)+1; time.settime(-1, klc);} if(message == "65 5 с 1 ffff ffff ffff") //сообщение настройки времени (-1 час) {byte klc=(time.Hours)-1; time.settime(-1, -1, klc);} if(message == "65 5 16 1 ffff ffff ffff") //сообщение настройки времени (+1 час) {byte klc=(time.Hours)+1; time.settime(-1, -1, klc);} // ---------- настройка времени и даты с экрана // RADIO if(message == "65 2 20 1 ffff ffff ffff") //сообщение ФМ модуля VOLUME - {radio.volumeDown();} //VOLUME - if(message == "65 2 21 1 ffff ffff ffff") //сообщение ФМ модуля VOLUME + {radio.volumeUp();} //VOLUME + if(message == "65 2 1e 1 ffff ffff ffff") //сообщение ФМ модуля ПОИСК СТАНЦИИ + {radio.seekUp();} //ПОИСК СТАНЦИИ + if(message == "65 2 1c 1 ffff ffff ffff") //сообщение ФМ модуля ВКЛ/ВЫКЛ {radio.mute();} if(message == "65 0 1d 1 ffff ffff ffff") //сообщение ФМ модуля ВКЛ/ВЫКЛ {radio.unMute();} // RADIO //---------------- прием данных с экрана ---------------- } //физические выключатели/включатели (кнопки) if(digitalRead(47)==HIGH)//если кнопка нажата дополнительного света комнаты { releintWallRoom (); delay(500);//небольшая защита от "дребезга" контактов кнопки } if(digitalRead(49)==HIGH)//если кнопка нажата основного света комнаты { releintMainRoom (); delay(500);//небольшая защита от "дребезга" контактов кнопки } //физические выключатели/включатели (кнопки) } void releintWallRoom () //действия при вкл/выкл реле бокового освещения комнаты { lightWallRoom=!lightWallRoom; if (lightWallRoom==true) { mp3_play (2); //воспроизвести mp3/0002releintWallRoomOFF digitalWrite( 46, HIGH ); //выключаем реле myNextion.sendCommand("room.p2.pic=40");//на экране изменяем картинку myNextion.sendCommand("page0.p6.pic=30");//на экране изменяем картинку } if (lightWallRoom==false) { mp3_play (1); //воспроизвести mp3/0001releintWallRoomON {digitalWrite( 46, LOW ); //включаем реле myNextion.sendCommand("room.p2.pic=41");}//на экране изменяем картинку myNextion.sendCommand("page6.p6.pic=31");//на экране изменяем картинку } } void releintMainRoom () //действия при вкл/выкл реле основного освещения комнаты { lightMainRoom=!lightMainRoom; if (lightMainRoom==true) { mp3_play (7); //воспроизвести mp3/0007 mainWallRoomOFF digitalWrite( 48, HIGH ); //выключаем реле myNextion.sendCommand("room.p1.pic=29");//на экране изменяем картинку myNextion.sendCommand("page0.p0.pic=30");//на экране изменяем картинку } if (lightMainRoom==false) { mp3_play (6); //воспроизвести mp3/0006 mainWallRoomON {digitalWrite( 48, LOW ); //включаем реле myNextion.sendCommand("room.p1.pic=28");}//на экране изменяем картинку myNextion.sendCommand("page0.p0.pic=31");//на экране изменяем картинку } } void active () //-----------------------------------режим "АКТИВНЫЙ"---------------------------------------- { if (modeStatus1==0) {sleepStat=false; securityStat=false; mp3_play (3); myNextion.sendCommand("page0.mode.pic=2"); //на экран изменяем картинку АКТИВНЫЙ ОН modeStatus1=1; //изменяем свою переменную modeStatus2=0; //изменяем переменную "СОН" modeStatus3=0; //изменяем переменную "ОХРАНА" digitalWrite( 44, LOW ); //выключаем ночную подсветку комнаты (остатки режима СОН) light=false; // меняем переменную режима сна (остатки режима СОН) } infoNextion (); }//--------------------------------------------------------------------------------------------------------- void sleep () //--------------------------------------режим "СОН"------------------------------------------- { if (modeStatus2==0) {activeStat=false; securityStat=false; mp3_play (4); myNextion.sendCommand("page0.mode.pic=3"); //на экран изменяем картинку СОН modeStatus2=1; //изменяем свою переменную modeStatus1=0; //изменяем переменную "АКТИВНЫЙ" modeStatus3=0; //изменяем переменную "ОХРАНА" if (digitalRead (48)==LOW) {digitalWrite( 48, HIGH ); //выключаем реле lightMainRoom=true; myNextion.sendCommand("room.p1.pic=29");//на экране изменяем картинку myNextion.sendCommand("page0.p0.pic=30");//на экране изменяем картинку } delay (500); if (digitalRead (46)==LOW) {digitalWrite( 46, HIGH ); //выключаем реле lightWallRoom=true; myNextion.sendCommand("room.p2.pic=40");//на экране изменяем картинку myNextion.sendCommand("page0.p6.pic=30");//на экране изменяем картинку } } infoNextion (); boolean movPinCorr=(digitalRead (movSenseCorrPin)); //переменная датчика движения корридора //boolean movPinroom=(digitalRead (movSenseRoomPin)); //переменная датчика движения комнаты if (digitalRead (movSenseRoomPin)==1&&lightroom==false&&light==false) //если в комнате движения есть и темно {digitalWrite( 44, HIGH ); light=true; prev2 = millis();} //записываем данные для задержки подсветки if (light==true&&lightroom==true) {digitalWrite( 44, LOW ); //выключаем ночную подсветку комнаты light=false;} if (millis()-prev2>10000&&digitalRead (movSenseRoomPin)==0&&light==true) //если в комнате движения нет и темно {digitalWrite( 44, LOW ); //выключаем ночную подсветку комнаты prev2 = millis(); //сбрасываем таймер light=false;} } void security () //------------------------------------------------------------------------------ { if (modeStatus3==0) {activeStat=false; sleepStat=false; mp3_play (5); myNextion.sendCommand("page0.mode.pic=4"); //на экран изменяем картинку ОХРАНА modeStatus3=1; //изменяем свою переменную modeStatus1=0; //изменяем переменную "АКТИВНЫЙ" modeStatus2=0; //изменяем переменную "СОН" } } void infoNextion () { //boolean movPinroom=(digitalRead (movSenseRoomPin)); boolean movPinCorr=(digitalRead (movSenseCorrPin)); boolean movPinBathroom=(digitalRead (movSenseBathroom)); if (millis()-prev3>3000) //проверка времени для вывод на экран { if(message == "") // если сообщений от экрана нет выводим инфу { //тесты // покажем температуру в мониторе Serial порта // Serial.print("Temp C: "); // Serial.print(sensors.getTempCByIndex(0)); // Serial.println(); /*Serial.print("температура комнаты: "); Serial.print(dht2.readTemperature()); Serial.println(); Serial.print("температура коридора: "); Serial.print(dht3.readTemperature()); Serial.println(); Serial.print("температура ванной: "); Serial.print(dht4.readTemperature()); Serial.println();*/ //Serial.println (analogRead(8)); // данные освещенности ванной //Serial.print ("фоторезистор улицы "); //Serial.println (analogRead(7)); //данные освещенности улицы //Serial.println (analogRead(5)); //данные освещенности коридора //Serial.print ("движение в корридоре "); //Serial.println (digitalRead (movSenseCorrPin)); //Serial.print ("движение в комнате "); //Serial.println (digitalRead (movSenseRoomPin)); //мониторинг датчика движения комнаты //Serial.print ("температура в комнате "); //Serial.println (dht2.readTemperature()); //Serial.print ("влажность в комнате "); //Serial.println (dht2.readHumidity()-10); ds.requestTemperatures(); // считываем температуру с датчиков Serial.print("Sensor 1: "); Serial.print(ds.getTempC(sensor1)); // отправляем температуру Serial.println("C"); Serial.print("Sensor 2: "); Serial.print(ds.getTempC(sensor2)); // отправляем температуру Serial.println("C"); Serial.print("Sensor 3: "); Serial.print(ds.getTempC(sensor3)); // отправляем температуру Serial.println("C"); Serial.println(""); delay(1000); //тесты //вывод инфы датчиков движения //--------------------------------------------------комната------------------------------------------------- if (lightroom==false&&digitalRead (movSenseRoomPin)==1) // если в комнате темно и есть движение {myNextion.sendCommand("page0.p7.pic=20");} // меняем картинку движение в темноте if (lightroom==true&&digitalRead (movSenseRoomPin)==1) // если в комнате светло и есть движение {myNextion.sendCommand("page0.p7.pic=21");} // меняем картинку движение при свете if (lightroom==true&&digitalRead (movSenseRoomPin)==0) // если в комнате светло и нет движение {myNextion.sendCommand("page0.p7.pic=23");} // меняем картинку движение при свете if (lightroom==false&&digitalRead (movSenseRoomPin)==0) // если в комнате темно и нет движение {myNextion.sendCommand("page0.p7.pic=22");} // меняем картинку без движение в темного //--------------------------------------------------комната------------------------------------------------- //--------------------------------------------------коридор------------------------------------------------- if (analogRead(5)<150&&movPinCorr==1) // если в коридоре темно и есть движение {myNextion.sendCommand("page0.p9.pic=20");} // картинка движение в темноте if (analogRead(5)<150&&movPinCorr==0) // если в коридоре темно и нет движение {myNextion.sendCommand("page0.p9.pic=22");} // картинка без движения в темноте if (analogRead(5)>150&&movPinCorr==1) // если в коридоре светло и есть движение {myNextion.sendCommand("page0.p9.pic=21");} // картинка движение при свете if (analogRead(5)>150&&movPinCorr==0) // если в коридоре светло и нет движение {myNextion.sendCommand("page0.p9.pic=23");} // картинка без движение при свете //--------------------------------------------------коридор------------------------------------------------- //--------------------------------------------------ванная------------------------------------------------- if (analogRead(8)<200&&movPinBathroom==1) // если в ванной темно и есть движение {myNextion.sendCommand("page0.p8.pic=20");} // картинка движение в темноте if (analogRead(8)<200&&movPinBathroom==0) // если в ванной темно и нет движение {myNextion.sendCommand("page0.p8.pic=22");} // картинка без движения в темноте if (analogRead(8)>200&&movPinBathroom==1) // если в ванной светло и есть движение {myNextion.sendCommand("page0.p8.pic=21");} // картинка движение при свете if (analogRead(8)>200&&movPinBathroom==0) // если в ванной светло и нет движение {myNextion.sendCommand("page0.p8.pic=23");} // картинка без движение при свете //--------------------------------------------------ванная------------------------------------------------- prev3 = millis(); //сбрасываем таймер вывод на экран инфы } } //------------- получения данных с датчиков температуры и влажности ------------- //int tempstreet = dht1.readTemperature(); // переменная температуры улицы //int humstreet = dht1.readHumidity(); // переменная влажности улицы byte rainSenseReading = digitalRead(rainSensePin); //переменная дождя 1-нет, 0-есть //byte temproom = dht2.readTemperature(); // переменная температуры комнаты //byte humroom = dht2.readHumidity(); // переменная влажности комнаты //int tempcorridor = dht3.readTemperature(); // переменная температуры коридора //int humcorridor = dht3.readHumidity(); // переменная влажности коридора //------------- получения данных с датчиков температуры и влажности ------------- if (millis()-prev>5000) //проверка времени для вывод на экран { if(message == "") // если сообщений от экрана нет выводим инфу { //вывод температуры и влажности //sensors.requestTemperatures(); // отправляем запрос на измерение температуры BM18B20 //int tempstreet = sensors.getTempCByIndex(0); //myNextion.setComponentText("page0.tempstreet", String(tempstreet)); //на экран в tempstreet вывести температуру //myNextion.setComponentText("humstreet", String(humstreet));//на экран в humstreet вывести влажность myNextion.setComponentText("page0.temproom", String(dht2.readTemperature())); //на экран в temproom вывести температуру комнаты myNextion.setComponentText("page0.humroom", String(dht2.readHumidity()-10)); //на экран в humroom вывести влажность комнаты //88888888myNextion.setComponentText("tempcorridor", String(dht3.readTemperature())); //на экран в tempcorridor вывести температуру коридора //88888888myNextion.setComponentText("humcorridor", String(dht3.readHumidity())); //на экран в humcorridor вывести влажность коридора //88888888myNextion.setComponentText("tempbathroom", String(dht4.readTemperature())); //на экран в tempcorridor вывести температуру коридора //88888888myNextion.setComponentText("humbathroom", String(dht4.readHumidity())); //на экран в humcorridor вывести влажность коридора //вывод температуры и влажности //вывод времени и даты myNextion.setComponentText("time", String(time.gettime("H :i"))); //на экран время myNextion.setComponentText("date", String(time.gettime("d.m.Y"))); //на экран дата //вывод времени и даты //вывод информации дверей и окна if (digitalRead(doorBathroom)==0) //геркон разомкнут {myNextion.sendCommand("page0.doorbathroom.pic=25"); }// отправляем картинку дверь в ванной открыта else {myNextion.sendCommand("page0.doorbathroom.pic=24"); }//отправляем картинку дверь в ванной закрыта //вывод информации дверей и окна //--------------- изменения картинки дня и ночи, дождь или нет if (lightstreet==true&rainSenseReading==0)//если на улице день и начался дождь {myNextion.sendCommand("page0.day.pic=16"); }//на экран изменяем картинку солнце за тучей if (lightstreet==false&rainSenseReading==0)//если на улице ночь и начался дождь {myNextion.sendCommand("page0.day.pic=17");} //на экран изменяем картинку месяц за тучей if (lightstreet==true&rainSenseReading==1)// если на улице день и нет дождя {myNextion.sendCommand("page0.day.pic=14");} //меняем картинку на солнце if (lightstreet==false&rainSenseReading==1)// если на улице ночь и нет дождя {myNextion.sendCommand("page0.day.pic=15");} //меняем картинку на луну //--------------- изменения картинки дня и ночи, дождь или нет prev = millis(); //сбрасываем таймер вывод на экран инфы } } }Отработка команд по кнопкам и с экрана без проблем. Только ИК приемник отрабатывает при движении на 26 пине.
Помогите советом. Где я накосячил?