120 lines
2.8 KiB
C++
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);
|
|
}
|