• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом Как использовать все контакты ESP8266-01

selan61

Member
На новой библиотеке Wire по шине I2C подключил 3 датчика RTC_SI7021_BMP280. Проверено на пинах 0,2 и 1,3 ESP01.
Подключение выполнено по рисунку
ESP_01_I2C.jpg
Новая библиотека Wire GitHub - enjoyneering/ESP8266-I2C-Driver: Bug fixes of native Arduino ESP8266 core I2C Driver
Консультация разработчика Исправленная Wire библиотека для Arduino ESP8266 core
Скетч
Код:
//Проверка работы шины I2C с новой библиотекой Wire 
//на датчиках SI7021, RTC, BMP280 с ESP01 на пинах 0-SDA, 2-SCL

#include <Wire.h>       //I2C library
#include <SI7021.h>     //I2C SI7021
#include <RtcDS3231.h>  //RTC library
#include <Adafruit_BMP280.h>

#define SDA 0 // GPIO0 on ESP-01 module
#define SCL 2 // GPIO2 on ESP-01 module

Adafruit_BMP280 bmp; // I2C 
SI7021 sensor;
RtcDS3231<TwoWire> rtcObject(Wire); //Uncomment for version 2.0.0 of the rtc library

void setup() {
  Wire.begin(SDA,SCL); // SDA SCL I2C
  sensor.begin(SDA,SCL);
  Serial.begin(115200);  //Starts serial connection
  rtcObject.Begin();     //Starts I2C

 if (!bmp.begin(0x76)) { 
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }
 
  RtcDateTime currentTime = RtcDateTime(18, 01, 16, 17, 30, 0); //define DATE and TIME
  rtcObject.SetDateTime(currentTime); //configure the RTC with object

}

void loop() {

  RtcDateTime currentTime = rtcObject.GetDateTime();    //get the time from the RTC
  char str[15];   //declare a string as an array of chars
  sprintf(str, "%d/%d/%d %d:%d:%d",     //%d allows to print an integer to the string
          currentTime.Year(),   //get year method
          currentTime.Month(),  //get month method
          currentTime.Day(),    //get day method
          currentTime.Hour(),   //get hour method
          currentTime.Minute(), //get minute method
          currentTime.Second()  //get second method
         );
  Serial.println(str); //print the string to the serial port
 
  // temperature is an integer in hundredths
    float temperature = sensor.getCelsiusHundredths();
    temperature = temperature / 100;
   
   Serial.print(F("temperature-")); 
   Serial.println(temperature); 
       
    // humidity is an integer representing percent
    float humidity = sensor.getHumidityPercent();
    Serial.print(F("humidity-")); 
    Serial.println(humidity); 

    Serial.print(F("Temperature = "));
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");
   
    Serial.print(F("Pressure = "));
    Serial.print(bmp.readPressure()/133.3);
    Serial.println(" mmhg");

    Serial.print(F("Approx altitude = "));
    Serial.print(bmp.readAltitude(1013.25)); // this should be adjusted to your local forcase
    Serial.println(" m"); 
    Serial.println();

  delay(20000); //20 seconds delay

}
 

selan61

Member
@selan61 у меня и на стандартной библиотеки прекрасно работал экран по I2C на пинах RX, TX.
Возможно. Но как пишет автор
Пока на шине одно устройство, все еще как то работает. Стоит добавить еще сенсоров - модуль начинает виснуть и перегружаться.
Поэтому решил попробовать новую библиотеку. Три датчика и OLED LCD прекрасно работают долгое время. Поэтому и поделился.
 

Алексей.

Active member
у меня и на стандартной библиотеки прекрасно работал экран по I2C на пинах RX, TX.
как решали вывод лога ошибок?
я перевешивал вывод через os_install_putc1 на свою функцию в которой логировал в udp, вроде не плохо, os_printf перенаправлялся, а вот сообщения об ошибках всё равно выводились на TX
 

Сергей_Ф

Moderator
Команда форума
@Алексей.
А что там решать? В Ардуино ИДЕ отладочный вывод подавляется, вроде, при инициализации этих пинов как обычных портов.
 

selan61

Member
@selan61 а зачем новую тему создали? Почему не ответили в теме автора https://esp8266.ru/forum/threads/is...oteka-dlja-arduino-esp8266-byla-udalena.2928/ ? Он же там просил отзыв оставлять.
К сожалению эту тему не видел. Для меня, как начинающего, полученная возможность использовать все пины ESP01, показалась существенной. Поэтому и поделился. Но если Вы считаете эту тему лишней, её можно удалить. Я не обижусь.
 

pvvx

