Датчик BME280
- Войдите на сайт для отправки комментариев
Пнд, 07/12/2020 - 20:48
Понимаю,что тема уже набила оскомину и все же..)
Есть китайский датчик как на картинке

Скетч сканирования по 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 штуки, ни один работать не хочет(
bme.begin() с какой целью закомментированно?
Начинайте всегда с внимательного чтения сообщения. Вам же сказали:
Оно называется "Access to invalid address", а причин может быть две:
1. Access to Cache after it is turned off
2. Wild pointers
Теперь, зная что искать, смотрим на скетч и видим, что Вы забыли инициализировать bme
Теперь, зная что искать, смотрим на скетч и видим, что Вы забыли инициализировать bme
а можно для тупых - какую строчку в код я не вставил?
если я расскоменчу while сетч плюется,что датчик не найден
Проверьте подключение или пройдитесь i2c сканером, вдруг датчик дохлый
Вот рабочий пример,248 строка
http://arduino.ru/forum/programmirovanie/snova-mqtt-1?page=1#comment-570275
в том то и дело, что сканер, залитый в 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); }Значит вариантов особо нет, или дохлый или попробовать с другим МК
Billy Bons, лично у меня сложилось впечатление от работы с esp8266, что этот чип принципиально не совместим с delay(5000).
С delay() там всё ок, его имплементация, содержащаяся в ESP8266 Core содержит esp_yield();
А вот всякие долгие циклы, в которых yield() забыт - таки да, могут взбесить watchdog.
в том то и дело, что сканер, залитый в 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()
Попытался я проинициализировать датчик строкой кода
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(" %"); }в результате в сом порт выдает
Какие элементы находятся с другой стороны платы модуля?
Какие элементы находятся с другой стороны платы модуля?
четыре резистора 103 и два блокировочных конденсатора.Ну и сам датчик.Подключаю его на 3,3 в
Странно, конечно. Вы уверены, что это BME, а не BMP? Адреса у них могут быть одинаковые, а вот Chip ID - разные.
Я бы вот это прогнал: https://github.com/adafruit/Adafruit_BME280_Library/blob/master/examples/bme280test/bme280test.ino
С delay() там всё ок, его имплементация, содержащаяся в ESP8266 Core содержит esp_yield();
А вот всякие долгие циклы, в которых yield() забыт - таки да, могут взбесить watchdog.
Да, думаю, что это так.
Просто я экспериментировал именно с длинным циклом и на основе этого сделал неверные выводы.
Попробуй библиотеку отсюда: http://cactus.io/hookups/sensors/barometric/bme280/hookup-arduino-to-bme280-barometric-pressure-sensor
все разобрался.Оказывается датчик был BMP 280.Обманули кытайцы)
Спасибо всем,кто помог