grosszeichendisplay/include/CO2.h
2023-04-26 13:09:45 +02:00

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);
}