Активный участник сообщества
Подключение выполнено по рисунку
Посмотреть вложение 5539
На GPOI0 при старте модуля выводиться 26MHz до запуска инициализации SDK, в режиме программирования - постоянно. А вы его на "gnd"...
Сигналы SCL и SDA должны выводиться на шину в режиме вывода "открытый коллектор". Многие устройства имеют совмещенную спецификацию I2C с SMBus. При этом устройство управляет удержанием сигнала SCL на шине мастеру в "0" для обеспечения синхронизации - вывод сигнала ожидания... Т.е. будет КЗ.
Поддержки этого не наблюдается в данной либе. :(
В итоге заявление о исправлении либы в корне неверно. Такая-же глючная либа для Arduino что и другие. Проблемы кроются в самом концепте Arduino - при установке вывода в режим "открытый коллектор" в Arduino сигналы управления им и считывания инвертируются. :D Такой стандарт в Arduino выдуман домохозяйкой, как и многое другое в ней.
 
Последнее редактирование:

enjoynering

Well-known member
На GPOI0 при старте модуля выводиться 26MHz до запуска инициализации SDK, в режиме программирования - постоянно. А вы его на "gnd"...
Сигналы SCL и SDA должны выводиться на шину в режиме вывода "открытый коллектор". Многие устройства имеют совмещенную спецификацию I2C с SMBus. При этом устройство управляет удержанием сигнала SCL на шине мастеру в "0" для обеспечения синхронизации - вывод сигнала ожидания... Т.е. будет КЗ.
Поддержки этого не наблюдается в данной либе. :(
В итоге заявление о исправлении либы в корне неверно. Такая-же глючная либа для Arduino что и другие. Проблемы кроются в самом концепте Arduino - при установке вывода в режим "открытый коллектор" в Arduino сигналы управления им и считывания инвертируются. :D Такой стандарт в Arduino выдуман домохозяйкой, как и многое другое в ней.
Ну какое кз??? Просто коллектор сядет на землю через резистор подтяжки в 4.7кОм!!! Это штатная ситуация для i2c шины. Где кз объясните?

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

Алексей.

Active member
А что там решать? В Ардуино ИДЕ отладочный вывод подавляется, вроде, при инициализации этих пинов как обычных портов.
Вы меня не поняли, отладочный лог как раз выводится куда нужно, а сообщения об ошибках например wdt reset, по прежнему выводится в уарт.
 

pvvx

Активный участник сообщества
Ну какое кз??? Просто коллектор сядет на землю через резистор подтяжки в 4.7кОм!!! Это штатная ситуация для i2c шины. Где кз объясните?

i2c без подтяжки к земле работать не будет, как раз из-за открытого коллектора.
Это если в реализации дров сделан вывод CLK через эмуляцию "открытый коллектор".
---
В данной либе, из первого соо, он сделан, т.е. работа идет не через стандартные либы Arduino.
Но в схеме у TC стоят резисторы в 300 Ом и подтяжка в 3.3 кОм, что может привести к нестабильной работе нескольких I2C устройств :)
Подтяжка в 4.7 кОм мала для скоростей 400 кГц на I2C с несколькими устройствами или одним на проводе от 30..50 см. Будут сбои.
Если устройства висят на выводах управления типом загрузки ESP8266, то возможны "зависоны" при рестарте, т.к. напряжение на этих входах/выходах могут быть в "0" при защелкивании по фронту RESET. Сказывается и на софт-рестарт. Может перезагрузиться в режим "программирования", или "go boot", или ... на этом и "повиснет".
Вы меня не поняли, отладочный лог как раз выводится куда нужно, а сообщения об ошибках например wdt reset, по прежнему выводится в уарт.
Это сообщение при рестарте, после сброса?
Стандартными методами стартовый вывод в GPIO0, TX(GPIO1), TX2(GPIO2) у ESP8266 не отключается.
На них будут все КЗ, которые только возможны при подключении туда I2C.
Примерно то, что твориться на этих выводах во время старта:
https://raw.githubusercontent.com/pvvx/Rapid_Loader/master/ESP-01-StartSignals.gif
Время вывода 26 МНz на GPIO0 и кол-во выходящих из ESP8266 сообщений на TX/TX2 в Arduino будет больше не менее чем в 2 раза, т.к. это диаграмма для специального ускоренного загрузчика как раз уменьшающего это время (время до старта SDK) и кол-во выводов всяких сообщений при старте/рестарте...
 
Последнее редактирование:

enjoynering

Well-known member
С потенциальной нестабильностью во время загрузки esp8266-01 согласен, а с кз нет. Не будет там его из-за подтягивающего(нагрузочного) к земле резистора в 4.7к (именно такой номинал ставят китайцы на все платы с i2c итерфейсом)
 

iGureev

New member
Подкину свои 5ть копеек.
Если собрать такую схему, то какие ещё интерфейсы можно будет использовать одновременно с I2С?
Например, мне ,в идеале, хотелось бы подцепить пару сенсоров с I2C, готовую плату с алика DHT22, и, возможно, что-то на UART...
 
Сверху Снизу