• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266 E12 + BME280 - не показывает влажность

Alex255

New member
Здравствуйте.

Подключил к ESP8266 E12 датчик BME280. Отлично возвращает температуру и давление, но влажность - постоянно 0.00%

Temperature = 21.69 *C
Pressure = 1000.89 hPa
Approx. Altitude = 103.46 m
Humidity = 0.00 %

Что самое интересное, на OrangePi Zero возвращает и влажность.

Протестировал уже два датчика - все тоже самое.

Код:
/***************************************************************************
  This is a library for the BME280 humidity, temperature & pressure sensor

  Designed specifically to work with the Adafruit BME280 Breakout
  ----> http://www.adafruit.com/products/2650

  These sensors use I2C or SPI to communicate, 2 or 4 pins are required
  to interface. The device's I2C address is either 0x76 or 0x77.

  Adafruit invests time and resources providing this open source code,
  please support Adafruit andopen-source hardware by purchasing products
  from Adafruit!

  Written by Limor Fried & Kevin Townsend for Adafruit Industries.
  BSD license, all text above must be included in any redistribution
***************************************************************************/
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

unsigned long delayTime;

void printValues();

void setup() {
    Serial.begin(9600);
    Serial.println(F("BME280 test"));

    bool status;
  
    // default settings
    status = bme.begin(0x76);
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
  
    Serial.println("-- Default Test --");
    delayTime = 1000;

    Serial.println();
}


void loop() {
    printValues();
    delay(delayTime);
}


void printValues() {
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");

    Serial.print("Pressure = ");

    Serial.print(bme.readPressure() / 100.0F);
    Serial.println(" hPa");

    Serial.print("Approx. Altitude = ");
    Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    Serial.println(" m");

    Serial.print("Humidity = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");

    Serial.println();
}

Заранее благодарен за помощь!
 

Юрий Ботов

Moderator
Команда форума
Если почитать вот это: http://ru.mouser.com/ds/2/621/BST-BME280_DS001-09-521021.pdf становится понятно что датчик влажности изначально банально выключен и его нужно включить (5.4.3. Register 0xF2 “ctrl_hum”). Я не знаю какими вы пользуетесь именно библиотеками, но по всей видимости та что на OrangePI - его включает, а та которая на ESP - нет. Возможно там есть специальная команда на включение, ну или другую библиотеку поищите, ну или просто пошлите по i2c нужную команду: записать в 0xf2 значение 1 вместо 0


Посмотрел адафрутовскую библиотеку там даже стоит комментарий:
// you must make sure to also set REGISTER_CONTROL after setting the
// CONTROLHUMID register, otherwise the values won't be applied (see DS 5.4.3)
Так что тупо включайте вручную или ищите другую библиотеку
 
Последнее редактирование:

Alex255

New member
Если почитать вот это: http://ru.mouser.com/ds/2/621/BST-BME280_DS001-09-521021.pdf становится понятно что датчик влажности изначально банально выключен и его нужно включить (5.4.3. Register 0xF2 “ctrl_hum”). Я не знаю какими вы пользуетесь именно библиотеками, но по всей видимости та что на OrangePI - его включает, а та которая на ESP - нет. Возможно там есть специальная команда на включение, ну или другую библиотеку поищите, ну или просто пошлите по i2c нужную команду: записать в 0xf2 значение 1 вместо 0
Нашел константу SAMPLING_X16. Задал 1 (было 5), но так и не включается. Согласно даташиту, она как раз и отвечает за усиление и функция write8(BME280_REGISTER_CONTROLHUMID, _humReg.get()) пишет по адресу 0xF2 (константа BME280_REGISTER_CONTROLHUMID=0xF2)

Уже пробовал Sparkfun library и BME by Tylen Glenn.
 
Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
Добавьте это куда нибудь в setup()
Код:
_humReg.osrs_h = 1;   
bme.setSampling(Adafruit_BME280::MODE_FORCED,
                    Adafruit_BME280::SAMPLING_X1, // temperature
                    Adafruit_BME280::SAMPLING_X1, // pressure
                    Adafruit_BME280::SAMPLING_X1, // humidity
                    Adafruit_BME280::FILTER_OFF   );
 

Юрий Ботов

Moderator
Команда форума
Так понимаю, что вот эта строка
отвечает за влажность?
эта строка пишет в регистр F2 bme280 текущее значение _humReg.osrs_h. А там пока вы ничего не присвоили - живет ноль. Собственно это я выше и сделал - присвоил 1 и перезапустил функцию.
 

Alex255

New member
эта строка пишет в регистр F2 bme280 текущее значение _humReg.osrs_h. А там пока вы ничего не присвоили - живет ноль. Собственно это я выше и сделал - присвоил 1 и перезапустил функцию.
Ради эксперимента распаковал новый датчик. Работает! (и на Orange Pi Zero и на ESP E12). Старый так не запустился. Распаковал еще один - ни там ни там не работает. Или брак или продавцы дурят - непонятно. Спасибо за помощь!
 

IvanKurtti

New member
Тут не совсем понятная проблема
в основном проблема в обмане продавцов BMP/BME см. спойлер
причём продавец мне давал разные BMP280 на обмен и результат почему то отличался (обычно показывает >0<, но был, который показывал показания отличные от нуля (во общем мусор)).
Объяснить можно только так "China неликвидус" т.е. не прошедшие тестирование.

В этом случае датчик точно BME280 (если фото его) и ответ может быть наверное один :
этот производитель нарушил технологию (если технология вообще была, а не наколенная пайка паяльной станцией с флюсом), а затем всю плату промывал.
Если в отверстие на датчике попал флюс или ещё чего нибудь - получите этот результат.
Температура (через корпус датчика) меряется, давление (плёнка пластичного "флюса" внутри продавливается) меряется, а вот с влажностью извините, не всё так просто (как повезёт).

Сам думал об этом, может подольше в УЗ ванне промывать, чёрт знает промоет (ли) или датчик убьет?
P.S. Тестировал разные датчики на одной и той же ESPке и прошивку не изменял. (а тестировать на разных платформах (не гуд), к неисправностям датчиков добавляются недостатки (ошибки) кода.
Разве не у кого не было с не подключенными датчиками показаний?
 

Вложения

Последнее редактирование:
Сверху Снизу