16.03.2021 11:05, автор DiEitch
Лет пять назад, когда я делал домашнюю метеостанцию, приходилось использовать несколько различных датчиков, так как комбинированные датчики если и существовали на тот момент, то были слишком уж дорогие. Ситуация коренным образом изменилась с появлением Bosch BME280. Этот миниатюрный прибор содержит в себе почти все необходимые датчики (кроме СО2) для построения домашней метеостанции, может работать в нескольких режимах и позволяет произвести калибровку даже в домашних условиях. Недаром, этот сенсор широко используется радиолюбителями и продаётся на Aliexpress по демократичным ценам.
Недавно я обнаружил в интернете очень заманчивую, простую и эстетичную конструкцию домашней метеостанции и решил всенепременно её повторить. Я закупил (а кое-что было уже в моей мастерской) всё необходимое и начал сборку. Но беда в том, что исходный код (скетч на Arduino) устроил меня не полностью, и я решил его малость переписать под себя.
Среда ардуино позволяет писать и прошивать код "на лету", но мне показалось, что неплохо бы тщательно проработать всё в Proteus, ну а потом уже "шить". На удачу, в Proteus нашлось абсолютно всё, кроме самого датчика BME280, и задача была перенаправлена и углублена на его создание (библиотеку для Arduino Uno можно скачать здесь). В Proteus можно сгенерировать также свою собственную модель, но я не стал заморачиваться (там изучать достаточно много) и решил сэмулировать BME280 на ATMEGA8. Изначально я выбрал ATTINY85 (по количеству ног, чтобы лишние не "болтались" и не засоряли схему), но почему-то модель этого контроллера работала в плане использования TWI не совсем корректно, да и с прерываниями там было что-то "не то".
Кроме того, за давностью лет я имел уже довольно смутное представление об алгоритмах работы с шиной I2C (тем более в режиме slave, который применяется довольно редко), совсем позабыл, что значит: Start, Stop, Sr, как производить Ack или Nak. Так что хотелось вспомнить и "пощупать" эту шину снова.
На текущий момент эмулятор уже "дружит" с библиотеками Arduino и выдаёт фиксированные значения параметров, чего "с головой" достаточно для проверки и отладки кода для метеостанции.
Выше я упоминал про калибровку этого датчика, так вот, в нём содержится ряд регистров calib00 ... calib25, calib26 ... calib41, которые записываются производителем на стадии изготовления и поверки. Я брал эти параметры для реального датчика с форума, где человек не поленился и считал их. Эти данные специфичны (для каждого сенсора или партии - они разные), но уверен, что они пригодятся не раз, поэтому продублирую здесь.
Адрес 0xA0 я в дампе не нашёл и поставил в том регистре значение 0x00. Адресов 0xE8-0xF0 тоже не было, и они у меня также 0x00. Все регистры датчика я уместил в массив согласно карте памяти BME280:
Попутно я освежил память, что же такое Start, Stop, Restart, Ack и Nak изучая эпюры I2C для BME280 и DS1307.
Из коробки датчик, как правило, имеет адрес на шине I2C 0x76, но бывают случаи, когда адрес 0х77, тогда:
Для отладки я использовал также информацию и проекты с других сайтов:
Проект и все необходимые для изучения файлы можно найти в архиве к этой статье.