Датчик BME280

Billy Bons
Offline
Зарегистрирован: 13.06.2019

Понимаю,что тема уже набила оскомину и все же..)

Есть китайский датчик как на картинке

Скетч сканирования по I2C его находит и выдает адрес 0x76.

В библиотеке Adafruit_BME280.h адрес я поправил ( там стоял 0х77)

вместо ардуино юзаю ESP8266 D1

Пины I2C (SDA - D2; SLC - D1) - датчик подключен к ним,питание 3,3В

Вот скетч


#include <ESP8266WiFi.h>         
#include <Wire.h>//для работы с шиной I2C
#include <Adafruit_Sensor.h> 
#include <Adafruit_BME280.h>
Adafruit_BME280 bme; // I2C (SDA - D2; SLC - D1)

void setup() {
 
    Serial.begin(115200);
   
      
   //while (!bme.begin(0x76)){
   //        Serial.println("Не найден датчик BME280.Проверьте подключение!");
    //        delay (1000);
     //     };
     
}
    
void loop() {
 
  Send();
  delay(5000);

}

void Send(){


      // float h = bme.readHumidity(); // переменная влажности
       float t = bme.readTemperature(); // переменная температуры
     //  float p = (bme.readPressure() / 133.3223684F); // переменная давления
       
    Serial.println("Temperature = ");
    Serial.println(t);
    Serial.println(" *C");    
  
  /*  
    Serial.println("Pressure = ");
    Serial.println(p);
    Serial.println(" hPa");
   

    
    Serial.println("Humidity = ");
    Serial.println(h);
    Serial.println(" %");*/
   
    
}
 
