Помогите новичку разобраться с DHT датчиком
- Войдите на сайт для отправки комментариев
Вс, 30/10/2016 - 16:08
добрый день.
Уже пару вучеров бьюсь, не могу понять. Отдельно работают, вместе - нет. Я имею в виду отдельно тело по переключения выходов 22-33 работает, отдельно работает показания с датчика температуры и влажность, но когда пишу это в однои теле - раотают только датчики, на переключение выходов 22-33 не реагирует...
#include <DHT.h> #include <SoftwareSerial.h> #include <Nextion.h> #define DHTPIN 5 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); SoftwareSerial nextion(13, 12);// Nextion TX to pin 13 and RX to pin 12 of Arduino Nextion myNextion(nextion, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps void setup() { Serial.begin(9600); myNextion.init(); dht.begin(); pinMode( 5, INPUT); pinMode( 22 , OUTPUT); pinMode( 23 , OUTPUT); pinMode( 24 , OUTPUT); pinMode( 25 , OUTPUT); pinMode( 26 , OUTPUT); pinMode( 27 , OUTPUT); pinMode( 28 , OUTPUT); pinMode( 29 , OUTPUT); pinMode( 30 , OUTPUT); pinMode( 31 , OUTPUT); pinMode( 32 , OUTPUT); pinMode( 33 , OUTPUT); digitalWrite(22, LOW); digitalWrite(23, HIGH); digitalWrite(24, LOW); digitalWrite(25, HIGH); digitalWrite(26, HIGH); digitalWrite(27, LOW); digitalWrite(28, HIGH); digitalWrite(29, LOW); digitalWrite(30, HIGH); digitalWrite(31, LOW); digitalWrite(32, HIGH); digitalWrite(33, LOW); } void loop() { /* float h = dht.readHumidity(); float t = dht.readTemperature(); myNextion.setComponentText("t0", String(t)); myNextion.setComponentText("t1", String(h)); */ String message = myNextion.listen(); //check for message if(message != ""){ // if a message is received... Serial.println(message); //...print it out } /* Бойлер на 300 л., пины: 22,23,24,25,26,27. ON - Охладжение */ if(message =="70 bt0:ON"){ // if a message is received... digitalWrite(22, HIGH); digitalWrite(23, LOW); digitalWrite(24, HIGH); digitalWrite(25, LOW); digitalWrite(26, LOW); digitalWrite(27, HIGH); } if(message =="70 bt0:OFF"){ // if a message is received... digitalWrite(22, LOW); digitalWrite(23, HIGH); digitalWrite(24, LOW); digitalWrite(25, HIGH); digitalWrite(26, HIGH); digitalWrite(27, LOW); }; /* Бойлер 1000л., пины: 28,29,30. ON - выключен */ if(message =="70 bt1:ON"){ // if a message is received... digitalWrite(28, LOW); digitalWrite(29, HIGH); digitalWrite(30, LOW); } if(message =="70 bt1:OFF"){ // if a message is received... digitalWrite(28, HIGH); digitalWrite(29, LOW); digitalWrite(30, HIGH); }; /* Теплообменник, пины: 31,32,33. ON - включен теплообмен */ if(message =="70 bt2:ON"){ // if a message is received... digitalWrite(31, HIGH); digitalWrite(32, LOW); digitalWrite(33, HIGH); } if(message =="70 bt2:OFF"){ // if a message is received... digitalWrite(31, LOW); digitalWrite(32, HIGH); digitalWrite(33, LOW); }; }
Т.Е. То что иде следом за void loop заключенное в /*...*/ при подключении этой функции перестает работать переключение выходов 22-33...
Сорри за опечатки, буду внимательнее :)
Немного дополнил программу, добавил функцию millis. Теперь данные от датчика отображаются на дисплее, но отзыв на переключения с дисплея Nextion осуществляется раз в 5 секунд примерно... Что делаю не так, в каком направлении изучать проблему?
В общем как мне добиться отдновременного переключения и отображения параметров температуры с датчиков?
И зачем вам оновременное переключение и отображение на экране. Ну переклчать надо вовремя, потому что алгоритм и быстрые процессы. Хотя нагрев и охлаждение инерционые процессы.Секунда туда сюда роли не играет. Опять же отображение. Человек с точки зрения процессора это внешний медленый инструмент. Быстрее 0,2 секунд он не отреагирует. А если много датчиков , то и минуту может на анализ потратить.
А вот тогда попробую rx сигнал подтянуть с другой платы ардуино. Пусть одна занимается переключением, а другая датчиками!? Отпишусь потом.
Спасибо за комментарий.
Может разбить на отдельные функции, а в лупе оставить только анализ и вызов. Функция считывания температуры вызывается раз в пару секунд, функция исполнительных только при изменении параметра, остальное время долбим дисплей.
Хотел бы попробовать. Но не силен в грамматике, можно пример?
Функции
Ага, т.е. через функции я определяю значение каких либо переменных, которые потом в лупе будут выполнять определенные действия!? Интересно. Думал об этом, но не довел до конца, попробую, спасибо. Отпишусь о результате.
Я бы и действия выполнял в функциях, а луп только решает, вызывать функцию или не надо.
P/S с временными параметрами, удобнее тоже в начало функции ставить и там уже решать - продолжать или вернуться. Типа такого. 47 пост.
В общем попробовал я с функциями, модуль луп уменьшился до четырех строк, но это не помогло. Искать дальне - не хватает знаний и опыта.
Решение одно: управлять выходами с одного ардуино, собирать данные с другого, соответственно выход с Nextion на первую плату ардуино, вход в Nextion со второй платы.
Так все просто получилось и стабильно.
Спасибо за помощь.
А счастье было так близко. У вас мастер-учитель программист был или китаец или индус.
Почему ? ))) Я не в теме )
Меня не учили, сижу сам ковыряюсь, пытаюсь понять и разобраться. Делаю для себя, и в принципе то чего хотед - добился, даже больше... Мне пока что большего от него не нужно, но пока буду изучать дальше..
Может кто порекомендует учебник?
Учебник Мастера Индийского Кодинга, или Китайского Кодинга. Вместе с потерей СССР мир потерял и стремление учить и создавать оптимальные программы. Капитализм и Коммерция уничтожили это. Зачем создавать учебники и эффективные программы, если за вес и мудреннось заплатят больше.
Слушай, ты хочешь что бы человек в начале своих познаний, изучая букварь писал мемуары? Скажи толком что не так, кроме комментариев. К слову, комменты привел в порядок, до прочтения твоего сообщения, для того что бы в будущем не забыть что к чему.
На счет "Индийского коддинга" думаешь в нем проблема? Думаешь присвоение каждому пину переменной для дальнейшей обработки ее значений, вместо прямой комонды подачи сигнала решит проблему?
Кстати, мысль! Намекни еще как ни будь, что бы точно быть уверенным что правильно тебя понял? Люблю конкретику ;)
Так а смысл в "очеловечить"? Просто что бы грамматика была более приемлемой или это как то влияет на работу ардуино?
Просто я еще не решил какие пины какое конкретно действие будут выполнять, поэтому и не очеловечил их пока что... Общий принцип работы их составлен, после того как будет собрана общая схема и подключен модуль реле, все эти пины получат свои имена.
Да, я знал о 0 и 1, но мне так нагляднее и понятнее, для себя же пишу а не для: "То есть новичек видет код и нихрена не понимает."
Суть вопроса была не в этом, а в том, как мне давать команды на переключение цифровых выходов и принимать данные с датчика температуры, передавая их на дисплей...
Я бы организовал 3 вычислительных потока. 1 - запрос и прием информации с датчика. Записывает переменые.
2 поток опрашивает прием с Nextion и отдает команду на выполнение.
3 отправляет данные на Nextion.
И все.
ПС:http://www.youtube.com/watch?v=I5n3Yd55jtk
Низкий поклон тебе, добрый человек. Очень интересно, примусь разбирать и изучать.
Извини, бегло пробежался, но не увидел : "1 - запрос и прием информации с датчика. Записывает переменые.".
Сорри если что то не понимаю, я то ардуино дня 4 назад в руки то взял, пока как обезьяна с ним.
Ме суть понятна, буду изучать и переписывать прогу, отпишусь потом что и как. Спасибо еще раз.
Вообще-то когда делается какой-либо конечный автомат начинать принято с сотавления алгоритма, делается это средствами булевой алгебры, сразу становится понятно (глядя на формулу) сколько переменных задействовано на входящие датчики, на исполнительные механизмы, сколько потребуется организовать временных счётчиков и т.д. и начинать надо с учебника по этой алгебре )))
PS для себя инверсный пишу так к примеру - (!переменная) вместо того, чтобы писать черту над ней )))
PPS когда-то тоже начинал изучать программирование написанием программ в лоб, так что вы не одиноки )))
qwone, я правильно понимаю, что этот модуль:
static
uint32_t MILLIS ;
36
MILLIS = millis() ;
37
//#1 1000 миллисекунд вычислит. поток 1
38
static
uint32_t future1 = 0 ;
39
if
(MILLIS >= future1) {
40
future1 = MILLIS + 1000 ;
позполяет ардуино в определенный промежуток времени выполнять определенную операцию, что не загаживает его процессор ненужными циклическими операциями, как в моем случае?
т.е. могу ли я в этом блоке сделать прием данных с датчика и отправку их на дисплей?
Наверное в сетапе нужно считать данные с датчика, присвоить им знчение а в лупе. в одном из потоков, например в 4-м вызвать присвоенные значения и отправить на дисплей? Ведь я так понимаю, что при значении: future1 = MILLIS + 1000 ; или future1 = MILLIS + 1500 ; он будет проводить запрос раз в 1 или 1,5 секунды?
И еще вопрос: почему в первом случае выражение i увеличиваем до 6-ти, а во втром и третьем до 3-х?
void
setup
() {
18
//#1
19
for
(i = 0; i < 6; i++) {
20
pinMode( bt0_pin[i] , OUTPUT);
21
digitalWrite(bt0_pin[i], bt0_ON[i]);
22
}
23
//#2
24
for
(i = 0; i < 3; i++) {
25
pinMode( bt1_pin[i] , OUTPUT);
26
digitalWrite(bt1_pin[i], bt1_ON[i]);
ua6em. тяжело в учении - легко в бою...
Это как новое хобби, одно из многих, вечерами надо себя чем то занять, а свободное время привык проводить с пользой.
Ну у меня свой подход к составлению программы. Вот шаблон.
Ну #1,#2,#3 это процессы.
А вот если процессы надо делать с какой-то частотой, а не когда подошла очередь то делаю по этому шаблону.
Разумеется у других свой стиль. А в Си стилей море. От вменяемых до безумных.
Про i в цикле очень просто . У вас bt0 - 6 выводов. а bt1,bt2 - по 3.
Qwone, говно твой шаблон, работать не будет.
ua6em. тяжело в учении - легко в бою...
Это как новое хобби, одно из многих, вечерами надо себя чем то занять, а свободное время привык проводить с пользой.
Ага как там у Новикова - "...но чтоб с какой-то лярвой я время проводил..." и, я с ним полностью согласен )))
программирование вешь увлекательная, но начинать надо всё же с алгоритма, тогда и ошибки ищутся ну прямо как..."одним движением руки...двинул он полки" ну вы поняли о чём я...к примеру некоторое устройство управляет газовой горелкой (упрощённый вариант)
Исходные данные:
датчик газа - G
датчик горения - GR
вентиль газа (клапан) KPG
кнопка запуск - KN
аппарат розжига RZ
Тогда запуск - RZ = G*KN*!GR то-есть напряжение будет подаваться до тех пор пока не сработает датчик пламени, ан нет и тут начинаем вводить новые переменные, то-есть строим алгоритм (а газ открыть) )))
Парни, не ссортесь :))
Попробую все методы, в которых смогу разобраться.
Затея то сама в чем: что бы не бегать в котельную и не ломать каждый раз, вспоминая какой вентель что открывает\закрывает, родилась идея это все визуализовать и переключать удаленно. Есть три бойлера и один теплообменник, первый на 300л работает летом в системе охлаждения, зимой в системе отопления, бойлер на 1000л. лучше отключать зимой что бы тепловой насос даром не грел такой обьем воды, он не нужен, и есть теплообменник, который получает тепло с большого теплового насоса, на случай если наступит холод и нужно много тепла. Управлать всем этим через реле, которые будут переключать 12-ти аольтовые электромагнитные клапаны. Вся система будет запитана от аккумулятора, который даст возможность автономно работать всей системе без света больше суток, т.к. у нас часто рубят свет и на долго. Ну и попутно хочу к каждому котлу подключить по два датчика температуры, что бы видеть что там происходит, опять таки не бегая в котельную.
Вот скетч один, пусть кривой, но работает как часы:
Вот скетч второй для сбора данных с датчиков, просто для информации, что бы не бегать в котельную:
Когда пытаюсь обьеденить оба лупа - идет задержка при переключении, т.е. реагирует с периодом каждае 5-10 секунд...
Ну тогда по критике: на хой фак вам сдались эти DHT c их 250мС задержкой на каждый датчик+ отдельный пин? Повесьте гирлянду DS18B20 и читайте хоть 100 точек практически без задержек. Посоветовать что то с дисплеем не в состоянии, т.к. никогда с ним не сталкивался. Поэтому, за исключеним неизвестного мне дисплея, все должно летать. Третий год работает система с двумя диммируемыми нагревательными каналами+ 3 DS18 + 1DHT (влажность)+ 2 вентиляционных + 1освещение+аналоговая клавиатура+ I2C 1602+ I2C часы-календарь. Молотит без задержек, только редкое подмигивание из за DHT (нагреватели - галогеновые прожектора). Разберитесь с этим дисплеем или его библиотекой и думаю все пойдет.
С временными интервалами считывания DS, проблема возникла только один раз - срывало синхронизацию телевизионного сигнала (тема где то на форуме), пришлось считывать датчики по одному за проход и все наладилось.
Этот датчик просто как эксперимент, как раз и собираюсь использовать датчик DS18D20, т.к. он в том формфакторе который мне нужен. Приедет, попробую с ним... но думаю проблема не в нем, а в моем не знании как правильно сделать что бы это работало все в одном. Поэтому и обратился за помощью... Так то в ходе поиска решений - нашел выход, пока что, в будующем может и дойду до того что бы сделать все в одном, хоть немного глубже изучив язык ардуино...
Уважаемый, у Вас что в итоге вышло?
Неделю назад начал знакомиться с Ардуино и сейчас дошел до той же проблемы, что и Вы. Очень бы хотелось понять как решилось, не применяя вторую ардуино.