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.
Dependencies: BLE_API mbed nRF51822
Fork of SenseAirLP8 by
Diff: LP8.h
- Revision:
- 1:b512a405b584
- Parent:
- 0:ee3787c8e209
- Child:
- 2:d02255d8c36f
--- a/LP8.h Fri Apr 21 13:26:06 2017 +0000
+++ b/LP8.h Mon Jun 05 11:10:28 2017 +0000
@@ -1,159 +1,139 @@
#ifndef LP8_H
#define LP8_H
+/* To initialize the lp8 object, you need to pass a serial (tx, rx), an DigitalOut signal for the en_vbb,
+an DigitalIn for the ready signal and a timer object. */
+
class LP8
{
public:
-
- //constructor
- LP8(Serial &device, DigitalOut &vbb, DigitalOut &vbb_en, DigitalIn &rdy, Timer &_timer): /* initiate class object */
- Device(device),
- VBB(vbb),
- VBB_EN(vbb_en),
- RDY(rdy),
- lp8Wait(_timer)
- {
- Device.baud(9600); //set baud rate to 9600
+//constructor
+ LP8(Serial &device, DigitalOut &vbb_en, DigitalIn &rdy, Timer &_timer):
+ Device(device),
+ VBB_EN(vbb_en),
+ RDY(rdy),
+ lp8Wait(_timer)
+ {
+ Device.baud(9600); //set baud rate to 9600
- //initialize arrays with modbus commands.
- //initial startup command
- firstWrite[0] = 0xfe;
- firstWrite[1] = 0x41;
- firstWrite[2] = 0x00;
- firstWrite[3] = 0x80;
- firstWrite[4] = 0x01;
- firstWrite[5] = 0x10;
- firstWrite[6] = 0x28;
- firstWrite[7] = 0x7e;
+ //initialize arrays with lp8 modbus commands.
+ //initial startup command:
+ firstWrite[0] = 0xfe; //device adress
+ firstWrite[1] = 0x41; //write to ram
+ firstWrite[2] = 0x00; //
+ firstWrite[3] = 0x80; //starting adress
+ firstWrite[4] = 0x01; //nr of bytes to send
+ firstWrite[5] = 0x10; //calculation control byte
+ firstWrite[6] = 0x28; //crc low
+ firstWrite[7] = 0x7e; //crc high
- //write sensor state to lp8 command
- stateWrite[0] = 0xfe; //device adress
- stateWrite[1] = 0x41; //read/write
- stateWrite[2] = 0x00; //
- stateWrite[3] = 0x80; //starting adress
- stateWrite[4] = 0x18; //nr of bytes to send
- stateWrite[5] = 0x20; //Calculation Control
- for(int k = 6; k < 31; k++) { stateWrite[k] = 0x00; }
+ //write previous sensor state to lp8, command:
+ stateWrite[0] = 0xfe; //device adress
+ stateWrite[1] = 0x41; //write to ram
+ stateWrite[2] = 0x00; //
+ stateWrite[3] = 0x80; //starting adress
+ stateWrite[4] = 0x18; //nr of bytes to send
+ stateWrite[5] = 0x20; //Calculation Control
+ for(int k = 6; k < 31; k++) { stateWrite[k] = 0x00; } //
- //read lp8 state command
- stateRead[0] = 0xfe;
- stateRead[1] = 0x44;
- stateRead[2] = 0x00;
- stateRead[3] = 0x80;
- stateRead[4] = 0x2c;
- stateRead[5] = 0x00;
- stateRead[5] = 0x00;
- //response buffer
- for(int k = 0; k < 60; k++) { response[k] = 0x00; }
+ //read request from the lp8:
+ stateRead[0] = 0xfe; //adress
+ stateRead[1] = 0x44; //read from ram
+ stateRead[2] = 0x00; //
+ stateRead[3] = 0x80; //starting adress
+ stateRead[4] = 0x2c; //number of bytes to read
+ stateRead[5] = 0x00; //crc_l
+ stateRead[5] = 0x00; //crc_h
+
+ //response buffer
+ for(int k = 0; k < 60; k++) { response[k] = 0x00; }
-
-// gC = 0x00;
- co2 = 400;
- counter = 0;
- CRC = 0x0000;
- _timeMe = 0.3;
- };
+ //variable initialization
+ co2 = 400; //co2 value
+ counter = 0; //
+ CRC = 0x0000; //crc value
+ _timeMe = 0.350; //wait timer(ms)
+ };
- //send startup msg .
+//LP8 Initialization .
bool lp8Init(){
- VBB.write( 1 );
VBB_EN.write( 1 ); //power on
- timeIt( _timeMe );
-
- transmitPacket(firstWrite, 8); //Send out msg (and nr of elements) over serial line
+ //wait for rdy signal
+ timeIt( _timeMe ); //wait for lp8 rdy signal
+ transmitPacket(firstWrite, 8); //Send out msg (and nr of bytes) over serial line
Response( 4 ); //read 4 bytes response
-
- if( RDY.read() == 0 ) {
- lp8Wait.start();
- while( lp8Wait.read() < 0.5 ) { /* spin */ }
- lp8Wait.stop();
- lp8Wait.reset();
- }
-
-//compute crc
+ //compute crc
CRC = modbusCrc(stateRead, 5);
-//add crc value to the transmit package
- stateRead[5] = (uint8_t)CRC; //crc_H
- stateRead[6] = (uint8_t)(CRC >> 8); //crc_L
- timeIt( _timeMe ); //wait for message to be sent and processed
+ //add crc value to the transmit package
+ stateRead[5] = (uint8_t)CRC; //crc_l
+ stateRead[6] = (uint8_t)(CRC >> 8); //crc_h
+ //wait for rdy
+ timeIt( _timeMe ); //
transmitPacket(stateRead, 7); //transmit packet
Response( 49 ); //read sensor state and co2 value(s)
-
- VBB_EN.write( 0 ); //power off
- VBB.write( 0 );
-
-//was the talk a success?
+ VBB_EN.write( 0 ); //power off lp8
+ //was the talk a success? (simple check...)
if ( getValue() < 1 ) {
return 1; }
else {
return 0; }
-
};
-
- //send subsequent messages to the lp8
- void lp8Talk(){
-
+//send subsequent messages to the lp8
+ void lp8Talk(uint8_t ccByte){
//transfer previous sensor state to the new msg out
for (int u = 4; u < 23+4; u++) {
stateWrite[u+2] = response[u];
}
+ //Set Calibration Control Byte (see end of page for explantion)
+ stateWrite[5] = ccByte;
//compute new crc value
CRC = modbusCrc(stateWrite, 29);
//add new crc value to send list
stateWrite[29] = (uint8_t)CRC;
stateWrite[30] = (uint8_t)(CRC >> 8);
-
-
//initialize new transfer sequence
- VBB.write( 1 );
VBB_EN.write( 1 ); //power on sensor
timeIt( _timeMe );
-
transmitPacket(stateWrite, 31); //Send out msg with previous state (and nr of elements) over serial line
Response( 4 ); //read 4 bytes response
-
//compute crc
CRC = modbusCrc(stateRead, 5);
//add crc value to the read request transmit package
stateRead[5] = (uint8_t)CRC; //crc_l
stateRead[6] = (uint8_t)(CRC >> 8); //crc_h
+ timeIt( _timeMe );
//send read request
transmitPacket(stateRead, 7); //transmit packet
//read sensor response
Response( 49 ); //read sensor state and co2 value(s)
-
- VBB_EN.write( 0 ); //power off
- VBB.write( 0 );
+ VBB_EN.write( 0 ); //power off
};
-
-
-
- //get co2 value from lp8 response
+
+//get co2 value from lp8 response
unsigned long getValue()
{
- int high = response[29];
- int low = response[30];
+ int high = response[29];
+ int low = response[30];
unsigned long val = high * 256 + low;
return val;
}
-
-
- /************************************************* Helper Functions ********************************************/
- /************************************************* ********************************************/
+
+/************************************************* Helper Functions ********************************************/
+/************************************************* ********************************************/
+//purge response buffer
void responsePurge(int bytesToPurge){
for (int j = 0; j < bytesToPurge; j++) {
response[j] = 0x00;
}
};
-
-
- //read from the lp8
+
+//read from the lp8
void Response(int bytesToRead ){
- lp8Wait.start(); //poll rx line for x seconds
+ lp8Wait.start(); //poll rx line for 0.5 seconds
do {
if(Device.readable()) {
response[counter] = Device.getc();
@@ -166,6 +146,7 @@
lp8Wait.reset();
};
+//transmit data over serial lines
void transmitPacket(uint8_t msg[], int le ){
//Send out msg over serial line:
while(!Device.writeable() ) { /* wait for serial available*/ }
@@ -175,7 +156,7 @@
};
- //timer
+//timer
void timeIt(float &timeMe){
//start amd stop timer...
lp8Wait.start();
@@ -184,7 +165,7 @@
lp8Wait.reset();
};
- // Computation for the modbus 16-bit crc
+// Computation for the modbus 16-bit crc
uint16_t modbusCrc(uint8_t buffer[], int len){
uint16_t crc = 0xFFFF;
@@ -203,19 +184,16 @@
// Note, this number has low and high bytes swapped
return crc;
};
-
-
-
-
+
+//variables and buffers
private:
Serial &Device;
- DigitalOut &VBB;
DigitalOut &VBB_EN;
DigitalIn &RDY;
Timer &lp8Wait;
- //msg containers (needs to be initialized at constructor level)
+ //msg containers
uint8_t firstWrite[8];
uint8_t stateWrite[31];
uint8_t stateRead[7];
@@ -225,14 +203,13 @@
int counter; //simple counter
uint16_t CRC; //modbus crc value
float _timeMe; //timer value
-// uint8_t gC; //getCharacter...
};
#endif
/*
-LP8 Communication Protocol (With no external Pressure Sensor):
+LP8 Modbus Communication Protocol (With no external Pressure Sensor):
--------------------------------------------------------------------------------
Initial Measurement (first read after powerup): COMMANDS:
--------------------------------------------------------------------------------
@@ -272,6 +249,26 @@
--------------------------------------------------------------------------------
+LP8 Background Calibration, Calculation Control Byte
+--------------------------------------------------------------------------------
+To calibrate the lp8, commands needs to be sent with the calculation control byte
+Calculation:
+CC =
+0x10 Initial measurement (filters reset, ABC sample reset and other,
+0x20 Subsequent measurement,
+0x40 Zero calibration using unfiltered data,
+0x41 Zero calibration using filtered data,
+0x42 Zero calibration using unfiltered data + reset filters,
+0x43 Zero calibration using filtered data + reset filters,
+0x50 Background calibration using unfiltered data,
+0x51 Background calibration using filtered data,
+0x52 Background calibration using unfiltered data + reset filters,
+0x53 Background calibration using filtered data + reset filters,
+0x70 ABC (based on filtered data),
+0x72 ABC (based on filtered data) + reset filters
+
+
+--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
CC = Calculation Control, 1 byte
SS = Sensor State, Sensor State, 23 bytes
