Hệ thống nông nghiệp thông minh phiên bản ESP8266

Mình xin giới thiệu phiên bản cải tiến phần 2 của hệ thống nông nghiệp thông minh. Ở các phiên bản trước, mình đã giới thiệu với các bạn về hệ thống sử dụng TIVA / Arduino và ESP8266, tuy nhiên nó vẫn còn bộc lộ nhiều yếu điểm:

  • Chưa có chức năng điều khiển qua điện thoại
  • Vẫn phải xài kèm với TIVA/ Arduino, do đó lại tốn thêm 1 ít chi phí đầu tư

Do đó mình thử chuyển sang sử dụng với NodeMCU (ESP8266) để xem thử là với board này có đáp ứng đủ yêu cầu của mình hay không. Cũng nhân tiện cho các bạn thấy được ưu nhược điểm khi dùng board này

Bài viết này nằm trong serie về Nông nghiệp thông minh

 

Chuẩn bị

Phần cứng

  • NodeMCU
  • Cảm biến DHT22
  • Cảm biến độ ẩm đất
  • Modul 2 relay để điều khiển bơm
  • Dây nối

Phần mềm

Về cơ bản một số thông tin từ bài trước vẫn được giữ nguyên như các thông tin về nhiệt độ, độ ẩm, và độ ẩm đất, trừ thông tin về ánh sáng tạm thời loại do ESP8266 chỉ có một chân Analog, dựa trên các dữ liệu này thì sẽ thực hiện điều khiển tưới nước và cấp nhiệt cho cây, ở đây có một điểm khác nữa là modul 2 relay dùng để điều khiển 1 bơm nước và 1 đèn cấp nhiệt. LCD mình tạm thời bỏ không dùng ở trong ví dụ này.

Phân tích hệ thống

Chúng ta sẽ đi qua phân tích một chút về input và output của hệ thống

Input

  • Các thông số của cảm biến: nhiệt độ, độ ẩm, độ ẩm đất
  • Nút nhấn: điều khiển bơm và đèn

Output

  • Relay điều khiển bơm
  • Relay điều khiển đèn

Thông tin cần hiển thị lên điện thoại

  • Bơm được bật
  • Đèn được bật
  • Hệ thống offline

Dữ liệu cần hiển thị và lưu trữ

  • Các thông số từ cảm biến

Thực hiện

Trước khi thực hiện nếu bạn chưa có kiến thức gì về ESP8266 thì nên xem qua một số bài hướng dẫn về ESP8266 và các ví dụ ở đây.

Do sử dụng phần cứng mới là ESP8266 nên mình trình bày lại một chút và kế thừa lại từ project Tự làm hệ thống nông nghiệp phần 1 lại cho mọi người tiện theo dõi

Sơ đồ chân của NodeMCU

Sơ đồ kết nối hệ thống (nhớ cấp nguồn cho Relay nha)

 

Đọc tín hiệu từ DHT11/DHT22

Các bạn có thể kết nối DHT11/DHT22 theo sơ đồ như hình trên, có một lưu ý nhỏ là phải có kết nối trở 10k giữa chân Data out và chân VCC. Chân output sẽ được kết nối với chân D3 của nodeMCU, nguồn cấp cho DHT11/DHT22 là 3.3V được lấy từ NodeMCU.

Lưu ý:

Cần có sẵn thư viện DHT11/DHT22 để build không lỗi

Tùy loại cảm biến bạn sử dụng là DHT11 hay DHT22 mà comment out lại dòng #define DHTTYPE DHT22 hoặc #define DHTTYPE DHT11

DHT22

Đọc tín hiệu từ cảm biến độ ẩm đất

Cảm biến độ ẩm đất sẽ được kết nối với chân A0 của NodeMCU, nguồn cấp là 3v3.

Chương trình kết hợp đọc DHT22 và cảm biến độ ẩm đất

Độ ẩm đất

Kết quả

Ta sẽ có kết quả của việc đọc DHT và cảm biến độ ẩm đất

Thêm nút nhấn, relay

Ở đây mình thêm 3 nút nhấn

  • Nút 1 (D0) điều khiển bơm (D6)
  • Nút 2 (D1) điều khiển đèn (D7)
  • Nút 3 (D4) dùng để đọc cảm biến và cập nhật trạng thái
Chương trình

