Главная » Статьи » Проекты |
Попрактивовавшись с различной периферией (датчиками температуры, часами реального времени, микросхемами памяти) решил собрать все это в кучу и сделать устройство способное замерять температуру, фиксировать точки экстремума (максимума и минимума) температуры, запоминать время точек экстремума, высчитывать среднесуточную температуру и записывать все эти данные в энергонезависимую память микросхемы 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 и делается наглядный график. Вот что у меня вышло за время тестирования устройства: Итак наметки на будущее, то что нужно доработать в устройстве и в программной части:
Пока все, если есть еще идеи интересно узнать. Архив с прошивкой и исходниками можно скачать ниже: СКАЧАТЬ (обновление от 11.10.11) | |
Просмотров: 31504 | Комментарии: 27
| Теги: |
Всего комментариев: 27 | |||||||||||||||||||||||
| |||||||||||||||||||||||
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |