Попрактивовавшись с различной периферией (датчиками температуры, часами реального времени, микросхемами памяти) решил собрать все это в кучу и сделать устройство способное замерять температуру, фиксировать точки экстремума (максимума и минимума) температуры, запоминать время точек экстремума, высчитывать среднесуточную температуру и записывать все эти данные в энергонезависимую память микросхемы EEPROM. В качестве базовой платы использован модуль с микроконтроллером Atmega32 и с дисплеем от Nokia 3310. В качестве памяти я использовал EEPROM микросхему 24LC08 с объемом памяти 1кб, этого хватит чтобы мониторить температуру в течении 2 месяцев.
За временем следит специализированная микросхема DS1307, имеющая автономное питание от 3-х вольтовой батарейки, поэтому можно не опасаться за потерю настроек времени при пропадании основного питания. А измерением температуры занимается датчик температуры DS18b20.
Схема подключения обвеса микроконтроллера приведена ниже. Микроконтроллер работает на частоте 16МГц, тактирование от внешнего кварца.
Напряжение питания (VCC) 5 вольт. Питание микроконтроллера на схеме не показано. Конденсаторы С1 и С2 у кварца Х2 номиналом 18-22 пФ. Не помешают так же керамические конденсаторы по 0,1 мкФ возле каждой микросхемы. Светодиод D1 служит для индикации работы с микросхемой памяти, когда происходит считывание или запись данных, светодиод загорается.
Пока что у меня все это выглядит так.
Принцип работы
Несколько раз в минуту происходит считывание датчика температуры. Если считанное значение температуры больше или меньше зафиксированного значения, тогда фиксируется новое значение макс/мин температуры. Также записывается время когда был зафиксирован рекорд температуры (часы:минуты). Затем расчитывается средняя температура с учетом всех считанных значений температур в течении суток. Все эти данные хранятся в оперативной памяти микроконтроллера до наступления новых суток, при смене суток эти данные записываются в энергонезависимую память микросхемы 24LC08. После записи, все значения пиков температур обнуляются чтобы для новых суток фиксировать новый максимум/минимум, и высчитывать новую среднесуточную. Чтобы посмотреть записанные данные, нужно подключить устройство к терминалу и нажать кнопку PB1. Об этом чуть позже.
Настройка часов
Так как используются часы реального времени с автономным питанием, поэтому пока не стал уделять внимания настройке часов с помощью кнопок. В дальнейшем планирую организовать полноценный пользовательский интерфейс с менюшками, а пока настройка часов выглядела так:
$regfile = “m32def.dat”
$crystal = 16000000
$lib “ds1307clock.lib” ‘подключение библиотеки ds1307
‘конфигурируем scl и sda пины
Config Sda = Portb.0 ‘ I2C Data
Config Scl = Portb.1 ‘ I2C Clock
Const Ds1307w = &HD0
Const Ds1307r = &HD1
Dim Seco As Byte
Dim Mine As Byte
Dim Hour As Byte
Dim Day As Byte
Dim Dat As Byte
Dim Month As Byte
Dim Year As Byte
Seco = 0
Seco = Makebcd(seco)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cwbyte Seco
I2cstop
Mine = 13
Mine = Makebcd(mine)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 1
I2cwbyte Mine
I2cstop
Hour = 15
Hour = Makebcd(hour)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 2
I2cwbyte Hour
I2cstop
Dat = 4
Dat = Makebcd(dat)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 4
I2cwbyte Dat
I2cstop
Month = 10
Month = Makebcd(month)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 5
I2cwbyte month
I2cstop
Year = 11
Year = Makebcd(year)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 6
I2cwbyte Year
I2cstop
End
Присваиваем переменным seco, mine, hour, dat, month, year текущие значения, компилируем, прошиваем программой контроллер. Подключаем микросхему часов (если она еще не была подключена) и подаем питание. Все, часы настроены и будут исправно тикать, если конечно не вытаскивать батарейку.
Организация памяти
Запись суточных данных происходит постранично (на одни сутки выделена одна страница памяти), что это и как происходит писал здесь. Распределение данных в ячейках памяти у меня выглядит так (одна страница):
0 – число
1 – месяц
2 – год
3 – час максимальной температуры
4 – минуты максимальной температуры
5 – знак максимальной температуры
6 – значение максимальной температуры
7 – час минимальной температуры
8 – минуты минимальной температуры
9 – знак минимальной температуры
10 – значение минимальной температуры
11 – знак среднесуточной температуры 12 – значение среднесутчной температуры
Оставшиеся 3 байта памяти (13-15) остаются пустыми, так что можно записать еще немного данных.
Если память полностью заполняется, снова происходит запись с первой страницы памяти, с затиранием самых старых данных.
После записи всех данных на внешнюю EEPROM, происходит сохранение адреса, куда должна произойти следующая запись данных. Этот адрес сохраняется во строенной в микроконтроллер энергонезависимой памяти. Поэтому после появления питания, запись продолжится после записанных ячеек памяти и не произойдет затирание данных с прошлыми измерениями.
Считывание данных
Извлечение записанных данных из микросхемы памяти происходит при нажатии на кнопку РВ1. Во время считывания и отправки в терминал данных загорается светодиод D1.
Данные отправляются в терминал по UART. Для сопряжения с компьютером использовался конвертер на микросхеме FT232RL. Отправка происходит на скорости 9600 бод. В терминале прочитанные данные выглядят следующим образом:
Если прочитанная область микросхемы пуста, считывается дефолтное состояние ячейки памяти, на картинке видно, что после записанных данных дальше идут 255. Надо организовать проверку и резать чтение только на нужных данных, пропуская пустую область.
После небольших махинаций, принятые данные вставляются в таблицу Excel и делается наглядный график. Вот что у меня вышло за время тестирования устройства:
Итак наметки на будущее, то что нужно доработать в устройстве и в программной части:
- Набросать пользовательский интерфейс, так как рулить устройством с помощью кнопочек куда удобней, да и привычней неподготовленному пользователю 😉
- Дождаться холодов и протестировать фиксирование точек экстремума при минусовой температуре (хотя заморозка датчика в морозилке показала положительные результаты)
- Написать какое нибудь приложение для компа, чтобы можно было в ней обрабатывать полученные данные. Я пока в этом деле ничерта не понимаю, но может кто-нибудь подсобит?
- Возможно, если появятся желающие, переделка под более доставаемый (но более дорогой) знакогенерирующий дисплей 16х4. Такого у меня нет, а под имеющийся 16х2 делать не интересно.
- После обкатки на мелкой памяти, возможно, появится версия под более емкие микросхемы, например в зпасе имеется 24LC64, с ней время записи увеличится до полутора года =)
- Нужно проработать алгоритм в целом, код писался “чтобы работало” и поэтому многое сделано в лоб, код не оптимизировался. Возможно немного поменяю алгоритм, чтобы контроллер, во время простоев между измерениями, переходил в энергозберегающий режим.
Пока все, если есть еще идеи интересно узнать.
Архив с прошивкой и исходниками можно скачать ниже:
СКАЧАТЬ (обновление от 11.10.11)
Взято с: avrproject.ru
Последние статьи
- Лучшая практика проектирования при размещении компонентов печатной платы
- Android 6.0 на lancer X
- Простой усилитель мощности класса АВ своими руками.
- Двухтактный ультралинейный ламповый УНЧ на EL84 (6П14П).
- Люксметр на ATmega8 и цифровом датчике BH1750
- Контроллер для светодиодной ленты с ИК управлением
- Самодельный LED светильник на основе ИК датчика HC-SR501
- Простой усилитель низкой частоты на TDA7377 и NE5532
- Простейший звонок с двумя мелодиями
- LED Cube 8x8x8 на Arduino с RTC