Đến đây coi như đã hoàn thành được các bước cơ bản đọc dữ liệu và điều khiển offline như bài trước:

  • Đọc cảm biến
  • Đọc nút nhấn
  • Điều khiển bơm và đèn
  • Hiển thị thông tin lên máy tính qua terminal (các bạn có thể thay thế bằng hiển thị lên LCD)

Vì thời gian cho mỗi nhiệm vụ là khác nhau nên mình sẽ dùng timer để điều khiển thời gian cho từng task (nhiệm vụ) thay cho cách dùng millis().

Với thư viện SimpleTimer thì mình sẽ thực hiện các nhiệm vụ theo thời gian như sau:

  timer.setInterval(1000L, readLocalCmd);       // 1s đọc trạng thái nút nhấn 1 
  timer.setInterval(2000L, getDhtData);         // 2s đọc cảm biến DHT 1 lần
  timer.setInterval(10000, getSoilMoist); // 10s đọc cảm biến độ ẩm đất 1 lần
  timer.setInterval(10000, printData);        // 10s hiển thị thông tin debug lên máy tính 1 lần

Ở đây mình xin nói thêm về nút nhấn đọc dữ liệu (nút nhấn thứ 3), trong quá trình hệ thống làm việc, như trên thì 10s sẽ có thông tin thông báo cho chúng ta biết, nếu tăng lên 10ph, 30ph thì lại phải ngồi chờ mỏi mòn mới biết được thông tin ? Quá bất tiện, do đó mà nút nhấn đọc dữ liệu này ra đời, mục đích là khi ấn nút thì ta có được thông tin ngay tức thời thôi.

Chương trình

Điều khiển tự động

Hệ thống coi như đã hoạt động được ở chế độ offline, giờ mình cho nó thông minh hơn một chút là có thể tự bơm nước hoặc tự bật đèn cấp nhiệt được dựa trên các tín hiệu từ cảm biến

Cảm biến độ ẩm đất:

  • Ướt: trên 88%, không cần phải bơm thêm nước
  • Bình thường: từ 66% tới 88%, là mức hoạt động bình thường, ổn định
  • Khô: dưới 66%, cần phải bơm nước

Nhiệt độ môi trường

  • Lạnh: Dưới 15 độ C, cần bật đèn sưởi
  • Bình thường: từ 15 – 24 độ C
  • Nóng: trên 24 độ C, không được bật đèn sưởi.

Chúng ta sẽ định nghĩa các thông số này trong chương trình

/* Thông số điều khiển tự động */
#define DRY_SOIL      66
#define WET_SOIL      88
#define COLD_TEMP     15
#define HOT_TEMP      24
#define TIME_PUMP_ON  15
#define TIME_LAMP_ON  15

Với TIME_PUMP_ONTIME_LAMP_ON là thời gian bật bơm và bật đèn, với một số phân tích như trên thì khi áp dụng vào code sẽ rất đơn giản

  • Nếu DRY => PUMP = ON
  • Nếu COLD => LAMP = ON

Chúng ta sẽ có hàm điều khiển tự động là autoControlPlantation()nhiệm vụ chính là điều khiển tự động bơm nước và đèn sưởi

Chương trình mình viết lại hàm đọc cảm biến DHT, cảm biến độ ẩm đất, thêm thư viện SimpleTimer và hàm điều khiển tự động

Chương trình

Điều khiển qua điện thoại với Blynk

Đây là phần được mong đợi nhất, mình xin trình bày phương án đơn giản nhất để có thể điều khiển từ xa thông qua điện thoại.

Trước tiên sẽ là tạo giao diện thông qua app Blynk trên smartphone có các chức năng sau

  • Đọc và hiển thị toàn bộ dữ liệu từ cảm biến và trạng thái của bơm,đèn
  • Điều khiển từ xa Đèn và Bơm
  • Gửi thông báo hệ thống offline hoặc khi đèn hoặc bơm được bật
  • Lưu lại dữ liệu từ cảm biến

Mình sẽ tạo ra 2 tab để hiển thị thông tin trên

  • Cảm biến
    • Nhiệt độ, input là V10 value 0 – 50, frequency: 5s
    • Độ ẩm, input là V11 value 0 – 100, frequency:5s
    • Độ ẩm đất input là V12 value 0 – 100, frequency:5s
    • LED cho bơm Red, V0
    • LED cho đèn Green, V1
    • Đồ thị hiển thị thông tin V10 – V12
  • Điều khiển
    • Nút PUMP, output: V3 0 – 1, mode:push, label: on – ACT, off – OK
    • Nút LAMP, output: V4 0 – 1, mode:push, label: on – ACT, off – OK
    • LED PUMP, V0
    • LED LAMP, V1
    • Thông báo Notification: when HW goes offline: ON
  • Biểu đồ hiển thị
    • Graph hiển thị thông tin cảm biến từ V10-V12

