Hallo zusammen,
Im folgenden stelle ich einmal eine Lösung vor wie man den Kohlenstoffdioxid Sensor von Groove an die senseBoxMCU anschliessen kann.
Material
- senseBoxMCU ( https://sensebox.kaufen/product/sensebox-mcu-2)
- JST to Jumper Wire(Male) Kabel - https://sensebox.kaufen/product/jst-phr4-zu-jumper-wire-male-150mm
- Groove Sensor(https://www.seeedstudio.com/Grove-Carbon-Dioxide-Sensor-MH-Z16.html)
- Groove Kabel
- Lötstation
Hardware
Der Kohlenstoffdioxid Sensor verwendet das Grove System . Das Grove System wird nicht von der senseBoxMCU unterstützt, deswegen muss das Grove Kabel an ein JST Kabel der senseBox gelötet werden. Tabelle 1 zeigt die PIN Belegung beim Grove und JST System. Die Kabel sollten wie in der Tabelle aufgezeigt gelötet und anschließend entsprechend isoliert werden (Gelb an Grün, Weiß an Gelb, usw.). Nachfolgend kann das JST-Ende des Kabels an einen seriellen Port der senseBox und das Grove-Ende an den Sensor angeschlossen werden.
Grove | JST(senseBox) |
---|---|
Gelb(PIN1) | Grün (Rx) |
Weiß(PIN2) | Gelb(Tx) |
Rot(PIN3) | Rot(5V) |
Schwarz(PIN4) | Schwarz(GND) |
Software
Anfangs deklarieren wir eine DEBUG Methode mit der wir durch #define ENABLE_DEBUG
Konsolenausgaben an oder ausschalten können.
// Uncomment the next line to get debugging messages printed on the Serial port
// Do not leave this enabled for long time use
#define ENABLE_DEBUG
#ifdef ENABLE_DEBUG
#define DEBUG(str) Serial.println(str)
#else
#define DEBUG(str)
#endif
Um den Sensor ans Laufen zu bringen ist keine zusätzliche Library nötig.
Als erstes muss der Serielle Port an dem der Sensor angeschlossen ist definiert werden. Anschließend wird eine Variable für den Zugriff auf den Sensor gespeichert.
#define GROVE_CO2(Serial2)
const unsigned char cmd_get_sensor[] = {0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x79 };
Darüber hinaus deklarieren wir noch eine Buffer Variable wenn der Sensor Daten liefert und 2 Variablen in denen wir die Messwerte speichern.
unsigned char dataReceived[9];
int temperature_co2;
int CO2PPM;
Nun sind alle Variablen im Header definiert. Nun muss noch eine Helfer Funktion deklariert werden, welche die Sensorwerte ausliest und in den eben angelegten Variablen speichert.
// Helper function for co2 sensor
int dataReceive(void)
{
byte data[9];
int i = 0;
//transmit command data
for(i=0; i<sizeof(cmd_get_sensor); i++)
{
GROVE_CO2.write(cmd_get_sensor[i]);
}
delay(10);
//begin receiving data
if(GROVE_CO2.available())
{
while(GROVE_CO2.available())
{
for(int i=0;i<9; i++)
{
data[i] = GROVE_CO2.read();
}
}
}
delay(100);
if((i != 9) || (1 + (0xFF ^ (byte)(data[1] + data[2] + data[3] + data[4] + data[5] + data[6] + data[7]))) != data[8])
{
return false;
}
CO2PPM = (int)data[2] * 256 + (int)data[3];
temperature_co2 = (int)data[4] - 40;
return CO2PPM;
}
Damit der Sensor am Anfang des Programms gestartet werden soll muss der entsprechende Befehl noch in die Setup-Funktion eingefügt werden.
void setup(){
GROVE_CO2.begin(9600);
}
Damit ist die Konfigurierung abgeschlossen und der Sensor kann in der Loop-Funktion wiefolgt ausgelesen werden.
void loop(){
uint8_t attempt_co2 = 0;
while (attempt_co2 < 5) {
bool error_co2 = dataReceive();
if (error_co2 != 0) {
DEBUG(F("CO2 PPM: "));
DEBUG(CO2PPM);
break;
}
attempt++;
}
Der Messwert für CO2 wird nun nach jedem Loop Vorgang in der Variable
CO2PPM
gespeichert.
Sonstiges
Ein Beispiel wie ein fertiger Sketch der per LoRaWAN CO2 Werte an die openSenseMap schickt habe ich hier hochgeladen. Die zugehörige Payload Funktion ist hier.
Manchmal können die Farben der Grove Kabel sich von meiner Tabelle unterscheiden. Hierfür am besten noch diese Website beachten.