Module cảm biến độ ẩm đất

Một phần của tài liệu Nghiên cứu và mô phỏng hệ thống tưới cây tự động có hiển thị màn hình LCD (Trang 35)

CHƯƠNG 3 : NỘI DUNG

3.3 Các thiết bị được sử dụng

3.3.4 Module cảm biến độ ẩm đất

3.3.4.1 Nguyên lí hoạt động

Cảm biến độ ẩm đất, trạng thái đầu ra mức thấp (0V), khi đất thiếu nước đầu ra sẽ là mức cao (5V), độ nhạy cao chúng ta có thể điều chỉnh được bằng biến trở. Phần đầu đo được cắm vào đất để phát hiện độ ẩm của đất, khi độ ầm của đất đạt ngưỡng thiết lập, đầu ra DO sẽ chuyển trạng thái từ mức thấp lên mức cao. Nhờ thế, ta có thể sử dụng Analog hoặc Digital của Arduino để đọc giá trị từ cảm biến.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

28

Hình 3.18: Module cảm biến độ ẩm đất

3.3.4.2 Thông số kỹ thuật

Điện áp vào : 2V – 5V.

Trạng thái đầu ra: LOW-mức thấp(0V); HIGH-mức cao(5V). Kiểu đầu ra : Analog.

Độ sâu cần thiết:38mm. Kích thước: 20mm*51mm.

Có thể điều chỉnh độ nhạy bằng biến trở.

3.3.4.3 Cách đo và cách đọ độ ẩm đất dùng cảm biến độ ẩm đất

Cách đo: phần đầu đo được cắm vào đất để phát hiện độ ẩm của đất.

Cách đọc: có hai cách đọc tín hiệu từ cảm biến độ ẩm đất. Đọc giá trị Digital hoặc đọc giá trị Analog:

- Đọc giá trị Digital (đọc bằng chân D0): Khi độ ẩm đất đạt ngưỡng thiết lập, đầu ra D0 sẽ chuyển trạng thái từ mức thấp lên mức cao.

- Đọc giá trị Analog (đọc bằng chân A0): Giá trị đầu ra sẽ có điện áp từ 0-5V tương ứng với độ ẩm từ 0-100%.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

29

3.3.4.4 Cách quy đổi độ ẩm đất thành phần trăm

Tín hiệu Analog có độ phân giải mặc định là từ 0 - 1023 tương ứng 0 - 5V. Để quy đổi nó sang %, chúng ta sẽ chuyển nó bằng hàm map về 0 - 100%.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

30

3.3.4.5 Kết nối dây với Arduino

Ta dựa vào bảng sau để kết nôi chân cảm biến độ ẩm đất với Arduino UNO R3

Bảng 3.3: Kết nối cảm biến độ ẩm đất với Arduino.

Cảm biến độ ẩm đất Arduino UNO R3

Vcc 5V GND GND A0 A0 3.3.5 Lập trình cho cảm biến độ ẩm đất void setup() { Serial.begin(9600);//Mở cổng Serial ở mức 9600 pinMode (2, INPUT); pinMode(A0, INPUT); pinMode (13, OUTPUT); } void loop() {

int value = analogRead(A0); // Ta sẽ đọc giá trị hiệu điện thế của cảm biến // Giá trị được số hóa thành 1 số nguyên có giá trị

// trong khoảng từ 0 đến 1023

Serial.println(value);//Xuất ra serial Monitor delay(10);

// Đọc giá trị D0 rồi điều khiển Led 13...Các bạn cũng có thể điều khiển bơm nước thông qua rơle....

if (digitalRead (2) == 0) {

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường 31 } else{ digitalWrite (13, LOW); } } 3.3.6 Module Relay 5VDC 3.3.6.1 Cấu tạo

Do các chân Digital của Arduino chỉ xuất ra mức tín hiệu thấp 0V hoặc cao 5V nên chúng ta chọn relay dịng kích 5VDC.

