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

ESP-12E NodeMCU+GY-BMP/E280

Иван 32

New member
Опробовал предложенный вами метод. Не вышло.
Подключение :
(BME280---NodeMCU)
VIN--3.3V
GND--GND
SCL--D2
SDA--D1

Изменился только код ошибки
Код:
Soft WDT reset

ctx: cont
sp: 3ffef4b0 end: 3ffef690 offset: 01b0

>>>stack>>>
3ffef660:  3fffdad0 00000000 3ffee63c 402020d0 
3ffef670:  feefeffe feefeffe 3ffee658 402039d0 
3ffef680:  feefeffe feefeffe 3ffee670 40100114 
<<<stack<<<
/еЦФ…дяDHъBME280 test
Could not find a valid BME280 sensor, check wiring!
Вот полный листинг скетча:
Код:
#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 setup() {
    Serial.begin(9600);
    Serial.println(F("BME280 test"));

    Wire.begin(5/*D1*/, 4/*D2*/); delay(10);

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

    Serial.println();

    delay(100); // let sensor boot up
}


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();
}
 

gerkimuyda

New member
Вы все варианты перепробовали? На старой прошивке пины переключать? На новой разные варианты? Адрес менять пробовали? (давно было, смутно помню, но вроде там разные адреса от способа подключения получаются, или то я с другими датчиками путаю).

