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

ESP-12E NodeMCU+GY-BMP/E280

Здравствуйте.
На руках имеется ESP12E NodeMCU и датчик - 1 ШТ. GY BME280 3.3 точности высотомер атмосферное давление BME280 модуль датчика купить на AliExpress. Хотелось получить нечто подобное (Making a simple weather web server using ESP8266 and BME280 - Tapatalk), но в мониторе порта выплывает только это:
BME280 test
Could not find a valid BME280 sensor, check wiring!

Soft WDT reset

ctx: cont
sp: 3ffef660 end: 3ffef850 offset: 01b0

>>>stack>>>
3ffef810: 3ffe8484 3ffee6ec 3ffee7f0 402023dd
3ffef820: 3ffe88b0 fa00a8c0 feefeffe feefeffe
3ffef830: 3fffdad0 00000000 3ffee814 402048b0
3ffef840: feefeffe feefeffe 3ffee830 40100718
<<<stack<<<

ets Jan 8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v00000000
~ld

В основном это всегда и появляется, какие бы схемы подключения я не пробовал.
Что это может быть?Неисправен датчик или руки кривые?
 

Arthur

Active member
Код прошивки покажите, будьте так любезны...
И схему, что используете...
P. S. Любит народ задавать вопросы "Ничо не пашет, помогите разобраться", а схему и код прошивки - типа, сами угадайте :)...
 
Код прошивки покажите, будьте так любезны...
И схему, что используете...
P. S. Любит народ задавать вопросы "Ничо не пашет, помогите разобраться", а схему и код прошивки - типа, сами угадайте :)...
Ну, так, а как иначе. На то и новички, чтоб так спрашивать ))) А вы ж на то и спецы, чтоб угадывать ;)

Схема, имеется ввиду схема подключения? Все, как в примере по ссылке, на основе которого и хотел все реализовать. Только у меня остаются два незадействованных контакта на датчике - CSB и SDO.
Код, который заливаю:
Код:
/*********
  Project: BME Weather Web server using NodeMCU
  Implements Adafruit's sensor libraries.
  Complete project is at: http://embedded-lab.com/blog/making-a-simple-weather-web-server-using-esp8266-and-bme280/
 
  Modified code from Rui Santos' Temperature Weather Server posted on http://randomnerdtutorials.com 
*********/

#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 = "ssid";
const char* password = "******";
float h, t, p, pin, dp;
char temperatureFString[6];
char dpString[6];
char humidityString[6];
char pressureString[7];
char pressureInchString[6];

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

// only runs once on boot
void setup() {
  // Initializing serial port for debugging purposes
  Serial.begin(115200);
  delay(10);
  Wire.begin(D4, D3);
  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...");
  delay(10000);
 
  // Printing the ESP IP address
  Serial.println(WiFi.localIP());
  Serial.println(F("BME280 test"));

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

void getWeather() {
 
    h = bme.readHumidity();
    t = bme.readTemperature();
    t = t*1.8+32.0;
    dp = t-0.36*(100.0-h);
   
    p = bme.readPressure()/100.0F;
    pin = 0.02953*p;
    dtostrf(t, 5, 1, temperatureFString);
    dtostrf(h, 5, 1, humidityString);
    dtostrf(p, 6, 1, pressureString);
    dtostrf(pin, 5, 2, pressureInchString);
    dtostrf(dp, 5, 1, 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");
            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 Weather Web Server</h1>");
            client.println("<table border=\"2\" width=\"456\" cellpadding=\"10\"><tbody><tr><td>");
            client.println("<h3>Temperature = ");
            client.println(temperatureFString);
            client.println("&deg;F</h3><h3>Humidity = ");
            client.println(humidityString);
            client.println("%</h3><h3>Approx. Dew Point = ");
            client.println(dpString);
            client.println("&deg;F</h3><h3>Pressure = ");
            client.println(pressureString);
            client.println("hPa (");
            client.println(pressureInchString);
            client.println("Inch)</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.");
  }
}
 
Всё правильно, может крашиться от такого кода. Сами писали? Или отсюдова его брали GitHub - adafruit/Adafruit_BME280_Library: Arduino Library for BME280 sensors ?
Нет, брал отсюда - Making a simple weather web server using ESP8266 and BME280 - Tapatalk
Кстати, и с вашим такая же беда. Правда там я не совсем уверен, что правильно подключаю. Я, к сожалению, ооочень новичок )) да еще и не программер, поэтому для меня готовые решения-мое спасение :) Правда, разбираться готов, и теорию немного знаю. Совсем чуть-чуть :)
 

Arthur

