Имеем ардуино нано, 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 работать на нано. Вопросов: "зачем нужна шина на нестандартных пинах" просьба не задавать.
Стандартная библиотека Wire на Нано ни на каких пинах, кроме А4 А5 - работать не будет. ищите в гугле как запустить Software I2C
На самом деле в программной реализации айтуси нет ничего сложного. http://forum.amperka.ru/threads/Суперэкономичный-беспроводной-монитор-Т-и-rh.17221/#post-199357
Спасибо, почитал. Очень интересно. Но мне не по зубам. (К стати, у Вас не выложено готового решения для тупого повторения? И Вы обещали расковырять BME280 - не нашёл) Попытался посмотреть как работает библиотека Oled_i2c.cpp, нашёл только пару строк с передачей данных, но совсем не понял как это работает: Код (C++): void OLED::_writeByte(uint8_t value) { pinMode(_sda_pin, OUTPUT); shiftOut(_sda_pin, _scl_pin, MSBFIRST, value); } Не понимаю кто сюда обращается, что такое MSBFIRST и кому принадлежит команда shiftOut
Понимаете, это уже не простое копирование скетчей для работы с готовыми библиотеками. На этом уровне надо знать и понимать работу интерфейса I2C на физическом уровне. Работа даже со встроенным модулем I2C не такая уж тривиальная задача. Прерывание для I2C одно на все случаи жизни. Писал на ассемблере обмен с часами DS3231, так обработчик прерывания более 50 строк занял. Ну а программную реализацию I2C (это когда любые другие пины под SDA и SCL) я как-то с трудом представляю. Так-что для вас я вижу несколько вариантов решения вашей проблемы: - пересмотреть концепцию вашей секретной разработки в сторону использования стандартных SDA и SCL; - написать в раздел "Закажу проект" и возможно найдётся знающий человек, который за ваши деньги подправит (считайте перепишет) библиотеку для BME280 для работы с программным I2C; - прочитать много умных книжек и на зло мне и другим форумчанам исправить библиотеку самому.
Английским владеете ? Ответ на все эти вопросы подробно разжеван во встроенном онлайн справочнике Arduino IDE. Если с инглишем не лады - подключаете Гуглопереводчик. ПС. Для начала погуглите про протоколы I2C и SPI. Изучать команды самого датчика - не старайтесь. Датчиков охрененное количество, и у всех свои подробности. По жизни эти "подробности" - всего лишь отражение необходимых для работы электронной схемы устройства последовательностей дрыганья электрическим напряжением на различных выводах схемы. И какой вам будет толк от этого знания ??? Эти последовательности раз и навсегда задает и фиксирует в документации инженер-схемотехник этого устройства. А программист создает более-менее удобную библиотеку, которая скрывает за ненужностью (а чаще - от жадности) подробности. В самом низу этой библиотеки как раз лежит этот самый обычный вышеупомянутый "ногодрыг". ППС. Установите штатным образом библу для этого сенсора. Там есть нормальные примеры. Ими и пользуйтесь как исходниками для своих целей.