Relay là thiết bị đóng cắt cơ bản, nó được sử dụng rất nhiều trong cuộc sống và trong các thiết bị điều khiển điện tử. Nó là một chuyển mạch hoạt động bằng điện. Dòng điện chạy qua cuộn dây của relay tạo ra một từ trường hút lõi sắt non làm thay đổi công tắc chuyển mạch. Dịng điện qua cuộn dây có thể được bật hoặc tắt vì thế rơle có hai vị trí chuyển mạch qua lại.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

32 Cấu tạo relay gồm 2 phần:

- Cuộn hút: tạo ra năng lượng từ trường để hút các tiếp điểm về mình. - Cặp tiếp điểm: khi không cấp điện tiếp điểm 1 được tiếp xúc tiếp điểm

2 (tiếp điểm thường đóng). Khi cấp điện tiếp điểm 1 bị hút chuyển.

3.3.6.2 Cách sử dụng

Relay bình thường gồm có 6 chân. Trong đó có 3 chân để kích, 3 chân cịn lại nối với đồ dùng điện có cơng suất cao:

- 3 chân dùng để kích:

 +: cấp hiệu điện thế kích tối ưu vào chân này.

 : nối với cực âm.

 S: chân tín hiệu, tùy vào loại module relay mà nó sẽ làm nhiệm vụ kích relay.

Nếu bạn đang dùng module relay kích ở mức cao và chân S bạn cấp điện thế dương vào thì module relay của bạn sẽ được kích, ngược lại thì khơng.

Tương tự với module relay kích ở mức thấp.

- 3 chân cịn lại nối với đồ dùng điện cơng suất cao:

 COM: chân nối với 1 chân bất kỳ của đồ dùng điện, nhưng mình khuyên nên mắc vào dây chân lửa (nóng) nếu dùng hiệu điện thế xoay chiều và cực dương nếu là hiệu điện một chiều.

 ON hoặc NO: chân này bạn sẽ nối với chân lửa (nóng) nếu dùng điện xoay chiều và cực dương của nguồn nếu dòng điện một chiều.

 OFF hoặc NC: chân này bạn sẽ nối chân lạnh (trung hòa) nếu dùng điện xoay chiều và cực âm của nguồn nếu dùng điện một chiều.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

33

3.3.7 Màn hình LCD 3.3.7.1 Cấu tạo 3.3.7.1 Cấu tạo

LCD phổ thông khi giao tiếp "chay" với Arduino thì tốn rất nhiều chân, để khắc phục tình trạng đó mà module I2C ra đời.

Hình 3.21: LCD 2004

- VSS: tương đương với GND - cực âm.

- VDD: tương đương với VCC - cực dương (5V). - Constrast Voltage (V0): điều khiển độ sáng màn hình.

- Register Select (RS): điều khiển địa chỉ nào sẽ được ghi dữ liệu.

- Read/Write (RW): Bạn sẽ đọc (read mode) hay ghi (write mode) dữ liệu Nó sẽ phụ thuộc vào bạn gửi giá trị gì vào.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

34

- D0 - D7: 8 chân dư liệu, mỗi chân sẽ có giá trị HIGH hoặc LOW nếu bạn đang ở chế độ đọc (read mode) và nó sẽ nhận giá trị HIGH hoặc LOW nếu đang ở chế độ ghi (write mode).

- Backlight (Backlight Anode (+) và Backlight Cathode (-): Tắt bật đèn màn hình LCD.

Hình 3.22: LCD 2004 - module I2C

Kết nối LCD với Arduino:

Bảng 3.4: Kết nối LCD với Arduino

Module màn hình LCD Arduino UNO R3

GND GND

Vcc 5V

SDA A4

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

35

3.3.7.2 Lập trình

// thư viện LiquitCrystal có sẵn #include <LiquidCrystal.h>

//Khởi tạo với các chân

LiquidCrystal lcd(0x27, 20, 4);

void setup() {

//Thông báo đây là LCD 1602 lcd.begin();

//In ra màn hình lcd dịng chữ Toi yeu Arduino lcd.print("Toi yeu Arduino!");

}

void loop() {

// đặt con trỏ vào cột 0, dòng 1

// Lưu ý: dòng 1 là dòng thứ 2, lịng 0 là dịng thứ 1. Nơm na, nó đếm từ 0 chứ không phải từ 1

lcd.setCursor(0, 1); // In ra dong chu

lcd.print(" Arduino.VN"); }

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

36

3.3.8 Bàn phím ma trận 4x4 3.3.8.1 Sơ đồ nguyên lí 3.3.8.1 Sơ đồ nguyên lí

Hình 3.23: Sơ đồ ngun lí Keypad

Trên đây là hình ảnh sơ đồ nguyên lý của module bàn phím 4x4. Tuy có đến 16 nút nhấn, nghĩa là nếu làm một cách thơng thường (dùng chân digital) thì ta phải cần đến 16 chân Arduino để đọc. Nhưng với bàn phím này, chúng ta chỉ cần dùng 8 chân (4 chân hàng ngang (row), và 4 chân cột dọc (column)).

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

37 Kết nối Keypad với Arduino:

Bảng 3.5: Kết nối Arduino với Keypad

Arduino Keypad 5 R1 6 R2 7 R3 8 R4 9 C1 10 C2 11 C3 12 C4 3.3.8.2 Lập trình #include Keypad.h

const byte rows = 4; //số hàng const byte columns = 4; //số cột

int holdDelay = 700; //Thời gian trễ để xem là nhấn 1 nút nhằm tránh nhiễu int n = 3; //

int state = 0; //nếu state =0 ko nhấn,state =1 nhấn thời gian nhỏ , state = 2 nhấn giữ lâu

char key = 0;

//Định nghĩa các giá trị trả về char keys[rows][columns] = {

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường 38 {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}, };

byte rowPins[rows] = {8, 7, 6, 5}; //Cách nối chân với Arduino byte columnPins[columns] = {12, 11, 10, 9};

//cài đặt thư viện keypad

Keypad keypad = Keypad(makeKeymap(keys), rowPins, columnPins, rows, columns);

void setup() {

Serial.begin(9600);//bật serial, baudrate 9600

}

void loop() {

char temp = keypad.getKey(); if ((int)keypad.getState() == PRESSED) { if (temp != 0) { key = temp; } } if ((int)keypad.getState() == HOLD) { state++; state = constrain(state, 1, n-1); delay(holdDelay); }

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

39 if ((int)keypad.getState() == RELEASED) { key += state;

state = 0;

//Xuất lên Máy tính để xem kết quả Serial.println(key);

}

delay(100); }

3.4 Giới thiệu các phần mềm được sử dụng 3.4.1 Giới thiệu phầm mềm Fritzing 3.4.1 Giới thiệu phầm mềm Fritzing

Để thiết kế một sơ đồ mạch điện ứng dụng hồn chỉnh, phục vụ cho q trình học tập và nghiên cứu thì chúng ta cần có nhiều kinh nghiệm và linh kiện điện tử để thử nghiệm. Một giải pháp hiệu quả cho tình huống này là sử dụng phần mềm Fritzing, bạn sẽ nhanh chóng tạo ra những sơ đồ mạch nguyên lý, sơ đồ lắp đặt và từ đó lựa chọn loại PCB sao cho phù hợp với nhu cầu thiết kế.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

40

Với phần mềm Fritzing hổ rợ chúng ta các tính năng như sau:

 Sơ đồ cắm linh kiện trực tiếp dùng để kiểm tra mạch với Breadboard.

 Sơ đồ nguyên lí mạch với Schematic.

 Sơ đồ mạch in với PCB.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

41

3.4.2 Giới thiệu phần mềm Arduino IDE

