Nội Dung Bài Viết
Tổng quan
Viết chương trình Arduino đọc nhiệt độ, độ ẩm từ Arduino hiển thị lên App Blink sử dụng giao thức truyền thông Modbus RTU giao tiếp với Kit NodeMCU.
Từ Blink set nhiệt độ và độ ẩm bật tắt 2 led.
- Nhiệt độ môi trường nhỏ hơn nhiệt độ set thì bật đèn led 1.
- Độ ẩm môi trường nhỏ hơn độ ẩm set thì bật đèn led 2.
Trong bài viết này, Arduino giao tiếp với Esp8266 thông qua Modbus RTU. Cụ thể, Arduino đóng vai trò Modbus Master và NodeMCU có vai trò là Modbus Slave. Arduino đọc dữ liệu từ cảm biến gửi qua cho Esp8266. Esp8266 gửi dự liệu hiển thị lên App Blink thông qua wifi. Ngược lại, Esp8266 nhận giá trị set từ App Blink và gửi dữ liệu xuống Arduino làm giá trị tham chiếu bật tắt led.
Thiết kế giao diện và cấu hình App Blink
Nếu điện thoại bạn chưa cài App Blink, các bạn vô Google Play trên Android hoặc App Store trên IOS search App Blink và cài đặt. Sau khi cài đặt, tiến hành đăng ký tài khoản Blink (có thể đăng ký nhanh bằng facebook hoặc tài khoản google).
Sau khi đăng ký xong, các bạn tạo một Project mới và cấu hình thiết bị như hình. DEVICES chọn NodeMCU (Wifi). Và chú ý mã AUTH TOKEN (App Blynk sau khi đăng ký có gửi mã AUTH TOKEN vào mail cho bạn rồi).
Các trong giao diện thiết kế, các bạn chọn Widget Box và giống như hình
Widget Box Value Display NHIỆT ĐỘ, các bạn cấu hình theo hình sau
Widget Box Value Display ĐỘ ẨM, các bạn cấu hình theo hình sau
Widget Box Slider NHIỆTĐỘ SÉT, các bạn cấu hình theo hình sau
Widget Box Slider ĐỘ ẨM SÉT, các bạn cấu hình theo hình sau
Thế là xong phần thiết kế giao diện trên App Blynk, đơn giản vậy thôi.
Sơ độ mạch kết nối Arduino với Kit NodeMCU
Chương trình Arduino cho Arduino Modbus Master
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include <DHT.h> #include <ModbusMaster232.h> ///#include <SoftwareSerial.h> // Modbus RTU pins D7(13),D8(15) RX,TX // Instantiate ModbusMaster object as slave ID 1 ModbusMaster232 node(1); #define Led_h 9 #define Led_t 10 #define DHTPIN 12 // what pin we're connected to #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); int t,h; int tSet,hSet; void setup() { dht.begin(); pinMode(Led_h, OUTPUT); pinMode(Led_t, OUTPUT); Serial.begin(9600); delay(100); node.begin(9600); // Modbus RTU delay(100); Serial.println("Connected "); Serial.println("Modbus RTU Master Online"); } void process(){ if(tSet > t){ digitalWrite(Led_t,HIGH); } else digitalWrite(Led_t,LOW); if(hSet > h){ digitalWrite(Led_h,HIGH); } else digitalWrite(Led_h,LOW); } void loop() { h = dht.readHumidity(); t = dht.readTemperature(); process(); ///////// node.writeSingleRegister(5,t); Serial.print("Nhiet do: "); Serial.print(t); //delay(20); Serial.print(" "); /////// node.writeSingleRegister(6,h); Serial.print("Do am: "); Serial.print(h); //delay(20); ////// Serial.print(" "); node.readHoldingRegisters(7, 1); tSet = node.getResponseBuffer(0); Serial.print("Nhiet do set: "); Serial.println(tSet); //delay(20); node.clearResponseBuffer(); //// Serial.print(" "); node.readHoldingRegisters(8, 1); hSet = node.getResponseBuffer(0); Serial.print("Do am set: "); Serial.println(hSet); //delay(20); node.clearResponseBuffer(); } |
Chương trình Arduino cho Kit NodeMCU Slave
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #include <Ethernet.h> #define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include <SimpleTimer.h> #include <modbus.h> #include <modbusDevice.h> #include <modbusRegBank.h> #include <modbusSlave.h> #include <SoftwareSerial.h> // Modbus RTU pins D7(13),D8(15) RX,TX //SoftwareSerial swSer(13, 15, false, 256); modbusDevice regBank; modbusSlave slave; char auth[] = "99b55e95203b478495fad41da30da2fc"; //Token cua blynk char ssid[] = "Quang Ngai 76"; //Ten wifi char pass[] = "LamTruong12345"; //Pass wifi SimpleTimer timer; // Su dung timer int tSet=0,hSet=0; int h, t; BLYNK_WRITE(V2) { tSet = param.asInt(); // assigning incoming value from pin V1 to a variable // You can also use: // String i = param.asStr(); // double d = param.asDouble(); Serial.print("V2 Slider value is: "); Serial.println(tSet); } BLYNK_WRITE(V3) { hSet = param.asInt(); // assigning incoming value from pin V1 to a variable // You can also use: // String i = param.asStr(); // double d = param.asDouble(); Serial.print("V3 Slider value is: "); Serial.println(hSet); } void setup() { Blynk.begin(auth, ssid, pass); // Ket noi voi blynk timer.setInterval(1000L, Processing); //1s doc cam bien 1 lan //Assign the modbus device ID. regBank.setId(1); // Holding registers regBank.add(40006); regBank.add(40007); regBank.add(40008); regBank.add(40009); slave._device = ®Bank; Serial.begin(9600); delay(100); // Initialize the serial port for coms at 9600 baud slave.setBaud(9600); delay(100); Serial.println("Connected "); Serial.println("Modbus RTU Slave Online"); } void Processing(){ Blynk.virtualWrite(V0, t); Blynk.virtualWrite(V1, h); } void loop() { t= regBank.get(40006); Serial.print("Nhiet do: "); Serial.print(t); Serial.print(" "); //////// h= regBank.get(40007); Serial.print("Do am: "); Serial.print(h); Serial.print(" "); //////// Serial.print("Nhiet do set: "); Serial.println(tSet); regBank.set(40008,tSet); delay(20); //////// Serial.print(" "); Serial.print("Do am set: "); Serial.println(hSet); regBank.set(40009,hSet); delay(20); slave.run(); Blynk.run(); // Chay Blynk timer.run(); // Chay SimpleTimer } |
Trong phần chương trình Arduino cho Kit NodeMCU, các bạn chú ý thay đổi auth[], ssid[], pass[] phù hợp ( phần chữ gạch dưới màu đỏ trong chương trình cần thay đổi).
Do hiện tại, tôi không sẵn có Kit NodeMCU nên không thể quay video demo cho các bạn xem được. Chương trình này tôi đã chạy thử và ok. (trước đây).
Download Source code và thư viện
Arduino Master Esp8266 Slave
Thư viện
Bài viết các bạn có thể tham khảo:







