4. Đề nghị cho bảo vệ hay không?
5.1.2.2 Khối cảm biến độ ẩm đất
40
5.1.2.3 Khối cảm biến tín hiệu tương tự
Bao gồm cảm biến siêu âm và cảm biến nhiệt độ, độ ẩm không khí sử dụng nguồn nuôi 5VDC.
Hình 5.7: Sơ đồ kết nối cảm biến tương tự
Đối với cảm biến siêu âm, công thức tính toán từ tín hiệu tương tự sang đơn vị cm hay inch:
uS là biến lưu lại số được truyền từ cảm biến vào arduino.
Khoảng cách = uS/58 (đơn vị cm) hoặc uS/148 (đơn vi inch)
Ở trạng thái ban đầu khi chưa bị đối tượng tác động thì giá trị mặc định uS=
1024.
Đối với cảm biến nhiệt độ, độ ẩm không khí:
Do arduino hỗ trợ ngõ vào tương tự với độ phân giải 10 bit do đó có 210 = 1024
giá trị khác nhau. Giá trị cảm biến nhiệt độ, độ ẩm không khí sẽ biến đổi trong phạm vi từ 0 đến 1024. Mặc định giá trị ban đầu khi chưa tác động thì giá trị là 1024.
41
5.1.2.4 Khối cảm biến ánh sáng
42
5.1.2.5 Khối cơ cấu chấp hành:
Khi các tín hiệu đầu vào được được xử lý, so sánh, đối chiếu với thông số chuẩn thì bộ điều khiển sẽ trả tín hiệu để kích các thiết bị trong cơ cấu chấp hành hoạt động.
+ Trường hợp 1: Khi độ ẩm đất dưới 60% thì chân Analog của cảm biến sẽ có tín hiệu trả về VĐK qua đó VĐK sẽ có tín hiệu tác động đến mạch cầu H để kích cho bơm nước chạy để đưa nước vào vườn. Đến khi độ ẩm đất đạt 90% thì bộ điều khiển sẽ ngắt tín hiệu để bơm ngưng hoạt động tránh thừa nước làm thối gốc cây trồng. Do chỉ thử nghiệm trên mô hình nên vườn chỉ có kích thước 40cm x 20cm do đó nhóm em quyết đinh chọn loại bơm có nguồn cấp 5 (V) DC là phù hợp với việc cung cấp nước cho vườn.
+ Trường hợp 2: Khi nhiệt độ cũng như độ ẩm không khí trong vườn quá nhiệt độ cho phép thì sẽ bộ điều khiển sẽ đưa ra tín hiệu để kích cho quạt cấp, thải hoạt động để đối lưu không khí trong vườn nhằm điều hòa nhiệt độ, độ ẩm trong vườn. Trong trường hợp độ chênh lệch quá lớn thì bộ điều khiển sẽ kích đồng thời để quạt và bộ tạo ẩm cùng hoạt động để điều hòa lại nhiệt độ ẩm trong vườn. Do thử nghiệm trên mô hình có kích thể tích 100cm x 60cm x 40cm nên nhóm chọn sử dụng 1 quạt cấp khí và 2 quạt thoát khí có nguồn cấp 12 (V) DC. Nguồn cấp bộ tạo ẩm là 24 (V) DC.
+ Trường hợp 3: Trong những ngày mưa thì chỉ tiêu ánh sáng của cây sẽ không được đáp ứng đủ thì thông qua tín hiệu từ cảm biến ánh sáng thì bộ điều khiển sẽ cấp tín hiệu cho relay đóng/mở đèn để cung cấp đủ ánh sáng cho cây trồng.
43
5.2 Phần mềm ARDUINO 1.6.7
Arduino IDE là phần mềm lập trình cho Arduino. Môi trường lập trình cho Arduino IDE có thể chạy trên 3 nền tảng phổ biến nhất hiện nay là Windows, OS và Linux. Do có tính chất nguồn mở nên ngôn ngữ lập trình có thể được mở rộng qua các thư viện C++.
44
CHƯƠNG 6:
LƯU ĐỒ GIẢI THUẬT
6.1 Lưu đồ giải thuật khối chương trình chính
Hình 6.1: Sơ đồ khối chương trình chính
Bắt đầu Bơm vào bồn Bật đèn Quạt gió Bơm 1 Bơm 2 Phun sương Kết thúc
45
6.2 Lưu đồ giải thuật của các cảm biến
`
Sai
Đúng
Sai
Đúng
Hình 6.2: Sơ đồ khối cảm biến cảm biến đo mức nước
Bắt đầu Cảm biến đo khoảng cách Không bơm nước được
Nhắn tin cho chủ vườn
46
Sai
Đúng
Hình 6.3: Sơ đồ khối cảm biến đo độ ẩm đất, cảm biến ánh sáng Cảm biến đo
độ ẩm đất
Bơm nước
Kết thúc Bắt đầu
47
Đúng Sai Sai Đúng
Hình 6.4: Sơ đồ khối cảm biến đo nhiệt độ, độ ẩm không khí Cảm biến độ
ẩm không khí
Quạt cấp, quạt thải hoạt đông
Kết thúc Bắt đầu
Cảm biến độ ẩm không khí
Quạt cấp, quạt thải hoạt đông
48 CHƯƠNG 7: KẾT LUẬN VÀ KIẾN NGHỊ 7.1 Kết luận: Những hạng mục đã đạt được: Mô hình hoàn tất
Hoàn thành kết nối các cảm biến với Arduino
Hoàn thành cảnh báo thông qua SMS
Kỹ năng làm việc nhóm.
Những hạng mục chưa đạt được:
Mô hình chưa hoàn chỉnh như mong muốn
Chưa viết được chương trình giao tiếp hoàn chỉnh cho mô hình
7.2 Kiến nghị
Có thể phát triển mô hình theo hướng sử dụng pin năng lượng mặt trời để mô hình
hoạt động đôc lập mà không cần phụ thuộc vào nguồn 220V.
Liên hệ với các công ty trong lĩnh vực điều khiển thông minh.
49
TÀI LIỆU THAM KHẢO
[1] Giáo trình Đo lường và cảm biến, Thầy Lê Chí Kiên, NXB Đại Học Sư Phạm Kỹ Thuật TP.HCM
[2] Lịch sử phát triển Arduino “ wikipedia.com /arduino-mega” Ngoài ra tài liệu được tham khảo từ các nguồn trên internet: Datasheet arduino mega 2560 PDF
Diễn đàn điện tử Việt Nam
http: www.dientuvietnam.net
Diễn đàn Arduino Việt Nam và quốc tế www.Arduino.vn
www.arduino.cc Tiêu chuẩn VietGAP www.vietgap.gov.vn
các trang web chuyên về nhà kính www.nhakinh.vn
50
PHỤ LỤC
CHƯƠNG TRÌNH CODE CỦA ARDUINO
#include "SIM900.h" // sim900 #include <SoftwareSerial.h> //sim900 #include "sms.h" //sim900
#include <Wire.h> //BH1750 IIC Mode #include <math.h>
int BH1750address = 0x23; //setting i2c address
#define DHT11_PIN 0 // khai bao chan analog cam bien nhiet do, do am khong khi #define analogdoamdat1 1 // khai bao chan analog cam bien do do am 1
#define analogdoamdat2 2 // khai bao chan analog cam bien do do am 2
SoftwareSerial SIM900(2, 3); // CHÂN TX NỐI VỚI CHÂN 3, CHÂN RX NỐI VỚI CHÂN 4
String textSMS="BOM NUOC KHONG LEN";//NÔI DUNG GỬI char tempchar;
const int trig = 7; // chân trig của HC-SR04 const int echo = 8; // chân echo của HC-SR04 const int in01Pin = 22; //bomvaobon
const int in02Pin = 24;
const int in11Pin = 26; //bom1 const int in12Pin = 28;
const int in21Pin = 30; //bom2 const int in22Pin = 32;
51 const int phunsuong = 31; //phun suong
const int quat = 33; //quat const int den = 35; //den
byte buff[2]; // anh sang void setup()
{
DDRC |= _BV(DHT11_PIN); // nhiet do do am PORTC |= _BV(DHT11_PIN); // nhiet do do am Wire.begin();// dung cho cam bien anh sang
Serial.begin(9600); // giao tiếp Serial với baudrate 9600 SIM900.begin(115200);
pinMode(trig,OUTPUT); // chân trig sẽ phát tín hiệu pinMode(echo,INPUT); // chân echo sẽ nhận tín hiệu pinMode(13,OUTPUT); pinMode(in11Pin,OUTPUT); pinMode(in12Pin,OUTPUT); pinMode(in21Pin,OUTPUT); pinMode(in22Pin,OUTPUT); pinMode(phunsuong,OUTPUT); pinMode(quat,OUTPUT); pinMode(den,OUTPUT); }
int distance() // cam bien do muc nuoc {
52 int distance; // biến lưu khoảng cách unsigned long duration; // biến đo thời gian /* Phát xung từ chân trig */
digitalWrite(trig,0); // tắt chân trig delayMicroseconds(2);
digitalWrite(trig,1); // phát xung từ chân trig
delayMicroseconds(5); // xung có độ dài 5 microSeconds digitalWrite(trig,0); // tắt chân trig
/* Tính toán thời gian */
// Đo độ rộng xung HIGH ở chân echo. duration = pulseIn(echo,HIGH); // Tính khoảng cách đến vật. distance = int(duration/2/29.412); return distance;
}
int doamdat1() //cam bien do do am 1 {
int doamdat1 = analogRead(analogdoamdat1);
doamdat1 = map(doamdat1,0,1024,0,100);// chuyen do am dat ve thang 100% delay(1000);
return doamdat1;
}
53 {
int doamdat2 = analogRead(analogdoamdat1); doamdat2 = map(doamdat2,0,1024,0,100); delay(1000);
return doamdat2; }
byte read_dht11_dat() // nhietdodoam {
byte i = 0; byte result=0; for(i=0; i< 8; i++) {
while(!(PINC & _BV(DHT11_PIN))); // wait for 50us delayMicroseconds(30);
if(PINC & _BV(DHT11_PIN)) result |=(1<<(7-i));
while((PINC & _BV(DHT11_PIN))); // wait '1' finish } return result; } void loop() { bomvaobon();
54 bom1();
bom2();
quatgiohoinuoc(); batden();
delay(600000);// cho 10s roi lap lai }
void bomvaobon() // bom tu gieng len { if((distance())<=10) { digitalWrite(in01Pin,HIGH); digitalWrite(in02Pin,LOW); } if((distance())>=20) { digitalWrite(in01Pin,LOW); digitalWrite(in02Pin,LOW); } delay(100000);
if(((distance())<=9) && (((distance())<=12))) {
delay(20);
sendSMS(textSMS);//GỬI TÍN HIÊU SMS delay(3000);
55 }
void bom1() // bom den chau co cam bien 1 { if((doamdat1())<=40) { digitalWrite(in11Pin,HIGH); digitalWrite(in12Pin,LOW); } if((doamdat1())>=60) { digitalWrite(in11Pin,LOW); digitalWrite(in12Pin,LOW); } }
void bom2() // bom den chau co cam bien 2 { if((doamdat2())<=40) { digitalWrite(in21Pin,HIGH); digitalWrite(in22Pin,LOW); } if((doamdat2())>=60) { digitalWrite(in21Pin,LOW); digitalWrite(in22Pin,LOW);
56 } } void quatgiohoinuoc() { byte dht11_dat[5]; byte dht11_in;
byte i;// start condition
// 1. pull-down i/o pin from 18ms PORTC &= ~_BV(DHT11_PIN); delay(18); PORTC |= _BV(DHT11_PIN); delayMicroseconds(40); DDRC &= ~_BV(DHT11_PIN); delayMicroseconds(40);
dht11_in = PINC & _BV(DHT11_PIN); if(dht11_in)
{
Serial.println("dht11 start condition 1 not met"); return;
}
delayMicroseconds(80);
dht11_in = PINC & _BV(DHT11_PIN); if(!dht11_in)
57 Serial.println("dht11 start condition 2 not met"); return;
}
delayMicroseconds(80);// now ready for data reception for (i=0; i<5; i++)
dht11_dat[i] = read_dht11_dat(); DDRC |= _BV(DHT11_PIN); PORTC |= _BV(DHT11_PIN);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];// check check_sum
if(dht11_dat[4]!= dht11_check_sum) {
Serial.println("DHT11 checksum error"); }
if((dht11_dat[0])<=50) {
digitalWrite(phunsuong,HIGH);// bat phun suong }
if((dht11_dat[0])>=70) {
digitalWrite(phunsuong,LOW);// tat phun suong }
if((dht11_dat[2])>=45) {
58
digitalWrite(quat,HIGH);// bat quat giam nhiet trong nha kinh }
if((dht11_dat[2])<=30) {
digitalWrite(quat,LOW);// tat quat } delay(2000); } void batden() { int i; uint16_t val=0; BH1750_Init(BH1750address); delay(200); if(2==BH1750_Read(BH1750address)) { val=((buff[0]<<8)|buff[1])/1.2; if(val <= 4) {
digitalWrite(den,HIGH);// bat den }
if(val >= 5) {
59 digitalWrite(den,LOW);// tat den
} }
delay(150); }
int BH1750_Read(int address) // { int i=0; Wire.beginTransmission(address); Wire.requestFrom(address, 2); while(Wire.available()) // {
buff[i] = Wire.read(); // receive one byte i++;
}
Wire.endTransmission(); return i;
}
void BH1750_Init(int address) {
Wire.beginTransmission(address); Wire.write(0x10);//1lx reolution 120ms Wire.endTransmission();
60 void sendSMS(String message)
{
SIM900.print("AT+CSCS=\"GSM\"\r\n"); // Lệnh AT để gửi in nhắn SMS SIM900_response(500);
SIM900.print("AT+CMGF=1\r\n"); // Bắt đầu quá trình gửi tin nhắn SIM900_response(500);
SIM900.print("AT+CMGS=\"+841676079836\"\r"); // Số điên thoại của người nhân theo format quốc tế
SIM900_response(500);
SIM900.print(message); // gửi nội dung tin nhắn SIM900_response(500);
SIM900.print((char)26); // Kết thúc lênh gửi SIM900_response(5000);
}
void SIM900_response(int time) {
int tnow = millis();
while ((millis()-tnow) < time){ if (SIM900.available()){ tempchar = (char)SIM900.read(); if (tempchar == '\r'){ Serial.print("/R/"); } else if (tempchar == '\n'){ Serial.println("/N/");
61 } else Serial.print(tempchar); } } }