Published
- 2 min read
CPE241 Week 13
Modbus
Modbus Communication Overview:
ModbusMaster Library: Used for implementing Modbus RTU communication in Arduino. SoftwareSerial: Configures UART communication (pins 14 and 12) for Modbus RTU via a MAX485 transceiver. MAX485 Transceiver: Used for converting TTL (UART) signals to RS485 for Modbus communication. RE (Receiver Enable) and DE (Driver Enable) pins control data flow direction (receive/send).
RS485 + XY-MD02
#include <SoftwareSerial.h>
#include <ModbusMaster.h>
SoftwareSerial md02Serial(14, 12); // RX, TX
#define MAX485_DE 4
#define MAX485_RE_NEG 5
ModbusMaster node;
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
void setup()
{
Serial.begin(115200);
md02Serial.begin(9600);
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
node.begin(1, md02Serial);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop()
{
uint8_t result;
double t;
double h;
Serial.println("XY-MD02 data");
result = node.readInputRegisters(1, 2);
if (result == node.ku8MBSuccess)
{
t = node.getResponseBuffer(0) / 10.0f;
h = node.getResponseBuffer(1) / 10.0f;
Serial.print("Temp: ");
Serial.println(t);
Serial.print("Humid: ");
Serial.println(h);
Serial.println();
}
delay(1000);
}
ADD data To firebase
#include "FirebaseESP8266.h"
#include <ESP8266WiFi.h>
#include <SoftwareSerial.h>
#include <ModbusMaster.h>
#define FIREBASE_HOST "YOUR_FIREBASE_HOST"
#define FIREBASE_AUTH "YOUR_FIREBASE_AUTH"
#define WIFI_SSID "YOUR_WIFI_SSID"
#define WIFI_PASSWORD "YOUR_WIFI_PASSWORD"
SoftwareSerial md02Serial(14, 12); // RX, TX
#define MAX485_DE 5
#define MAX485_RE_NEG 4
ModbusMaster node;
FirebaseData firebaseData;
FirebaseJson json;
String path = "MD02";
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
void setup()
{
Serial.begin(115200);
md02Serial.begin(9600);
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
node.begin(1, md02Serial);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.reconnectWiFi(true);
Firebase.setReadTimeout(firebaseData, 1000 * 60);
Firebase.setwriteSizeLimit(firebaseData, "tiny");
}
void loop()
{
uint8_t result;
double t;
double h;
Serial.println("XY-MD02 data");
result = node.readInputRegisters(1, 2);
if (result == node.ku8MBSuccess)
{
t = node.getResponseBuffer(0) / 10.0f;
h = node.getResponseBuffer(1) / 10.0f;
Serial.print("Temp: ");
Serial.println(t);
Serial.print("Humid: ");
Serial.println(h);
Serial.println();
}
json.add("temp", t);
json.add("humid", h);
Firebase.set(firebaseData, path, json);
delay(1000);
}