ESP12 Проблема с I2C

MihaNN52
Offline
Зарегистрирован: 22.01.2017

Проблема. При подключении датчика BME280 и часов DS3131 к шине I2C.

Беру примеры из библиотек.

Отдельно и BME и часы работают нормально.

Объединяю скетчи - все работает до перезагрузки ESP12E.

После перезагрузки, на первый , а может на пятый раз шина i2c падает.

И не восстанавливает свою работу до тех пор пока не выдерну провод SDA из часов.

После чего снова все работает без проблем до перезагрузки .

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

Из модуля часов выпаял все лишнее -епром подтяжку зарядку.

Менял ESP на wemos d1. nodemcuv3. и просто голую ESP12E. Результат один и тот же.

Менял библиотеки BME и часов на другие - все бестолково.

Думаю есть какая то особенность которую я не учел, возможно что то не так в библиотеке wire.

Не могу понять в чем дело. Скетчи пишу в ардуино IDE 1.8.1 Пробовал менять источник питания и напряжение питание. - так же без результата.

При всем все отлично работает на UNO и STM32.

Длина проводов I2C 5 см.

Все спаял. Подключение -шина.

Подтяжку перебирал от 1-10КОм

 

#include <Wire.h>
#include "RTClib.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
 
 
 
RTC_DS3231 rtc;
unsigned long long time1 = millis();
 
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
unsigned long time1 = 0;
float BME_T;
float BME_H;
float BME_P;
 
void read_sensor() {
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");
    BME_T = bme.readTemperature();
 
    Serial.print("Pressure = ");
 
    Serial.print(bme.readPressure() / 133.322);/// 100.0F
    Serial.println(" hPa");
    BME_P = bme.readPressure() / 133.322;
 
    Serial.print("Approx. Altitude = ");
    Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    Serial.println(" m");
 
    Serial.print("Humidity = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");
    BME_H = bme.readHumidity();
 
    Serial.println();
}
 
void data_time(){
    DateTime now = rtc.now();
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
}
 
 
 
void setup () {
 
#ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif
 
  Serial.begin(9600);
 
  delay(3000); // wait for console opening
 
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
 
  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
 
  ////
  Serial.println(F("BME280 test"));
 
    bool status;
 
    // default settings
    status = bme.begin();
    if (!status) {
        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 () {
 
    DateTime now = rtc.now();
 
 
    if (millis() - time1 >= 5000) {
    time1 = millis();
    data_time();
    read_sensor();
  }
 
 
}

 

Arduino85
Offline
Зарегистрирован: 31.10.2016

Схему подключения отправь. Возможно питание на ESP не хватает.

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

MihaNN52 пишет:

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

Если речь идет об I2C, то параллельное соединение всех резисторов подтяжки должно быть не менее 1.8-2.0к.

MihaNN52
Offline
Зарегистрирован: 22.01.2017

схема

sda - 4

scl - 5

источники питания менял первым делом

подтяжка стоит в BME280 из часов подтяжку убрал

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А GND - GND есть ?

MihaNN52
Offline
Зарегистрирован: 22.01.2017

Виснет SDA в низком уровне при перезапуске

см видео https://www.youtube.com/watch?v=LUvpQ-USbkw&feature=youtu.be

 

да земля есть

Arduino85
Offline
Зарегистрирован: 31.10.2016

Попробуй задержку увеличить

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Причем тут данные. У вас мастер затыкается. Может быть клиент не все данные успевает передать. Попробуйте после перезагрузки подергать scl, импульсов 100 в холостую выдать. Ведомые устройства у вас тоже аппаратно ресетятся ?

MihaNN52
Offline
Зарегистрирован: 22.01.2017

задержка нужна не в сетапе а в основном цикле

достаточно 100мс и все заработало

до этого луп был на миллис