【前言】
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库。

安装STCC4库

【代码实现】
/**
* @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模组,获取环境信息如下:

【总结】
此次实现,基于arduino的生态,可以快速的实现环境的监测。
阅读全文