63 lines
1.4 KiB
C++
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];
|
|
} |