ESP12 Проблема с I2C
- Войдите на сайт для отправки комментариев
Проблема. При подключении датчика 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(); } }
Схему подключения отправь. Возможно питание на ESP не хватает.
Подтяжка стоит и в BME и в модуле часов.
Если речь идет об I2C, то параллельное соединение всех резисторов подтяжки должно быть не менее 1.8-2.0к.
схема
sda - 4
scl - 5
источники питания менял первым делом
подтяжка стоит в BME280 из часов подтяжку убрал
А GND - GND есть ?
Виснет SDA в низком уровне при перезапуске
см видео https://www.youtube.com/watch?v=LUvpQ-USbkw&feature=youtu.be
да земля есть
Попробуй задержку увеличить
Причем тут данные. У вас мастер затыкается. Может быть клиент не все данные успевает передать. Попробуйте после перезагрузки подергать scl, импульсов 100 в холостую выдать. Ведомые устройства у вас тоже аппаратно ресетятся ?
задержка нужна не в сетапе а в основном цикле
достаточно 100мс и все заработало
до этого луп был на миллис