modbus485_dust_co2_node/src/main.cpp

63 lines
1.4 KiB
C++

#include <SoftwareSerial.h>
#include <SimpleModbusSlave.h>
#include <TaskScheduler.h>
#include <PMS.h>
SoftwareSerial serial1(2, 3); // RX, TX
SoftwareSerial serial2(4, 5); // RX, TX
PMS pms(serial1);
PMS::DATA data;
Scheduler runner;
void sensor_co2();
Task t1(5000, TASK_FOREVER, &sensor_co2);
//////////////// MODBUS Registers ///////////////////
enum
{
R00_Dust_10,
R01_Dust_25,
R02_Dust_100,
R03_CO2_PPM,
TOTAL_ERRORS,
TOTAL_REGS_SIZE
};
unsigned int holdingRegs[TOTAL_REGS_SIZE]; // function 3 and 16 register array
//////////////////////////////////////////////////////
int PM10 = 0;
int PM25 = 0;
int PM100 = 0;
int CO2 = 0;
byte return1[9];
byte return2[9];
byte com[]={0xff,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
void setup() {
serial1.begin(9600);
serial2.begin(9600);
modbus_configure(9600, 6, 6, TOTAL_REGS_SIZE, 0); //Modbus via MAX485
runner.init();
runner.addTask(t1);
t1.enable();
}
void loop() {
runner.execute();
holdingRegs[R00_Dust_10] = PM10;
holdingRegs[R01_Dust_25] = PM25;
holdingRegs[R02_Dust_100] = PM100;
holdingRegs[R03_CO2_PPM] = CO2;
holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);
if (pms.read(data)) {
PM10 = (int)data.PM_AE_UG_1_0;
PM25 = (int)data.PM_AE_UG_2_5;
PM100 = (int)data.PM_AE_UG_10_0;
}
}
void sensor_co2() {
serial2.write(com,9);
serial2.readBytes(return1,9);
CO2 = return1[2]*256+return1[3];
}