Ich habe einen GY-BME/PM280 Druck-, Temperatur-, Feuchtigkeits- und Höhensensor gekauft, um mit der eingebetteten Programmierung und IoT-Geräten/Heim zu beginnen Automatisierung.
Zu Beginn kaufte ich:
- BreadBoard
- Multimeter
- GY-BME/PM280-Sensor (6pin)
Ich begann, diesen Tutorials zu folgen:
- Wie man ein Steckbrett benutzt (wird verwendet, um zu verstehen, wie Strom durch ein Steckbrett fließt)
- ESP32 mit BME280 (wird verwendet, um zu verstehen, wie man das Gerät verkabelt)
- Fehlerbehebung: Es konnte kein gültiger BME280-Sensor gefunden werden (wird verwendet, um das mögliche Problem zu ermitteln: Verkabelung, Programmierung oder falsche Pin-Verwendung).
Pin-Layout
esp32
BME280
3,3v
VCC
GND
GND
GPIO 22
SDA
GPIO 21
SCL
ESP32 Pin-Layout-Datenblatt< /p>
Aktuelles Setup
Ich habe mich für die Verwendung von i2c-Verbindungen entschieden (es war die erste Option im Tutorial und wegen der kürzeren Verkabelung ist sie stabiler).
Laut esp32 i2c v5.4, i2c-Kommunikation muss drei Dinge tun:
1. Erstellen Sie i2c_master_bus_config_t
Eigenschaft
Wert
i2c_port
I2C_NUM_0
sda_io_num
GPIO 21
scl_io_num
GPIO 22
clk_source
I2C_CLK_SRC_DEFAULT
glitch_ignore_cnt7
flags.enable_internal_pullup
true
2. Erstellen Sie einen i2c-Masterbus:
Code: Select all
i2c_master_bus_handle_t bus_handle;
ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_mst_config, &bus_handle));
Code: Select all
/// Create device config to add to the bus
i2c_device_config_t i2c_dev_config;
i2c_dev_config.dev_addr_length = I2C_ADDR_BIT_LEN_7;
i2c_dev_config.device_address = BME_SENSOR_ADDRESS ;
i2c_dev_config.scl_speed_hz = 100000;
i2c_master_dev_handle_t dev_handle;
esp_err_t dev_connect_rslt = i2c_master_bus_add_device(bus_handle, &i2c_dev_config, &dev_handle);
ESP_ERROR_CHECK(dev_connect_rslt);
if (dev_connect_rslt == ESP_OK) {
ESP_LOGI(I2C_SETUP_TAG, "BME 280 connected correctly to i2c bus: %d" , i2c_dev_config.device_address );
}
Aktuelles Problem:
Nun zum eigentlichen Problem. Der Bus wird korrekt erstellt und laut Protokollausgaben wird das Gerät „richtig“ zum i2c-Bus hinzugefügt. Aber ich kann anscheinend nicht mit dem BME280-Sensor kommunizieren. Und ich weiß nicht warum...
Tests
- Ich habe i2c_master_probe() verwendet Funktion, um sicherzustellen, dass sich das tatsächliche Gerät am i2c-Bus befindet.
- Ich habe die Funktion i2c_master_receive() verwendet, um zu versuchen, vom Sensor zu lesen.
- Um die Leistung zu testen, habe ich ein Multimeter verwendet Spannung des bme280-Sensors an den VCC- und GND-Pins.
- Um die physische i2c-Kommunikation zu testen, Ich habe ein Multimeter verwendet, um die variable Spannung an den SCL- und SDA-Pins zu testen.
< li>Um die i2c-Adresse des BME280-Sensors zu überprüfen, I habe einen Arduino-Sketch verwendet, der nach i2c-Adressen auf dem i2c-Bus sucht. i2c-Scanner-Skizze
Ich erhalte ständig einen ESP_ERR_NOT_FOUND, der wahrscheinlich darauf hinweist, dass das Gerät an der BME_SENSOR_ADDRESS ist nicht auf dem i2c-Bus.
Es wurde also wahrscheinlich zum Bus „hinzugefügt“, befindet sich aber nicht physisch auf dem Busi2c_master_receive-Ergebnisse
Ich erhalte ständig eine „ACK“, die nicht vom bme280-Sensor empfangen wurde, was wahrscheinlich darauf hindeutet, dass das Gerät wiederum „auf“ dem Bus ist, aber nicht auf dem i2c-Bus.
Stromtest
Das Multimeter hat eine Spannung von 3,3 V aufgezeichnet – wahrscheinlich fließt Strom durch den Sensor. Dies bedeutet, dass die Verbindungen VCC - 3.3v und GND - GND korrekt und funktionsfähig sind.
Ergebnisse der physikalischen I2C-Kommunikation
Das Multimeter hat eine Spannung von 1 V bis 1,3 V aufgezeichnet, was darauf hinweist, dass eine variable Spannung vorhanden ist. Dies bedeutet, dass die Verbindungen SCL - GPIO 22 und SDA - GPIO 21 korrekt und funktionsfähig sind.
Ergebnisse des I2C-Scanners
Der serielle Ausgang zeigte „Keine I2C-Geräte gefunden“ an. Das bedeutet, dass sich das Gerät wieder nicht am i2c-Bus befindet.
Wahrscheinliche Schuldige
Die wahrscheinlichen Probleme sind:
- Falsche Verkabelung
- Falsche i2c-Bus-Einrichtung und Gerätehinzufügung
- Falsche BME280-Adressverwendung
Ich habe mit dem Multimeter getestet und es gibt Strom und variable Spannung im BME280-Sensor. Ich weiß nicht, was das potenzielle Problem sein könnte, ich habe mehrere Lösungen ausprobiert und kämpfe seit etwa drei Tagen.
Vielleicht könnte jemand helfen, der besser qualifiziert oder erfahrener ist . Über jede Hilfe wäre ich sehr dankbar, es muss jemanden geben, der schon einmal damit zu kämpfen hatte.
Bitte informieren Sie mich, wenn ich noch etwas hinzufügen muss...
Physikalischer Aufbau

