#include #include #include #include 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.listen(); serial2.write(com,9); serial2.readBytes(return1,9); CO2 = return1[2]*256+return1[3]; serial1.listen(); }