Để chạy được app Blynk thì cần có một số cái mới cần phải thêm vào chương trình

  • Thêm thư viện BlynkSimpleEsp8266 ở đầu chương trình
  • Trong Setup(), cần cấu hình Blynk với token,tên wifi và mật khẩu với hàm Blynk.begin(auth, ssid, pass);
  • Xác định thời gian gửi dữ liệu lên server Blynk : timer.setInterval(5000L, sendUptime);
  • Gọi hàm Blynk.run(); tại vòng lặp loop()
  • Tạo hàm sendUptime(); để gửi dữ liệu từ cảm biến lên Blynk Server: Blynk.virtualWrite(VirtualPin, sensor data);

Bạn cần thay đổi một số thông số tương ứng với thông số của bạn như sau

//Token Blynk và wifi 
char auth[] = "api_token_blynk"; // Điền api token blynk của bạn 
char ssid[] = "ten_wifi"; //Tên wifi
char pass[] = "pass_wifi";//Password

Ngoài ra cần có “LED báo trạng thái” trên Blynk để lưu trạng thái được định nghĩa

WidgetLED PUMP(V0); // Nhan tin hieu tu nut V0 cua Blynk App 
WidgetLED LAMP(V1); // Nhan tin hieu tu nut V1 cua Blynk App

Để bật và tắt bơm và đèn kết nối với PIN ảo V0 và V1 tương ứng với các hàm

  • PUMP.on(); và PUMP.off();
  • LAMP.on(); và LAMP.off();

2 hàm này được thêm vào trong hàm aplyCmd(), ngoài ra mình còn thêm một cái thông báo trên điện thoại mỗi khi bơm hay đèn được bật thông qua hàm  Blynk.notify(“xxx”);

Các bạn có thể xem qua một số hình minh họa bên dưới nếu vẫn còn khó khăn trong việc tạo giao diện

Bước 1: Tạo project

Bước 2: Thêm giao diện hiển thị thông số cảm biến và điều chỉnh thông số nhiệt độ TEMP

Bước 3: Chỉnh thông số độ ẩm HUMID

Bước 4: Điều chỉnh thông số cảm biến độ ẩm đất SOIL

Bước 5: Thêm đèn LED trạng thái và cảnh báo điện thoại

Bước 6: Thêm nút nhấn điều khiển

Bước 7: Thêm đồ thị hiển thị thông tin lưu trữ

Bước 8: Lấy token

Chương trình

Kết quả sau khi điều chỉnh và làm đẹp thêm 1 chút

Toàn bộ chương trình các bạn có thể tải tại  Button Text

Tạm kết

Thế là xong được anh bạn điều khiển qua điện thoại với ESP8266, vẫn còn rất nhiều nhược điểm cần khắc phục như tình trạng delay, trễ quá nhiều khi ấn nút điều khiển, phản hồi hơi chậm với chế độ điều khiển bằng tay. Tuy nhiên nếu sử dụng ở mức cơ bản vẫn đáp ứng được với nhu cầu nghiên cứu và tìm hiểu ứng dụng được ở nhà. Hi vọng sẽ có ích và giúp bạn có bước đầu để phát triển hệ thống tốt hơn lớn hơn.

Tham khảo [1]

44
Leave a Reply

avatar
23 Comment threads
21 Thread replies
2 Followers
 
Most reacted comment
Hottest comment thread
24 Comment authors
quang tânscLê ThắngtienHoangNguyen Recent comment authors

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.

  Subscribe  
newest oldest most voted
Notify of
Bụi
Guest
Bụi

Chào bạn . mình đang thực hiện như bài hướng dẫn .
mình đang gặp vấn đề ở chỗ thiết kế blynk , khi khai báo value cho nhiệt độ là v10 , độ ẩm là v11, và đồ thị theo như bạn hướng dẫn là v10-v11 , nhưng khi lấy đồ thị ra lúc set chân thì nó báo v10 ,v11 busy , vậy làm sao để vẽ dc đồ thị nhiệt độ và độ ẩm? Thank bạn đã hướng dẫn

