Помогите новичку разобраться с DHT датчиком

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

добрый день. 

 

Уже пару вучеров бьюсь, не могу понять. Отдельно работают, вместе - нет. Я имею в виду отдельно тело по переключения выходов 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... 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Сорри за опечатки, буду внимательнее :) 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Немного дополнил программу, добавил функцию millis. Теперь данные от датчика отображаются на дисплее, но отзыв на переключения с дисплея Nextion осуществляется раз в 5 секунд примерно... Что делаю не так, в каком направлении изучать проблему? 

 

#include <DHT.h>
#include <SoftwareSerial.h>
#include <Nextion.h>


#define DHTPIN 5
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);
unsigned long previousMillis = 0; 
const long interval = 1000;

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() {

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;

  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);
  };

 } 

 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

В общем как мне добиться отдновременного переключения и отображения параметров температуры с датчиков?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

И зачем вам оновременное переключение и отображение на экране. Ну переклчать надо вовремя, потому что алгоритм и быстрые процессы. Хотя нагрев и охлаждение инерционые процессы.Секунда туда сюда роли не играет. Опять же отображение. Человек с точки зрения процессора это внешний медленый инструмент. Быстрее 0,2 секунд он не отреагирует. А если много датчиков , то и минуту может на анализ потратить.

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

А вот тогда попробую rx сигнал подтянуть с другой платы ардуино. Пусть одна занимается переключением, а другая датчиками!? Отпишусь потом.

Спасибо за комментарий.

bwn
Offline
Зарегистрирован: 25.08.2014

Может разбить на отдельные функции, а в лупе оставить только анализ и вызов. Функция считывания температуры вызывается раз в пару секунд, функция исполнительных только при изменении параметра, остальное время долбим дисплей.

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Хотел бы попробовать. Но не силен в грамматике, можно пример?

bwn
Offline
Зарегистрирован: 25.08.2014
Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Ага, т.е. через функции я определяю значение каких либо переменных, которые потом в лупе будут выполнять определенные действия!? Интересно. Думал об этом, но не довел до конца, попробую, спасибо. Отпишусь о результате.

bwn
Offline
Зарегистрирован: 25.08.2014

Я бы и действия выполнял в функциях, а луп только решает, вызывать функцию или не надо.

P/S  с временными параметрами, удобнее тоже в начало функции ставить и там уже решать - продолжать или вернуться. Типа такого. 47 пост.

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

В общем попробовал я с функциями, модуль луп уменьшился до четырех строк, но это не помогло. Искать дальне - не хватает знаний и опыта.

Решение одно: управлять выходами с одного ардуино, собирать данные с другого, соответственно выход с Nextion на первую плату ардуино, вход в Nextion со второй платы.

Так все просто получилось и стабильно.

Спасибо за помощь.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А счастье было так близко.  У вас мастер-учитель программист был или китаец или индус.

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Почему ? ))) Я не в теме )

Меня не учили, сижу сам ковыряюсь, пытаюсь понять и разобраться. Делаю для себя, и в принципе то чего хотед - добился, даже больше...  Мне пока что большего от него не нужно, но пока буду изучать дальше.. 

Может кто порекомендует учебник? 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Учебник Мастера Индийского Кодинга, или Китайского Кодинга.  Вместе с потерей СССР мир потерял и стремление учить и создавать оптимальные программы. Капитализм и Коммерция уничтожили это. Зачем создавать учебники и эффективные программы, если за вес и мудреннось заплатят больше.

// что это за образчик индийского кодинга
    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);
// и это
   digitalWrite(22, HIGH);
   digitalWrite(23, LOW);
   digitalWrite(24, HIGH);
   digitalWrite(25, LOW);
   digitalWrite(26, LOW);
   digitalWrite(27, HIGH);

   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);

   digitalWrite(28, HIGH);
   digitalWrite(29, LOW);
   digitalWrite(30, HIGH);

   digitalWrite(31, HIGH);
   digitalWrite(32, LOW);
   digitalWrite(33, HIGH);

   digitalWrite(31, LOW);
   digitalWrite(32, HIGH);
   digitalWrite(33, LOW);
