• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом ESP12 Проблема с одновременной работой двух модулей I2C

MihaNN52

Member
я кстати пробовал ставить разные задержки в сетапе - не помогло (от 300 до 3000мс)
раньше попадал на проблему с зависание с подключенным только одним BME280
сейчас попробую это повторить
момент зависания приходит не в основном цикле а при инициализации датчиков на сколько я понимаю.
 

nikolz

Well-known member
по проблеме в софте - этот же скетч работает без нареканий в UNO и STM32
у меня есть проект на stm32 где и часы и бме живут вместе и все норм
возможно там нормально, а здесь возможно -нет.
Драйверы обращения к железу разные для разных процессоров.
Попробуйте поставить резисторы в разрыв провода SDA датчиков
Попробуйте зафиксировать момент зависания т е очередность
---------------------------------------
Дьявол прячется в мелочах.
 

nikolz

Well-known member
я кстати пробовал ставить разные задержки в сетапе - не помогло (от 300 до 3000мс)
раньше попадал на проблему с зависание с подключенным только одним BME280
сейчас попробую это повторить
момент зависания приходит не в основном цикле а при инициализации датчиков на сколько я понимаю.
Теперь непонятно стало.
Раньше Вы писали что по одному они не зависают, а теперь пишите что BME зависает
 

Юрий Ботов

Moderator
Команда форума
Пофантазирую: проблема в использовании D2 который GPIO16... Замените на другой вывод (в коде и физически)
 

MihaNN52

Member
Вот сейчас проверяю все заново.
Часы отдельно не зависают.
BME отдельно не зависает.
Зависает когда подключены вместе. Помогает восстановить работу передергивание часов с макетной платы.
 

nikolz

Well-known member
Вот сейчас проверяю все заново.
Часы отдельно не зависают.
BME отдельно не зависает.
Зависает когда подключены вместе. Помогает восстановить работу передергивание часов с макетной платы.
Уточните следующее.
Вы отдельно их подключаете на схеме или отдельно подключаете в программе(коммент обращения )?
Сделайте эксперимент - то и другое .
 

MihaNN52

Member
отдельно подключаю на схеме
сейчас вынул батарейку из часов - все равно виснет.
нормальная перезагрузка - линии шины высокий уровень
по каким то причинам часы вешают линию в ноль
я думал что из-за собственного источника питания, но это тоже не причем.
 

nikolz

Well-known member
отдельно подключаю на схеме
сейчас вынул батарейку из часов - все равно виснет.
нормальная перезагрузка - линии шины высокий уровень
по каким то причинам часы вешают линию в ноль
я думал что из-за собственного источника питания, но это тоже не причем.
попробуйте резистор1 ком последовательно поставить
А как же у Вас все работает в STM32? Там Вы также включаете?
 

MihaNN52

Member
с резистором на киллоом падает и без перезагрузки. начинает работать несколько сек и зависает SDA-0.65V
в уно и стм все работает без проблем
 

nikolz

Well-known member
с резистором на киллоом падает и без перезагрузки. начинает работать несколько сек и зависает SDA-0.65V
в уно и стм все работает без проблем
Проверьте стабильность питание 3.3 в
подключите часы и датчик но в программе обратитесь только к датчику
 

MihaNN52

Member
питание норм менял и не раз
взял пример для BME280 и часы оставил подключенные к шинеI2C - вылетов нет
 

MihaNN52

Member
ребят походу заработало
сменил библиотеку часов в очередной раз
 

MihaNN52

Member
Сергей спасибо сейчас почитаем. Если сотый раз спрашивают то конечно закрепите.
В общем последние опыты показали очень странную вещь.
Вот пример. Цикл Loop крутится с delay.
Код:
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#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;

///
#if defined(ESP8266)
#include <pgmspace.h>
#else
#include <avr/pgmspace.h>
#endif

/* for software wire use below
#include <SoftwareWire.h>  // must be included here so that Arduino library object file references work
#include <RtcDS3231.h>

SoftwareWire myWire(SDA, SCL);
RtcDS3231<SoftwareWire> Rtc(myWire);
for software wire use above */

/* for normal hardware wire use below */
//#include <Wire.h> // must be included here so that Arduino library object file references work
#include <RtcDS3231.h>
RtcDS3231<TwoWire> Rtc(Wire);
/* for normal hardware wire use above */

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();
}
#define countof(a) (sizeof(a) / sizeof(a[0]))

void printDateTime(const RtcDateTime& dt)
{
    char datestring[20];

    snprintf_P(datestring,
            countof(datestring),
            PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
            dt.Month(),
            dt.Day(),
            dt.Year(),
            dt.Hour(),
            dt.Minute(),
            dt.Second() );
    Serial.print(datestring);
}

void setup() {
    Serial.begin(9600);
    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

    ////
    Serial.print("compiled: ");
    Serial.print(__DATE__);
    Serial.println(__TIME__);

    //--------RTC SETUP ------------
    Rtc.Begin();
 

    // if you are using ESP-01 then uncomment the line below to reset the pins to
    // the available pins for SDA, SCL
    // Wire.begin(0, 2); // due to limited pins, use pin 0 and 2 for SDA, SCL

    RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
    printDateTime(compiled);
    Serial.println();

    if (!Rtc.IsDateTimeValid())
    {
        // Common Cuases:
        //    1) first time you ran and the device wasn't running yet
        //    2) the battery on the device is low or even missing

        Serial.println("RTC lost confidence in the DateTime!");

        // following line sets the RTC to the date & time this sketch was compiled
        // it will also reset the valid flag internally unless the Rtc device is
        // having an issue

        Rtc.SetDateTime(compiled);
    }

    if (!Rtc.GetIsRunning())
    {
        Serial.println("RTC was not actively running, starting now");
        Rtc.SetIsRunning(true);
    }

    RtcDateTime now = Rtc.GetDateTime();
    if (now < compiled)
    {
        Serial.println("RTC is older than compile time!  (Updating DateTime)");
        Rtc.SetDateTime(compiled);
    }
    else if (now > compiled)
    {
        Serial.println("RTC is newer than compile time. (this is expected)");
    }
    else if (now == compiled)
    {
        Serial.println("RTC is the same as compile time! (not expected but all is fine)");
    }

    // never assume the Rtc was last configured by you, so
    // just clear them to your needed state
    Rtc.Enable32kHzPin(false);
    Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone);
}


void loop() {
    printValues();
     if (!Rtc.IsDateTimeValid())
    {
        // Common Cuases:
        //    1) the battery on the device is low or even missing and the power line was disconnected
        Serial.println("RTC lost confidence in the DateTime!");
    }

    RtcDateTime now = Rtc.GetDateTime();
    printDateTime(now);
    Serial.println();

    RtcTemperature temp = Rtc.GetTemperature();
    Serial.print(temp.AsFloat());
    Serial.println("C");

    delay(delayTime);
}
Все работает замечательно. Даже если датчик BME вдруг не инициализировался то через 2-3 сек все встает в норму.
Ну я думаю что раз все работает накачу ка я свой код.
Заливаю.... и снова та же картинка.
Методом тыка понимаю что как только я вставляю свой код в loop неприятность опять вылазит.
Убираю код из loop...сабака работает. Код простой там нет ниче такого. Но нет задержек. Все на millis();
И что вы думаете? добавляю delay(100); И все работает.
Мая в недоумении. Обычно наоборот, стараюсь не использовать задержки.
 
Сверху Снизу