co2_sensor/co2_sensor.ino
2026-05-26 23:09:45 +03:00

120 lines
2.8 KiB
C++

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SensirionI2cScd4x.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // -1 = no reset pin
SensirionI2cScd4x scd4x;
void setup() {
Serial.begin(9600);
Wire.begin();
// Инициализация дисплея
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // 0x3C or 0x3D
Serial.println(F("SSD1306 allocation failed"));
while (1) delay(20);
}
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("Initializing..."));
display.display();
delay(1000);
// Инициализация SCD40
display.clearDisplay();
display.setCursor(0, 0);
display.println(F("Starting SCD40..."));
display.display();
scd4x.begin(Wire, SCD40_I2C_ADDR_62);
// Проверка подключения
uint16_t error;
char errorMessage[256];
error = scd4x.stopPeriodicMeasurement();
if (error) {
Serial.print("Error stopping periodic measurement: ");
Serial.println(error);
}
delay(500);
error = scd4x.startPeriodicMeasurement();
if (error) {
Serial.print(F("Error starting periodic measurement: "));
Serial.println(error);
display.clearDisplay();
display.setCursor(0, 0);
display.println(F("SCD40 ERROR!"));
display.println(F("Check wiring"));
display.display();
while (1) delay(20);
} else {
display.clearDisplay();
display.setCursor(0, 0);
display.println(F("SCD40 Ready!"));
display.display();
delay(1000);
}
}
void loop() {
uint16_t error;
char errorMessage[256];
uint16_t co2 = 0;
float temperature = 0.0;
float humidity = 0.0;
error = scd4x.readMeasurement(co2, temperature, humidity);
display.clearDisplay();
display.setCursor(0, 0);
if (error) {
// Если ошибка чтения
display.println(F("SCD40 READ ERROR!"));
display.print(F("Code: "));
display.println(error);
display.println();
display.println(F("Check connection"));
} else {
// Отображение CO2
display.print(F("CO2: "));
display.print(co2);
display.println(F(" ppm"));
if (co2 < 800) {
display.println(F("Status: GOOD"));
} else if (co2 < 1200) {
display.println(F("Status: NORMAL"));
} else if (co2 < 2000) {
display.println(F("Status: POOR!"));
} else {
display.println(F("Status: DANGER!"));
}
display.println();
display.print(F("Temp: "));
display.print(temperature, 1);
display.println(F(" C"));
display.print(F("RH: "));
display.print(humidity, 1);
display.println(F(" %"));
}
display.display();
// Задержка между измерениями (SCD40 обновляется каждые 5 секунд)
delay(5000);
}