Khối cảm biến độ ẩm đất

Một phần của tài liệu Điều khiển và giám sát vườn rau thông minh tiêu chuẩn vietgap bằng arduino và sim900 (Trang 53)

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); } } }

Một phần của tài liệu Điều khiển và giám sát vườn rau thông minh tiêu chuẩn vietgap bằng arduino và sim900 (Trang 53)

Tải bản đầy đủ (PDF)

(76 trang)