// https://wokwi.com/projects/344892587898831442 program dht22
//---Objecttive Hum <40 pump on , Hum >80 pump off
// Smart Farm
//---- LCD 20X4 (I2C)
#include <LiquidCrystal_I2C.h> // LCD 20X4 (I2C)
LiquidCrystal_I2C lcd(0X27, 20, 4); // LCD 20X4 (I2C) can use address 0X3f
// -- DHT
#include "DHT.h" // DHT
#define dhtPin 2 // dhtPin is digital led pin 2 use for DHT22
#define DHTTYPE DHT22 // DHT
DHT dht(dhtPin, DHTTYPE); // DHT
// ---
#define dly1000 1000
#define Millis1000 1000 // interval Time millis
//#define d8 8 // digital led pin 8 use Relay or pump can use define
// ---- pin for control by relay
#define fanPin 9 // Temperature , Relay ตัวกลาง
#define lampPin 10 // lamp
#define buttonPin 11 // Button pin 11
// --- Relay use for ป้๊ม Servo
int pumpPin = 8; // variable val for keep value digital leg pin 8 equiment Relay
// --- DHT22
int h; // Humidity
int t; // Temperature
// --- Millis use in Smart Farm, Relay ตัวล่างสุด ใช้ digital pin 8
unsigned long CurTime = 0; // current time
unsigned long pPre = 0; // previous time
int pTime = Millis1000; // interval time
int pState = LOW; // keep work status of เงือนไข (h < 40)
// for condition (h > 40 && h < 80), Relay ตัวล่างสุด ใช้ digital pin 8
unsigned long p1Pre = 0; // previous time for
int p1Time = Millis1000; // interval time for
int p1State = LOW; // keep work status of เงือนไข (h > 40 && h < 80)
// --- Millis use in Smart Farm Temperatureม Relay ตัวกลาง ใช้ digital pin 9
// t>40 lamp off fan on , // t < 20 lamp on fan off
unsigned long fPre = 0; // previous time
int fTime = Millis1000; // interval time
int fState = LOW; // keep work status of เงือนไข (t > 40)
//-- condition t<40 && t>20
unsigned long f1Pre = 0; // previous time
int f1Time = Millis1000; // interval time
int f1State = LOW; // keep work status of เงือนไข (t<40 && t>20)
//---- Start Lamp ,Lamp work when Temperature is LOW , use Millis
// 1 CurTime 2 PreTime 3 Interval ทำทุกๆเท่าไร 4 CurTime = millis
// 5 if (1-2 >=3) 6 2 <- 1 7 State
unsigned long lampPre = 0; // previous time
int lampTime = Millis1000; // interval time
int lampState = LOW; // keep work status of เงือนไข t<20
// Start Lamp ,Lamp work when Temperature is LOW , เงือนไข t>20 && t<40
unsigned long lamp1Pre = 0; // previous time
int lamp1Time = Millis1000; // interval time
int lamp1State = LOW; // keep work status of เงือนไข t>20 && t<40
// -- variable keep buttonPin
int button = 0;
int buttonState = HIGH; // ต้องการให้ มน กดติด ปล่อยดบ
//--- baurate for Serial monitor
void Sbaudrate() {
Serial.begin(115200);
}
//---
void InitPinMode() {
pinMode(pumpPin, OUTPUT); // Relay
pinMode(dhtPin, INPUT); // DHT22
pinMode(buttonPin, INPUT_PULLUP); // button use digital pin 11
}
//--- DHT22
void InitDHT22() {
dht.begin();
}
//--- DHT22 humidity/temperature sensors, display to Serial Monitor
void Dht22() {
h = dht.readHumidity();
t = dht.readTemperature();
Serial.print("Hum: ");
Serial.print(h);
Serial.print(" Temp: ");
Serial.println(t);
//delay(dly1000);
}
//---- LCD 20X4 (I2C), display to LCD 20X4 (I2C)
void InitLCD20X4() { // initialize LCD 20X4 (I2C)
lcd.init();
lcd.backlight();
}
// --- use LCD20X4 (I2C)
void UseLCD20X4() { // initialize LCD 20X4 (I2C)
CurTime = millis(); // very important first command in Millis
//Serial.print(CurTime);
h = dht.readHumidity();
t = dht.readTemperature();
lcd.setCursor(0, 0);
lcd.print("Hum: ");
lcd.print(h);
lcd.print(" ");
CHumInterval(h); //---Objecttive Hum <40 pump on , Hum >80 pump off ใช้ Millis
lcd.print(" Temp: ");
lcd.print(t);
lcd.print(" ");
lcd.setCursor(0, 1);
if (digitalRead(fanPin)) { // ให้ check คำสั่ง digitalRead(fanPin) ข้อมูล , digitalRead(fanPin) == HIGH
lcd.print("Fan: ON ");
} else {
lcd.print("Fan: OFF");
}
//lcd.print(" ");
lcd.setCursor(9, 1);
if (digitalRead(lampPin)) { // digitalRead(lampPin) == 1
lcd.print("Lamp: ON ");
} else {
lcd.print("Lamp: OFF");
}
//lcd.print(" ");
//delay(1000);
CTemp(t); // Temperature (t > 40) (h>40 && h<80)
lampTempLOW(); // Temperature is LOW use Lamp (t<20), (t < 40 && t > 20)
}
//--- Hum <40 pump on , Hum >80 pump off , CONTROL ความชื้น
void CHumInterval(int h) { // start Hum
// CurTime = millis(); // very important first command in Millis
if (h<40) { // h = ความชื้น , h น้อยกว่า 40 และใช้ Millis ไม่ใช้ delay command
/*digitalWrite(pumpPin, HIGH); // replace with the millis commands use CutTime, pPre, pTime if (CurTime-pPre >= pTime)
delay(2000); // replace with the millis commands use CutTime, pPre, pTime
digitalWrite(pumpPin, LOW); // replace with the millis commands use CutTime, pPre, pTime
delay(1000);*/ // replace with the millis commands use CutTime, pPre, pTime
if (CurTime - pPre >= pTime) { // น้อยกว่า 40 และใช้ Millis ไม่ใช้ delay command
pTime = CurTime;
if (pState == LOW) {
pState = HIGH;
pTime = 3000; // ช่วงนี้เพิ่งเริ่มต้นเลย ต้องการเลี้ยงความชื้นให้คงที่โดยเร็ว ให้พ่นน้ำนาน 3 วินาที ใช้เวลาไม่เท่ากัน กับข้างล่าง
} else {
pState = LOW;
pTime = 500; // ให้หยุดพ่นน้ำช่วงเวลาสั้นๆ ครึ่งวินาที ใช้เวลาไม่เท่ากันกับข้างต้น
}
digitalWrite(pumpPin, pState);
}
} else if (h>40 && h<80) { // interval ต้องการให้น้ำพ่น และไม่พ่นเป็นระยะ พ่นน้อย ดับนาน
if (CurTime - p1Pre >= p1Time) {
p1Time = CurTime;
if (p1State == LOW) {
p1State = HIGH;
p1Time = 500; // ช่วงยืดหยุน ช่วงนี้เริ่มต้นมานานแล้ว ต้องการเลี้ยงระดับความชื้นให้คงที่ ให้พ่นน้ำแค่ ครึ่งวินาที ใช้เวลาไม่เท่ากัน กับข้างล่าง
} else {
p1State = LOW;
p1Time = 3000; // ช่วงยืดหยุน ให้หยุดพ่นน้ำนาน 3 วินาที ใช้เวลาไม่เท่ากัน กับข้างบน
}
digitalWrite(pumpPin, p1State);
}
} else { // h>80 หรือทุกกรณี ยกเว้นเงื่อนไข (h < 40) และ (h > 40 && h < 80) แสดงข้างต้น
digitalWrite(pumpPin, LOW);
}
}
// -- end CHumInterval(int h)
//---- Initial pinMode fan lamp pinMode control by Relay
void InitRelaypinMode() {
pinMode(fanPin, OUTPUT); // Relay contral fan
pinMode(lampPin, OUTPUT); // Relay contral lamp
}
// --- , CONTROL อุณหภูมิ
void CTemp(int t) { // start fan
// --- t>40 lamp off fan on , t < 20 lamp on fan off
if (t > 40) { // t > 40 , start fan
if (CurTime - fPre >= fTime) {
fPre = CurTime;
if (fState == LOW) {
fState = HIGH;
fTime = 3000; // ช่วงนี้เพิ่งเริ่มต้นเลย ต้องปรับอุณหภูมิให้คงที่โดยเร็ว จึงให้พ่นน้ำนาน 3วินาที
} else {
fState = LOW;
fTime = 500; // ปรับให้หยุดพ่นน้ำ ครึ่งวินาที
}
digitalWrite(fanPin, fState);
}
}else if (t < 40 && t > 20) { // อยู่ในช่วง interval เลี้ยงอุณหภูมิให้คงที่ โดยพ่นน้ำ ครึ่งวินาที หยุดพ่นน้ำ 3วินาที
if (CurTime - f1Pre >= f1Time) {
f1Pre = CurTime;
if (f1State == LOW) {
f1State = HIGH;
f1Time = 500; // ช่วงยืดหยุน อยู่ในช่วง interval ต้องการเลี้ยงระดับอุณหภูมิให้คงที่ โดยพ่นน้ำ ครึ่งวินาที
} else {
f1State = LOW;
f1Time = 3000; // ช่วงยืดหยุน อยู่ในช่วง interval ต้องการเลี้ยงระดับอุณหภูมิให้คงที่ โดย หยุดพ่นน้ำ 3วินาที
}
digitalWrite(fanPin, f1State);
}
}else {
digitalWrite(fanPin, LOW);
}
}
// -- end CTemp()
//---- Start Lamp ,Lamp work when Temperature is LOW ,CONTROL อุณหภูมิ
void lampTempLOW() {
if (t<20) { // Temperature is LOW t<20
//digitalWrite(lampPin, HIGH); // พัดลมเป่า 3 วินาที
/*delay(3000);
digitalWrite(lampPin, LOW); // พัดลมหยุด 1 วินาที
delay(1000);*/
// use Millis มาแทน commands in comments เพราะ ใช้งานจริงร่วน หน่วง cpu
if (CurTime - lampPre >= lampTime) {
lampPre = CurTime;
if (lampState == LOW) {
lampState = HIGH;
lampTime = 3000; // ช่วงยืดหยุน อยู่ในช่วง interval ต้องการเลี้ยงระดับอุณหภูมิให้คงที่ โดยพ่นน้ำ 3วินาที
} else {
lampState = LOW;
lampTime = 500; // ช่วงยืดหยุน อยู่ในช่วง interval ต้องการเลี้ยงระดับอุณหภูมิให้คงที่ โดย หยุดพ่นน้ำ ครี่งวินาที
}
digitalWrite(lampPin, lampState);
}
}else {
if (t>20 && t<40) { //
/*digitalWrite(lampPin, HIGH);
delay(1000); // ติด 1 วินาที
digitalWrite(lampPin, LOW);
delay(3000); // ดับ 3 วินาที */
// ไม่ใช้ millis
if (CurTime - lamp1Pre >= lamp1Time) { // use millis แทน command in comment
lamp1Pre = CurTime;
if (lamp1State == LOW) {
lamp1State = HIGH;
lamp1Time = 500; // ช่วงยืดหยุน อยู่ในช่วง interval ต้องการเลี้ยงระดับอุณหภูมิให้คงที่ โดยพ่นน้ำ ครี่งวินาที
} else {
lamp1State = LOW;
lamp1Time = 3000; // ช่วงยืดหยุน อยู่ในช่วง interval ต้องการเลี้ยงระดับอุณหภูมิให้คงที่ โดย หยุดพ่นน้ำ 3วินาที
}
digitalWrite(lampPin, lamp1State);
}
}else {
digitalWrite(lampPin, LOW);
}
}
}
//--- end lampTempLOW()
//------
void setup() {
Sbaudrate(); // Serial monitor
InitPinMode(); // Set pinMode
InitDHT22(); // DHT22
InitLCD20X4(); // initialize LCD 20X4 (I2C)
InitRelaypinMode(); // Init pinMode fan lamp pinMode control by Relay
}
//-----
void loop() {
/*
Dht22(); // DHT22 display Serial Monitor
UseLCD20X4(); // LCD 20X4 (I2C) // temphum() ของ AJ
*/
// ปุ่ม button manual , ปุ่ม button มีปญหาเรื่อง bound ต้องมีคำส่ง delay(500)
/*
button = digitalRead(buttonPin);
Serial.print(button);
delay(200);
if (button == 0) {
digitalWrite(fanPin, HIGH);
}else {
digitalWrite(fanPin, LOW);
}
*/
/*
// ปุ่ม button กด ติด ปล่อย ดับ มันจะค้าง
button = digitalRead(buttonPin);
Serial.print(button);
delay(500);
if (button == 0) {
if (buttonState == LOW) { // มี variable buttonState เพ่ิ่มขึ้นอีก เพื่อเช็ด กด ปุ่ม button ติด ปล่อย ดับ
buttonState = HIGH;
} else {
buttonState = LOW;
}
digitalWrite(fanPin, buttonState);
}
*/
//
/*
// ปุ่ม button กด ติด ปล่อย ดับ มันจะค้าง
button = digitalRead(buttonPin);
Serial.print(button);
delay(500);
if (button == 0) {
if (buttonState == LOW) { // มี variable buttonState เพ่ิ่มขึ้นอีก เพื่อเช็ด กด ปุ่ม button ติด ปล่อย ดับ
buttonState = !buttonState;
}
digitalWrite(fanPin, buttonState);
}
*/
// ปุ่ม button กด ติด ปล่อย ดับ มันจะค้าง
Serial.print(digitalRead(buttonPin));
delay(500);
if (digitalRead(buttonPin)) {
if (buttonState == LOW) { // มี variable buttonState เพ่ิ่มขึ้นอีก เพื่อเช็ด กด ปุ่ม button ติด ปล่อย ดับ
buttonState = !buttonState;
}
digitalWrite(fanPin, buttonState);
}
}
//---- end program