ESP32-CAM не читает BME680
Я пытаюсь прочитать BME680 на ESP32-CAM со следующим кодом:
(Прежде чем попробовать BME680, я успешно подключил BME280 к ESP32-CAM через S/W SPI)
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#define SEALEVELPRESSURE_HPA (1013.25)
#define BME_SCK 12 //Подключение SCL к IO12
#define BME_MISO 15 //Подключение SDO к IO15
#define BME_MOSI 13 //Подключение SDA к IO13
#define BME_CS 14 //Подключена CS к IO14
// Adafruit_BME280 bme; // I2C
Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // программный SPI
//плавающая температура = 0;
//влажность с плавающей запятой = 0;
//плавающее давление = 0;
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println(F("BME680 test"));
if (!bme.begin(0x76))
{
Serial.println("Could not find a valid BME680 sensor, check wiring!");
while (1);
}
// Настраиваем передискретизацию и инициализацию фильтра
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C в течение 150 мс
}
void loop()
{
if (! bme.performReading())
{
Serial.println("Failed to perform reading :(");
return;
}
Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bme.pressure / 100.0);
Serial.println(" hPa");
Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println(" %");
Serial.print("Gas = ");
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(" KOhms");
Serial.print("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Serial.println();
delay(2000);
}
Когда я пытаюсь загрузить код в ESP32-CAM, когда BME680 подключен, я получаю следующую ошибку
esptool.py v2.6
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
MAC: a4:cf:12:99:b5:70
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Warning: Could not auto-detect Flash size (FlashID=0xffffff, SizeID=0xff), defaulting to 4MB
Compressed 8192 bytes to 47...
A fatal error occurred: Timed out waiting for packet content
A fatal error occurred: Timed out waiting for packet content
Затем я попытался отключить BME680 и загрузить код в ESP32-CAM, который сработал, а затем снова подключить BME680 к ESP32-CAM.
Но теперь я вижу следующую ошибку в Serial Monitor:
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371
ets Jn 8 2016 00:22:57
rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371
ets Jun 8 2016 00:22:57
rst:0x10 (RTCWDT_RTC_RESET),boot0x33 SPI_FAST_FLASH_BOT)
lash read err, 1000
et_main.c 371
ets Jun 8 2016 00:22:57
rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371
ets Jun 8 2016 00:22:57
rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371
ets Jun 8 2016 00:22:57
Есть идеи, что здесь не так?
Обновление:
Я переключил #define BME_SCK 12
на #define BME_SCK 16
, теперь получаю следующее сообщение
ts Jun 8 2016 00:2:57
rst:0x1 (POWEON_REST),boot:0x13 (PI_FAT_FLASH_BOOT)
cnfigsi: 0, SPIWP:0xee
clk_dv:0x00,q_drv:0x0,d_drv0x00,cs0_drv:0x00,d_drv0x00,wp_drv:0x0
mod:DIO, clock div:
loa:0x3fff0018,len:4
load0x3fff001c,len:1216
ho 0 tail 12 room 4
lod:0x40078000,len:9720
h 0 tail 12 room 4
load0x40080400,len:6352
etry 0x400806b8
[D][esp32-hal-psram.c:47] psramInit(): PSRAM enabled
@roy, 👍0
Обсуждение2 ответа
GPIO12 не должен быть слишком высоким во время загрузки. Возможно, на коммутационной плате BME680, которую вы используете, есть подтягивающий резистор, который подтягивает SCK к высокому уровню и мешает процессу загрузки. Я бы не стал использовать здесь GPIO12.
Если у вас закончились контакты на ESP32, вы можете подключить BME680 через I2C, а не через SPI. I2C нужны только SDA и SCK (и питание и земля, конечно). В библиотеке Adafruit для BME680 есть пример вызова конструктора для соединения I2C.
Я использую ESP32-CAM, не все выводы «IO» доступны, а также «I2C» недоступен, поэтому доступен только программный «SPI». Я переключил BME_SCK с 12 на 16 и получил новую ошибку., @roy
Вы используете выводы
#define BME_SCK 12 //Connected SCL to IO12
#define BME_MISO 15 //Connected SDO to IO15
#define BME_MOSI 13 //Connected SDA to IO13
#define BME_CS 14 //Connected CS to IO14
для программного SPI, но esp32 может использовать любой набор контактов для аппаратного SPI.
И ваш набор контактов - это даже выделенные контакты мультиплексора для SPI2 (они имеют прямое соединение без мультиплексора). Но они находятся в другом отображении, чем ваше программное обеспечение SPI.
SPI2:
SCLK 14
MISO 12
MOSI 13
SS 15
Источник: https://docs.espressif.com. /projects/esp-idf/en/latest/api-reference/peripherals/spi_master.html
SPI2 — это SPI по умолчанию, используемый библиотекой SPI ESP32 Arduino, поэтому у библиотеки Adafruit не должно возникнуть проблем при использовании аппаратного SPI с библиотекой SPI.
Adafruit_BME680 bme(BME_CS); // используем аппаратный SPI
и подключите датчик к контактам SPI2 в соответствии с их назначением
@roy, я улучшил ответ, @Juraj
С этим предложенным изменением я получаю последнее сообщение об ошибке, упомянутое в моем вопросе., @roy
попробуйте подключить провод к пину 12 только после включения esp32. это может быть проблема в ответе Джона, @Juraj
Пробовал и так, все та же ошибка, @roy
в следующий раз я бы попробовал датчик с какой-нибудь простой платой, такой как Uno или Nano., @Juraj
- Как определить наличие воды с помощью всего двух проводов
- Библиотека емкостных датчиков на D1 Mini
- Существует ли точная процедура подключения между esp32 и ультразвуковым датчиком(HC-SR04)?
- ESP32 WROOM 32 Проблемы с SPI EMF
- Драйверы для чипа последовательного порта CH9102X
- ESP32: отключить детектор отключения питания
- Преобразование строки в IP-адрес
- Какую плату выбрать в PlatformIO для ESP Wroom 32?
Если вы прочтете [схему ESP32_cam] (https://github.com/SeeedDocument/forum_doc/blob/master/reg/ESP32_CAM_V1.6.pdf), вы заметите, что microSD использует как GPIO12, так и GPIO16., @hcheung
@hcheung, SPI - это шина, но да, если карта будет вставлена, проводка SPI должна совпадать с проводкой карты., @Juraj
Я не использую SD-карту. Также BME280 отлично работал с BME_SCK=14, BME_MISO=12, BME_MOSI=13, BME_CS=15., @roy