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

, 👍0

Обсуждение

Если вы прочтете [схему 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


2 ответа


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


0

Вы используете выводы

#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