// мой совет не делайте так

 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Слушай, ты хочешь что бы человек в начале своих познаний, изучая букварь писал мемуары? Скажи толком что не так, кроме комментариев. К слову, комменты привел в порядок, до прочтения твоего сообщения, для того что бы в будущем не забыть что к чему.

На счет "Индийского коддинга" думаешь в нем проблема? Думаешь присвоение каждому пину переменной для дальнейшей обработки ее значений, вместо прямой комонды подачи сигнала решит проблему?

Кстати, мысль! Намекни еще как ни будь, что бы точно быть уверенным что правильно тебя понял? Люблю конкретику ;)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
// Продолжу.
// для чего даются каждому пину имена? Что бы их очеловечить? Нет.
// Для того что бы не наделать ощибок, если этот пин придется поменять.
const int Blink_pin=13;// теперь здесь я могу поменять минагающий диод не бегая по километровому скетчу
void setup() {
  pinMode(Blink_pin, OUTPUT);// делаем этот вход выходом
}
void loop() {
  digitalWrite(Blink_pin, 1);  // Меня задалбывают эти HIGH и LOW
  delay(1000);              // ждем секунду, а давно перешел на millis(), но вам для примера оставлю
  digitalWrite(Blink_pin, 0); // Ну если вы не знали что HIGH можно менять на 1, а LOW на 0
  delay(1000);              // опять ждем.
}
/*ПС: Я не издеваюсь. Я просто показываю , что в комментариях о программе можно говорить о многом,
и это не нарушит ход программы. Хотя для тот , кто посматривает,может составить психологический 
портрет пишущего программиста и понять ход самой программы. Это тоже урок. */
Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Так а смысл в "очеловечить"? Просто что бы грамматика была более приемлемой или это как то влияет на работу ардуино?
Просто я еще не решил какие пины какое конкретно действие будут выполнять, поэтому и не очеловечил их пока что... Общий принцип работы их составлен, после того как будет собрана общая схема и подключен модуль реле, все эти пины получат свои имена.

Да, я знал о 0 и 1, но мне так нагляднее и понятнее, для себя же пишу а не для: "То есть новичек видет код и нихрена не понимает."

Суть вопроса была не в этом, а в том, как мне давать команды на переключение цифровых выходов и принимать данные с датчика температуры, передавая их на дисплей...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
uint8_t i; // переменная которая часто используется в циклах
//#1
const uint8_t bt0_pin[] = {22, 23, 24, 25, 26, 27};
const uint8_t bt0_ON[] = {1, 0, 1, 0, 0, 1};
const uint8_t bt0_OFF[] = {1, 1, 0, 1, 1, 0};
uint8_t bt0 = 0; // переменная в зависимомти от которой будет 0-OFF/1-ON
//#2
const uint8_t bt1_pin[] = {28, 29, 30};
const uint8_t bt1_ON[] = {0, 1, 0};
const uint8_t bt1_OFF[] = {1, 0, 1};
uint8_t bt1 = 0; // переменная в зависимомти от которой будет 0-OFF/1-ON
const uint8_t bt2_pin[] = {31, 32, 33};
const uint8_t bt2_ON[] = {0, 1, 0};
const uint8_t bt2_OFF[] = {1, 0, 1};
uint8_t bt2 = 0; // переменная в зависимомти от которой будет 0-OFF/1-ON