Active member
Покажите, как присоединяете датчик...
Можно фотками, но только чтобы было видно, какой провод куда цепляете...
 

Arthur

Active member
Я бы для надёжности изменил бы код библиотеки, изменив в ней строки
Код:
Wire.begin();
на
Код:
Wire.begin(0, 2);
И выполнил бы рекомпиляцию проекта с предварительной очисткой.
Если бы это не помогло, то стоило бы попробовать выполнить код типа такого

Код:
void I2Cscan()
{
  // scan for i2c devices
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;

  for (address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the 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");

}
чтобы глянуть, видит ли какие устройства еспшка.
Если найдёт какое устройство/адрес, то по данному адресу стоит попробовать считать регистер 0xD0. Если вернёт 0x60, то дальше смотреть.
Пока что это протестируйте...
 
Я бы для надёжности изменил бы код библиотеки, изменив в ней строки
Код:
Wire.begin();
на
Код:
Wire.begin(0, 2);
И выполнил бы рекомпиляцию проекта с предварительной очисткой.
Если бы это не помогло, то стоило бы попробовать выполнить код типа такого

Код:
void I2Cscan()
{
  // scan for i2c devices
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;

  for (address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the 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");

}
чтобы глянуть, видит ли какие устройства еспшка.
Если найдёт какое устройство/адрес, то по данному адресу стоит попробовать считать регистер 0xD0. Если вернёт 0x60, то дальше смотреть.
Пока что это протестируйте...
Исправление библиотеки не помогло. Ситуация та же.

Выполнение кода на поиск устройств при компиляции выдает ошибку:
...In function 'void I2Cscan()':

sketch_dec18b:16: error: 'Wire' was not declared in this scope

Wire.beginTransmission(address);

^

exit status 1
'Wire' was not declared in this scope"

Подсвечивается строка: "Wire.beginTransmission(address);"
 

Arthur

Active member
Хм, а вы как использовали предоставленный мной код? Полный исходник скиньте, пожалуйста.
 

Arthur

Active member
Также, приложите, пожалуйста, код библиотеки, что вы используете... Можно в виде zip архива приложить, аттачем.
 
Хм, а вы как использовали предоставленный мной код? Полный исходник скиньте, пожалуйста.
Код просто скопировал и начал пытаться заливать через Arduino IDE. Надо было как-то по другому?

Код библиотеки во вложении. Адрес в библиотеке правил и на 0X77, и на 0X76, ситуация всегда одинакова.

P.S. Вы уж меня извините, если я где глупости делаю или туплю на очевидных вещах. Как я выше упоминал, я ооооочень новичок во всем этом, и практически уверен, что не работает как раз из-за кривизны моих рук. Именно поэтому и полез за помощью обращаться, чтоб наставили на путь истинный :) И да, спасибо Вам за попытку мне помочь и разобраться в проблеме! :cool:
 

Вложения

Arthur

Active member
Что-то Вы не так скопировали. Лучше весь исходник скиньте, что гадать-то. У вас Wire теперь вне зоны видимости.

Вам бы пообщаться с европейскими или амеровскими коллегами :). Вот они-то уж так всё разжёвывать не будут - просто скажут, в каком направлении копать. Причём, коли сами раскопаете ответ, после наводки-то на правильный ресурс, можете задавать им следующий вопрос. Если не раскопали бы - значит не стоили бы их внимания, их затраченного времени :). У них более жёсткое общение, как правило. Капитализм - хочешь чего-то, соответствуй :).
 
Что-то Вы не так скопировали. Лучше весь исходник скиньте, что гадать-то. У вас Wire теперь вне зоны видимости.

Вам бы пообщаться с европейскими или амеровскими коллегами :). Вот они-то уж так всё разжёвывать не будут - просто скажут, в каком направлении копать. Причём, коли сами раскопаете ответ, после наводки-то на правильный ресурс, можете задавать им следующий вопрос. Если не раскопали бы - значит не стоили бы их внимания, их затраченного времени :). У них более жёсткое общение, как правило. Капитализм - хочешь чего-то, соответствуй :).
Про капитализм все верно )) Но, как мне казалось, русские всегда тем и отличаются, что очень уж мы отзывчивые, добрые и любим помогать )))
За наводку спасибо, буду пробовать по наличию времени :)
 

Arthur

