96 lines
2.2 KiB
C
96 lines
2.2 KiB
C
#include <Arduino.h>
|
|
|
|
#include <HardwareSerial.h>
|
|
|
|
HardwareSerial Co2Port(1); // use UART2
|
|
|
|
// co2 Grenzwerte
|
|
/* #define CO2_WARN_1 650
|
|
#define CO2_WARN_2 950
|
|
#define CO2_WARN_3 1250
|
|
#define CO2_WARN_4 1500
|
|
#define CO2_CRITICAL_PPM 1850 */
|
|
#define CO2_WARN_1 600
|
|
#define CO2_WARN_2 800
|
|
#define CO2_WARN_3 1000
|
|
#define CO2_WARN_4 1500
|
|
#define CO2_WARN_5 2000
|
|
#define CO2_CRITICAL_PPM 1850
|
|
|
|
int CO2Wert = -99;
|
|
char antwort[100] = {0xFF};
|
|
int range =2000;
|
|
bool readCo2Flag;
|
|
|
|
char getCheckSum(char *packet)
|
|
{
|
|
char i, checksum;
|
|
for (i = 1; i < 8; i++)
|
|
{
|
|
checksum += packet[i];
|
|
}
|
|
checksum = 0xFF - checksum;
|
|
return checksum +1;
|
|
}
|
|
|
|
int readCO2() {
|
|
char cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
|
|
Co2Port.write(cmd,9);
|
|
if(Co2Port.available()) {
|
|
Co2Port.readBytes(antwort, 9);
|
|
}
|
|
#ifdef DebugCO2
|
|
for (int a=0; a<9; a++){
|
|
Serial.printf(" BufferRead [%d] = 0x%02X \n", a, antwort[a]);
|
|
}
|
|
Serial.println();
|
|
#endif
|
|
if (antwort[0] != 0xFF) return -1;
|
|
if (antwort[1] != 0x86) return -2;
|
|
int antwortHigh = (int) antwort[2]; // CO2 High Byte
|
|
int antwortLow = (int) antwort[3]; // CO2 Low Byte
|
|
int ppm = (256 * antwortHigh) + antwortLow;
|
|
Co2Port.flush();
|
|
return ppm;
|
|
}
|
|
|
|
void calibrationCo2() {
|
|
char cmd[9] = {0xFF, 0x01, 0x79, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
cmd[8] = getCheckSum(cmd);
|
|
Serial.printf("Checksumme = 0x%02X\n", cmd[8]);
|
|
Co2Port.write(cmd,9);
|
|
#ifdef DebugCO2
|
|
for (int a=0; a<9; a++){
|
|
Serial.printf(" BufferCalibration [%d] = 0x%02X \n", a, cmd[a]);
|
|
}
|
|
Serial.println();
|
|
#endif
|
|
}
|
|
|
|
void setRange()
|
|
{
|
|
char cmd[9] = {0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
|
|
cmd[6] = range >> 8;
|
|
cmd[7] = range & 0xFF;
|
|
cmd[8] = getCheckSum(cmd);
|
|
Serial.printf("Checksumme = 0x%02X\n", cmd[8]);
|
|
Co2Port.write(cmd,9);
|
|
#ifdef DebugCO2
|
|
for (int a=0; a<9; a++){
|
|
Serial.printf(" BufferRange [%d] = 0x%02X \n", a, cmd[a]);
|
|
}
|
|
Serial.println();
|
|
#endif
|
|
}
|
|
|
|
void beginC02()
|
|
{
|
|
Co2Port.begin(9600, SERIAL_8N1, 32, 33);
|
|
readCo2Flag = false;
|
|
delay(100);
|
|
calibrationCo2();
|
|
delay(100);
|
|
setRange();
|
|
delay(100);
|
|
} |