thanhtrung
Guest
thanhtrung

admin ơi cho hỏi là nếu không lắp con trở 10k vào thì serial monitor không hiển thị được như trên à?? mình toàn ra kí tự vớ vẩn

CU
Guest
CU

CHÀO BẠN, HIỆN TẠI MÌNH GẶP VẤN ĐỀ TẠI NÚT NHẤN VẬT LÍ, MÌNH LÀM SƠ ĐỒ GIỐNG BẠN, NHƯNG NÚT NHẤN KO PHẢN HỒI? BẠN CÓ THỂ GIÚP MÌNH ĐƯỢC KHÔNG? XIN CẢM ƠN Ạ.

ltnhung
Guest
ltnhung

Bạn đã fix được lỗi này chưa vậy, mình cũng bị tương tự? Nút không bị vấn đề gì cả, hoàn toàn bình thường nhé.

Tranhieunknd
Guest
Tranhieunknd

cho mình hỏi chút, mình đã làm như mô tả nhưng khi lấy dữ liệu nhiệt độ của DHT nó luôn rơi vào trường hợp “Failed to read from DHT sensor”, thì nguyên nhân do đâu được nhỉ, trong khi nếu chạy trên arduino uno thì vẫn lấy được dữ liệu

Tranhieunknd
Guest
Tranhieunknd

cho mình hỏi chút, mình đã làm như mô tả nhưng khi lấy dữ liệu nhiệt độ của DHT nó luôn rơi vào trường hợp “Failed to read from DHT sensor”, thì nguyên nhân do đâu được nhỉ, trong khi nếu chạy trên arduino uno thì vẫn lấy được dữ liệu nên trường hợp DHT không hỏng, mình không hiểu tại sao

Phạm Đức Trung
Guest

Hi,
Mình cũng tình trạng y chang bạn Tranhieunknd, ko biết bạn đã tìm ra nguyên nhân chưa nhỉ? Chỉ zùm mình với, mình đang làm Luận văn ạ
Lỗi thì báo Failed…: https://imgur.com/khjiECv
Đã thử mọi cách, tìm các diễn đàn, blog nước ngoài rồi mà vẫn ko đc. Mong admin giúp mình ạ
Có gì liên hê chỉ giúp mình qua
+ Gmail: ductrung107@gmail.com
+ Fb.com/ductrung107
+ SĐT: 01674159896. Mình cảm ơn rất nhiều.

DoanVanThao
Guest
DoanVanThao

Mình muốn làm mạch đo công suất của 2 nguồn điện 1 chiều ( <200vdc) và xoay chiều, và post dữ liệu lên database dạng sql. bác nào đã từng làm hay có cao kiến gì gọi ý giúp mình với.

Hoang Phong
Guest
Hoang Phong

Mình cần làm một dự án tương tự, bạn nào có thể thực hiện thì liên lạc mình nhe
0931 53 55 96
hoangphong0809@gmail.com

linh
Guest
linh

cho e hỏi, code để hiện thị thời gian thực trên blynk là như thế nào vậy ạ. có thể cho e xin với.

Bien
Guest
Bien

Bạn tham khảo code RTC trong example blynk nha.

loi
Guest
loi

A có thể làm một bài về esp8266 dùng cảm biến BH1750, I2C LCD, DHT22, độ ẩm đất cùng 1 code được k ạ? BH1750 thì điều khiển đèn ON OFF, độ ẩm đất khô bơm nước, DHT nóng thì quạt, còn lại LCD hiển thị các thiết bị ON OFF. e xin cảm ơn

quốc
Guest
quốc

em copy đoạn code vào biên dịch ra nó bị lỗi :
” GetFileAttributesEx C:\Users\DELL-PC\AppData\Local\Temp\arduino_cache_154402: The system cannot find the file specified.

Error compiling for board Generic ESP8266 Module. ”
là bị gì vậy ạ?

Fighting Sir Alex
Guest
Fighting Sir Alex

Chào a!
A cho e hỏi Nếu muốn hiển thị LCD 16×2+I2C thì làm sạo ạ

mimi1010
Guest