Protokollausgabe
Codebeispiel
Code: Select all
I (313) I2C Setup: Initializing I2C...
D (313) i2c.common: new bus(0) at 0x3ffaffbc
I (323) gpio: GPIO[21]| InputEn: 1| OutputEn: 1| OpenDrain: 1| Pullup: 1| Pulldown: 0| Intr:0
I (333) gpio: GPIO[22]| InputEn: 1| OutputEn: 1| OpenDrain: 1| Pullup: 1| Pulldown: 0| Intr:0
D (333) i2c.common: bus clock source frequency: 80000000hz
I (343) I2C Setup: BME 280 connected correctly to i2c bus: 118
I (353) I2C Setup: Starting I2C bus scan...
I (373) I2C Setup: I2C scan completed.
I (373) I2C Setup: Result from the device probe: 261
E (373) I2C Setup: Device is not found on the i2c bus
E (373) i2c.master: I2C hardware NACK detected
E (383) i2c.master: I2C transaction unexpected nack detected
E (393) i2c.master: s_i2c_synchronous_transaction(872): I2C transaction failed
I (393) gpio: GPIO[21]| InputEn: 1| OutputEn: 1| OpenDrain: 1| Pullup: 1| Pulldown: 0| Intr:0
I (403) gpio: GPIO[22]| InputEn: 1| OutputEn: 1| OpenDrain: 1| Pullup: 1| Pulldown: 0| Intr:0
E (413) i2c.master: i2c_master_receive(1117): I2C transaction failed
I (423) I2C Setup: I2C initialized successfully, bus handle: 0x3ffb4bfc, device handle: 0x3ffb5024
I (433) MAIN: Hello from app_main!

Quellcode
i2c_setup.cpp
Code: Select all
#include "FreeRTOSConfig.h"
#include "FreeRTOSConfig.h"
#include "FreeRTOSConfig.h"
#include "driver/i2c_master.h"
#include "esp_err.h"
#include "hal/i2c_types.h"
#include "portmacro.h"
#include "soc/gpio_num.h"
#include "esp_log.h"
#include
// Logging tag for I2C setup
static const char* I2C_SETUP_TAG = "I2C Setup";
/** ========================== Macros =======================================*/
#define SCL_PIN GPIO_NUM_22
#define SDA_PIN GPIO_NUM_21
#define I2C_PORT I2C_NUM_0
#define BUFFER_SIZE 32
#define BME_SENSOR_ADDRESS 0x76
/** ============================== Functions =================================== */
void i2c_free_bus(i2c_master_bus_handle_t bus_handle) {
i2c_del_master_bus(bus_handle);
}
void i2c_scan(i2c_master_bus_handle_t bus_handle) {
ESP_LOGI(I2C_SETUP_TAG, "Starting I2C bus scan...");
for (uint8_t addr = 0x03; addr