Тут нету кодов ошибки. А ошибка у вас выскакивает, потому, что сторожевая собака кусает! [inline]Soft WDT reset[/inline] В этой строчке [inline] while (1);[/inline] (т.е. вечный цикл без передачи управления в SDK и без выдачи косточки для сторожевой собаки (без сброса WD-таймера).

Если никак - пора брать осциллограф и смотреть, что там в проводах происходит.
Может контакт где слабый? Может SDA и SCL перепутали. Может еще где ошибка?
 

Иван 32

New member
Адрес в файле Adafruit_BME280.h - менял
Библиотеку для датчика пробовал с гитхаба GitHub - adafruit/Adafruit_BME280_Library: Arduino Library for BME280 sensors и ту, которую присылал пользователь Алексей В. https://esp8266.ru/forum/threads/esp-12e-nodemcu-gy-bmp-e280.1941/#post-27409
Пины менял местами и назначал свои. Не помогает.
А вариант подключения, на моем датчике - только один. По i2c

Осциллографом не располагаю. Видимо придется возвращаться к BMP180 + DHT22 :(
Что-то никак у меня оптимизация количества проводов не получается)
 

gerkimuyda

New member
"Местами" - это имелось ввиду SDA=D1 SCL=D2 или SDA=D2 SCL=D1
Желательно еще какой-то прибор с I2C подключить и проверить. Вы сканер I2C пробовали тоже в разных вариациях подключения?
У меня такой:

подключен по 4 проводам и никаких проблем. Вот библиотека (правда она под BMP280, а не BME280, но это только на влажность влияет).
----------
upd: Хотя есть небольшие различия, вот из доки табличка:
201711191615.jpg
 

Вложения

Последнее редактирование:

Иван 32

New member
С вашей библиотекой - всегда выдает только максимальные значения.
Другой датчик по i2c - работает(bmp180)
Местами пины менял
"Местами" - это имелось ввиду SDA=D1 SCL=D2 или SDA=D2 SCL=D1
----------
Попробовал сканер i2c на разных пинах - устройств i2c не видно.

Получается датчик мертв?
 
Последнее редактирование:

gerkimuyda

New member
С вашей библиотекой - всегда выдает только максимальные значения.
Если не пишет, что устройство не найдено, значит частично его видит?
У вас что выбрано на плате (перемычка S1 по схеме):
  • SDO низкая: 0x76
  • SDO высокая: 0x77
Перед строкой [inline] if (read8(BME280_REGISTER_CHIPID) != 0x60) [/inline] в файле Adafruit_BME280.cpp
Сделайте вывод read8(BME280_REGISTER_CHIPID), что пишет? Если какое-то число - значит какие-то данные получает. Если 255 или 0 - значит связи нет.
--------
Если у вас есть рабочий bmp180 на I2C, значит его можно повесить на эти-же пины и общаться сразу с двумя датчиками...
 

Иван 32

New member
У вас что выбрано на плате (перемычка S1 по схеме):
  • SDO низкая: 0x76
  • SDO высокая: 0x77
Не понял что это и где искать.

Перед строкой if (read8(BME280_REGISTER_CHIPID) != 0x60) в файле Adafruit_BME280.cpp
Сделайте вывод read8(BME280_REGISTER_CHIPID), что пишет? Если какое-то число - значит какие-то данные получает. Если 255 или 0 - значит связи нет.
Возвращает 255
 

gerkimuyda

New member
Значит проблемы с модулем. Я их не ломал, а потому подсказать не смогу.

Про адрес, это не ваш случай (у вас 255 означает отсутствие связи). А вообще - можно в модуле задавать один из двух адресов переключателем S1 SW SPDT (те три золотистых площадки на фотографии). Проверьте, чтобы в воздухе не болталась 5 нога (SDO). По фотке - там дорожка идет от GND, если не перерезана.


 
Последнее редактирование:

gerkimuyda

New member
Видимо придется возвращаться к BMP180 + DHT22 :(
Что-то никак у меня оптимизация количества проводов не получается)
А что за оптимизация проводов?

ЗЫ: А зачем далеко уносить BMP180? Давление - оно и на улице и в доме одинаковое! Т.е. достаточно вывести на улицу два-три DHT-21 с разных сторон, и с них получать температуру/влажность. А BMP/E 180/280 прикрепить возле ESP и с него снимать давление (и температуру ESP, или чердака, или где модуль стоит?). Для улицы DHT-21 за глаза, куда больше влияние имеют завихрения ветра от окружающих датчик предметов, чем сотые точности температуры. А вот иметь один датчик с севера/востока, а второй с юга/запада - очень полезно для правильного определения температуры. И позиционировать его надо подальше от нагревающихся от солнца предметов, от поднимающегося теплого потока воздуха, прямых лучей солнца . И поближе к обдуваем ветеркам. Кстати, потом по разнице в показаниях этих датчиков можно судить был ли день пасмурным (разница не значительная) или солнечным (датчик на солнечной стороне будет намного сильнее нагреваться, чем в тени). Я эту особенность поначалу не замечал, пока ребенок не пришел ко мне с "природознавством", где они отмечают каждый день температуру и облачность. Теперь видно когда в первой половине дня было солнце, а потом пасмурно, или наоборот.

Перед установкой на постоянные места датчиков - произведите их программную калибровку относительно друг-друга. Т.е. продолжительное время понаблюдайте за температурами, которые они отдают, когда находятся друг с другом рядом в одинаковых условиях. DS18B20 врут иногда почти на градус, даже при 11-12 битной настройке. Потом в программе по адресу датчика вносите корректировку к его показаниям.
 
Последнее редактирование:

Иван 32

New member
Оптимизация проводов - я придумал такой термин для описания расположения проводов внутри корпуса устройства. Не люблю когда много проводов и они не очень красиво располагаются, чертова эстетика во всем :)
Про датчики с разных сторон знаю, в гараже, где они функционируют, уже висят таким образом 2 штуки dht22.
BME280 брал на пробу, хотел в корпусе устройства(110*90*70 мм) навести порядок, убрав пару датчиков и заменив их одним. Но не судьба ) буду заказывать второй BME280, а пока он не доехал - вернусь к старому расположению всего в коробочке.
Спасибо за ваши советы, помогли многое понять.
 

gerkimuyda

New member
Попробуйте другой модуль BME280 (не такой-же как брали).
Кстати, BMP280 (у меня в городе 40-50грн) по цене чуть дороже DS18B20 (25-30), в отличии от DHT21 (115 грн) или DHT22 (100грн) или BME280 (195грн)

По давлению прогнозирование бы создать. Нигде не встретил готового алгоритма, только оценочные выводы. Пока накидал для себя простенькое ("К улучшению", "К ухудшению", "Переменная погода") путем подсчета разницы давления за 6 часов и 3 часа, и сравнения этих дельт (в ГектоПаскалях):
PHP:
  if( ($d6h < -3)&&($d3h < -1) ) { $prognozchik = "К ухудшению погоды"; }
  if( ($d6h > 3 )&&($d3h > 1) )  { $prognozchik = "К улучшению погоды"; }
  if( (($d6h < -1)&&($d3h > 1)) || (($d6h > 1)&&($d3h < 1)) ) { $prognozchik = "Переменная погода"; }
 
Последнее редактирование:

Andrey278