void setup() {
  //#1
  for (i = 0; i < 6; i++) {
    pinMode( bt0_pin[i] , OUTPUT);
    digitalWrite(bt0_pin[i], bt0_ON[i]);
  }
  //#2
  for (i = 0; i < 3; i++) {
    pinMode( bt1_pin[i] , OUTPUT);
    digitalWrite(bt1_pin[i], bt1_ON[i]);
  }
  for (i = 0; i < 3; i++) {
    pinMode( bt2_pin[i] , OUTPUT);
    digitalWrite(bt2_pin[i], bt2_ON[i]);
  }
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1 1000 миллисекунд вычислит. поток 1
  static uint32_t future1 = 0 ;
  if (MILLIS >= future1) {
    future1 = MILLIS + 1000 ;
    bt0 = !bt0; // перевернуть состоянии переменной bt0
    if (bt0) {  // если bt0==1
      for (i = 0; i < 6; i++)
        digitalWrite(bt0_pin[i], bt0_ON[i]);
    }
    else  // если bt0==0
      for (i = 0; i < 6; i++)
        digitalWrite(bt0_pin[i], bt0_OFF[i]);
  }
  //#2  1200 миллисекунд вычислит. поток 2
  static uint32_t future2 = 0 ;
  if (MILLIS >= future2) {
    future2 = MILLIS + 1200 ;
    bt1 = !bt1; // перевернуть состоянии переменной bt0
    if (bt1) {  // если bt1==1
      for (i = 0; i < 3; i++)
        digitalWrite(bt1_pin[i], bt1_ON[i]);
    }
    else  // если bt1==0
      for (i = 0; i < 3; i++)
        digitalWrite(bt1_pin[i], bt1_OFF[i]);
    bt2 = !bt2; // перевернуть состоянии переменной bt0
    if (bt2) {  // если bt2==1
      for (i = 0; i < 6; i++)
        digitalWrite(bt2_pin[i], bt2_ON[i]);
    }
    else  // если bt2==0
      for (i = 0; i < 6; i++)
        digitalWrite(bt2_pin[i], bt2_OFF[i]);
  }
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Zombrero пишет:
Суть вопроса была не в этом, а в том, как мне давать команды на переключение цифровых выходов и принимать данные с датчика температуры, передавая их на дисплей...

Я бы организовал 3 вычислительных потока. 1 - запрос и прием информации с датчика. Записывает переменые.

2 поток опрашивает прием с Nextion и отдает команду на выполнение.

3 отправляет данные на Nextion.

И все.

ПС:http://www.youtube.com/watch?v=I5n3Yd55jtk

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Низкий поклон тебе, добрый человек. Очень интересно, примусь разбирать и изучать.

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Извини, бегло пробежался, но не увидел : "1 - запрос и прием информации с датчика. Записывает переменые.".

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Сорри если что то не понимаю, я то ардуино дня 4 назад в руки то взял, пока как обезьяна с ним.

Ме суть понятна, буду изучать и переписывать прогу, отпишусь потом что и как. Спасибо еще раз.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Вообще-то когда делается какой-либо конечный автомат начинать принято с сотавления алгоритма, делается это средствами булевой алгебры, сразу становится понятно (глядя на формулу) сколько переменных задействовано на входящие датчики, на исполнительные механизмы, сколько потребуется организовать временных счётчиков и т.д. и начинать надо с учебника по этой алгебре )))

PS для себя инверсный пишу так к примеру  - (!переменная) вместо того, чтобы писать черту над ней  )))

PPS когда-то тоже начинал изучать программирование написанием программ в лоб, так что вы не одиноки )))

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

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. тяжело в учении - легко в бою... 

Это как новое хобби, одно из многих, вечерами надо себя чем то занять, а свободное время привык проводить с пользой. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну у меня свой подход к составлению программы. Вот шаблон.

/*
сюда пишу все электрические подключения
*/
//#1 здесь описание констант , перемнных и функций
//#2
//#3

void setup() {
  //#1 здесь setup каждого потока 
  //#2
  //#3
}

void loop() {
  //#1 а вот здесь функцилнирование 
  //#2
  //#3
}

Ну #1,#2,#3 это процессы. 

А вот если процессы надо делать с какой-то частотой, а не когда подошла очередь то делаю по этому шаблону.

/* 
#1
#2
#3
*/
//#1
//#2
//#3
void setup() {
//#1
//#2
//#3
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ; 
//#1 1000 миллисекунд вычислит. поток 1
  static uint32_t future1 = 0 ;
  if (MILLIS>=future1) {
  future1 = MILLIS + 1000 ;
  // сам код
  MILLIS = millis() ;    
  }
//#2  200 миллисекунд вычислит. поток 2
  static uint32_t future2 = 0 ;
  if (MILLIS>=future2) {
  future2 = MILLIS + 200 ;
  // сам код
  MILLIS = millis() ;    
  }
//#3  100 миллисекунд вычислит. поток 3
  static uint32_t future3 = 0 ;
  if (MILLIS>=future3) {
  future3 = MILLIS + 100 ;  
    // сам код  
  }
}

