Подключение к ESP32-C3 SuperMini такого датчика как DHT11, как правило не вызывает особых вопросов и сложностей, так как там все можно сделать по аналоги с подключением DHT11 к ESP8266 (NodeMCU). Но вот подключение AHT20 + BMP280 уже интереснее. Там и два разных датчика в одном теле и обращение по адресу памяти. Да и дублирование поступающих данных, может немного запутать по началу.
Ниже небольшая памятка для быстрого подключения датчиков AHT20 + BMP280 к ESP32-C3 SuperMini, на основе которой, внеся нужные изменения, можно полностью заточить код под свои нужды.
Используемые материалы:
— Модуль датчика температуры, давления, влажности AHT20 + BMP280
— Микроконтроллер ESP32-C3 SuperMini, WiFi, Bluetooth 5.0(BLE)
— Провода для подключения
Схема подключения
Пример кода для подключения
Спойлер [раскрыть]
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_AHTX0.h>
#include <Adafruit_BMP280.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
// Create objects for sensors BMP280 - 0x77 and AHT20 - 0x38
Adafruit_AHTX0 aht;
Adafruit_BMP280 bmp;
// Wi-Fi settings
const char* ssid = "";
const char* password = "";
WiFiClient client;
WebServer server(80);
bool aht_initialized = false;
bool bmp_initialized = false;
float sum_temperature_aht = 0.0;
float sum_temperature_bmp = 0.0;
int num_readings = 0;
void setup() {
bool serial_initialized = false;
Serial.begin(115200);
for (int i = 0; i < 10; i++) {
if (Serial) {
serial_initialized = true;
break;
}
delay(1000);
}
if (serial_initialized) {
Serial.println("Serial port initialized.");
} else {
// Continue without serial port
}
WiFi.setHostname("ESP32C3_ClimateSensor");
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
if (serial_initialized) {
Serial.println("Connecting to WiFi...");
}
}
if (serial_initialized) {
Serial.println("Connected to WiFi");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
// Get and print ID of ESP32-C3 device
uint64_t chipid = ESP.getEfuseMac();
if (serial_initialized) {
Serial.print("ID of ESP32-C3 device: ");
Serial.println(chipid, HEX);
}
// Initialize I2C
Wire.begin(8, 9); // Use GPIO 8 for SDA and GPIO 9 for SCL
// Initialize AHT20 sensor
if (aht.begin(&Wire, 0, 0x38)) {
aht_initialized = true;
if (serial_initialized) {
Serial.println("AHT20 sensor initialized");
}
} else {
if (serial_initialized) {
Serial.println("Error: Failed to find AHT20");
}
}
// Initialize BMP280 sensor
if (bmp.begin(0x77)) {
bmp_initialized = true;
if (serial_initialized) {
Serial.println("BMP280 sensor initialized");
}
} else {
if (serial_initialized) {
Serial.println("Error: Failed to find BMP280");
}
}
// Set up handlers for HTTP server
server.on("/", handleRoot);
server.on("/data", handleData);
server.begin();
if (serial_initialized) {
Serial.println("HTTP server started");
}
}
void loop() {
server.handleClient(); // Handle HTTP requests
float humidity_value = 0.0;
float pressure_mmHg = 0.0;
if (aht_initialized && bmp_initialized) {
// Get data from AHT20 sensor
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);
sum_temperature_aht += temp.temperature;
humidity_value = humidity.relative_humidity;
num_readings++;
// Get data from BMP280 sensor
float temperature = bmp.readTemperature();
float pressure_Pa = bmp.readPressure(); // Pressure in Pascals (Pa)
// Convert to mmHg
pressure_mmHg = pressure_Pa / 100.0 * 0.75006375541921;
sum_temperature_bmp += temperature;
num_readings++;
} else {
// Try to reinitialize BMP280
if (bmp.begin(0x77)) {
bmp_initialized = true;
}
}
// Calculate average temperature
if (num_readings > 0) {
float average_temperature = (sum_temperature_aht + sum_temperature_bmp) / num_readings;
// Output average temperature, humidity, pressure, and device ID
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);
float pressure_Pa = bmp.readPressure();
float pressure_hPa = pressure_Pa / 100.0;
float pressure_mmHg = pressure_hPa * 0.75006375541921;
if (Serial) {
Serial.print("Temperature: ");
Serial.print(average_temperature);
Serial.print(" °C, Humidity: ");
Serial.print(humidity.relative_humidity);
Serial.print(" %, Pressure: ");
Serial.print(pressure_mmHg);
Serial.print(" mmHg, ID: ");
Serial.println(ESP.getEfuseMac(), HEX);
}
}
// Delay before next measurement
delay(3000);
}
// Handler for root URL ("/")
void handleRoot() {
server.send(200, "text/html", SendHTML());
}
// Handler for "/data" URL
void handleData() {
if (aht_initialized && bmp_initialized) {
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);
float pressure_Pa = bmp.readPressure();
float pressure_hPa = pressure_Pa / 100.0;
float pressure_mmHg = pressure_hPa * 0.75006375541921;
if (num_readings > 0) {
String data = "<h1>Climate!</h1>";
data += "<p>Temperature: " + String((sum_temperature_aht + sum_temperature_bmp) / num_readings) + " °C</p>";
data += "<p>Humidity: " + String(humidity.relative_humidity) + " % </p>";
data += "<p>Pressure: " + String(pressure_mmHg) + " mmHg</p>";
data += "<p>ID: " + String(ESP.getEfuseMac(), HEX) + "</p>";
data += "<p>MAC: " + String(ESP.getEfuseMac()) + "</p>";
server.send(200, "text/html", data);
} else {
server.send(500, "text/plain", "Error: No data available");
}
} else {
server.send(500, "text/plain", "Error: Sensors not initialized");
}
}
// Function to generate HTML page
String SendHTML() {
String ptr = "<!DOCTYPE html> <html>\n";
ptr += "<head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
ptr += "<title>ESP32 Climate Report</title>\n";
ptr += "<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
ptr += "body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
ptr += "p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
ptr += ".normal {color: black;}\n";
ptr += ".alert {color: red;}\n";
ptr +="</style>\n";
ptr +="<script>\n";
ptr +="setInterval(loadDoc, 2000);\n"; // Update every 2 seconds
ptr +="function loadDoc() {\n";
ptr +="var xhttp = new XMLHttpRequest();\n";
ptr +="xhttp.onreadystatechange = function() {\n";
ptr +="if (this.readyState == 4 && this.status == 200) {\n";
ptr +="document.getElementById(\"data\").innerHTML = this.responseText;\n";
ptr +="}\n";
ptr +="};\n";
ptr +="xhttp.open(\"GET\", \"/data\", true);\n";
ptr +="xhttp.send();\n";
ptr +="}\n";
ptr +="</script>\n";
ptr += "</head>\n";
ptr += "<body>\n";
ptr += "<div id=\"data\">\n";
ptr += "<h1>Climate!</h1>\n";
ptr += "<p>Loading data...</p>\n";
ptr += "</div>\n";
ptr += "</body>\n";
ptr += "</html>\n";
return ptr;
}
В коде добавлены проверки на поступающие данные и есть ли подключение к датчику. Если подключения нет, то появится ошибка с указанием проблемного датчика.
Так же стоит обратить внимание на еще один момент. Оба датчика считывают и показывают температуру и каждый свою. При этом между поступающими данными может быть небольшая погрешность и это нормально, это в общем-то особенность всех датчиков. Для упрощения работы с информацией, в коде показания с обоих датчиков приводятся к среднему значению и выводятся обобщенные данные.
Полезные ссылки:
ESP32-C3 SuperMini плата разработки (памятка)
К этой записи нет комментарий. Ваш будет первым!