电子网首页 > 开源与设计

【ArduinoGIGAR1WiFi】基于stcc4的环境监测系统

2026-02-07 01:10 | 来源:电子世界报

【前言】

Arduino GIGA R1 WiFi开发板获取家里的环境信息。

【硬件】

1、ArduinoGIGAR1WiFi开发板

2、OLED模组

3、STCC4二氧化碳监测模组

【硬件连接】

OLED采用IIC接口。

STCC4采用IIC接口。

ArduinoGIGAR1WiFi 开发板上有三组IIC接口,如下:

  • SDA - D20

  • SCL - D21

  • SDA1 - also available on the camera connector.

  • SCL1 - also available on the camera connector.

  • SDA2 - D9

  • SCL2 - D8

根据开发板的资料使用如下:

Wire.begin() //SDA & SDL
Wire1.begin(); //SDA1 & SDL1
Wire2.begin(); //SDA2 & SDL2

我采用SDA/SCL接口。

【软件安装】

打开库搜索SSD1306,安装Monochrome OLEDs based on SSD1306库。

image.png

安装STCC4库

image.png

【代码实现】

/**
 * @file stcc4_ssd1306_display.ino
 * @brief Combines STCC4 CO2 sensor reading with SSD1306 OLED display.
 *        Reads CO2, Temperature, and Humidity, then displays them elegantly.
 * 
 *        Connect STCC4 to Wire1 (SDA1, SCL1) on Arduino Giga R1.
 *        Connect SSD1306 to default Wire (SDA, SCL) on Arduino Giga R1.
 */

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_STCC4.h>

// --- Configuration ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET_PIN -1 // Use -1 if not connected to a pin
#define SCREEN_ADDRESS 0x3C // Default address for 128x64 display

// --- Object Declarations ---
// Create STCC4 object, specifying Wire1 for communication
Adafruit_STCC4 stcc4 ;

// Create SSD1306 object, specifying dimensions, Wire object, and reset pin
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET_PIN);

// Variables to store sensor readings
uint16_t last_co2 = 0;
float last_temp = 0.0;
float last_humid = 0.0;
uint16_t last_status = 0;
bool last_read_success = false;

// Timing variables
unsigned long previousMillis = 0;
const long interval = 2000; // Read sensor every 2 seconds


void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10);

  Serial.println(F("Initializing STCC4 and SSD1306..."));

  // Initialize Wire1 for STCC4 (SDA1, SCL1)
  Wire.begin();
  delay(10);

  // Initialize STCC4 sensor
  if (!stcc4.begin()) {
    Serial.println(F("Failed to find STCC4 chip on Wire1!"));
    Serial.println(F("Check wiring and restart."));
    errorLoop("STCC4 Init Failed");
  }
  Serial.println(F("STCC4 found!"));

  if (!stcc4.reset()) {
    Serial.println(F("Failed to reset STCC4!"));
    errorLoop("STCC4 Reset Failed");
  }
  Serial.println(F("STCC4 reset successful."));

  if (!stcc4.enableContinuousMeasurement(true)) {
    Serial.println(F("Failed to start continuous measurement on STCC4!"));
    errorLoop("Start Measurement Failed");
  }
  Serial.println(F("STCC4 continuous measurement started."));

  // Initialize SSD1306 display
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed!"));
    Serial.println(F("Check wiring and restart."));
    errorLoop("OLED Init Failed");
  }
  Serial.println(F("SSD1306 initialized successfully."));

  // Clear the buffer and show a startup message on the OLED
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 20);
  display.println(F("System Ready"));
  display.setCursor(0, 30);
  display.println(F("Reading Sensors..."));
  display.display();

  delay(2000); // Briefly show startup message
}

void loop() {
  unsigned long currentMillis = millis();

  // --- Sensor Reading Logic ---
  // Only read the sensor every 'interval' milliseconds
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    Serial.println("Attempting to read STCC4...");
    if (stcc4.readMeasurement(&last_co2, &last_temp, &last_humid, &last_status)) {
      last_read_success = true;
      Serial.print(F("Read OK - CO2: ")); Serial.print(last_co2);
      Serial.print(F(" ppm, Temp: ")); Serial.print(last_temp);
      Serial.print(F(" C, Humidity: ")); Serial.print(last_humid);
      Serial.print(F(" %, Status: 0x")); Serial.println(last_status, HEX);
    } else {
      last_read_success = false;
      Serial.println(F("Failed to read measurement from STCC4."));
    }
  }

  // --- Display Update Logic ---
  // Update the display on every loop iteration to maintain responsiveness
  updateDisplay();
 
  // Small delay to prevent overwhelming the CPU, though not strictly necessary
  // with the timing logic above.
  delay(50);
}

void updateDisplay() {
  // Clear the display buffer
  display.clearDisplay();

  // --- Layout Information ---
  // Title
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // White text on black background
  display.setCursor(0, 0);
  display.println(F("ENVIRONMENTAL DATA"));

  // Divider Line
  display.drawLine(0, 12, SCREEN_WIDTH - 1, 12, SSD1306_WHITE);

  if (last_read_success) {
    // --- Define row heights based on font size ---
    // Font Size 1: ~8 pixels high
    // Font Size 2: ~16 pixels high
    int row1_y = 16; // For CO2
    int row2_y = 34; // For Temp & Humidity
    int row3_y = 52; // For Status or other info if needed later

    // --- CO2 Section ---
    display.setTextSize(1); // Use smaller font for label
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, row1_y);
    display.print(F("CO2:"));
   
    display.setTextSize(2); // Larger font for value
    display.setCursor(30, row1_y); // Position value further right
    display.print(last_co2);
    display.print(F("p")); // Abbreviated unit to save space

    // --- Temperature & Humidity Section (Single Row) ---
    display.setTextSize(1);
    display.setCursor(10, 36);
    display.print(F("TEMP       HUMI")); // Short label for Temperature
   
    display.setTextSize(2);
    display.setCursor(0, 48);
    display.print(last_temp, 1); // Print with 1 decimal place
    display.print(F("C")); // Unit

    display.setTextSize(2);
    // Position Humidity value after its label
    display.setCursor(64, 48);
    display.print(last_humid, 1); // Print with 1 decimal place
    display.print(F("%")); // Percentage sign

  } else {
    // Display error message if reading failed
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, 25);
    display.println(F("Sensor Read Error!"));
    display.setCursor(0, 35);
    display.println(F("Check Connections."));
  }

  // Actually write the buffer to the screen
  display.display();
}
// Helper function to handle initialization errors gracefully
void errorLoop(const char* errorMsg) {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println(F("ERROR:"));
  display.println(errorMsg);
  display.println(F("Restart device."));
  display.display();

  while (true) {
    delay(1000); // Flash or do nothing, indefinitely
  }
}

【测试】

编译下载后,连接OLED以及STCC4模组,获取环境信息如下:

image.png

【总结】

此次实现,基于arduino的生态,可以快速的实现环境的监测。

阅读全文

推荐技术

返回顶部