Chào a!
Em có thắc mắc thế này a giúp e mới ạ. Nếu dùng Blynk thì ở bất kỳ đâu có internet cũng có thể điều khiển được hay là phải cùng 1 mạng ạ?
Nếu e muốn đưa dữ liệu lên web để hiển thị , lưu trữ và điều khiển, nhưng phải là ở bất kỳ đâu cũng có thể điều khiển thì làm thế nào ạ

MinhSeven
Guest
MinhSeven

Chào anh!
Anh cho em hỏi là em muốn thêm nút MANUAL trên Blynk. Nếu MANUAL không được nhấn thì mạch sẽ chạy auto còn nếu MANUAL được ấn thì các thiết bị sẽ chỉ hoạt động khi mình bật tắt qua các nút nhấn đã set trên blynk. Anh có thể giúp em vấn đề này được không ạ? Em cảm ơn anh nhiều!

Nghị
Guest
Nghị

AD cho mình hỏi mình kết nối giống như sơ đồ trên nhưng khi nạp code vào thì 2 Led cứ nhấp nháy với lại DHT nó rơi vào trường hợp “Failed to read from DHT sensor” . Cách khắc phục như thế nào v ad

Nghị
Guest

AD cho e thắc mắc như e đã kết nối giống như sơ đồ trên, khi nạp code vào thì 2 led sẽ nhấp nháy hoài với DHT rơi vào trường hợp “Failed to read from DHT sensor”. Cách khắc phục như thế nào v AD?

Tú
Guest

A ơi cho e hỏi!!
Ví dụ mình bật bơm rồi. nhưng mình quên tắt đi. vậy có hàm gì hẹn giờ mà ví dụ như bật 15 phút là bơm tự ngắt không ạ??

Tú
Guest

Ad ơi cho e hỏi
Mình làm hẹn giờ được không a? Ví dụ mình bật bơm mà quên tắt đi thì trong khoảng 15 phút thì bơm tự tắt đi đấy ạ!

TA
Guest
TA

Ad cho em hỏi,bây giờ muốn nhiều người cùng truy nhập vào một project blynk thì làm tn ạ,vì mỗi project chỉ sinh ra một mã token nạp cho esp,người khác muốn vào lại phải viết lại ứng dụng đó trên điện thoại mình và nạp lại mã token để điều khiển.

Vjper
Guest
Vjper

Mình có làm theo như chỉ dẫn nhưng code mình chỉ giữ lại phần của DHT 11 thôi , cụ thể là mình dùng chân GPIO 1 ( TX ) để đọc giá trị Data của DHT 11 khi test riêng bên ngoài thì hoạt động ổn định . Nhưng khi cắm vào board thì không hiển thị nhiệt độ độ ẩm nữa không biết là sử dụng chân TX thì có lỗi gì không mong bạn hướng dẫn . và còn 1 vấn dể nữa là số hiển thị trên App Blynk của mình hiển thị sau dấu phẩy… Read more »

HoangNguyen
Guest
HoangNguyen

Chào anh ạ!
Em cũng đang làm một project về nông nghiệ thông minh, nhưng em dùng mqtt để điều khiển bật/tắt đèn và bơm từ xa. Em muốn hỏi là có cách nào để khi mà đang chạy chế độ tự động nhưng khi bật/tắt từ xa thì đáp ứng theo lệnh từ xa ạ? Ví dụ: đang chạy bơm tự động thì tắt bơm, và ngược lại, bơm đang tắt thì bật được bơm.Em xin cảm ơn!

tien
Guest

nếu không dùng nút nhấn thì làm sao ạ

Lê Thắng
Guest
Lê Thắng

Chào Anh.
Hiện em đang làm đồ án, mà em đang bị loay hoay ở chỗ:
Em dùng phần cứng là Arduino Mega 2560 để kết nối với các chân của cảm biến nhiệt độ, độ ẩm, cảm biến đất, cảm biến ánh sáng, cảm biến mưa. Và các chân của 4 relay.
Còn ESP8266 em sử dụng chỉ dùng để kết nối wifi với phần mềm Blynk.
Anh có thể hướng dẫn cách em viết code không ạ?
Em cảm ơn anh nhiều lắm.

quang tân
Guest
quang tân

chào bạn mình muốn gửi thông báo từ phần cứng lên blynk , dòng thông báo mình muốn viết bằng tiếng việt có dấu thì làm cách nào ?? VD cái bạn làm gửi lên là “BOM ON” , bay giờ mình muốn gửi lên là ” BẬT MÁY BƠM” thì phải làm cách nào ạ