You are on page 1of 8

ĐỒ ÁN HỆ THÔNG NÔNG NGHIỆP THÔNG MINH

THÊM NÚT NHẤN VÀ RELAY CHO CHẾ ĐỘ ĐIỀU KHIỂN THỦ CÔNG
Mục đích của việc sử dụng nút nhấn và relay là để điều khiển máy bơm và đèn khi cần
thiết. Trong đó có 3 nút nhấn: một nút dùng để điều khiển đèn, một nút dùng để điều
khiển máy bơm và nút còn lại để đọc cảm biến và cập nhập trạng thái.

I. Mô phỏng chương trình trên phần mềm


Phần mềm sử dụng để mô phỏng : Proteus
Vì trên protues không thể mô phỏng được nodeMCU nên chúng em sẽ sử dụng arduino
uno để thay thế.

1.Mạch mô phỏng bao gồm:


+ Arduino uno để điều khiển mạch.
+ Relay 2 kênh, một kênh kết nội với máy bơm và một kênh kết nối với đèn.
+ Cảm biến ánh sáng và cảm biến độ ẩm đất,
+ Ba nút nhấn lần lượt để điều khiển máy bơm, điều khiển đèn và cập nhập trạng
thái hiện tại của mạch,
+ Led LCD hiển thị kết quả mô phỏng của mạch.
2. Sơ đồ kết nối chân của từng linh kiện:
+ Led LCD: Sử dụng chế độ 4 bit điều khiển. Trong đó 4 chân dữ liệu từ D4 – D7
được nối với chân 7 – 4 của arduino. Chân Enable kết nối với chân 9, chân RS kết nối với
chaan9 và chân RW nối đất để luôn trong write mode.
+ Cảm biến độ ẩm, nhiệt độ chân data nối với chân 2 của arduino.
+ Cảm biến độ ẩm đất chân A0 nối với chân A1
+ Relay 2 kênh lần lượt nối với chân 3 và 12
+ Ba nút nhấn kết nối lần lượt với chân A2,A3,A4.
+ Cấp nguồn cho các linh kiện.
II. Lập trình
Cộng cụ lập trình: arduino IDE.
Các thư viện được sử dụng: thư viện DHT, LiquidCrystal.
Phần code sẽ bao gồm 3 phần chính: khai báo, các hàm khởi tạo, đọc giá trị từ cảm biến,
điều khiển nút nhấn,relay và cuối cùng là in các thông tin đó ra màn hình LCD.
Phần khai báo:
#include "DHT.h"
#include <LiquidCrystal.h>

#define DHTPIN 2            // Chân DATA nối với PD0


#define SOIL_MOIST_1_PIN A1 // Chân PE4 nối với cảm biến độ
ẩm
// Relay, nút nhấn
#define PUMP_ON_BUTTON A2   //Nút có sẵn trên kit
#define PUMP_CONTROL 3          //Nút điều khiển relay bơm
#define LAMP_ON_BUTTON A3   //Nút có sẵn trên kit
#define LAMP_CONTROL 12         //Nút điều khiển relay đèn
#define SENSORS_READ_BUTTON A4  //Nút cập nhập trạng thái
#define DHTTYPE DHT22       // DHT 22  

// Biến lưu các giá trị cảm biến


int DoAmKK;
int NhietDo;
int DoAmDat;
// Biến lưu trạng thái của bơm và đèn
boolean PumpStatus = 0;
boolean LampStatus = 0;
// Biến cho timer
long sampleTimingSeconds = 50; // ==> Thời gian đọc cảm biến
(s)
long startTiming = 0;
long elapsedTime = 0;
// Khởi tạo cảm biến
DHT dht(DHTPIN, DHTTYPE);
// Khởi tạo LCD
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

Đọc giá trị từ cảm biến, setup nút bấm,relay và timer:


