Буду благодарен за помощь
- Войдите на сайт для отправки комментариев
Пт, 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 объявлена в
void
sleep 201 строка
221 строка boolean light=
false
;
//переменная для хранения состояния света (вкл/выкл)
240
if
(light==
true
) отрабатывает без проблем, но когда доходит до
if
(millis() - prev2 > 5000)
продвижений увы нет (Пробывал заменить на
if
ledlightstatus=
true
тоже самое, доходит до таймера и тормозит
И не должна отрабатывать, потому что "как есть" - она у Вас обьявлена как локальная (внутренняя) переменная функции и ПРИ КАЖДОМ вызове устанавливается заново в false. Чтобы этого избежать (и помнить промеж вызовов что true) надо воспользоваться советом из постов №1 или 2.
light объявлена в
void
sleep 201 строка
221 строка boolean light=
false
;
//переменная для хранения состояния света (вкл/выкл)
вам же написали, что делать - либо обьявите light как static. либо вынесите ее из процедуры sleep() в глобальные.
Вы по подсказкам не догадались, в чем дело? - у вас сейчас переменная light не сохраняется между вызовами функции sleep. а каждый раз ставится в false. поэтому условие для плавного выключения диодов не выполняется никогда.
Код не ваш что ли, списали где-то и ничего в нем не смыслите?
в строке 211 добавьте вначале ключевое слово static - скорее всего проблема решится, если я не пропустил других косяков
Условие
для того чтобы при активации режима условие выполнялось один раз
semen741. прошу прощения, я сослепу не разглядел номер строки - не 211, а 221
Ну и советую сначала прочитать все последующие сообщения в ветке - вам уже разжевали и ЧТО надо сделать. и ПОЧЕМУ
light объявлена в
void
sleep 201 строка
221 строка boolean light=
false
;
//переменная для хранения состояния света (вкл/выкл)
вам же написали, что делать - либо обьявите light как static. либо вынесите ее из процедуры sleep() в глобальные.
Вы по подсказкам не догадались, в чем дело? - у вас сейчас переменная light не сохраняется между вызовами функции sleep. а каждый раз ставится в false. поэтому условие для плавного выключения диодов не выполняется никогда.
Код не ваш что ли, списали где-то и ничего в нем не смыслите?
Я понял. Поэтому без таймера отработка была один раз (тоесть светодиод сразу выключался), а потом переменная преходила снова в false и соответсвенно таймер не отрабатывал.
Спасибо!
Не пойму почему не корректно работает прием данных с ИК пульта
Работало все нормально, чутку подправил код и добавил датчики 18В20. Датчики отрабатывает норм, но данные с ИК пульта принимаются только если есть движение от датчика комнаты const byte movSenseRoomPin = 26; когда движения нет, данные с ИК пульта не принимаются(((
Отработка команд по кнопкам и с экрана без проблем. Только ИК приемник отрабатывает при движении на 26 пине.
Помогите советом. Где я накосячил?