/* DHT-22 sensor with I2C 16x2 LCD with Arduino Uno
Temperature and humidity sensor displayed on LCD
based on: http://www.ardumotive.com/how-to-use-dht-22-sensor-en.html and
https://www.ardumotive.com/i2clcden.html for the I2C LCD library by Michalis Vasilakis
Recompiled by adhitadhitadhit
Notes: Use the LCD I2C Library from the link above. I'm not sure why, but the new LiquidCrystal library from Francisco Malpartida isn't working for me.
Another thing, check your connections. */
// Libraries
#include <dht.h> // Sensor library using lib from https://www.ardumotive.com/how-to-use-dht-22-sensor-en.html
#include <LiquidCrystal_I2C.h> // LCD library from https://www.ardumotive.com/i2clcden.html for the I2C LCD library
#include <ModbusRTUSlave.h>
#include <SoftwareSerial.h>
dht DHT;
// Constants
#define DHT22_PIN 2
#define SLAVE_ID 1
#define TEMPERATURE_REGISTER 0
#define HUMIDITY_REGISTER 1
LiquidCrystal_I2C lcd(0x27, 16, 2);
const byte dePin = 4;
const byte rxPin = 1;
const byte txPin = 0;
// const byte buzzerPin = 7;
SoftwareSerial mySerial(rxPin, txPin);
ModbusRTUSlave modbus(mySerial, dePin); // Use default baud rate
uint16_t holdingRegisters[2];
// Variables
float humidity;
float temperature;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight(); // Initialize LCD and turn on backlight
modbus.configureHoldingRegisters(holdingRegisters, 2);
modbus.begin(SLAVE_ID, 9600);
pinMode(8, OUTPUT); // Pin for controlling humidity conditions
pinMode(7, OUTPUT); // Pin for controlling humidity conditions
// pinMode(buzzerPin, OUTPUT);
}
void loop() {
modbus.poll();
int chk = DHT.read22(DHT22_PIN);
humidity = DHT.humidity;
temperature = DHT.temperature;
Serial.println(humidity);
Serial.println(temperature);
// Print temp and humidity values to LCD
lcd.clear(); // Clear LCD before printing new values
lcd.setCursor(0, 0);
lcd.print("Humidity: ");
lcd.print(humidity);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
if (humidity > 50) {
// tone(buzzerPin, 100, 1000);
digitalWrite(8, HIGH); // Control humidity conditions based on threshold
digitalWrite(7, LOW);
} else if (humidity < 30) {
digitalWrite(8, LOW); // Control humidity conditions based on threshold
digitalWrite(7, HIGH);
}
// Store values in Modbus registers (correct way)
holdingRegisters[TEMPERATURE_REGISTER] = static_cast<uint16_t>(temperature * 10);
holdingRegisters[HUMIDITY_REGISTER] = static_cast<uint16_t>(humidity);
delay(2000);
}