• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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...
 
Сверху Снизу