Как написать код для датчика pH DHT11 с ЖК-дисплеем i2c 16x2 в Arduino Uno?

Я работаю над своим проектом в колледже, в котором я должен измерять температуру, показывать ее на ЖК-дисплее 16x2, а также переключать охлаждающее устройство в зависимости от температуры, также я должен использовать датчик pH и отображать его значение на 16x2. В настоящее время я использую приведенный ниже код для температуры и переключения, но он работает неправильно. Показывает температуру на экране но и какое-то фиговое значение, и тоже не переключается нормально.

 #include <Wire.h>
 #include <LCD.h>
 #include <LiquidCrystal_I2C.h>
 #include <dht.h>

 dht DHT;
 #define DHT11_PIN 7
 LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7);
 const int ledPin = 6;

 void setup()
 {
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.begin(16, 2);
  lcd.clear();
  Serial.begin(9600);

  for (int DigitalPin = 8; DigitalPin <= 8; DigitalPin++) {
   pinMode(DigitalPin, OUTPUT);
  }  

 }

 void loop()
 {
  int chk = DHT.read11(DHT11_PIN);
  float temp=(DHT.temperature);
  float Hum=(DHT.humidity);
  lcd.print("Temp         C  ");
  lcd.setCursor(6,0);
  lcd.print(temp);
  lcd.setCursor(0,1);
  lcd.println("Humid        %  ");
  lcd.setCursor(6,1);
  lcd.print(Hum);

  delay(1000);

  if (temp <= 29)
   digitalWrite(8, LOW);
  else if (temp>30)
  digitalWrite(8, HIGH);
 }

person shahzaib4841    schedule 06.11.2020    source источник


Ответы (2)


Я разделю свой ответ на две части:

  1. Аппаратное обеспечение:

Пожалуйста, опишите конфигурацию вашего оборудования, чтобы сузить круг вашей проблемы: Как вы переключаете реле? Он оптически связан? Вы используете транзистор? Если да, то какого типа? Есть ли в вашем реле защита от обратного диода? (Не не подключайте реле напрямую к контакту Arduino)

  1. Код

2.1. Этот цикл for в вашей настройке() неверен:

for (int DigitalPin = 8; DigitalPin <= 8; DigitalPin++) {
   pinMode(DigitalPin, OUTPUT);
}

Вы индексируете от 8 до 8, поэтому вам не нужен цикл for для объявления одного вывода в качестве выхода.

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

а . Начните свой код со всеми вызовами библиотек

#include <Wire.h>    // The Wire.h library is already called by the LiquidCrystal_I2C library, so you don't need to call it if you use the I2C one
#include <LCD.h>    // You are using the LCD library...
#include <LiquidCrystal_I2C.h>    // but also the I2C lcd library. You don't need both.
#include <dht.h>    // Is this the latest version? Use Adafruit's

б. Попробуйте сгруппировать все свои макросы в начале. Объявите контакты или константы здесь:

// Using macros
#define DHT11_PIN 7
#define DigitalPin 8
#define DHT11_PIN 7

или используя константы для выводов. Выберите один, а не оба:

// Group all your const int together, for the sake of clarity
const int DHT_PIN = 7;
const int DigitalPin = 8;
const int ledPin = 6;

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

LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7); 

попробуйте вместо этого с этим конструктором:

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
 

д. Функция setup() тоже нуждается в некоторых изменениях:

 void setup()
 {
   // You don't seem to be using the serial library. However, if you use it, it is 
   // preferable to start it first.
  Serial.begin(9600);  

  // LCD configuration
  lcd.begin(16, 2);    // Always call the begin() method first
  lcd.setBacklightPin(3,POSITIVE);    // Then, use additional configuration methods.
  lcd.setBacklight(HIGH);
  lcd.clear();
  // Once again, please check if you are using the right library. 
  // It might be the cause of the garbage you see.
   
  // Initialize the type of pin
   pinMode(DigitalPin, OUTPUT);
    
 }

е. Согласно библиотеке Adafruit (пожалуйста, см. примеры), вам не хватает макроса для объявления типа используемого датчика DHT:

# определить DHTTYPE DHT11

ф. В вашем основном цикле() вы читаете значения с какой-то странной скобкой:

int chk = DHT.read11(DHT11_PIN);
float temp=(DHT.temperature);
float Hum=(DHT.humidity);

который, согласно последней библиотеке, должен быть:

// The latest library does not have this prototype: int chk = DHT.read11(DHT11_PIN); What is it for in your dht lib?
  
float temp = DHT.readTemperature(); // instead of: float temp=(DHT.temperature); --> which should be DHT.temperature(); in any case
float hum = DHT.readHumidity(); // instead of: float Hum=(DHT.humidity);

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

person Daniel Melendrez    schedule 27.11.2020
comment
Большое спасибо @daniel-melendrez за краткое руководство, это очень полезная и очень полезная информация для таких нубов, как я. Я использовал Arduino Uno r3, релейный модуль 6 В для Arduino, имеющий собственный управляющий транзистор, DHT11, дисплей 16x2, модуль i2C. Мне также нужно будет добавить датчик pH в этом микропроекте, но я еще не купил его. Как только он будет у меня в руках, я добавлю и его, и, возможно, тогда мне тоже понадобится ваша помощь. Спасибо еще раз - person shahzaib4841; 30.11.2020

Большое спасибо за ваше руководство, ниже приведен рабочий код для меня:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHTPIN 7 //digital pin for sensor

#define DHTTYPE DHT11      // DHT 11
DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() 

{
  pinMode(8, OUTPUT); //for configuring relay output
  lcd.begin(16, 2);  
  dht.begin();
}

void loop() {

 delay(1000);
 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);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) 

{
   lcd.print("NO CONNECTION");
    return;
}

//Hum code
  lcd.setCursor(0, 0);
  lcd.print("Hum:");
  lcd.print(h);
  lcd.print(" % ");
//Temp code
  lcd.setCursor(0, 1);
  lcd.print("Temp:");
  lcd.print(t);
  lcd.print(" C");


//To operate relay
{
if (t <= 26)
digitalWrite(8, LOW);
else if (t>27)
digitalWrite(8, HIGH);
}
  
}
person shahzaib4841    schedule 30.11.2020
comment
В настоящее время он работает для работы реле по температуре, я добавлю код датчика pH после его завершения и обязательно опубликую здесь. - person shahzaib4841; 30.11.2020
comment
Приятно знать, что это сработало для вас. P.S. Извините, что комментирую так поздно! - person Daniel Melendrez; 25.04.2021