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

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

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

Метки:
  1. MihaNN52

    MihaNN52 Новичок

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

    nikolz Гуру

    Сообщения:
    3.999
    Симпатии:
    426
    возможно там нормально, а здесь возможно -нет.
    Драйверы обращения к железу разные для разных процессоров.
    Попробуйте поставить резисторы в разрыв провода SDA датчиков
    Попробуйте зафиксировать момент зависания т е очередность
    ---------------------------------------
    Дьявол прячется в мелочах.
     
  3. nikolz

    nikolz Гуру

    Сообщения:
    3.999
    Симпатии:
    426
    Теперь непонятно стало.
    Раньше Вы писали что по одному они не зависают, а теперь пишите что BME зависает
     
  4. Юрий Ботов

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

    Сообщения:
    1.040
    Симпатии:
    173
    Пофантазирую: проблема в использовании D2 который GPIO16... Замените на другой вывод (в коде и физически)
     
  5. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    Вот сейчас проверяю все заново.
    Часы отдельно не зависают.
    BME отдельно не зависает.
    Зависает когда подключены вместе. Помогает восстановить работу передергивание часов с макетной платы.
     
  6. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    Да я это делал уже ранее. Не помогло. Это первое что пришло в голову. Сейчас вернул все назад.
     
  7. nikolz

    nikolz Гуру

    Сообщения:
    3.999
    Симпатии:
    426
    Уточните следующее.
    Вы отдельно их подключаете на схеме или отдельно подключаете в программе(коммент обращения )?
    Сделайте эксперимент - то и другое .
     
  8. nikolz

    nikolz Гуру

    Сообщения:
    3.999
    Симпатии:
    426
    вообще-то D2 это GPIO04, а D0 это GPIO16 вnodemcu
     
  9. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    отдельно подключаю на схеме
    сейчас вынул батарейку из часов - все равно виснет.
    нормальная перезагрузка - линии шины высокий уровень
    по каким то причинам часы вешают линию в ноль
    я думал что из-за собственного источника питания, но это тоже не причем.
     
  10. nikolz

    nikolz Гуру

    Сообщения:
    3.999
    Симпатии:
    426
    попробуйте резистор1 ком последовательно поставить
    А как же у Вас все работает в STM32? Там Вы также включаете?
     
  11. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    с резистором на киллоом падает и без перезагрузки. начинает работать несколько сек и зависает SDA-0.65V
    в уно и стм все работает без проблем
     
  12. nikolz

    nikolz Гуру

    Сообщения:
    3.999
    Симпатии:
    426
  13. nikolz

    nikolz Гуру

    Сообщения:
    3.999
    Симпатии:
    426
    Проверьте стабильность питание 3.3 в
    подключите часы и датчик но в программе обратитесь только к датчику
     
  14. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    это чтоб в цикле пауза была...чтоб не выводило без перерыва
     
  15. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    питание норм менял и не раз
    взял пример для BME280 и часы оставил подключенные к шинеI2C - вылетов нет
     
  16. nikolz

    nikolz Гуру

    Сообщения:
    3.999
    Симпатии:
    426
    теперь оставьте BM и запустите часы.
    Потом измените скетч чтобы чередовалась работа с датчиком и часами
     
  17. nikolz

    nikolz Гуру

    Сообщения:
    3.999
    Симпатии:
    426
    Может быть у них адреса пересекаются?
     
  18. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    ребят походу заработало
    сменил библиотеку часов в очередной раз
     
  19. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.127
    Симпатии:
    226
  20. MihaNN52

    MihaNN52 Новичок

    Сообщения:
    78
    Симпатии:
    1
    Сергей спасибо сейчас почитаем. Если сотый раз спрашивают то конечно закрепите.
    В общем последние опыты показали очень странную вещь.
    Вот пример. Цикл Loop крутится с delay.
    Раскрыть Спойлер

    Код (Text):
    1.  
    2.  
    3. #include <Wire.h>
    4. #include <SPI.h>
    5. #include <Adafruit_Sensor.h>
    6. #include <Adafruit_BME280.h>
    7. #define SEALEVELPRESSURE_HPA (1013.25)
    8.  
    9. Adafruit_BME280 bme; // I2C
    10. //Adafruit_BME280 bme(BME_CS); // hardware SPI
    11. //Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
    12.  
    13. unsigned long delayTime;
    14.  
    15. ///
    16. #if defined(ESP8266)
    17. #include <pgmspace.h>
    18. #else
    19. #include <avr/pgmspace.h>
    20. #endif
    21.  
    22. /* for software wire use below
    23. #include <SoftwareWire.h>  // must be included here so that Arduino library object file references work
    24. #include <RtcDS3231.h>
    25.  
    26. SoftwareWire myWire(SDA, SCL);
    27. RtcDS3231<SoftwareWire> Rtc(myWire);
    28. for software wire use above */
    29.  
    30. /* for normal hardware wire use below */
    31. //#include <Wire.h> // must be included here so that Arduino library object file references work
    32. #include <RtcDS3231.h>
    33. RtcDS3231<TwoWire> Rtc(Wire);
    34. /* for normal hardware wire use above */
    35.  
    36. void printValues() {
    37.     Serial.print("Temperature = ");
    38.     Serial.print(bme.readTemperature());
    39.     Serial.println(" *C");
    40.  
    41.     Serial.print("Pressure = ");
    42.  
    43.     Serial.print(bme.readPressure() / 100.0F);
    44.     Serial.println(" hPa");
    45.  
    46.     Serial.print("Approx. Altitude = ");
    47.     Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    48.     Serial.println(" m");
    49.  
    50.     Serial.print("Humidity = ");
    51.     Serial.print(bme.readHumidity());
    52.     Serial.println(" %");
    53.  
    54.     Serial.println();
    55. }
    56. #define countof(a) (sizeof(a) / sizeof(a[0]))
    57.  
    58. void printDateTime(const RtcDateTime& dt)
    59. {
    60.     char datestring[20];
    61.  
    62.     snprintf_P(datestring,
    63.             countof(datestring),
    64.             PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
    65.             dt.Month(),
    66.             dt.Day(),
    67.             dt.Year(),
    68.             dt.Hour(),
    69.             dt.Minute(),
    70.             dt.Second() );
    71.     Serial.print(datestring);
    72. }
    73.  
    74. void setup() {
    75.     Serial.begin(9600);
    76.     Serial.println(F("BME280 test"));
    77.  
    78.     bool status;
    79.  
    80.     // default settings
    81.     status = bme.begin();
    82.    
    83.     if (!status) {
    84.         Serial.println("Could not find a valid BME280 sensor, check wiring!");
    85.         while (1);
    86.     }
    87.  
    88.     Serial.println("-- Default Test --");
    89.     delayTime = 1000;
    90.  
    91.     Serial.println();
    92.  
    93.     delay(100); // let sensor boot up
    94.  
    95.     ////
    96.     Serial.print("compiled: ");
    97.     Serial.print(__DATE__);
    98.     Serial.println(__TIME__);
    99.  
    100.     //--------RTC SETUP ------------
    101.     Rtc.Begin();
    102.  
    103.  
    104.     // if you are using ESP-01 then uncomment the line below to reset the pins to
    105.     // the available pins for SDA, SCL
    106.     // Wire.begin(0, 2); // due to limited pins, use pin 0 and 2 for SDA, SCL
    107.  
    108.     RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
    109.     printDateTime(compiled);
    110.     Serial.println();
    111.  
    112.     if (!Rtc.IsDateTimeValid())
    113.     {
    114.         // Common Cuases:
    115.         //    1) first time you ran and the device wasn't running yet
    116.         //    2) the battery on the device is low or even missing
    117.  
    118.         Serial.println("RTC lost confidence in the DateTime!");
    119.  
    120.         // following line sets the RTC to the date & time this sketch was compiled
    121.         // it will also reset the valid flag internally unless the Rtc device is
    122.         // having an issue
    123.  
    124.         Rtc.SetDateTime(compiled);
    125.     }
    126.  
    127.     if (!Rtc.GetIsRunning())
    128.     {
    129.         Serial.println("RTC was not actively running, starting now");
    130.         Rtc.SetIsRunning(true);
    131.     }
    132.  
    133.     RtcDateTime now = Rtc.GetDateTime();
    134.     if (now < compiled)
    135.     {
    136.         Serial.println("RTC is older than compile time!  (Updating DateTime)");
    137.         Rtc.SetDateTime(compiled);
    138.     }
    139.     else if (now > compiled)
    140.     {
    141.         Serial.println("RTC is newer than compile time. (this is expected)");
    142.     }
    143.     else if (now == compiled)
    144.     {
    145.         Serial.println("RTC is the same as compile time! (not expected but all is fine)");
    146.     }
    147.  
    148.     // never assume the Rtc was last configured by you, so
    149.     // just clear them to your needed state
    150.     Rtc.Enable32kHzPin(false);
    151.     Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone);
    152. }
    153.  
    154.  
    155. void loop() {
    156.     printValues();
    157.      if (!Rtc.IsDateTimeValid())
    158.     {
    159.         // Common Cuases:
    160.         //    1) the battery on the device is low or even missing and the power line was disconnected
    161.         Serial.println("RTC lost confidence in the DateTime!");
    162.     }
    163.  
    164.     RtcDateTime now = Rtc.GetDateTime();
    165.     printDateTime(now);
    166.     Serial.println();
    167.  
    168.     RtcTemperature temp = Rtc.GetTemperature();
    169.     Serial.print(temp.AsFloat());
    170.     Serial.println("C");
    171.  
    172.     delay(delayTime);
    173. }
    174.  
    175.  
    176.  
    177.  

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

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