Разумеется у других свой стиль. А в Си стилей море. От вменяемых до безумных.

Про i в цикле очень просто . У вас bt0 - 6 выводов. а bt1,bt2 - по 3.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Qwone, говно твой шаблон, работать не будет.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Zombrero пишет:

ua6em. тяжело в учении - легко в бою... 

Это как новое хобби, одно из многих, вечерами надо себя чем то занять, а свободное время привык проводить с пользой. 

Ага как там у Новикова - "...но чтоб с какой-то лярвой я время проводил..." и, я с ним полностью согласен )))
 

программирование вешь увлекательная, но начинать надо всё же с алгоритма, тогда и ошибки ищутся ну прямо как..."одним движением руки...двинул он полки" ну вы поняли о чём я...к примеру некоторое устройство управляет газовой горелкой (упрощённый вариант)

Исходные данные:

датчик газа - G
датчик горения - GR
вентиль газа (клапан) KPG

кнопка запуск - KN
аппарат розжига RZ

Тогда запуск - RZ =  G*KN*!GR то-есть напряжение будет подаваться до тех пор пока не сработает датчик пламени,  ан нет и тут начинаем вводить новые переменные, то-есть строим алгоритм (а газ открыть) )))

 

 

 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Парни, не ссортесь :)) 

Попробую все методы, в которых смогу разобраться. 

Затея то сама в чем: что бы не бегать в котельную и не ломать каждый раз, вспоминая какой вентель что открывает\закрывает, родилась идея это все визуализовать и переключать удаленно. Есть три бойлера и один теплообменник, первый на 300л работает летом в системе охлаждения, зимой в системе отопления, бойлер на 1000л. лучше отключать  зимой что бы тепловой насос даром не грел такой обьем воды, он не нужен, и есть теплообменник, который получает тепло с большого теплового насоса, на случай если наступит холод и нужно много тепла. Управлать всем этим через реле, которые будут переключать 12-ти аольтовые электромагнитные клапаны. Вся система будет запитана от аккумулятора, который даст возможность автономно работать всей системе без света больше суток, т.к. у нас часто рубят свет и на долго. Ну и попутно хочу к каждому котлу подключить по два датчика температуры, что бы видеть что там происходит, опять таки не бегая в котельную.  

Вот скетч один, пусть кривой, но работает как часы: 

#include <SoftwareSerial.h>
#include <Nextion.h>

