Термометр с датчиком DALLAS |
Автор: Рудаков Г. В.
Дата: 2009-07-28 |
В магазинах радиоэлектронных компонентов давно появились в продаже готовые цифровые термометры с широким диапазоном измеряемых температур и высокой точности за счет применения цифровых датчиков.
В этой статье я расскажу о принципе действия такого устройства, и о том, как собрать его в домашних условиях, вооружившись паяльником и терпением. В результате должна получиться конструкция представленная на рисунке 1.
Рисунок 1 – Общий вид цифрового термометра.
Для изготовления термометра нам потребуются следующие основные компоненты:
Цифровой датчик DALLAS DS1820
Микроконтроллер AVR Attiny2313
Индикатор LED R 4DIG AN BQ-M326R (с общим анодом)
Корпус защитный BOX-G023
На рисунке 2 представлена принципиальная электрическая схема. К микроконтроллеру по шине 1-WIRE подключается цифровой датчик, который передает значение температуры в виде числа integer. Затем микроконтроллер выводит полученное значение на индикатор. Индикатор динамический, поэтому в обязанности микроконтроллера входит переключать разряды индикатора по прерыванию таймера с частотой не заметной для глаза человека. Устройство питается от любого Li-ion аккумулятора снятого со старенького сотового телефона, зарядка которого осуществляется через USB-шнур от ПК или БП. Контроль зарядки не предусмотрен, так как современные аккумуляторы сотовых телефонов в своем составе уже имеют плату управления процессом заряда.
Рисунок 2 – Принципиальная электрическая схема цифрового термометра.
На рисунке 3 и рисунке 4 представлен чертеж печатной платы термометра выполненный в программе Sprint Layout 5. Печатная выполнена из двух частей (основная и плата для индикатора) и имеет габаритные размеры 68 мм × 46 мм, с крепежными отверстиями под винты M3.
Рисунок 3 – Печатная плата термометра.
Рисунок 4 – Печатная плата для индикатора BQ-M326RD.
В корпусе предусмотрены крепежные стойки для платы. Причем высота стоек позволяет свободно под платой разместить Li-ion аккумулятор практически от любого сотового телефона (см. рисунок 5).
Рисунок 5 – Расположение аккумулятора в корпусе.
Готовые печатные платы представлены на рисунке 6. Изначально такое разделение было задумано, для того, чтобы как можно лучше вписаться в габариты готового корпуса. Так как корпус достаточно высокий, то индикатор был вынесен на отдельную плату, которая при помощи разъема стыкуется с основной платой (рисунок 7).
Рисунок 6 – Печатные платы в собранном виде.
Рисунок 7 – Печатные платы в сопряжении.
Цифровой датчик DS18B20 подключается к колодке на плате. При желании его можно вынести за пределы корпуса, предварительно засунув в термоусадочную трубку.
В крышке корпуса необходимо аккуратно проделать отверстие (рисунок 8) под индикатор, светодиод и кнопку включения.
Рисунок 8 – Цифровой термометр в разобранном виде.
Аккумулятора емкостью 750 мА хватает приблизительно на сутки бесперебойной работы термометра, поэтому в качестве кнопки включения была выбрана кнопка без фиксации. Для зарядки аккумулятора от ПК необходим шнур USB (USB A - USB B). Светодиод, расположенный на плате термометра показывает процесс зарядки (рисунок 9).
Рисунок 9 – Зарядка аккумулятора от ПК.
Рассмотрим детально некоторые фрагменты микропрограммы (прошивки) для микроконтроллера, написанной в среде CodeVision.
Изначально нам необходимо подключить несколько библиотек. Причем, библиотеку для работы с шиной 1-wire, нужно подключить лишь после назначения к какому порту и какой ножке МК будет подключен цифровой датчик Dallas. В нашем случае это PORTD.5:
#include <tiny2313.h>
#asm
.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=5
#endasm
#include <1wire.h>
#include <ds1820.h>
#include <delay.h>
Затем опишем массив состояния ножек порта «B», соответствующих выводимой цифре или символу. Так, например, чтобы отобразить цифру 7, необходимо включить следующие биты: 0, 2 и 5 (включенное состояние бита порта определяется как «0», а выключенное как «1», так как используемый в схеме динамический индикатор с общим анодом).
unsigned char digits[] = {
0b01010000,
0b11011011,
0b01100010,
0b01001010,
0b11001001,
0b01001100,
0b01000100,
0b11011010,
0b01000000,
0b01001000,
0b11101111,
0b11111111,
0b11101000
};
Рассмотрим фрагмент кода, отвечающий за динамическое переключение разрядов индикатора:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
switch (cursor)
{
case 0:{PORTD=0b0000010;break;};
case 1:{PORTD=0b0010000;break;};
case 2:{PORTD=0b0000100;break;};
case 3:{PORTD=0b0001000;break;};
}
PORTB=digits[digit_out[cursor]];
cursor++;
if (cursor==4) cursor=0;
}
Переменная "cursor" определяет номер разряда индикатора. По достижении значения "4", "cursor" обнуляется. После того как оператору switch был передан номер активного разряда, выводим в этот разряд соответствующую цифру, определенную ранее функцией output().
Затем, после инициализации микроконтроллера, в бесконечном цикле опрашиваем датчие dallas и вызываем функцию output(). #asm("sei") - разрешает прерывания.
while (1)
{
temperatura=ds1820_temperature_10(0);
.#asm("sei")
if (temperatura!=-9999)
{
output(temperatura);
}
}
Функцию, отвечающую за дробление числа по чифрам приводить не буду, так как там нету ничего сложного, да и вид у нее достаточно однообразный и громоздкий.
P.S. Удачи Вам! Если возникли вопросы, задавайте их в комментариях, обязательно разберемся..
Рейтинг: |
Просмотров: 65612 |
|
Гости не имеют права добавлять комментарии и проставлять рейтинг. |
|
Автор: grave (2012-09-06, 9:36)
Привет! Решил немного изменить схемку: Поставил индикатор с общим катодом и датчик ds18b20. Все поменял. Индикатор пашет, а вот температуру не высвечивает, только нули. [Ответить]