Метеостанция на балконе не завелась с первого раза: модуль сидел на макетке, светодиод питания горел, сканер шины показывал устройство на 0x76 — а библиотека упорно молчала, и Serial оставался пустым, будто датчика нет вовсе. Я переписал скетч трижды, пересадил провода, уже подозревал брак — пока в четвёртом туториале не заметил строку bmp.begin(0x77). Пример писали под плату с одним адресом, мой модуль жил на другом, и вся драма уместилась в четыре символа.
Адрес на BMP280 выбирает ножка SDO: на земле — датчик слушает 0x76, на питании — 0x77. Кажется, мелочь, но именно здесь валится половина первых запусков: примеры из сети заточены под 0x77, а большинство китайских GY-BMP280 выходят с завода с SDO на земле. В этом уроке подключим модуль по четырём проводам, разберёмся, кто решает адрес, и соберём сканер шины, который отвечает на вопрос «есть ли кто живой» до всякой библиотеки.
Правило, которое я вывел за пару вечеров: адрес всегда пишем явно, сканер запускаем первым, и только потом читаем показания. Такой порядок экономит часы: молчание барометра почти никогда не брак и почти всегда — несовпадение адреса в скетче с адресом на шине. Дальше по этому же правилу живут и часы, и дисплеи, и любые новые модули — один раз выстроенный ритуал запуска экономит вечер на каждом следующем устройстве.
Четыре провода и ножка, которая решает адрес
Проводов четыре, и это вся схема: VCC к 5 В, GND к земле, SDA к A4, SCL к A5 — стандартная пара шины из урока про два провода. Подтяжки на линиях уже распаяны на модуле, отдельных резисторов не нужно. Полная распиновка с фотографиями шёлка и вариантами для Nano и Mega лежит на лендинге про подключение BMP280 — здесь же идём от логики, а не от картинок.
Крайние выводы модуля — интерфейсные, и их роль стоит понимать до первого запуска. CSB подтянут к питанию прямо на плате, поэтому чип говорит по I2C; посадите его на землю — и тот же кристалл переключится на SPI с четырьмя дополнительными линиями, для макетки это лишние провода без пользы. SDO выбирает адрес: обычно это свободный вывод, соединённый с землёй дорожкой. Подадите на него 3,3 В — адрес переедет с 0x76 на 0x77, и два BMP280 смогут жить на одной шине как разные собеседники.
Про питание — отдельная песня. Кристалл BMP280 трёхвольтовый, но на модулях GY-BMP280 стоит стабилизатор AMS1117-3.3, который принимает от платы пять вольт и отдаёт чипу положенные три. Работает это честно, пока вход держится выше трёх с половиной вольт — ниже стабилизатор выходит из регулирования, и датчик начинает врать или молчать. Просадки питания и выбор блока — отдельная тема гайда по питанию Arduino, здесь запомним границу: пять вольт от USB или стабилизированного БП, а не от севшей кроны.
| Вывод модуля | Куда на Uno | Зачем |
|---|---|---|
| VCC | 5 В | вход AMS1117, который отдаст чипу 3,3 В |
| GND | GND | общая земля с платой |
| SDA | A4 | сигнальная линия шины I2C |
| SCL | A5 | линия тактирования шины I2C |
| SDO | GND или 3,3 В | выбор адреса: земля — 0x76, питание — 0x77 |
| CSB | не подключаем | на плате подтянут к питанию — режим I2C |
Сканер — первый скетч, который я заливаю на любую новую шину, раньше библиотек датчиков. Он перебирает адреса от 8 до 119 и спрашивает каждого: есть ли кто? Устройство, готовое к разговору, отвечает нулём после endTransmission — и адрес всплывает в мониторе. Запустили, увидели 0x76 или 0x77 — и половина вопросов закрыта: шина жива, провода целы, датчик на линии. Стоит сканер копейки — одна страница кода, а окупается при каждом новом модуле на шине.
Восьмибитная арифметика здесь путает новичков: сканер печатает семибитный адрес, а в даташите тот же выглядит удвоенным — 0xEC для 0x76 и 0xEE для 0x77. Библиотека Adafruit принимает семибитную форму, поэтому в скетч пишем ровно то, что показал сканер. Полная таблица адресов с правилом деления пополам — в уроке-таблице адресов I2C.
#include <Wire.h> void setup() { Serial.begin(9600); Wire.begin(); Serial.println("Skaner i2c start");} void loop() { int n = 0; for (byte addr = 8; addr < 120; addr++) { Wire.beginTransmission(addr); if (Wire.endTransmission() == 0) { // 0 — кто-то подтвердил адрес Serial.print("Ustrojstvo na 0x"); Serial.println(addr, HEX); n++; } } if (n == 0) { Serial.println("Shina pusta: provoda, SDA/SCL"); } delay(5000);}Читается сканер справа налево: Wire.beginTransmission(addr) открывает условный разговор, endTransmission() закрывает и возвращает статус — ноль только тогда, когда кто-то на шине подтянул линию и подтвердил адрес. Всё остальное — таймаут, отказ, обрыв — нулём не будет, и сканер промолчит. Отсюда и диагностика: пустая шина при живом светодиоде модуля почти всегда означает перепутанные SDA и SCL или обрыв, а не мёртвый чип. Сканер повторяется раз в пять секунд — за это время вы успеете передёрнуть провода и увидеть, как адрес всплывает в мониторе на глазах.
Тот же сканер снимает второй частый тупик: два адреса разом. На шине с часами DS3231 (0x68) и BMP280 (0x76) сканер покажет обе строки — и вы заранее знаете, кто есть кто, до подключения дисплея с его 0x27. У меня это постоянная практика: сканер до скетча, явный адрес в begin(0x76) — сколько бы примеров ни предлагали вызов без аргументов. Убедиться, что строка принадлежит именно барометру, проще всего отключением: сняли датчик — строка исчезла, вернули — появилась. Если адрес дрожит или пропадает на глазах — проверьте контакт макетки: криво вставленный провод даёт ровно такую картину.
BME280 не BMP280: близнецы с разным содержимым
Корпуса и шелкография у BMP280 и BME280 совпадают до последней буквы, и это главная ловушка: по внешнему виду их не различить, зато по поведению разница — на целую влажность. У BME280 внутри третий сенсор, и библиотека отдаёт влажность отдельным методом; у BMP280 этой функции нет вовсе, и попытки прочитать её другой библиотекой дают нули или мусор.
Проверяется принадлежность за минуту. Во-первых, по идентификатору чипа: регистр 0xD0 у BMP280 отвечает 0x58, у BME280 — 0x60. Во-вторых, по библиотеке: Adafruit_BMP280 на живом BME280 запустится, но влажности не покажет, а Adafruit_BME280 на настоящем BMP280 откажется сразу. Как отличить подделку по внешним признакам и что выбрать взамен — урок про альтернативы DHT, там же тест трёх продавцов.
Практический вывод простой: если в планах влажность — берите BME280 сразу и не экономьте тридцать рублей. Если нужны только давление и высота — BMP280 дешевле и точнее в своём профиле. Библиотеки не взаимозаменяемы: begin(0x76) у обоих выглядит одинаково, но класс в шапке скетча разный, и перепутанный модуль обнаружится уже после запуска.
После этого урока запуск у вас надёжный: сканер, явный адрес, светодиодная индикация ответа. Дальше — показания: вводный урок про барометр разбирает три метода библиотеки и высоту по формуле, а перевод давления в привычные миллиметры ртутного столба — следующий урок этого раздела. Для метеостанции в связке с DHT22 тот же модуль встаёт на ту же пару A4/A5 без конфликтов: адреса у датчиков разные, шина выдерживает — кадр станции с тремя величинами уже собран в уроке про метеостанцию DHT22 и BMP280.
- 1. На каком адресе будет жить BMP280 с ножкой SDO, посаженной на землю?
- 2. Что покажет сканер шины, если модуль цел, но SDA и SCL перепутаны местами?
- 3. Какой стабилизатор стоит на модулях GY-BMP280 и что он делает?
- 4. Чем BMP280 отличается от BME280?
- 5. begin() вернул ноль, сканер устройство видит. С чего начать разбор?
- Адрес выбирает ножка SDO: на земле — 0x76, на питании — 0x77; два модуля на одной шине разводятся именно так.
- Порядок запуска: сканер шины, явный адрес в begin(0x76), проверка возврата — и только потом чтение показаний.
- GY-BMP280 питается от 5 В через AMS1117-3.3; бескорпусный чип требует чистых 3,3 В.
- BME280 и BMP280 — разные чипы: у BME есть влажность и своя библиотека, идентификатор 0x60 против 0x58.
- 0xEC и 0xEE из даташита — те же 0x76 и 0x77, удвоенные до восьми бит; библиотеке нужны семибитные.
Частые вопросы по теме урока
- На каком адресе будет жить BMP280 с ножкой SDO, посаженной на землю?
- SDO на земле — 0x76, SDO на питании — 0x77. 0xEC — это удвоенная восьмибитная запись того же 0x76 из даташита, 0x68 — адрес часов DS3231. 0x76
- Что покажет сканер шины, если модуль цел, но SDA и SCL перепутаны местами?
- Без правильной пары линий никто не подтвердит адрес: сканер молчит. Сначала проверяйте провода и только потом грешите на чип. ничего — шина выглядит пустой
- Какой стабилизатор стоит на модулях GY-BMP280 и что он делает?
- Кристаллу нужно 3,3 В; AMS1117-3.3 принимает пять вольт от платы. Бескорпусный чип без модуля требует чистых 3,3 В. AMS1117-3.3: 5 В на входе, 3,3 В чипу
- Чем BMP280 отличается от BME280?
- Корпуса одинаковые, но у BME280 внутри третий сенсор влажности и своя библиотека. Идентификаторы: 0x58 у BMP280 против 0x60 у BME280. у BME280 есть влажность, у BMP280 — нет
- begin() вернул ноль, сканер устройство видит. С чего начать разбор?
- Пара «сканер видит, библиотека нет» почти всегда означает несовпадение адреса: примеры пишут под 0x77, модули чаще живут на 0x76. проверить адрес в begin — 0x76 или 0x77