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.

27 thoughts on “Hệ thống nông nghiệp thông minh phiên bản ESP8266

  1. 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

    1. Chân v10 với chân v11 bạn có sử dụng làm IO hay gì không ? Nếu busy bạn có thể đổi sang chân v khác để dùng hoàn toàn được nhé.

  2. 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 Ạ.

    1. 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é.

      1. Bạn kết nối nút nhấn theo kiểu nào ? Pull up hay pulldown ? trường hợp trên mình dùng pullup nhé, nếu xài pulldown thì bạn đảo trạng thái trong code là được

  3. 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

  4. 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

    1. Hi bạn, trường hợp của bạn là DHT11 hay DHT22, tùy vào cảm biến mà bạn xóa dấu # trước define của DHT11 hay DHT22 xem có hết lỗi không nhé

    2. 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: [email protected]
      + Fb.com/ductrung107
      + SĐT: 01674159896. Mình cảm ơn rất nhiều.

  5. 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.

  6. 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

  7. 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 ạ?

  8. 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 ạ

    1. Hi em, với blynk thì sẽ điều khiển được bất kỳ đâu nhé
      Nếu muốn đưa lên web hiển thị lưu trữ thì em phải có kiến thức về làm web với js hoặc html, sau đó thì đặt web này lên 1 cái server riêng thì sẽ điều khiển được ở mọi nơi nhé, có cách khác là nat port pc em ra nhưng a ko khuyến khích dùng cách này
      Thân.

  9. 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!

  10. 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

  11. 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?

Add Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.