Прошу помощи по декларированию переменных

Павел74
Offline
Зарегистрирован: 27.03.2019

Добрый день!

Кратко : по специальности электрик, работаю управленцем, но хобби (сборка свяких электронных штук типа ламповы усилителей меня оч увлекает)

Вообще не программист и никогда не был, но вот приобрел стартовый набор UNO с разными модулями - уже как третий  вечер осваиваю по тихому.

Для себя решил создавать наращивая, пока максимально не задействую модули и входы, причем планировал усложнять сборку

Код составляю по аналогии с вложенными уроками и параллельно сверяюсь с разделом "Программирование" на данном сайте

Цель проекта  - собрать систему контроля параметров воды в аквариме и поддержания нужного значения pH подачей углекислоты через  эл. магнитный клапан

Сейчас проблема - датчик DHT11  дает показания однократно, далее - на дисплее прописываются нули.

Система просле сброса кнопкой RESET повторяет цикл для влажности и температуры ОДНОКРАТНО дает реальные показания ( к примеру влажность 42% и температура 25С) , далее все снова по нулям ,  а цикл с заданием аналоговой переменной работает исправно.

 

К плате подключен дисплей 1602 Д( 2,3,4,5)

управление для эл. клапана оргаизовано на Д13, 

сервопривод ( до кучи) на 10 выводе

DHT11  на входе Д1, а Аналоговый сигнал с потенциометра - на А0

Ниже код с комментарием

 

#include <DHT.h>
#include <Servo.h>
#include <LiquidCrystal.h>
DHT dht(1, DHT11);                            //  тут  я инициировал датчик
Servo servo1;
LiquidCrystal lcd(12, 11, 5, 4, 3 ,2);

void setup() {

dht.begin();
lcd.begin(2, 50);
servo1.attach(10);
pinMode(13,OUTPUT); //это управление клапаном подачи СО
pinMode(1,INPUT);  // это вход с датчика DHT11 -ПРАВИЛЬНО ЛИ Я ЕГО ТУТ ОБЪЯВИЛ ИЛИ ОН ИСКЛЮЧАЕТСЯ ИЗ ЦИКЛА ЗАПИСИ ЗНАЧЕНИЯ
}

void loop() {

int rezuk = analogRead(0); // объявляю переменный аналоговый сигнал - с аналогового датчика
 lcd.setCursor(0 ,0);
lcd.print("pH");
 lcd.setCursor(3 ,0);
  lcd.print(rezuk);
  
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
 float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);    
  lcd.setCursor(0 ,1);
 lcd.print("H:");
 lcd.setCursor(4,1);
 lcd.print(h);
 lcd.setCursor(10,1);  
lcd.print("T");
lcd.setCursor(12,1);
lcd.print(t);  
  delay(2500);
  lcd.clear(); 
  // проверяю уровень регулируемого параметра по pH
digitalWrite(13,LOW);
if (rezuk>600) {
  digitalWrite(13,HIGH); 
  
  }
  
Serial.begin(9600);            //проверял на мониторе как дребезжит переменный резистор

  Serial.println(rezuk,DEC);
  delay(15);
rezuk = map(rezuk,0,1024,0,180);   // а это что называется - до кучи покрутить пропорционально сероприводом
servo1.write(rezuk);
delay(2);

 
}

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

А Вы временно всё из лупа уберите, оставьте только DHT и вывод его значения в Serial....

Павел74
Offline
Зарегистрирован: 27.03.2019

Ок ! Спасибо - думал над этим , но было жалко  - сейчас уберу все лишнее и пока выведу на монитор по послед порту

sadman41
Offline
Зарегистрирован: 19.10.2016

А чего жалеть? Ставите камменты /* - в начале фрагмента кода и */ - в конце. Таким образом временно выключаете этот фрагмент.

Павел74
Offline
Зарегистрирован: 27.03.2019

Оставил дисплей и послед порт с датчиком

ниже код

#include <DHT.h>

#include <LiquidCrystal.h>
DHT dht(1, DHT11);

LiquidCrystal lcd(12, 11, 5, 4, 3 ,2);
// DHT dht(1, DHT11); 
void setup() {
DHT dht(1, DHT11); 
dht.begin();
lcd.begin(2, 50);


pinMode(1,INPUT);
}

void loop() {


 lcd.setCursor(0 ,0);


  
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
 float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);    
  lcd.setCursor(0 ,1);
 lcd.print("H:");
 lcd.setCursor(4,1);
 lcd.print(h);
 lcd.setCursor(10,1);  
lcd.print("T");
lcd.setCursor(12,1);
lcd.print(t);  
  delay(2500);
  lcd.clear(); 
  
 
Serial.begin(9600);

  Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: "); 
Serial.print(t);
Serial.println(" *C");
  delay(15);



 
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

...и строка #41 вообще не на месте стоит.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

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

 

а так вижу, уберите датчик с 1 пина на другой.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

sadman41 пишет:

...и строка #41 вообще не на месте стоит.

поэтому один раз и срабатывает.

Павел74
Offline
Зарегистрирован: 27.03.2019

и вот результат повторился - однократно получаю данные и на дисплей и на монитор по послед порту , а далее идет все по 

тексту Humidity: nan  %  Temperature 00 *C

Павел74
Offline
Зарегистрирован: 27.03.2019

СПАСИБО ВАМ ОГРОМОЕ!!!! - на 8 пин переключил и все работает!!!

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Павел74 пишет:

СПАСИБО ВАМ ОГРОМОЕ!!!! - на 8 пин переключил и все работает!!!

причину поняли ?

или и так сойдет ?

Павел74
Offline
Зарегистрирован: 27.03.2019

а 41 строку я на 12 поставлю - это я просто в строчках напутал , когда в разные куски циклов ставил блок вывода влаж/температуры на экран.

Еще раз спасибо! сам бы долго ковырялся

Павел74
Offline
Зарегистрирован: 27.03.2019

причине не понятна чем Д1 от Д8 отличается - только если аппаратно внутри схемы  есть особенность

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Павел74 пишет:

причине не понятна чем Д1 от Д8 отличается - только если аппаратно внутри схемы  есть особенность

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

приеду домой, проверю! :))))

sadman41
Offline
Зарегистрирован: 19.10.2016

Павел74 пишет:

причине не понятна чем Д1 от Д8 отличается - только если аппаратно внутри схемы  есть особенность

https://www.arduino.cc/reference/en/language/functions/communication/serial/

Ищете свою Ардуину, смотрите в колонку Serial Pins и размышляете почему всё работало так плохо.

Павел74
Offline
Зарегистрирован: 27.03.2019

Нашёл:

"В Uno, Nano, Mini и Mega контакты 0 и 1 используются для связи с компьютером. Подключение чего-либо к этим контактам может помешать этому общению, в том числе вызвать неудачные загрузки на доску."

Очень Вам признателен, так много связных условий, что разом все не изучишь.

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

Эту тему, на вооружение возьмите. Поможет и при разводке платы, и при подобных вопросах.