Но почему то работать не хочет( В мониторе порта выдает
--------------- CUT HERE FOR EXCEPTION DECODER ---------------
 
Exception (28):
epc1=0x402013e8 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
 
>>>stack>>>
 
ctx: cont
sp: 3ffffdc0 end: 3fffffc0 offset: 0190
3fffff50:  feefeffe 00000001 3ffee4a0 3ffee508  
3fffff60:  00000000 00000001 3ffee4a0 402019fc  
3fffff70:  00000000 00000000 3ffee308 402014d4  
3fffff80:  0001c200 0000001c 3ffee4c8 4020105b  
3fffff90:  3fffdad0 00000000 3ffee4c8 4020109d  
3fffffa0:  feefeffe feefeffe feefeffe 402021e4  
3fffffb0:  feefeffe feefeffe 3ffe84e0 40100c29  
<<<stack<<< 
 
Кто подскажет в чем проблема может быть?Датчики из китая- 2 штуки, ни один работать не хочет(

 

sadman41
Offline
Зарегистрирован: 19.10.2016

bme.begin() с какой целью закомментированно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Начинайте всегда с внимательного чтения сообщения. Вам же сказали:

Billy Bons пишет:

Exception (28):

Оно называется "Access to invalid address", а причин может быть две:

1. Access to Cache after it is turned off
2. Wild pointers

Теперь, зная что искать, смотрим на скетч и видим, что Вы забыли инициализировать bme

Billy Bons
Offline
Зарегистрирован: 13.06.2019

ЕвгенийП пишет:

Теперь, зная что искать, смотрим на скетч и видим, что Вы забыли инициализировать bme

а можно для тупых - какую строчку в код я не вставил?

если я расскоменчу while сетч плюется,что датчик не найден

 
 

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Проверьте подключение или пройдитесь i2c сканером, вдруг датчик дохлый
Вот рабочий пример,248 строка
http://arduino.ru/forum/programmirovanie/snova-mqtt-1?page=1#comment-570275

Billy Bons
Offline
Зарегистрирован: 13.06.2019

andycat пишет:
Проверьте подключение или пройдитесь i2c сканером, вдруг датчик дохлый

в том то и дело, что сканер, залитый в esp нашел датчик с этим адресом..


#include <Wire.h>
#include <ESP8266WiFi.h> 
 
void setup(){
    Wire.begin();
 
    Serial.begin(115200);
    while (!Serial);
    Serial.println("\nI2C Scanner");
} 

void loop(){
    byte error, address;
    int nDevices;
 
    Serial.println("Scanning...");
 
    nDevices = 0;
    for(address = 8; address < 127; address++ ){
        Wire.beginTransmission(address);
        error = Wire.endTransmission();
 
        if (error == 0){
            Serial.print("I2C device found at address 0x");
            if (address<16)
                Serial.print("0");
            Serial.print(address,HEX);
            Serial.println(" !");
 
            nDevices++;
        }
        else if (error==4) {
            Serial.print("Unknow error at address 0x");
            if (address<16)
                Serial.print("0");
            Serial.println(address,HEX);
        } 
    }
    if (nDevices == 0)
        Serial.println("No I2C devices found\n");
    else
        Serial.println("done\n");
 
    delay(5000);
}
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Значит вариантов особо нет, или дохлый или попробовать с другим МК

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Billy Bons, лично у меня сложилось впечатление от работы с esp8266, что этот чип принципиально не совместим с delay(5000).

sadman41
Offline
Зарегистрирован: 19.10.2016

С delay() там всё ок, его имплементация, содержащаяся в ESP8266 Core содержит esp_yield();

А вот всякие долгие циклы, в которых yield() забыт - таки да, могут взбесить watchdog.

sadman41
Offline
Зарегистрирован: 19.10.2016

Billy Bons пишет:

andycat пишет:
Проверьте подключение или пройдитесь i2c сканером, вдруг датчик дохлый

в том то и дело, что сканер, залитый в esp нашел датчик с этим адресом..


#include <Wire.h>
...
void setup(){
    Wire.begin();
...
} 

Закомментируйте в сканере Wire.begin() и зачекайте результат.

Потом посмотрите в https://github.com/adafruit/Adafruit_BME280_Library/blob/master/Adafruit_BME280.cpp:

bool Adafruit_BME280::begin(uint8_t addr, TwoWire *theWire) {
...  
  status = init();
...  
}
...  

bool Adafruit_BME280::init() {
  // init I2C or SPI sensor interface
  if (_cs == -1) {
    // I2C
    _wire->begin();
  } else {
  ...
 

Подумайте, почему проблема связана с отсутствующим bme.begin()

Billy Bons
Offline
Зарегистрирован: 13.06.2019

Попытался я проинициализировать датчик строкой кода

bme.begin(0x76);

впрочем без указания адреса результат тот же.

  
  #include <ESP8266WiFi.h>
  #include <Wire.h>//для работы с шиной I2C
  #include <Adafruit_Sensor.h> //для работы с датчиком.Работают вместе
  #include <Adafruit_BME280.h>
  
  Adafruit_BME280 bme; // I2C (SDA - D2; SLC - D1)
  
  void setup() {
  
    Serial.begin(115200);
    bme.begin(0x76);
  
    //while (!bme.begin(0x76)){
    //        Serial.println("Не найден датчик BME280.Проверьте подключение!");
    //        delay (1000);
    //     };
  
  }
  
  void loop() {
  
    Send();
    delay(5000);
  
  }
  
  void Send() {
  
  
    float h = bme.readHumidity(); // переменная влажности
    float t = bme.readTemperature(); // переменная температуры
    float p = (bme.readPressure() / 133.3223684F); // переменная давления
  
    Serial.println("Temperature = ");
    Serial.println(t);
    Serial.println(" *C");
  
  
    Serial.println("Pressure = ");
    Serial.println(p);
    Serial.println(" hPa");
  
  
  
    Serial.println("Humidity = ");
    Serial.println(h);
    Serial.println(" %");
  
  
  
  }

в результате в сом порт выдает

Temperature = 
nan
 *C
Pressure = 
nan
 hPa
Humidity = 
0.00
 %
 
sadman41
Offline
Зарегистрирован: 19.10.2016

Какие элементы находятся с другой стороны платы модуля?

Billy Bons
Offline
Зарегистрирован: 13.06.2019

sadman41 пишет:

Какие элементы находятся с другой стороны платы модуля?

четыре резистора 103 и два блокировочных конденсатора.Ну и сам датчик.Подключаю его на 3,3 в

sadman41
Offline
Зарегистрирован: 19.10.2016

Странно, конечно. Вы уверены, что это BME, а не BMP? Адреса у них могут быть одинаковые, а вот Chip ID - разные.

Я бы вот это прогнал: https://github.com/adafruit/Adafruit_BME280_Library/blob/master/examples/bme280test/bme280test.ino

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sadman41 пишет:

С delay() там всё ок, его имплементация, содержащаяся в ESP8266 Core содержит esp_yield();

А вот всякие долгие циклы, в которых yield() забыт - таки да, могут взбесить watchdog.

Да, думаю, что это так.

Просто я экспериментировал именно с длинным циклом и на основе этого сделал неверные выводы.

ratman
Offline
Зарегистрирован: 11.10.2015
Billy Bons
Offline
Зарегистрирован: 13.06.2019

все разобрался.Оказывается датчик был BMP 280.Обманули кытайцы)

Спасибо всем,кто помог