Đọc DHT11 gửi lên App Blynk thông qua Esp8266 giao tiếp Modbus với Arduino

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

Giao tiếp Arduino với Esp8266 gửi dữ liệu lên App Blynk

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

Sơ đồ mạch kết nối Arduino với Kit NodeMCU

Chương trình Arduino cho Arduino Modbus Master

#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

#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 = &regBank;

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:

Viết một bình luận

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