Active member
Про капитализм все верно )) Но, как мне казалось, русские всегда тем и отличаются, что очень уж мы отзывчивые, добрые и любим помогать )))
За наводку спасибо, буду пробовать по наличию времени :)
Полностью с Вами согласен, но просто что-то, как-то, настроения у меня нет и оно лишь ухудшается...
Осознаю просто, что работу сейчас стоящую найти сложно, оклад не растёт, всё дорожает... Что в ближайшее время машину покупать нереально - и цены выросли, да и вообще, как-то всё... Не так, как Я хотел бы, как ожидал...
Помочь Я всегда рад, но, видимо, понимаю, что Новый Год скоро, а настрой вообще не праздничный, из-за этого настроение на нуле (((...
 
Полностью с Вами согласен, но просто что-то, как-то, настроения у меня нет и оно лишь ухудшается...
Осознаю просто, что работу сейчас стоящую найти сложно, оклад не растёт, всё дорожает... Что в ближайшее время машину покупать нереально - и цены выросли, да и вообще, как-то всё... Не так, как Я хотел бы, как ожидал...
Помочь Я всегда рад, но, видимо, понимаю, что Новый Год скоро, а настрой вообще не праздничный, из-за этого настроение на нуле (((...
Как я Вас понимаю...
 

SuperBoss

Member
Адрес у BME может быть 0х77 или 0х76. Библиотека от адафрута заточена по умолчанию на 0х77, а датчик установлен на 0х76. Нужно в begin добавить 0х76.
 
В общем, дорогие друзья, всем спасибо за помощь. Все заработало. Почему у меня раньше не получалось? Наверное, был не в себе....В общем подытожу:
Датчик - GY-BMP/E280
Плата - NodeMCU (с чипом CH340G)
Подключение по следующей схеме:
(BME280---NodeMCU)
VIN--3.3V
GND--GND
SCL--D4
SDA--D3
CSB--не подсоединен
SDO--не подсоединен

Использовал стандартный скетч BME280_Test. Правил файл BME280.cpp (вместо "Wire.begin();" ставим "Wire.begin(0, 2);"), далее в файле BME280.h исправляем адрес у BME (вместо "0х77" ставим "0х76")

При таких действиях все работает!
 

Иван 32

New member
Всем привет. Опробовал способы что указаны на этом форуме, но так и не смог запустить NodeMCU (с чипом CH340G) + GY-BMP/E280
Только в отличии от автора темы, датчик имеет только 4 пина и выглядит вот так 3In1 BME280 GY BME280 цифровой Сенсор SPI I2C влажность Температура and атмосферное Давление Сенсор модуль 1.8 5 В DC Высокое Точность купить на AliExpress
Подключение использую такое же как у автора
(BME280---NodeMCU)
VIN--3.3V
GND--GND
SCL--D4
SDA--D3

Скетч беру отсюда GitHub - adafruit/Adafruit_BME280_Library: Arduino Library for BME280 sensors , называется скетч bme280test

Пробовал и менять файл Adafruit_BME280.h (указывал адрес 0x77 и 0x76) и указывать в коде данный параметр
Код:
 status = bme.begin(0x76);
Ответ от датчика всегда один и тот же:
Код:
Soft WDT reset

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

>>>stack>>>
3ffef660:  3fffdad0 00000000 3ffee63c 402020c1 
3ffef670:  feefeffe feefeffe 3ffee658 402039bc 
3ffef680:  feefeffe feefeffe 3ffee670 40100114 
<<<stack<<<
ЖеЦФ…rюDHъBME280 test
Could not find a valid BME280 sensor, check wiring!
Если взять код i2c сканера, который предложил Arthur - то ответ всегда будет
"No I2C devices found"
Провода проверил мультиметром, питание есть, 3,29в (мало ли :) )

Помогите, пожалуйста, заставить эту железяку работать.
 

gerkimuyda

New member
Пробовал и менять файл Adafruit_BME280.h (указывал адрес 0x77 и 0x76) и указывать в коде данный параметр
Код:
 status = bme.begin(0x76);
У меня сделано так (чтобы конкретно задать пины):
Код:
#include <Wire.h>
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp280;

Wire.begin(5/*D1*/, 4/*D2*/); delay(10);
if (!bmp280.begin()) { Serial.print("BMP280: Sensor not found!\n"); periodBMP280=0; }
По вашей ссылке четко написано: "SPI: SDA/SCL default to pins 4 & 5 but any two pins can be assigned as SDA/SCL using Wire.begin(SDA,SCL)"
А вы подключили к 3 и 4. Т.е. - или переключите, или переделайте (а можно и то и то проверить)

------
В самой Adafruit-библиотеке пины SDA и SCL не задаются, а берутся стандартные из Wire.h
смотрим файл:
hardware/esp8266/2.3.0/variants/nodemcu/pins_arduino.h
Код:
static const uint8_t SDA = 4;
static const uint8_t SCL = 5;
 
Последнее редактирование:
Сверху Снизу