I2c на других пинах в ардуино нано

Тема в разделе "Arduino & Shields", создана пользователем Leshik, 27 апр 2020.

  1. Leshik

    Leshik Нуб

    Имеем ардуино нано, OLED дисплей, датчик BME280.
    Библиотека OLED_I2C без проблем позволяет поменять пины шины i2c.
    Код (C++):
    #include <OLED_I2C.h>
    OLED  myOLED(2, 3, 8); // 2pin - SDA , 3pin - SCL
    Есть пример для BME280 на ESP32
    Код (C++):
    #include <Wire.h>
    #include <Adafruit_Sensor.h>
    #include <Adafruit_BME280.h>

    #define I2C_SDA 33
    #define I2C_SCL 32

    #define SEALEVELPRESSURE_HPA (1013.25)

    TwoWire I2CBME = TwoWire(0);
    Adafruit_BME280 bme;

    unsigned long delayTime;

    void setup() {
      Serial.begin(115200);
      Serial.println(F("BME280 test"));
      I2CBME.begin(I2C_SDA, I2C_SCL, 100000);

      bool status;

      status = bme.begin(0x76, &I2CBME);
      if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
      }
    Но он не компилируется на ардуино нано, ругается на строку "TwoWire I2CBME = TwoWire(0);"
    no matching function for call to 'TwoWire::TwoWire(int)'
    Если при компиляции выбрать плату DOIT ESP32 DEVKIT V1, то ошибок нет.
    Подскажите как заставить библиотеку Wire работать на нано.
    Вопросов: "зачем нужна шина на нестандартных пинах" просьба не задавать.
     
  2. a1000

    a1000 Гик

    Может по тому, что на нано нет пинов 33 и 32?
     
    Igor68 и NikitOS нравится это.
  3. Leshik

    Leshik Нуб

    Ну да, ошибся, приводя пример. Но пробовал именно с #define I2C_SDA 2 и #define I2C_SCL 3
     
  4. b707

    b707 Гуру

    Стандартная библиотека Wire на Нано ни на каких пинах, кроме А4 А5 - работать не будет.
    ищите в гугле как запустить Software I2C
     
    Igor68, arkadyf и Asper Daffy нравится это.
  5. Asper Daffy

    Asper Daffy Иксперд

    +100500.

    А ещё лучше, думайте как обойтись стандартными пинами.
     
    Igor68 и Tomasina нравится это.
  6. Leshik

    Leshik Нуб

    Почему же тогда OLED_I2C.h без проблем работает на других?
     
  7. b707

    b707 Гуру

    потому что эта библиотека не использует Wire. у нее внутри своя собственная реализация I2C
     
    Igor68 и arkadyf нравится это.
  8. parovoZZ

    parovoZZ Гуру

  9. Leshik

    Leshik Нуб

    Спасибо, почитал. Очень интересно. Но мне не по зубам. (К стати, у Вас не выложено готового решения для тупого повторения? И Вы обещали расковырять BME280 - не нашёл)
    Попытался посмотреть как работает библиотека Oled_i2c.cpp, нашёл только пару строк с передачей данных, но совсем не понял как это работает:
    Код (C++):
    void OLED::_writeByte(uint8_t value)
    {
        pinMode(_sda_pin, OUTPUT);
        shiftOut(_sda_pin, _scl_pin, MSBFIRST, value);
    }
    Не понимаю кто сюда обращается, что такое MSBFIRST и кому принадлежит команда shiftOut
     

    Вложения:

    • OLED_I2C.cpp
      Размер файла:
      14,7 КБ
      Просмотров:
      77
    • OLED_I2C.h
      Размер файла:
      5 КБ
      Просмотров:
      76
    Последнее редактирование: 28 апр 2020
  10. Asper Daffy

    Asper Daffy Иксперд

    Все, кому не лень.
    Обратное LSBFIRST
    Олигархам, как и всё остальное, кому же ещё?
     
  11. a1000

    a1000 Гик

    Понимаете, это уже не простое копирование скетчей для работы с готовыми библиотеками. На этом уровне надо знать и понимать работу интерфейса I2C на физическом уровне. Работа даже со встроенным модулем I2C не такая уж тривиальная задача. Прерывание для I2C одно на все случаи жизни. Писал на ассемблере обмен с часами DS3231, так обработчик прерывания более 50 строк занял. Ну а программную реализацию I2C (это когда любые другие пины под SDA и SCL) я как-то с трудом представляю. Так-что для вас я вижу несколько вариантов решения вашей проблемы:
    - пересмотреть концепцию вашей секретной разработки в сторону использования стандартных SDA и SCL;
    - написать в раздел "Закажу проект" и возможно найдётся знающий человек, который за ваши деньги подправит (считайте перепишет) библиотеку для BME280 для работы с программным I2C;
    - прочитать много умных книжек и на зло мне и другим форумчанам исправить библиотеку самому.
     
    Daniil нравится это.
  12. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Английским владеете ? Ответ на все эти вопросы подробно разжеван во встроенном онлайн справочнике Arduino IDE. Если с инглишем не лады - подключаете Гуглопереводчик.
    ПС. Для начала погуглите про протоколы I2C и SPI. Изучать команды самого датчика - не старайтесь. Датчиков охрененное количество, и у всех свои подробности. По жизни эти "подробности" - всего лишь отражение необходимых для работы электронной схемы устройства последовательностей дрыганья электрическим напряжением на различных выводах схемы. И какой вам будет толк от этого знания ??? Эти последовательности раз и навсегда задает и фиксирует в документации инженер-схемотехник этого устройства. А программист создает более-менее удобную библиотеку, которая скрывает за ненужностью (а чаще - от жадности) подробности. В самом низу этой библиотеки как раз лежит этот самый обычный вышеупомянутый "ногодрыг".
    ППС. Установите штатным образом библу для этого сенсора. Там есть нормальные примеры. Ими и пользуйтесь как исходниками для своих целей.
     
    Последнее редактирование: 29 апр 2020
    Daniil нравится это.
  13. parovoZZ

    parovoZZ Гуру

    без меня расковыряли все, кому не лень)))

    Придётся покорпеть. От простого к сложному.