Главная » Статьи » Проекты

Логгер температуры
 Попрактивовавшись с различной периферией (датчиками температуры, часами реального времени, микросхемами памяти) решил собрать все это в кучу и сделать устройство способное замерять температуру, фиксировать точки экстремума (максимума и минимума) температуры, запоминать время точек экстремума, высчитывать среднесуточную температуру и записывать все эти данные в энергонезависимую память микросхемы 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) 

Категория: Проекты | Добавлено: 04.10.2011
Просмотров: 31504 | Комментарии: 27 | Теги: eeprom, 1-Wire, модуль, I2C, 18b20, DS1307 | Рейтинг: 5.0/19
Всего комментариев: 27
27 exersizze   (03.04.2014 13:38) [Материал]
Есть вот такой проект логгера http://avrproject.ru/publ/logger_temperatury_2_0/1-1-0-134
он какбэ вторая версия этого, много чего добавлено, но так и не допилено, к сожалению, до конца.

26 asd81   (03.04.2014 07:02) [Материал]
здравствуйте. есть ли продолжение у этого девайса?

25 exersizze   (30.04.2013 12:59) [Материал]
А данные в них записывали? Если нет, то часы пока стоят.

24 vaha303   (30.04.2013 10:07) [Материал]
Здравствуйте, решил повторить Вашу схему, но столкнулся с проблемой не работают часы.
Подскажите в чем проблема

23 pchela5   (14.12.2011 11:53) [Материал]
Ну скажем так - я хотел пожаловаться - была аналогичная ошибка, но решил разобраться. Там при выводе на дисплей русских букв П и Ф идет обращение к PE и FE (пишу на память как было - может слегка путаю) - на это ругалась программа. Исправил, компилятор стал ругаться на другие буквы - кажется А - опять начал править. В конце концов решил поменять имена переменных на более сложные - и все ошибки на библиотеку пропали. Вернул родную библиотеку взад - все работает. Проверял в программах как представленных на сайте, так и сторонних - в частности нашел DDS генератор, написанный на бейсике каким-то итальянцем - решил его переписать под дисплей 3310. Самое главное - ошибка выходит в версии васика 2..... - в версии 1.9.8 - этого нет. Чем обусловлено - не знаю.

22 exersizze   (13.12.2011 22:27) [Материал]
Не слышал чтобы кто-то еще жаловался на длину имен переменных. Может все-таки в другом дело.

21 pchela5   (13.12.2011 15:28) [Материал]
Логично. biggrin Но в программе если есть переменные с одной буквой - поменяйте на три-четыре буквы и сравните результат. Мне - помогло.

20 amv2000   (13.12.2011 13:04) [Материал]
Так PE и FE это не одна буква а две?

19 pchela5   (13.12.2011 10:03) [Материал]
> 4ester (13.11.2011 00:52)
> ругается на библиотеку 3310END в частности на строки PE и FE

Какая версия васика? Если 2.ХХХ, то да - ругается - в теле программы не должно быть переменных, состоящих из одной буквы. Выяснил методом тыка.

18 exersizze   (13.11.2011 10:48) [Материал]
Если менял файл 3310END то перед компиляцией необходимо сохранять изменения.
По поводу переменной, это особенность библиотеки, выводит на дисплей только переменную string. Для вывода байтовых переменных применяй команду str.

17 4ester   (13.11.2011 00:55) [Материал]
такой вопрос еще назрел, когда пытаюсь выводить переменную на дисплей компилятор ругается и отказывается выводить байтовые переменные, удалось вывести лишь переменную STRING, так и должно быть или все таки у меня какие то лаги с баскомом?

16 4ester   (13.11.2011 00:52) [Материал]
ругается на библиотеку 3310END в частности на строки PE и FE

15 exersizze   (12.11.2011 11:25) [Материал]
на какие именно библиотеки? по идее не должен, попробуй другую версию баскома

14 4ester   (11.11.2011 17:41) [Материал]
такой вопрос возник, при компиляции вашего проекта, вылазят 2 ошибки, ссылаясь на библиотеку, то есть ошибки в библиотеке, это нормально?

13 exersizze   (13.10.2011 09:46) [Материал]
Да без проблем: приделываете процедуру работы со вторым датчиком и дальше по коду добавляете обработку полученных значений smile
А вот с записью в микросхему памяти, придется переделывать алгоритм, так как все данные не влезут в одну страницу. Конечно можно не записывать максимумы/минимумы, а писать только среднюю. Например для комнатной температуры будет достаточно, у меня она меняется всего на 1 градус в сутки.

12 ya-zp   (12.10.2011 22:27) [Материал]
Интересненькая конструкция!
А если сделать мониторинг температуры 2х точек? Проще говоря - добавить еще 1 датчик температуры?

11 exersizze   (11.10.2011 23:55) [Материал]
Добавил функцию стирания памяти и обнуление переменных, хранящих адрес следующей записи. Стирание и обнуление происходит при нажатии на кнопку PB4, после процедуры стирания светодиод индикации несколько раз мигнет.

+1   Спам
10 tenevikus   (06.10.2011 23:06) [Материал]
респект величайший!!!! biggrin
надеюсь скоро доделаю утепление балкона -- оборудую там мастерскую свою... и с радостью подключусь к вашим рядам biggrin

вся инфа на сайте 5+

9 radan   (06.10.2011 22:22) [Материал]
Хорошо, буду дальше заниматься.

8 exersizze   (06.10.2011 20:59) [Материал]
удалось проверить программу, все отлично!
Получается разная длина строк.. так как температура и часы могут состоять из одного числа, а могут из двух. Если в этом будет проблема можно подправить.

7 radan   (05.10.2011 22:18) [Материал]
Кое что набросал: http://ifolder.ru/26169581
Нужен установленный фреймворк не ниже 2.0 (можно посмотреть в установленных программах).
Что нужно сделать:
1.Выбрать порт (Настройки - выбор последовательного порта)
2.Нажать кнопку передачи на контроллере (в программе пока не задействована)
3.Если всё пройдёт нормально, нижний текстбокс заполнится принятыми значениями.
4. Их нужно скопировать в текстовый файл и передать мне для дальнейшей работы.
Можно было бы самому всё сделать, но нет времени собирать макет на контроллере...

6 exersizze   (05.10.2011 19:23) [Материал]
Добавил в программу сохранение адреса в энергонезависимую память мк. Теперь при возобновлении питания запись в микросхему памяти продолжится с места последней записи.

5 exersizze   (05.10.2011 00:47) [Материал]
да согласен, программа сама должна общаться с контроллером.
датчик влажности еще не пробовал, даже и не знаю когда получится до него добраться.

4 AlekS   (04.10.2011 21:51) [Материал]
21 сюда пробовал приделать?

3 radan   (04.10.2011 20:42) [Материал]
Придется немного изменить софт. Логичнее не на кнопочку контроллера нажимать для отправки данных (это нормально на этапе отладки), а на кнопочку приложения - запрос на получение данных. Но это только моё мнение. Постараюсь набросать скелет, потом поговорим о функционале.
В любом случае нужно:
1. Выбор последовательного порта
2. Компонент для отображения графиков(уже ищу :D)
3. Возможность сохранять полученную информацию в файл на диск
4. Возможность загружать информацию из файла на диске
5. Ну и самое главное - получать информацию с контроллера...

2 exersizze   (04.10.2011 18:40) [Материал]
Буду весьма признателен, думаю нет особой разницы на чем будет написано приложение. Есть какие-нибудь требования к формату отправляемых данных?

1 radan   (04.10.2011 14:17) [Материал]
С приложением могу помочь. Если устроит VBNET или C#.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация