co2_sensor/co2_sensor.ino
2026-05-26 19:16:49 +03:00

125 lines
3.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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"));
for (;;);
}
display.clearDisplay();
display.setTextSize(1);
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("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();
delay(5000);
} 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;
// Чтение данных с SCD40
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"));
// Цветовая индикация уровня CO2
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);
}