Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Main.cpp
- Committer:
- Roietronics
- Date:
- 2017-08-01
- Revision:
- 2:65f09ca5b557
- Parent:
- 1:8cad8f7852d4
- Child:
- 3:1ba96949e2fd
File content as of revision 2:65f09ca5b557:
/* Run Honeywell Dust Sensor in continous Sampling Mode on a mDot
Version 1.0
Steve Mylroie Roitronic August 1st 2017
@C Copyright Global Quality Corp
*/
#include "mbed.h"
#include "mDot.h"
#include "MTSLog.h"
#include "stdlib.h"
#include <Stream.h>
#define TRACE_MODE
//Turn on trace logging to the PC USB port
#ifdef TRACE_MODE
//Log level need to be set one level higher than the high level to be output
#define LOG_LEVEL mts::MTSLog::TRACE_LEVEL + 1
#define DEBUG
#endif
const uint8_t* measureCommand = "68014057";
const uint8_t* stopCommand = "68012077";
#define OK 0xA5A5
#define BAD 0x9696
#define MESSAGE_LEN 32
//sensor measurement cycle in millseconds
#define MEASURE_DELAY 1500
//Use USB debug pott for the debug stream
#ifdef DEBUG
Serial pc(USBTX, USBRX, 115200);
#endif
//Use second UART to communicate witb the Honneywell sensor
//Default UART setting are 8,N,1
Serial sensor(PA_2, PA_3 , 9600);
Timer t;
//synchrnous serial read and writes
//Mbed 5 Serial class only supports single character read and writes or
// async buffer reads abd wrutes
void readBuffer(uint8_t* buffer, uint16_t count)
{
uint8_t* pointer = buffer;
uint16_t counter = count;
while(1)
{
if(sensor.readable())
{
*pointer++ = sensor.getc();
counter--;
}
if(count == 0) {
return;
}
}
}
void writeBuffer(const uint8_t* buffer, uint16_t count)
{
uint8_t* pointer = (uint8_t*)buffer;
uint16_t counter = count;
while(1)
{
if(sensor.writeable())
{
sensor.putc(*pointer++);
counter--;
}
if(count == 0) {
return;
}
}
}
//Va;idate the received mesurements checksum
bool checkValue(uint8_t *thebuf, uint8_t leng)
{
bool receiveflag = false;
uint16_t receiveSum=0;
for(int i=0; i<(leng-2); i++){
receiveSum=receiveSum+thebuf[i];
}
receiveSum=receiveSum + 0x42;
if(receiveSum == ((thebuf[leng-2]<<8)+thebuf[leng-1])) //check the debug data
{
receiveSum = 0;
receiveflag = true;
}
return receiveflag;
}
//Extract the 1 micron particle count from the messaage
uint16_t transmitPM01(uint8_t *thebuf)
{
uint16_t PM01Val;
PM01Val=((thebuf[3]<<8) + thebuf[4]); //count PM1.0 value of the air detector module
return PM01Val;
}
//Extract the 2.5 micron particle count from the messaage
uint16_t transmitPM2_5(uint8_t *thebuf)
{
uint16_t PM2_5Val;
PM2_5Val=((thebuf[5]<<8) + thebuf[6]);//count PM2.5 value of the air detector module
return PM2_5Val;
}
//Extract the 10 micron particle count from the messaage
uint16_t transmitPM10(uint8_t *thebuf)
{
uint16_t PM10Val;
PM10Val=((thebuf[7]<<8) + thebuf[8]); //count PM10 value of the air detector module
return PM10Val;
}
int main()
{
uint8_t dataBuffer[32];
uint16_t response;
uint16_t PM01Value=0; //define PM1.0 value of the air detector module
uint16_t PM2_5Value=0; //define PM2.5 value of the air detector module
uint16_t PM10Value=0; //define PM10 value of the air detector module
//Send start command to the sensor
writeBuffer(measureCommand, 4);
//Wait for sensors response
//while(!sensor.readable());
readBuffer(dataBuffer, 2);
response = dataBuffer[0] << 8 || dataBuffer[1];
switch(response) {
case OK:
logInfo("Sensor Auto Measurement Started");
break;
case BAD:
logInfo("Sensor rejected Start Measurement Commmand");
return -1;
default:
logInfo("Communication Error: Invalid Sensor Response");
return -2;
}
t.start();
//Start continous loop
while(1)
{
if(sensor.getc() == 0x42){ //start to read when detect 0x42
readBuffer(dataBuffer,MESSAGE_LEN -1);
if(dataBuffer[0] == 0x4d){
if(checkValue(dataBuffer,MESSAGE_LEN)){
PM01Value=transmitPM01(dataBuffer); //count PM1.0 value of the air detector module
PM2_5Value=transmitPM2_5(dataBuffer);//count PM2.5 value of the air detector module
PM10Value=transmitPM10(dataBuffer); //count PM10 value of the air detector module
}
}
}
char input = pc.getc();
if(input == 'Q' || input == 'q')
{
t.stop();
writeBuffer(stopCommand, 4);
logInfo("Exit request received");
return 0;
}
static unsigned long OledTimer= t.read_ms();
if (t.read_ms() - OledTimer >=1000)
{
OledTimer= t.read_ms();
pc.printf("PM1.0: %d ug/m3", PM01Value);
// debug.print(PM01Value);
// debug.println(" ug/m3");
pc.printf("PM2.5: %d ug/m3", PM2_5Value);
// debug.print(PM2_5Value);
// debug.println(" ug/m3");
pc.printf("PM10: %d ug/m3", PM10Value);
// debug.print(PM10Value);
// debug.println(" ug/m3");
pc.printf("\n");
}
}
}