Florin
Недавно я заказал у TI несколько образцов, среди которых был цифровой датчик температуры TMP275. Вот цитата из описания датчика:
TMP275 – двухпроводной датчик температуры с последовательным интерфейсом, обеспечивающий точность измерений 0.5°С. Датчик выпускается в корпусах MSOP-8 или SO-8. TMP275 способен измерять температуру с разрешением 0.0625°C, совместим с шиной SMBus и позволяет подключать до 8 устройств на одну шину. Он идеален для распределенного измерения температуры во множестве приложений. TMP275 рассчитан на измерение температуры в диапазоне от −40°C до +125°C.
Интерфейс I2C – один из простейших способов для извлечения результатов измерений из TMP275. Я разработал схему, имеющую все необходимые компоненты: датчик, мозг на ATmega8 и некоторые другие детали, необходимые для отображения информации и питания схемы. Дисплей сделан на четырех 7-сегментных светодиодных индикаторах CA56-12GWA от Kingbright. Для управления дисплеем я использовал PNP транзисторы, подключив их к общим анодам индикаторов, к катодам подключил резисторы, чтобы ограничить ток через выводы контроллера. Ток через транзисторы не ограничен, поэтому индикаторы дисплея всегда светятся одинаково, независимо от того, сколько сегментов включено.
Устройство я решил сделать портативным и запитал его от 9 вольтовой батарейки, поэтому мне понадобился стабилизатор напряжения. Выбор пал на старый добрый 7805.
Протокол I2C широко распространен, и в сети можно найти для него множество различных библиотек. Я выбрал библиотеку от Peter Fleury, поскольку она очень хорошо документирована. Из внешних компонентов для датчика TMP275 нужен только конденсатор между VCC и GND, и два подтягивающих резистора на линиях SDA и SCL.
Вся обработка выполняется библиотекой, сам я написал лишь несколько строчек кода для получения данных температуры с выхода датчика:
i2c_start_wait(sensor+I2C_WRITE); // установить адрес устройства и режим записи i2c_write(0x0); // записать регистр указатель 00000000, // чтобы выбрать регистр температуры i2c_rep_start(sensor+I2C_READ); // установить адрес устройства и режим чтения temp_high=i2c_readAck(); // считать старший байт температуры temp_low=i2c_readNak(); // считать младший байт температуры
Считанное с датчика значение температуры отображается на 4-разрядном дисплее. Для этого я написал дисплейный макрос, который вычисляет числа и выводит их на дисплей. По существу это программное мультиплексирование. Я даже тестировал устройство измерением отрицательных температур, поместив датчик в холодильник. Показания, которые я сравнивал с другим термометром, были корректными.