Để lập trình được cho các board Arduino, ta cần phải có một cơng cụ gọi là Intergrated Development Environment (IDE). Công cụ này được đội ngũ kĩ sư của Arduino phát triển và có thể chạy trên Windows , MAC OS X và Linux.

Hình 3.25: Màn hình khởi động của Arduino IDE

Cửa sổ làm việc:

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

42

Nút kiểm tra chương trình: dùng để kiểm tra xem chương trình được viết có lỗi khơng. Nếu chương trình bị lỗi thì phần mềm Arduino IDE sẽ hiển thị thơng tin lỗi ở vùng thông báo thông tin.

Nút nạp chương trình xuống board Arduino: dùng để nạp chương trình được viết xuống mạch Arduino. Trong quá trình nạp, chương trình sẽ được kiểm tra lỗi trước sau đó mới thực hiện nạp xuống mạch Arduino.

Hiển thị màn hình giao tiếp với máy tính: khi nhấp vào biểu tượng cái kính lúp thì phần giao tiếp với máy tính sẽ được mở ra. Phần này sẽ hiển thị các thông số mà người dùng muốn đưa lên màn hình. Muốn đưa lên màn hình phải có lệnh Serial.print() mới có thể đưa thơng số cần hiển thị lên màn hình.

Vùng lập trình: vùng này để người lập trình thực hiện việc lập trình cho chương trình của mình.

Vùng thơng báo thơng tin: có chức năng thơng báo các thơng tin lỗi của chương trình hoặc các vấn đề liên quan đến chương trình. Những thơng báo từ IDE sẽ được hiển thị tại đây. Để ý rằng góc dưới cùng bên phải hiển thị loại board Arduino và cổng COM được sử dụng. Luôn chú ý tới mục này bởi nếu chọn sai loại board hoặc cổng COM, ta sẽ không thể upload được code của mình.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

43

Khi lập trình, ta cần chọn port (cổng kết nối khi gắn board vào) và board (tên board mà ta sử dụng). Giả sử, ta đang dùng mạch Arduino Uno, và khi gắn board này vào máy tính bằng cáp USB nó được nhận là COM4 thì ta chỉnh như thế này là có thể lập trình được.

Hình 3.28: Chọn cổng kết nối IDE

Sử dụng một số menu thông dụng trên phần mềm Arduino IDE: có vài menu trong phần mềm IDE, tuy nhiên thông dụng nhất vẫn là menu File, ngồi những tính năng như mở một file mới hay lưu một file, phần menu này có một mục đáng chú ý là Example. Phần Example (ví dụ) đưa ra các ví dụ sẵn để người lập trình có thể tham khảo, giảm bớt thời gian lập trình. Hình bên dưới thể hiện việc chọn một ví dụ cho led chớp tắt (blink) để nạp cho mạch Arduino. Ví dụ về led chớp tắt này thường được dùng để kiểm tra board khi mới mua về.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

44

Hình 3.29: Menu File trong IDE

Một menu thường được sử dụng khác là menu Tools. Khi mới kết nối board Arduino với máy tính ta click vào Tools->board để chọn loại board sử dụng. Phần mềm chọn sẵn kiểu board là board Arduino Uno, nếu ta dùng kiểu board khác thì chọn kiểu board đang dùng.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

45

3.5 Lập trình cho mạch vi điều khiển 3.5.1 Sơ đồ thuật toán 3.5.1 Sơ đồ thuật toán

Hình 3.31: Sơ đồ thuật tốn Chú thích: a: giờ thực. b: giờ cài đặt. c: độ ẩm đất. d: ngưỡng độ ẩm cài đặt. M: phút thực. M: phút cài đặt.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

46

3.5.2 Code

#include <DS1307RTC.h>//thư viện ds 1307 #include <LiquidCrystal_I2C.h>// thư viện i2c #include <Keypad.h>// thư viện bàn phím #include <Wire.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const byte DS1307 = 0x68;//địa chỉ DS1307

