#arduino-uno #i2c #relay
#arduino-uno #i2c #реле
Вопрос:
Я работаю над своим проектом в колледже, в котором я должен измерить температуру, отобразить ее на ЖК-дисплее 16×2, а также переключить охлаждающее устройство в зависимости от температуры, также я должен использовать датчик pH и отображать его значение на 16×2. В настоящее время я использую приведенный ниже код для определения температуры и переключения, но он не работает должным образом. На экране отображается температура, а также некоторое значение мусора, а также неправильное переключение.
#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);
}
Ответ №1:
Я разделю свой ответ на две части:
- Аппаратное обеспечение:
Пожалуйста, опишите конфигурацию вашего оборудования, чтобы сузить проблему: как вы переключаете реле? Связан ли он оптически? Вы используете транзистор? Если да, то какой тип? Имеет ли ваше реле обратную диодную защиту? (Не подключайте реле напрямую к контакту Arduino)
- Код
2.1. Этот цикл for в вашей setup () неверен:
for (int DigitalPin = 8; DigitalPin <= 8; DigitalPin ) {
pinMode(DigitalPin, OUTPUT);
}
Вы индексируете от 8 до 8, следовательно, вам не нужен цикл for для объявления одного вывода в качестве вывода.
2.2. В общем, вы можете назначить свои выходные контакты переменным или в виде макроса, как вы сделали для DHT. Просто будьте последовательны. Кроме того, ваш код нуждается в общей уборке:
a. Запустите свой код со всеми библиотеками, вызывающими
#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);
d. 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);
}
e. Согласно библиотеке 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: поделитесь своим оборудованием, чтобы помочь вам. Обновите свои библиотеки, очистите код и используйте правильные методы из последних библиотек.
Комментарии:
1. Большое спасибо @daniel-melendrez за краткое руководство, это очень полезная и очень полезная информация для таких новичков, как я. Я использовал Arduino Uno r3, релейный модуль 6 В для Arduino, имеющий собственный управляющий транзистор, DHT11, дисплей 16×2, модуль i2C. Мне также нужно будет добавить датчик pH в этот микропроект, но я его еще не купил. Как только он будет у меня в руках, я также добавлю это, и, возможно, мне тоже понадобится ваша помощь. Еще раз спасибо
Ответ №2:
Большое спасибо за ваше руководство, ниже приведен рабочий код для меня:
#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);
}
}
Комментарии:
1. В настоящее время он работает для работы реле в зависимости от температуры, я добавлю код датчика pH после его завершения и обязательно опубликую здесь.
2. Приятно знать, что у вас все получилось. PS Извините, что прокомментировал так поздно!