Chế tạo máy đo độ ẩm đất, hiển thị lên màn hình OLED 0.96 bằng Arduino
Bạn đang thử chế tạo một thiết bị đo độ ẩm đất trực quan bằng Arduino, nhưng gặp khó khăn trong quá trình chế tạo. Thì bài viết này dành cho bạn, để hiểu hơn về cấu tạo và nguyên lý hoạt động của cảm biến độ ẩm điện dung mình khuyên các bạn nên xem trước bài viết ở bên dưới.
Trong dự án lần này, mình sẽ chế tạo một hệ thống đo độ ẩm đất bằng cảm biến độ ẩm điện dung, sử dụng màn hình OLED 0.96 với Arduino và được cảnh báo khi độ ẩm nhỏ 40% thông qua còi. Trước khi tiến hành các bạn cần chuẩn bị một số linh kiện sau:
Xem ngay: Hướng dẫn sử dụng cảm biến độ ẩm điện dung với Arduino
Linh kiện cần thiết cho dự án
TÊN LINH KIỆN | SỐ LƯỢNG | NƠI BÁN |
Arduino Nano | 1 | Shopee | Cytron |
Cảm biến độ ẩm đất điện dung | 1 | Shopee | Cytron |
Màn hình OLED 0.96 I2C | 1 | Shopee | Cytron |
Còi Chip 5VDC | 1 | Shopee | Cytron |
Transistor 2N2223 hoặc C1815 | 1 | Shopee | Cytron |
Điện trở 10K | 1 | Shopee | Cytron |
Tụ phân cực 470uF | 2 | Shopee | Cytron |
IC ổn áp LM7805 | 1 | Shopee | Cytron |
Jack nguồn DC | 1 | Shopee | Cytron |
Dây cắm (Đực – Cái) | 10 – 20 | Shopee | Cytron |
Tổng quan về cảm biến độ ẩm đất điện dung
Capacitive Soil Moisture Sensor (Cảm biến độ ẩm đất điện dung) là một loại cảm biến được sử dụng để đo độ ẩm của đất. Cảm biến này hoạt động dựa trên nguyên lý điện dung (RC) của đất.
Cấu trúc của cảm biến thường bao gồm hai điện cực, một điện cực dẫn và một điện cực cách điện. Khi cảm biến được đặt trong đất, độ ẩm của đất sẽ tác động lên điện dung giữa hai điện cực. Điện dung sẽ thay đổi theo tỉ lệ nghịch với độ ẩm của đất. Khi đất khô, điện dung sẽ cao hơn, và khi đất ẩm, điện dung sẽ thấp hơn.
Để hiểu rõ hơn về cảm biến độ ẩm đất điện dung, các bạn có thể xem bài viết bên dưới:
Xem ngay: Hướng dẫn sử dụng cảm biến độ ẩm điện dung với Arduino
Sơ đồ đấu nối
Code cảm biến độ ẩm đất điện dung
//Dry: (520 430] //Wet: (430 350] //Water: (350 260] #include <SPI.h> // include libraries #include <Wire.h> #include <Adafruit_GFX.h>z #include <Adafruit_SSD1306.h> const int AirValue = 620; const int WaterValue = 310; int soilMoistureValue = 0; int soilmoisturepercent = 0; int buzzer = 4; #define SCREEN_WIDTH 128 // ORelay display width, in pixels #define SCREEN_HEIGHT 64 // ORelay display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define ORelay_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, ORelay_RESET); int moisturesensor = A0; // moisture sensor is connected with the analog pin A0 of the Arduino void setup() { Serial.begin(9600); pinMode(moisturesensor, INPUT); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); delay(2000); display.clearDisplay(); display.setTextColor(WHITE); } void loop() { soilMoistureValue = analogRead(moisturesensor); Serial.println(soilMoistureValue); soilmoisturepercent = map(soilMoistureValue, AirValue, WaterValue, 0, 100); display.clearDisplay(); display.setCursor(10, 10); display.setTextSize(3); display.setTextColor(WHITE); display.print("SM:" + String(soilmoisturepercent) + "%"); display.display(); delay(1000); if (soilmoisturepercent < 40) { digitalWrite(buzzer, HIGH); delay(1000); digitalWrite(buzzer, LOW); delay(1000); digitalWrite(buzzer, HIGH); delay(1000); digitalWrite(buzzer, LOW); delay(1000); } }
Giải thích Code
#include <SPI.h> // include libraries #include <Wire.h> #include <Adafruit_GFX.h>z #include <Adafruit_SSD1306.h> const int AirValue = 620; const int WaterValue = 310; int soilMoistureValue = 0; int soilmoisturepercent = 0; int buzzer = 4;
Khai báo các thư viện và tạo một số biến như giá trị độ ẩm của không khí (AirValue), giá trị độ ẩm của nước (WaterValue), giá trị độ ẩm của đất (soilMoistureValue), phần trăm độ ẩm của đất (soilmoisturepercent), và chân điều khiển buzzer.
#define SCREEN_WIDTH 128 // ORelay display width, in pixels #define SCREEN_HEIGHT 64 // ORelay display height, in pixels
Định nghĩa hai hằng số SCREEN_WIDTH
và SCREEN_HEIGHT
để xác định kích thước của màn hình hiển thị. Hằng số SCREEN_WIDTH là chiều rộng của màn hình (đơn vị là pixel), và hằng số SCREEN_HEIGHT đại là chiều cao của màn hình (pixel).
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define ORelay_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, ORelay_RESET); int moisturesensor = A0; // moisture sensor is connected with the analog pin A0 of the Arduino
Khai báo một đối tượng display
từ thư viện Adafruit_SSD1306 để điều khiển màn hình SSD1306 kết nối thông qua giao tiếp I2C (SDA, SCL). Đối tượng display được khởi tạo với các tham số là SCREEN_WIDTH và SCREEN_HEIGHT để xác định kích thước của màn hình hiển thị. Tham số &Wire
cho biết sử dụng giao thức Wire (I2C) để giao tiếp với màn hình.
Đồng thời, định nghĩa một biến moisturesensor
có giá trị là A0, cảm biến độ ẩm điện dung được kết nối với chân analog A0 trên Arduino.
void setup() { Serial.begin(9600); pinMode(moisturesensor, INPUT); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); delay(2000); display.clearDisplay(); display.setTextColor(WHITE); }
Trong hàm setup(), cấu hình chân đầu vào cho cảm biến độ ẩm và khởi tạo màn hình OLED.
void loop() { soilMoistureValue = analogRead(moisturesensor); Serial.println(soilMoistureValue); soilmoisturepercent = map(soilMoistureValue, AirValue, WaterValue, 0, 100); display.clearDisplay(); display.setCursor(10, 10); display.setTextSize(3); display.setTextColor(WHITE); display.print("SM:" + String(soilmoisturepercent) + "%"); display.display(); delay(1000); if (soilmoisturepercent < 40) { digitalWrite(buzzer, HIGH); delay(1000); digitalWrite(buzzer, LOW); delay(1000); digitalWrite(buzzer, HIGH); delay(1000); digitalWrite(buzzer, LOW); delay(1000); } }
Hàm loop() được thực hiện lặp đi lặp lại. Giá trị độ ẩm của đất được đọc từ cảm biến analog thông qua lệnh analogRead(moisturesensor)
. Sau đó, giá trị độ ẩm này được chuyển đổi thành phần trăm sử dụng hàm map()
. Giá trị phần trăm này được hiển thị trên màn hình OLED.
Sau đó, trong điều kiện if, nếu giá trị độ ẩm của đất (soilmoisturepercent) nhỏ hơn 40%, buzzer (Còi) sẽ được bật/tắt và lặp đi lặp lại trong khoảng thời gian bởi lệnh delay(). Dùng để tạo ra một hiệu ứng âm thanh cảnh báo khi độ ẩm của đất quá thấp.
Hình ảnh thực tế
Để tinh gọn dây và tránh các lỗi không cần thiết, các bạn có thể làm một mạch in PCB như thế này, trong trường hợp bạn không biết thiết kế PCB có thể sử dụng breadboard để quá trình triển khai dự án nhanh chóng hơn.
Tiến hành, cắm đầu dò xuống đất, các bạn lưu ý chỉ cắm đến phần gạch ngang màu trắng được ký hiệu trên mạch, không cắm quá sâu tránh trường hợp gây hư hỏng cảm biến độ ẩm đất điện dung.
Dưới đây, là kết quả nhận được, các bạn có thể thử nghiệm bằng cách đổ nước vào bên trong đất xem cảm biến có thay đổi không.
Qua dự án này các bạn có thể ứng dụng vào các dự án thực tế như hệ thống tưới tự động, hay giám sát độ ẩm của đất…Mong rằng thông qua bài hướng dẫn này sẽ giúp các bạn hiểu rõ hơn về cảm biến độ ẩm điện dung và sáng tạo ra nhiều ứng dụng hay ho hơn.