Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,14 @@ i.e. mySDS.begin();
* Read values:
int read(float *p25, float *p10);
i.e. error = mySDS(pm25,pm10);

* Change sensor mode:
void mode_dsleep(); Sets working period for to max - 30minutes, to save battery
void mode_mon_300();
void mode_mon_60();
void mode_cont();
void mode_query();
void mode_active();

Reads the PM2.5 and PM10 values, return code is 0, if new values were read, and 1 if there were no new values.

Expand Down
216 changes: 209 additions & 7 deletions SDS011.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,140 @@ static const byte SLEEPCMD[19] = {
0xAB // tail
};

static const byte MODEDEEPCMD[19] = {
0xAA, // head
0xB4, // command id
0x08, // data byte 1
0x01, // data byte 2 (set mode)
0x1E, // data byte 3 (work time n*60 - 30 seconds)
0x00, // data byte 4
0x00, // data byte 5
0x00, // data byte 6
0x00, // data byte 7
0x00, // data byte 8
0x00, // data byte 9
0x00, // data byte 10
0x00, // data byte 11
0x00, // data byte 12
0x00, // data byte 13
0xFF, // data byte 14 (device id byte 1)
0xFF, // data byte 15 (device id byte 2)
0x25, // checksum
0xAB // tail
};


static const byte MODE300CMD[19] = {
0xAA, // head
0xB4, // command id
0x08, // data byte 1
0x01, // data byte 2 (set mode)
0x05, // data byte 3 (work time n*60 - 30 seconds)
0x00, // data byte 4
0x00, // data byte 5
0x00, // data byte 6
0x00, // data byte 7
0x00, // data byte 8
0x00, // data byte 9
0x00, // data byte 10
0x00, // data byte 11
0x00, // data byte 12
0x00, // data byte 13
0xFF, // data byte 14 (device id byte 1)
0xFF, // data byte 15 (device id byte 2)
0x0C, // checksum
0xAB // tail
};

static const byte MODE60CMD[19] = {
0xAA, // head
0xB4, // command id
0x08, // data byte 1
0x01, // data byte 2 (set mode)
0x01, // data byte 3 (work time n*60 - 30 seconds)
0x00, // data byte 4
0x00, // data byte 5
0x00, // data byte 6
0x00, // data byte 7
0x00, // data byte 8
0x00, // data byte 9
0x00, // data byte 10
0x00, // data byte 11
0x00, // data byte 12
0x00, // data byte 13
0xFF, // data byte 14 (device id byte 1)
0xFF, // data byte 15 (device id byte 2)
0x08, // checksum
0xAB // tail
};

static const byte MODECONTCMD[19] = {
0xAA, // head
0xB4, // command id
0x08, // data byte 1
0x01, // data byte 2 (set mode)
0x00, // data byte 3 (work time n*60 - 30 seconds)
0x00, // data byte 4
0x00, // data byte 5
0x00, // data byte 6
0x00, // data byte 7
0x00, // data byte 8
0x00, // data byte 9
0x00, // data byte 10
0x00, // data byte 11
0x00, // data byte 12
0x00, // data byte 13
0xFF, // data byte 14 (device id byte 1)
0xFF, // data byte 15 (device id byte 2)
0x07, // checksum
0xAB // tail
};

static const byte MODEQUERYCMD[19] = {
0xAA, // head
0xB4, // command id
0x02, // data byte 1
0x01, // data byte 2 (set mode)
0x01, // data byte 3 (query modes)
0x00, // data byte 4
0x00, // data byte 5
0x00, // data byte 6
0x00, // data byte 7
0x00, // data byte 8
0x00, // data byte 9
0x00, // data byte 10
0x00, // data byte 11
0x00, // data byte 12
0x00, // data byte 13
0xFF, // data byte 14 (device id byte 1)
0xFF, // data byte 15 (device id byte 2)
0x02, // checksum
0xAB // tail
};

static const byte MODEACTIVECMD[19] = {
0xAA, // head
0xB4, // command id
0x02, // data byte 1
0x01, // data byte 2 (set mode)
0x00, // data byte 3 (query modes)
0x00, // data byte 4
0x00, // data byte 5
0x00, // data byte 6
0x00, // data byte 7
0x00, // data byte 8
0x00, // data byte 9
0x00, // data byte 10
0x00, // data byte 11
0x00, // data byte 12
0x00, // data byte 13
0xFF, // data byte 14 (device id byte 1)
0xFF, // data byte 15 (device id byte 2)
0x01, // checksum
0xAB // tail
};


SDS011::SDS011(void) {

}
Expand Down Expand Up @@ -79,13 +213,81 @@ int SDS011::read(float *p25, float *p10) {
// SDS011:sleep
// --------------------------------------------------------
void SDS011::sleep() {
for (uint8_t i = 0; i < 19; i++) {
sds_data->write(SLEEPCMD[i]);
}
sds_data->flush();
while (sds_data->available() > 0) {
sds_data->read();
}
sendcmd(SLEEPCMD);
}

// --------------------------------------------------------
// SDS011:mode
// --------------------------------------------------------

void SDS011::mode_dsleep() {
sendcmd(MODEDEEPCMD);
}

void SDS011::mode_mon_300() {
sendcmd(MODE300CMD);
}

void SDS011::mode_mon_60() {
sendcmd(MODE60CMD);
}

void SDS011::mode_cont() {
sendcmd(MODECONTCMD);
}

void SDS011::mode_query() {
sendcmd(MODEQUERYCMD);
}

void SDS011::mode_active() {
sendcmd(MODEACTIVECMD);
}


void SDS011::sendcmd(const byte *CMD) {
uint8_t buff;
bool done=false;
unsigned long timeout;
while(!done) {
for (uint8_t i = 0; i < 19; i++) {
sds_data->write(CMD[i]);
}
sds_data->flush();
timeout = millis();
Serial.println();
// Wait for data to become available
while (!sds_data->available()) {
if((millis() - timeout) > 500) {
Serial.print("Timeout! ");
break;
}
delay(10);
}
// Try reading the reply
uint8_t i=0;
while (i<10) {
if(sds_data->available() >0 ) {
buff = sds_data->read();
Serial.print(" 0x"); Serial.print(buff, HEX);
// This is not command reply, try again
if(i==1 && buff != 0xC5) {
break;
}
i++;
} else {
// we've waited too much, try again
if((millis() - timeout) > 500) {
Serial.print("Timeout! ");
break;
}
delay(10);
}
// This is the last byte, we're done
if(i==9) done=true;
}
Serial.println();
}
}

// --------------------------------------------------------
Expand Down
7 changes: 7 additions & 0 deletions SDS011.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,15 @@ class SDS011 {
void begin(uint8_t pin_rx, uint8_t pin_tx);
int read(float *p25, float *p10);
void sleep();
void mode_dsleep();
void mode_mon_300();
void mode_mon_60();
void mode_cont();
void mode_query();
void mode_active();
void wakeup();
private:
uint8_t _pin_rx, _pin_tx;
Stream *sds_data;
void sendcmd(const byte* CMD);
};