SoftwareSerial nextion(13, 12);// Nextion TX на пин 13, но он не подключен,и RX на пин 12.
Nextion myNextion(nextion, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps

void setup() {
  Serial.begin(9600);
  myNextion.init();
   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 (23, 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() {
  String message = myNextion.listen(); 
  if(message != ""){ 
  Serial.println(message); 
  }

/* Бойлер на 300 л., пины: 22,23,24,25,26,27. ON - Охладжение */
  if(message =="70 bt0:ON"){ //почему то команда с дисплея Nextion приходит в виде "70 bt:ON, но в данном случае меня не парит, пусть так, если ей это нравится
   digitalWrite(22, HIGH);
   digitalWrite(23, LOW);
   digitalWrite(24, HIGH);
   digitalWrite(25, LOW);
   digitalWrite(26, LOW);
   digitalWrite(27, HIGH);
  }
   if(message =="70 bt0:OFF"){ 
   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"){ 
   digitalWrite(28, LOW);
   digitalWrite(29, HIGH);
   digitalWrite(30, LOW);
  }
   if(message =="70 bt1:OFF"){ 
   digitalWrite(28, HIGH);
   digitalWrite(29, LOW);
   digitalWrite(30, HIGH);
  };

/* Теплообменник, пины: 31,32,33. ON - включен теплообмен */
  if(message =="70 bt2:ON"){ 
   digitalWrite(31, HIGH);
   digitalWrite(32, LOW);
   digitalWrite(33, HIGH);
  }
   if(message =="70 bt2:OFF"){ 
   digitalWrite(31, LOW);
   digitalWrite(32, HIGH);
   digitalWrite(33, LOW);
  };
  
}

Вот скетч второй для сбора данных с датчиков, просто для информации, что бы не бегать в котельную: 

#include <SoftwareSerial.h>
#include <Nextion.h>
#include "DHT.h"
#define DHTPIN 12
#define DHTTYPE DHT11   //Тип датчика DHT 11
DHT dht(DHTPIN, DHTTYPE);
SoftwareSerial nextion(2, 3);// Nextion TX на пин 2 и RX на пин 3, но он не подлючен
Nextion myNextion(nextion, 9600); 

void setup() {
  Serial.begin(9600);
  myNextion.init();
  dht.begin();
  }

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  myNextion.setComponentText("t0", String(t));
  delay(200);
  myNextion.setComponentText("t1", String(h));
  delay(200);
}

Когда пытаюсь обьеденить оба лупа - идет задержка при переключении, т.е. реагирует с периодом каждае 5-10 секунд... 

Я не люблю все усложнять, пусть будет две ардуинки и каджая будет выполнять свою функцию - одна переключать реле, другая собирать информацию с датчиков. Один хрен с первой я получаю данные от дисплея по RX, а со второй я отправляю данные на TX. Так все работает четко и мне этого с головой хватает... 
 
Да, в будующем хотелось бы сделать отдельную ветку с таким алгоритмом: смотрим на показания температуры на улице, если тепло, сморим на время суток, если день, то с 9 до 17 часов включаем 6 реле. Это нужно будет для того что бы в солнечную погоду включать прогрев помещений, которые зимой не используются, т.к. постоянно греть я их не могу, т.к. образуется точка росы и пойдет плесень. И если бы это так же запитать на тот же дисплей - была бы красота. Но и в этом случае могу попробовать подключить третью ардуино с этим алгоритмом и парралельно вывести на нее RX и TX от того же дисплея, который уже задейстован... не знаю будет работать или нет, но причин не работать парралельно - не вижу...
 
Так то всем спасибо. если есть идеи, как это все упрядочить и совместить - пишите, я сейчас все хаваю как губка, кроме грибов  и любой критике рад.  
bwn
Offline
Зарегистрирован: 25.08.2014

Ну тогда по критике: на хой фак вам сдались эти DHT c их 250мС задержкой на каждый датчик+ отдельный пин? Повесьте гирлянду DS18B20 и читайте хоть 100 точек практически без задержек. Посоветовать что то с дисплеем не в состоянии, т.к. никогда с ним не сталкивался. Поэтому, за исключеним неизвестного мне дисплея, все должно летать. Третий год работает система с двумя диммируемыми нагревательными каналами+ 3 DS18 + 1DHT (влажность)+ 2 вентиляционных + 1освещение+аналоговая клавиатура+ I2C 1602+ I2C часы-календарь. Молотит без задержек, только редкое подмигивание из за DHT (нагреватели - галогеновые прожектора). Разберитесь с этим дисплеем или его библиотекой и думаю все пойдет.
С временными интервалами считывания DS, проблема возникла только один раз - срывало синхронизацию телевизионного сигнала (тема где то на форуме), пришлось считывать датчики по одному за проход и все наладилось.

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Этот датчик просто как эксперимент, как раз и собираюсь использовать датчик DS18D20, т.к. он в том формфакторе который мне нужен.  Приедет, попробую с ним... но думаю проблема не в нем, а в моем не знании как правильно сделать что бы это работало все в одном. Поэтому и обратился за помощью...  Так то в ходе поиска решений - нашел выход, пока что, в будующем может и дойду до того что бы сделать все в одном, хоть немного глубже изучив язык ардуино... 

lazzio
Offline
Зарегистрирован: 06.12.2016

Уважаемый, у Вас что в итоге вышло?
Неделю назад начал знакомиться с Ардуино и сейчас дошел до той же проблемы, что и Вы. Очень бы хотелось понять как решилось, не применяя вторую ардуино.