125 lines
3.2 KiB
C++
125 lines
3.2 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"));
|
||
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);
|
||
}
|