void setup() {
 pinMode(PUMP_CONTROL, OUTPUT);
 pinMode(LAMP_CONTROL, OUTPUT);
 pinMode(PUMP_ON_BUTTON, INPUT_PULLUP); // Button
 pinMode(LAMP_ON_BUTTON, INPUT_PULLUP); // Button
 pinMode(SENSORS_READ_BUTTON, INPUT_PULLUP);//Button
 CheckStatus();
 // Khởi tạo cổng serial baud 115200 giap tiếp uart
 Serial.begin(115200);
 Serial.println("XIN CHAO");
 // Bắt đầu đọc dữ liệu
 dht.begin();
 lcd.begin(16, 2);
 lcd.print("XIN CHAO");
 lcd.setCursor(0, 2);
 lcd.print("HE THONG NONG NGHIEP THONG MINH");
 delay(2000);
 readSensors(); // Khởi tạo đọc cảm biến
 startTiming = millis(); // Bắt đầu đếm thời gian
 lcd.clear();
 lcd.setCursor(0, 1);
 lcd.print("VUI LONG CHO");

void loop() {
 // Khởi tạo timer
 elapsedTime = millis() - startTiming;
 readLocalCmd();
 if (elapsedTime > (sampleTimingSeconds * 1000))
 {
   readSensors();
   showDataLCD();
   startTiming = millis();
 }
int getSoilMoist()
{
 int i = 0;
 int anaValue = 0;
 for (i = 0; i < 10; i++)
 {
   anaValue += analogRead(SOIL_MOIST_1_PIN); //Đọc giá trị
cảm biến độ ẩm đất
   delay(50);   // Đợi đọc giá trị ADC
 }
 anaValue = anaValue / (i);
 anaValue = map(anaValue, 1023, 0, 0, 100); //Ít nước:0%
==> Nhiều nước 100%
 return anaValue;
}
void readSensors(void)
{
 DoAmKK = dht.readTemperature();   //Đọc nhiệt độ DHT22
 NhietDo = dht.readHumidity();       //Đọc độ ẩm DHT22
 DoAmDat = getSoilMoist();        //Đọc cảm biến độ ẩm đất
}
void readLocalCmd()
{
 int digiValue = CheckButton(PUMP_ON_BUTTON);
 //  Serial.println(digiValue);
 if (!digiValue)
 {
   PumpStatus = !PumpStatus;
   showDataLCD();
   CheckStatus();
 }
 digiValue = CheckButton(LAMP_ON_BUTTON);
 if (!digiValue)
 {
   LampStatus = !LampStatus;
   showDataLCD();
   CheckStatus();
 }
 digiValue = CheckButton(SENSORS_READ_BUTTON);
 if (!digiValue)
 {
   readSensors();
   showDataLCD();
 }
}
void CheckStatus()
{
 if (PumpStatus == 1) digitalWrite(PUMP_CONTROL, LOW);
 if (PumpStatus == 0) digitalWrite(PUMP_CONTROL, HIGH);

 if (LampStatus == 1) digitalWrite(LAMP_CONTROL, LOW);


 if (LampStatus == 0) digitalWrite(LAMP_CONTROL, HIGH);
}
boolean CheckButton(int pin)
{
 boolean state;
 boolean previousState;
 const int Delay = 60;

 previousState = digitalRead(pin);
 for (int counter = 0; counter < Delay; counter++)
 {
   delay(1);
   state = digitalRead(pin);
   if (state != previousState)
   {
     counter = 0;
     previousState = state;
   }
 }
 return state;
}
In thông tin ra màn hình LCD:

void showDataLCD(void)
{
 lcd.setCursor(0, 1);
 lcd.print(" DoAmKK= ");
 lcd.print(DoAmKK);
 lcd.println("%" );

 lcd.setCursor(1, 0);
 lcd.print("NhietDo= ");
 lcd.print(NhietDo);
 lcd.println("C");
 delay(1000);
 
 lcd.clear();
 lcd.setCursor(0, 1);
 lcd.print("DoAmDat = ");
 lcd.print(DoAmDat);
 lcd.println("%" );
 delay(1000);
 
 lcd.clear();
 lcd.setCursor(0, 1);
 lcd.print("MayBom = ");
 lcd.print(PumpStatus);
 lcd.println(" " );

 lcd.setCursor(1, 0);
 lcd.print("DEN = ");
 lcd.print(LampStatus);
 lcd.println("");
 delay(1000);
}

III. Kết quả mô phỏng:


Khi chưa bấm nút:

Khi bấm nút A2 điều khiển đèn:


Khi bấm nút A3 điều khiển máy bơm:

Khi bấm nút A4 cập nhập trạng thái:

You might also like