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