const byte NumberOfFields = 3;// số byte dữ liệu đọc từ DS1307 tmElements_t cai;

String manhinh, phimnhan ;

int H1 = 0,H2 = 0, M1 = 0,M2 = 0,S1 = 0,S2 = 0; int set1H1 = 0,set1H2 = 0,set1M1 = 0,set1M2 = 0; int set2H1 = 0,set2H2 = 0,set2M1 = 0,set2M2 = 0; int x = 0;

boolean chop = 1;

int doam1 = 0, doam = 0, bientro1 = 0, bientro = 0; int Relay = 13;

int H , MI , S ;

const byte ROWS = 4; const byte COLS = 4;

// ĐỊNH NGHĨA CÁC GIÁ TRỊ TRẢ VỀ char keys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} };

byte rowPins[ROWS] = {8,7,6,5}; //các chân nối với hàng của keypad byte colPins[COLS] = {12,11,10,9}; //các chân nối với cột của keypad

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

47 // cài đặt thư viện keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup() {

Wire.begin();//khởi tạo ds1307 lcd.begin();// khởi tạo lcd

Serial.begin(9600); //Turn on serial monitor pinMode(Relay, OUTPUT); lcd.clear();

setTime(6, 59,00 );// cài thời gian cho ds 1307 readDS1307(); } void hienthi(){ readDS1307();// đọc dữ liệu DS1307 lcd.setCursor(0, 0); lcd.print("do am dat:"); lcd.print(doam );// in ra giá trị độ ẩm đất lcd.print("% "); lcd.setCursor(0, 1);

lcd.print("gia tri cai dat:");

lcd.print(bientro );// in ra giá trị độ ẩm cài đặt lcd.print("% ");

lcd.setCursor(0, 2);

lcd.print("SetTime " + String((set1H1) + String(set1H2) + ":" + String(set1M1) + String(set1M2)));

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

48 // NỐI CÁC CHUỖI LẠI VỚI NHAU

lcd.print("#" + String(set2H1) + String(set2H2) + ":" + String(set2M1) + String(set2M2)); lcd.setCursor(0, 3); if (H < 10) { lcd.print(0); lcd.print(H); } else { lcd.print(H); } lcd.print(":"); if (MI < 10) { lcd.print(0); lcd.print(MI); } else { lcd.print(MI); } lcd.print(":"); if (S < 10) { lcd.print(0); lcd.print(S); } else

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường 49 { lcd.print(S); } manhinh = "CLOCK"; } void loop() { doam1 = analogRead(A0);

doam = map(doam1, 0, 1023, 0, 100);// đổi giá trị độ ẩm đất ra % bientro1 = analogRead(A1);// đọc giá trị điện áp ở chân A1 bientro = map(bientro1, 0, 1023, 0, 100);// đổi giá trị cài đặt ra %

if (x == 0) {

hienthi(); }

char key = keypad.getKey(); if (key) {

phimnhan = String(key);

//==================== CÀI ĐẶT THỜI GIAN THỰC

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

50

//=============================================0 6 :0 0 :0 0 ========================

if ((manhinh == "CLOCK") && (phimnhan == "A")) {//Nhấn A để cài chỉnh thời gian thực

manhinh = "SET H1"; x = 1;

}

if (manhinh == "SET H1") {

if ((phimnhan == "0" || phimnhan == "1" || phimnhan == "2")) { H1 = phimnhan.toInt();// chuyển đổi chuỗi thành số

manhinh = "SET H2"; goto Blink; } } if (manhinh == "SET H2") { if (((H1 * 10) + phimnhan.toInt()) < 24) { H2 = phimnhan.toInt(); manhinh = "SET M1";

Một phần của tài liệu Nghiên cứu và mô phỏng hệ thống tưới cây tự động có hiển thị màn hình LCD (Trang 35)