Буду благодарен за помощь

semen741
semen741 аватар
Offline
Зарегистрирован: 28.03.2018

Доброго времени суток.

Ардуино хобби и неспеша строю умный дом. Застрял на одном моменте. 

В 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(); //сбрасываем таймер вывод на экран инфы
  }
}
}

 

b707
Offline
Зарегистрирован: 26.05.2017

в строке 221 добавьте вначале ключевое слово static - скорее всего проблема решится, если я не пропустил других косяков

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Или вынести light в определение глобалов .. только ещё просмотреть код на предмет где этот light надо ещё ставить в false принудительно..

semen741
semen741 аватар
Offline
Зарегистрирован: 28.03.2018

light объявлена в void sleep 201 строка 

221 строка   boolean light=false;       //переменная для хранения состояния света (вкл/выкл)

240 if (light==true) отрабатывает без проблем, но когда доходит до if (millis() - prev2 > 5000) продвижений увы нет (

Пробывал заменить на  if ledlightstatus=true  тоже самое, доходит до таймера и тормозит

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

И не должна отрабатывать, потому что "как есть" - она у Вас обьявлена как локальная (внутренняя) переменная функции и ПРИ КАЖДОМ вызове устанавливается заново в false. Чтобы этого избежать (и помнить промеж вызовов что true) надо воспользоваться советом из постов №1 или 2.

b707
Offline
Зарегистрирован: 26.05.2017

semen741 пишет:

light объявлена в void sleep 201 строка 

221 строка   boolean light=false;       //переменная для хранения состояния света (вкл/выкл)

вам же написали, что делать - либо обьявите light как static. либо вынесите ее из процедуры sleep() в глобальные.

Вы по подсказкам не догадались, в чем дело? - у вас сейчас переменная light не сохраняется между вызовами функции sleep. а каждый раз ставится в false. поэтому условие для плавного выключения диодов не выполняется никогда.

Код не ваш что ли, списали где-то и ничего в нем не смыслите?

semen741
semen741 аватар
Offline
Зарегистрирован: 28.03.2018

b707 пишет:

в строке 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      }

для того чтобы при активации режима условие выполнялось один раз

 

 

b707
Offline
Зарегистрирован: 26.05.2017

semen741. прошу прощения, я сослепу не разглядел номер строки - не 211, а 221

Ну и советую сначала прочитать все последующие сообщения в ветке - вам уже разжевали и ЧТО надо сделать. и ПОЧЕМУ

semen741
semen741 аватар
Offline
Зарегистрирован: 28.03.2018

b707 пишет:

semen741 пишет:

light объявлена в void sleep 201 строка 

221 строка   boolean light=false;       //переменная для хранения состояния света (вкл/выкл)

вам же написали, что делать - либо обьявите light как static. либо вынесите ее из процедуры sleep() в глобальные.

Вы по подсказкам не догадались, в чем дело? - у вас сейчас переменная light не сохраняется между вызовами функции sleep. а каждый раз ставится в false. поэтому условие для плавного выключения диодов не выполняется никогда.

Код не ваш что ли, списали где-то и ничего в нем не смыслите?

 

Я понял. Поэтому без таймера отработка была один раз (тоесть светодиод сразу выключался), а потом переменная преходила снова в  false и соответсвенно таймер не отрабатывал. 

Спасибо!

semen741
semen741 аватар
Offline
Зарегистрирован: 28.03.2018

Не пойму почему не корректно работает прием данных с ИК пульта

Работало все нормально, чутку подправил код и добавил датчики 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 пине.

Помогите советом. Где я накосячил?