cho em hỏi là khung truyền tín hiệu giữa mcu và blynk nó như thế nào ạ! em cảm ơn
CHO EM HỎI … EM MUỐN LÁY MỨC CAO CỦA NÚT NHẤN GỬI VỀ LẠI ARDUINO THÌ LÀM SAO Ạ??
EM GỬI GIÁ TRỊ VỀ ĐC NHƯ TRONG BÀI VIẾT. NHƯNG EM KO GỬI MỨC CAO CỦA NÚT NHẤN ĐC.
MONG ADD TƯ VẤN
Muốn làm việc được với modbus rtu thì bạn phải hiểu sơ nó là cái gì? Bạn có thể tham khảo bài viết: https://svtdhnlu.com/tai-lieu/tim-hieu-ve-giao-thuc-modbus-rtu-tieng-anh.html. Bạn xem bài viết gửi tín hiệu nút nhận giữa Arduino và Esp8266 tham khảo bài viết: https://svtdhnlu.com/chia-se/arduino/arduino-master-esp8266-slave-modbus-rtu.html. Chúc bạn thành công!
Cho mình hỏi sau khi arduino master đọc giá trị từ slave, thì mình có thể đọc giá trị đó từ arduino master lên máy tính thông qua matlab được k vậy ad??
Theo mình nghĩ là được nhé. Như con Mega có 3 serial. Bạn dùng một cổng giao tiếp arduino-arduino, một cổng arduino-matlab. Nếu uno thì có thể dùng cổng serial ảo.
Bạn làm chương trình này mình thấy hơi phí
1. Thứ nhất mục đích mình chỉ cần hiển thị giá trị lên Blynk thì mình chỉ cần 1 chú ESP8266-01 là ok
2. Chương trinh kết hợp với 1 arduino nano hoặc promini là xong
3. Code chương trình hơi rắc rối
Mk đã thử gửi giá trị nhiệt độ độ ẩm lên Blynk và đọc trên serial của nó rồi
Mọi thứ ok.Quan trọng là mình có được thứ mình cần với chi phí hợp lý mà cách làm đơn giản nhất là được
Email : manhephu@gmail.com
Bạn nói đúng. Ở đây mình chỉ muốn giới thiệu giao thức giao tiếp Modbus RTU thông qua bài chương trình ví dụ trên. Cảm ơn bạn đã góp ý.