Ваш браузер устарел. Рекомендуем обновить его до последней версии.

Приобрел себе датчик AM2321. В данный датчик включает в себя датчик влажности и датчик температуры. Диапазон рабочих напряжений от 2.6 до 5.5V.

Размеры датчика 11.3х7.8 высота 4 мм. Шаг выводов 1.27мм

 AM2321AM2321

 

Расположение выводов:

Расположение выводовРасположение выводов

 

 

Частота шины до 100кб/c. Диапазон измеряемой температуры от -40 до +80. Может работать в двух режимах передачи данных I2C и 1-Wire. Для того что бы переключить в режим I2C нужно подать питание и на шине SCL минимум на 500мс установить логическую единицу . Для переключения в 1-Wire режим после подачи питания на шине SCL минимум на 500мс устанавливаем логический ноль. Адрес датчика 0xB8 ( 10111000 r/w).

Пример инициализации датчика для Atmega16:

 

            ldi temp,1             ; выставляем высокий уровень на шине SCL
            out portc,temp
            call pausa500mc ; удерживаем сигнал минимум 500mc тем самым переводя датчик в режим I2C

 

Но просто начать читать данные сдатчика не получится. Специально пробовал не получается читать пока датчик не разбудим.

Далее все будет относиться к режиму работы в I2C. В конце статьи исходник на ассемблере с подробными комментариями.

По даташиту будится датчик так:

Старт + адрес 0xB8 + пауза более 800 мкс но меньше 3 сек + Стоп.

Код на ассемблере будет такой :

            call IIC_Start             ; Старт
            ldi temp,0b10111000 ; адрес микросхемы из даташита с битом записи
            call IIC_Send             ; отправляем адрес
            call pausa1mc            ; пауза 1 мс
            call IIC_Stop              ; Стоп

После отправки адреса в статусный регистр TWSR возвращается значение 0х20 (был передан адресный пакет SLA-W без подтверждения ведомого). Учитывайте это в коде если идет проверка статусного регистра .

И потом можно читать данные с датчика. Температура и влажность воздуха имеют разрядность 16 бит. Для температуры в 15 бите указывается положительная или отрицательная температура. Если 15 бит равен 1 то отрицательная температура.

Регистры для чтения показаний находятся по адресу 0х00 - 0х03

0х00 старшее значение температуры со знаком 

0х01 младшее значение температуры 

0х02 старшее значение влажности воздуха

0х03 младшее значение влажности воздуха

Для чтения данных из датчика нам нужно послать следующую команду:

Старт + адрес 0хB8 с битом записи (0b10111000) + код функции 0х03 + Начальный адрес с которого начнем читать + Кол-во регистров для чтения + Стоп

Начальный адрес с которого начнем читать = адрес регистра с которого будет чтение

Кол-во регистров для чтения = кол-во ячеек для чтения 

Читать можно только температуру , только влажность или все сразу.  

Далее я делал паузу в 2 мс. Без нее читались нули.

Затем читаем данные. Для чтения отправляем команду :

Старт + алрес 0xB8 с битом чтения (0b10111001) + тут читаются данные + Стоп

 

Принимаются данные в такой последовательности для режима чтения всех 4 регистров с 0х00 адреса .

Код функции 0х03 + число регистров для чтения + давление High + давление Low + температура High + температура Low + код CRC High + код CRC Low .

Затем нужно данные преобразовать в нормальный вид. В этом датчике преобразование очень простое.

Допустим в ячейках влажности воздуха такой результат 0166h и температуры 014Ah

Переводи в десятичное число:

0166h = 01*256 + 6*16 + 6 =  358 / 10 = 35.8%

014Ah = 01*256 + 4*16 + 10 (А)  = 330 / 10 = 33.0 C

Как видим расчет очень простой. Достаточно считанное значение поделить на 10.

У меня была макетная плата с распаянной Atmega16 , подсоединил к ней датчик и повесил на один из выводов светодиод. Светодиод нужен только для индикации чтения с датчика. Опрос датчика раз в 5 секунд. Если светодиод не мигает то значит датчик не отвечает.

Получилась такая схема:

 

Схема

Код писал для Atmega16 т.к была уже на макетке . Думаю не составит особого труда его перекомпилировать под другую AVR ку.

В исходнике данные сохранял и в ОЗУ и в EEPROM что бы потом в Atmel Studio  считать EEPROM  и посмотреть результат работы датчика. Конечно запись в EEPROM можно удалить т.к это делалось только для теста. 

В коде есть вот такой кусок: 

         call AM2321_temp_vlag      ; чтение температуры и влажности и CRC
      ; call AM2321_temp              ; чтение температуры и CRC
      ; call AM2321_vlag                ; чтение влажности и CRC
        call zap_data                        ; запись данных в EEPROM
        ldi temp,1                             ; включаем светодиод
        out porta,temp
        ret

Тут можно выбрать что нужно читать. По умолчанию читаем все. Если нужно только температуру или влажность то убираем ";" перед командой call в нужной строке, а в другую строку вставляем где не нужно читать ставим  ";"  перед командой call или совсем удаляем строки и компилируем код заново. 

Вот вроде и все. Есть еще в этом датчике контрольная сумма CRC . Но она мне не интересна пока.

Выкладываю два исходника с прошивкой для Atmega16. В одном из исходников нет записи в EEPROM.

 

Прошивка и исходник без записи EEPROM

Прошивка и исходник с записью в EEPROM

datasheet AM2321