New member
Приветствую всех!
Тоже новичок в ESP8266. Постараюсь в тезисах описать проблемы. В прошлом году приобрел WeMos D1 (Arduino compatible, Ver/2015-08). Из всех найденных мной примеров в сети, заработал только: Wemos D1 ESP8266 настройка и первое включение (SoftAP). При попытке завести модуль в STA-режим (Web-server) в serial monitor: .......(not connected)
Вкратце архитектура дом.сети:
Beeline --> rout SmartBox --> HP Probook4530s, Win-10Home (Host + ArduinoIDE +git clone esp8266com + esp8266 2.4.0(!) )
Нашел, что в WeMos свой адрес(lan): 192.168.4.1. В SmartBox (DHCP): 192.168.1.1, соответственно на раздачу: 192.168.1.6х\243. Думал в этом дело, попробовал через WiFiManager сменить адрес(lan) WeMos StaticIP, - тот же результат.
В общем, кто что знает по подобной проблеме, подскажите, пожалуйста.
Вот прилагаю некоторые логи
 

Вложения

Germes31

New member
Не знаю, насколько актуально, у меня вот такой скетч работал:

Код:
#include <math.h>
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

Adafruit_BME280 bme; // I2C

// Replace with your network details
const char* ssid = "NAME";
const char* password = "PASS";
float h, t, p, pin, dp, g;
char temperatureFString[6];
char dpString[6];
char humidityString[6];
char pressureString[7];
char pressureMeterString[6];

WiFiServer server(80);  // Web Server on port 80

// only runs once on boot
void setup() {
  // Initializing serial port for debugging purposes
  Serial.begin(115200);
  delay(10);
  Wire.begin(D3, D4);
  Wire.setClock(100000);
  // Connecting to WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Starting the web server
  server.begin();
  Serial.println("Web server running. Waiting for the ESP IP address...");
  delay(10000);
 
  // Printing the ESP IP address
  Serial.println(WiFi.localIP());
  Serial.println(F("BME280 test"));

  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
}

void getWeather() {
 
    h = bme.readHumidity();
    t = bme.readTemperature();
    g = (17.27*t/(237.7+t))+log(h/100);
    dp = 237.7*g/(17.27-g);
    p = bme.readPressure()*0.750063755419211/100.0F;
    pin = 0.01359543480877*p;
    dtostrf(t, 5, 2, temperatureFString);
    dtostrf(h, 5, 2, humidityString);
    dtostrf(p, 6, 1, pressureString);
    dtostrf(pin, 5, 3, pressureMeterString);
    dtostrf(dp, 5, 2, dpString);
    delay(100);
}

// runs over and over again
void loop() {
  // Listenning for new clients
  WiFiClient client = server.available();
 
  if (client) {
    Serial.println("New client");
    // bolean to locate when the http request ends
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
       
        if (c == '\n' && blank_line) {
            getWeather();
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html; charset=utf-8");
            client.println("Connection: close");
            client.println();
            // your actual web page that displays temperature
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("<head><META HTTP-EQUIV=\"refresh\" CONTENT=\"15\"></head>");
            client.println("<body><h1>ESP8266 метеостанция BME280</h1>");
            client.println("<body><h1>г. Абакан</h1>");
            client.println("<table border=\"2\" width=\"456\" cellpadding=\"10\"><tbody><tr><td>");
            client.println("<h3>Температура = ");
            client.println(temperatureFString);
            client.println("&deg;С</h3><h3>Влажность = ");
            client.println(humidityString);
            client.println("%</h3><h3>Точка росы = ");
            client.println(dpString);
            client.println("&deg;С</h3><h3>Давление = ");
            client.println(pressureString);
            client.println("мм рт.ст. (");
            client.println(pressureMeterString);
            client.println("метра)</h3></td></tr></tbody></table></body></html>"); 
            break;
        }
        if (c == '\n') {
          // when starts reading a new line
          blank_line = true;
        }
        else if (c != '\r') {
          // when finds a character on the current line
          blank_line = false;
        }
      }
    } 
    // closing the client connection
    delay(1);
    client.stop();
    Serial.println("Client disconnected.");
  }
}
 

Andrey278

New member
@Germes31 Спасибо, попробую. После установки плагина к ArduinoIDE- Arduino/filesystem.rst at master · esp8266/Arduino · GitHub ,загрузки скетчей С. Третьякова (где создается SPIFFS-раздел), у меня почти все скетчи заработали на WeMos D1 mini и WeMosD1(Arduino-compatible). Чуть позже напишу работу с DHT22, управление кнопкой, и датчикми газа MQ-XX через BLYNK-проект
 
Сверху Снизу