Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Железные вопросы по esp8266", создана пользователем MihaNN52, 18 апр 2017.

Метки:
  1. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    Проблема. При подключении датчика BME280 и часов DS3131 к шине I2C.
    Беру примеры из библиотек.
    Отдельно и BME и часы работают нормально.
    Объединяю скетчи - все работает до перезагрузки ESP12E.
    После перезагрузки, на первый , а может на пятый раз шина i2c падает.
    И не восстанавливает свою работу до тех пор пока не выдерну провод SDA из часов.
    После чего снова все работает без проблем до перезагрузки .
    Подтяжка стоит и в BME и в модуле часов.
    Из модуля часов выпаял все лишнее -епром подтяжку зарядку.
    Менял ESP на wemos d1. nodemcuv3. и просто голую ESP12E. Результат один и тот же.
    Менял библиотеки BME и часов на другие - все бестолково.
    Думаю есть какая то особенность которую я не учел, возможно что то не так в библиотеке wire.
    Не могу понять в чем дело. Скетчи пишу в ардуино IDE 1.8.1 Пробовал менять источник питания и напряжение питание. - так же без результата.
    При всем все отлично работает на UNO и STM32.

    Код (Text):
    1.  
    2. #include <Wire.h>
    3. #include "RTClib.h"
    4. #include <Adafruit_Sensor.h>
    5. #include <Adafruit_BME280.h>
    6. #define SEALEVELPRESSURE_HPA (1013.25)
    7. Adafruit_BME280 bme; // I2C
    8.  
    9.  
    10.  
    11. RTC_DS3231 rtc;
    12. unsigned long long time1 = millis();
    13.  
    14. char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    15. unsigned long time1 = 0;
    16. float BME_T;
    17. float BME_H;
    18. float BME_P;
    19.  
    20. void read_sensor() {
    21.     Serial.print("Temperature = ");
    22.     Serial.print(bme.readTemperature());
    23.     Serial.println(" *C");
    24.     BME_T = bme.readTemperature();
    25.  
    26.     Serial.print("Pressure = ");
    27.  
    28.     Serial.print(bme.readPressure() / 133.322);/// 100.0F
    29.     Serial.println(" hPa");
    30.     BME_P = bme.readPressure() / 133.322;
    31.  
    32.     Serial.print("Approx. Altitude = ");
    33.     Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    34.     Serial.println(" m");
    35.  
    36.     Serial.print("Humidity = ");
    37.     Serial.print(bme.readHumidity());
    38.     Serial.println(" %");
    39.     BME_H = bme.readHumidity();
    40.  
    41.     Serial.println();
    42. }
    43.  
    44. void data_time(){
    45.     DateTime now = rtc.now();
    46.     Serial.print(now.year(), DEC);
    47.     Serial.print('/');
    48.     Serial.print(now.month(), DEC);
    49.     Serial.print('/');
    50.     Serial.print(now.day(), DEC);
    51.     Serial.print(" (");
    52.     Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    53.     Serial.print(") ");
    54.     Serial.print(now.hour(), DEC);
    55.     Serial.print(':');
    56.     Serial.print(now.minute(), DEC);
    57.     Serial.print(':');
    58.     Serial.print(now.second(), DEC);
    59.     Serial.println();
    60. }
    61.  
    62.  
    63.  
    64. void setup () {
    65.  
    66. #ifndef ESP8266
    67.   while (!Serial); // for Leonardo/Micro/Zero
    68. #endif
    69.  
    70.   Serial.begin(9600);
    71.  
    72.   delay(3000); // wait for console opening
    73.  
    74.   if (! rtc.begin()) {
    75.     Serial.println("Couldn't find RTC");
    76.     while (1);
    77.   }
    78.  
    79.   if (rtc.lostPower()) {
    80.     Serial.println("RTC lost power, lets set the time!");
    81.     // following line sets the RTC to the date & time this sketch was compiled
    82.     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    83.     // This line sets the RTC with an explicit date & time, for example to set
    84.     // January 21, 2014 at 3am you would call:
    85.     // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
    86.   }
    87.  
    88.   ////
    89.   Serial.println(F("BME280 test"));
    90.  
    91.     bool status;
    92.  
    93.     // default settings
    94.     status = bme.begin();
    95.     if (!status) {
    96.         Serial.println("Could not find a valid BME280 sensor, check wiring!");
    97.         while (1);
    98.     }
    99.  
    100.     Serial.println("-- Default Test --");
    101.     //delayTime = 1000;
    102.  
    103.     Serial.println();
    104.  
    105.     delay(100); // let sensor boot up
    106.     ////
    107.  
    108. }
    109.  
    110. void loop () {
    111.  
    112.     DateTime now = rtc.now();
    113.  
    114.  
    115.     if (millis() - time1 >= 5000) {
    116.     time1 = millis();
    117.     data_time();
    118.     read_sensor();
    119.   }
    120.  
    121.  
    122. }
    123.  
     
    Последнее редактирование: 18 апр 2017
  2. Юрий Ботов

    Юрий Ботов Moderator Команда форума

    Сообщения:
    1.052
    Симпатии:
    175
    "Ветви" длинные?
    Физическое подключение реально "шина" или "звезда"?
     
  3. rst

    rst Читатель

    Сообщения:
    253
    Симпатии:
    7
    Сталкивался с подобной проблемой на ESP8266.
    Есть устройство (на EVB). В нём одна шина I2C и на ней 3 слэйва. При отключенном ESP устройство работает без сбоев часами (запускал на сутки). Написал даже тест, который грузит I2C на 100% непрерывным обменом поочерёдно со всеми слэйвами на макс. частоте - ни одного сбоя за весь день.
    Как только начинаешь обмен с ESP (просто начинаешь периодически подавать команду AT+GMR даже без выхода ESP в эфир) - уже через несколько секунд происходит сбой обмена на одном из слэйвов. Обычно это сбой или Arbitration lost или Bus error или просто NACK на очередной байт.
    Понятно, что помеха прёт от ESP. И понятно, что по питанию или сигнальным линиям (UART + GPIO).
    Но что только ни делал - ничего не помогло. Навесил блокировочных кондёров везде где можно у всех потребителей питания причём от 100nF до 10мкФ керамики, развязал ESP8266 по линии питания и по GND дросселями, навесил на все сигнальные линии ESP последовательные резисторы, запитал даже от отдельной цепочки DC-DC + LDO питающейся даже от отдельной розетки 220V, уменьшил сопротивление подтяжек I2C до малых номиналов (до ~1кОм), раскидал эти подтяжки по плате к слэйвам. Ничего не помогает. Единственное, что после этих мер число сбоев уменьшилось кратно, но один фиг - работает максимум минуту потом обязательно сбой, а чаще - уже через неск. секунд сбой.
    Потом всё-таки нашёл решение. Оно плохое, но пока другого решения не вижу. Сделал сигнал SCLK активным. После этого все сбои как рукой сняло. Работает по много часов с интенсивным обменом по эфиру и через UART с ESP8266 и по I2C - ни одного сбоя.
    Это конечно неправильно так делать (активный SCLK), но по-другому никак. :(:(:(:(
     
    Последнее редактирование: 18 апр 2017
  4. rst

    rst Читатель

    Сообщения:
    253
    Симпатии:
    7
    Шина I2C у меня длиной максимум до 10см. А один из слэйвов вообще - меньше 1см от проца. В то время как провода до ESP - около 10см. Снижение частоты SCLK тоже не помогает.
     
  5. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    шина.
    от esp к BME280 c него на часы
    подтяжку перебирал от 1-10КОм
    длина проводов 10см(не думаю сто больше)
    сейчас поставил транзистор который дергает SDA если часы несут пургу)) но хотелось бы решение нормальное.
     
  6. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    уменьшил длину проводов до 5см. ситуацию не изменило
    наверное придется ставить второй контроллер для датчиков, а есп как вифи...
    может есть у кого предположения что может это быть? кроме моих кривых рук)))
     
  7. rst

    rst Читатель

    Сообщения:
    253
    Симпатии:
    7
    А мои сообщения не видно что-ль? :confused:
     
  8. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    >Сделал сигнал SCLK активным
    Давайте попробуем)) ккак это сделать?
     
  9. rst

    rst Читатель

    Сообщения:
    253
    Симпатии:
    7
    Нормально по стандарту он должен быть oped drain, я его сделал push-pull (включил транзистор верхнего плеча).
    Так можно делать только если у Вас один мастер на шине. Да и то это неправильно конечно, но по-другому мне не удалось победить :(
     
  10. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    ну это не мой вариант
     
  11. nikolz

    nikolz Гуру

    Сообщения:
    4.706
    Симпатии:
    452
    Могу предположить следующее.
    Провода не виноваты , поэтому не надо над ними издеваться.
    Я бы посмотрел на состояние SDA в момент залипания.
    предположу что часы виснут в режиме вывода на SDA нуля. в результате на SDA всегда ноль т е кз.
    Возможно надо создать третье состояние (вкл диод) или еще что-то.
    но сначала посмотрите что там.
     
    MihaNN52 нравится это.
  12. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    да так и есть SCL подымается в высокий а SDA остается в нуле и не работает. Если SDA подымается вместе SCL то все работает.
    Чито делать то?))
     
  13. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
  14. nikolz

    nikolz Гуру

    Сообщения:
    4.706
    Симпатии:
    452
    схему покажите.
     
  15. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    BME 280 и часы имеют свою подтяжку. Но на осциллографе фронты становятся ровными при доп подтяжке 1КОм . Расположение пинов датчиков отличаются от реального но это ни чего не меняет.
    Раскрыть Спойлер

    [​IMG]
     
    Последнее редактирование: 19 апр 2017
  16. nikolz

    nikolz Гуру

    Сообщения:
    4.706
    Симпатии:
    452
    для начала давайте выкинем ваши подтяжки и посмотрим результат.
     
  17. nikolz

    nikolz Гуру

    Сообщения:
    4.706
    Симпатии:
    452
    еще я бы предположил что проблема в софте
    Например, возникает одновременная готовность, либо чтение второго датчика начинается до завершения работы с первым. Возможно где-то надо добавить задержку или сделать флаг готовности.
    Но это лишь рабочие гипотезы.
     
  18. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    я выкидывал
    все тоже самое только передний фронт заваливается
    вот без внешних подтяжек в 1КОм
    1.JPG

    момент зависания выглядит так же
    2.JPG

    так с подтяжкой в 1 КОм
    1k2.JPG
     
  19. nikolz

    nikolz Гуру

    Сообщения:
    4.706
    Симпатии:
    452
    Если резисторы не влияют то нафига их ставить.
    Момент зависания пока не ясен.
    ---------------------
    Правильно я понял, что подключены оба. Но обращаетесь к одному - проблем нет.
    Тогда надо смотреть софт.
     
  20. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    по проблеме в софте - этот же скетч работает без нареканий в UNO и STM32
    у меня есть проект на stm32 где и часы и бме живут вместе и все норм
     

Поделиться этой страницей