Измерительные устройства

Термометр с линейной шкалой

  • Печать

icothermoТермометр с линейной шкалой выполняет функции измерителя температуры с двойной индикацией: в цифровом виде и в виде линейной шкалы. Основу термометра составляет микроконтроллер PIC12F629 и драйвер светодиодного индикатора MAX7219. Возможности микросхем позволяют реализовать термометр с различными датчиками и индикацией на 3-х разрядном цифровом дисплее и линейном индикаторе на 40 точек.

Принципиальная схема термометра с линейной шкалой изображена ниже. Все элементы используют стандартный способ включения. Индикация температуры полностью реализована с помощью MAX7219. Питание конструкции выполняется постоянным напряжением 5В.

Принципиальная схема термометра

Принципиальная схема термометра

 Реализация отображения температуры.

lineled
Внешний вид

MAX7219 имеет два режима обработки и отображения входных данных. По умолчанию используется простой режим, в котором каждый бит регистра данных микросхемы, отвечает за состояние отдельного светодиода. Этот режим наилучшим образом подходит для работы с линейной шкалой. Второй режим использует декодирование входного BCD кода, и предназначен для работы с цифровыми семисегментными индикаторами. В этом случае в регистр данных записывается одноразрядное число в BCD коде, которое должно быть отображено на дисплее.  Микросхема MAX7219 имеет 8 регистров данных, что позволяет работать с 8 цифровыми индикаторами, либо с 64 светодиодами. Переключение режима работы выполняется программно.

Для построения термометра принято, что температура будет отображаться на 3-х разрядном дисплее. Такой дисплей дает возможность показывать значение от 0 до 99.9 градуса в положительной части шкалы. В отрицательной части шкалы, из-за необходимости отображения знака «минус», можно работать только с целыми числами.

После реализации дисплея остается доступными 40 отдельных светодиодов, которые и образуют линейную шкалу. Ее возможностей вполне достаточно для бытовых измерений. Если ограничиться только положительными значениями, то диапазон отображаемых значений составит от 0 до +40 градусов с шагом в 1 градус. При необходимости, диапазон индикации можно расширить, увеличив шаг отображения температуры.

 

Конструкция

Основой термометра является двухсторонняя печатная плата размерами 130х33 мм. Светодиоды и индикаторы установлены с обратной, от остальных радиодеталей стороны.

Линейная шкала набрана из отдельных светодиодов L-383, изготавливаемых KingBright в прямоугольном корпусе 2х5 мм. Для повышения информативности, в позициях десятков установлены красные светодиоды, в позициях пятерок – оранжевые. Остальные светодиоды - зеленого свечения. В конструкции предусмотрена установка постоянно горящего светодиода диаметром 10мм, отображающего минимальное значение шкалы и имитирующего колбу жидкостного градусника.

При использовании двух датчиков предусмотрена индикация в виде светодиодов, расположенных по разные стороны шкалы. Такое расположение позволяет нанести на корпус и подсвечивать градуировку двух разных диапазонов измерений. Схемотехнически, эти светодиоды представляют собой неиспользуемые десятичные точки семисегментных индикаторов.

В качестве датчиков температуры можно использовать микросхемы с шиной 1-Wire или I2C. В обоих случаях реализация обмена выполняется программно.

Программное обеспечение

Программное обеспечение для термометра было написано в среде mikroPascal. Ниже приведенный код получает и обрабатывает значение температуры от датчика DS18B20.  

Программа термометра с линейной шкалой и датчиком DS18B20
program LineLED;
const home : byte = 1;
var port_array: array[3] of Byte;
   dig_buf: byte;
   temp_home : word;
   Line1,Line2,Line3,Line4,Line5:Byte;
   q:boolean;
   temp1,temp2:byte;
   temp_whole : byte;
// Процедура обмена с MAX7219
 
procedure setMAX7219(adr,dat:byte);
var i:byte;
begin
clearbit(GPIO,4);           // включить линию разрешения
  dig_buf:=adr;               // передача адреса регистра
  for i:=1 to 8 do
   begin
     if testbit(dig_buf,7) then setbit(GPIO,2) else clearbit(GPIO,2);
            setbit(GPIO,5);          // включить тактовую линию
         dig_buf:=dig_buf shl 1; // сдвиг символа в буфере отображения
       clearbit(GPIO,5);       // отключить тактовую линию
     end;
dig_buf:=dat;               // передачаданных
  for i:=1 to 8 do
   begin
     if testbit(dig_buf,7) then setbit(GPIO,2) else clearbit(GPIO,2);
     setbit(GPIO,5);         // включить тактовую линию
  dig_buf:=dig_buf shl 1; // сдвиг символа в буфере отображения
       clearbit(GPIO,5);       // отключить тактовую линию
     end;
  setbit(GPIO,4);             // выключить линию разрешения
  Delay_ms(10);
end;
// Преобразование температуры для линейки светодиодов
 
procedure line(templ:byte);
var c:byte;
begin
Line1:=0;                     // Обнуление индикаторов
Line2:=0;
Line3:=0;
Line4:=0;
Line5:=0;
c:=1;
if templ <=8 then             // Обработкапри T<=8 градусов
while c<=templ do
   begin
     if c=1 then setbit(Line1,7) else setbit(Line1,c-2);
     c:=c+1;
   end;
if (templ <=16) and (templ>8) then begin // Обработкапри 8<=T<=16 градусов
     while c<=templ do
     begin
       if c=9 then setbit(Line2,7) else setbit(Line2,c-10);
       c:=c+1;
     end;
     Line1:=0xFF;
   end;
if (templ <=24) and (templ>16) then     // Обработкапри 16<=T<=24 градусов
begin
while c<=templ do
   begin
     if c=17 then setbit(Line3,7) else setbit(Line3,c-18);
     c:=c+1;
   end;
   Line1:=0xFF;
   Line2:=0xFF;
end;
if (templ <=32) and (templ>24) then     // Обработкапри 24<=T<=32 градусов
begin
while c<=templ do
   begin
     if c=25 then setbit(Line4,7) else setbit(Line4,c-26);
     c:=c+1;
   end;
   Line1:=0xFF;
   Line2:=0xFF;
   Line3:=0xFF;
end;
if (templ <=40) and (templ>32) then    // Обработкапри 32<=T<=40 градусов
begin
while c<=templ do
   begin
     if c=33 then setbit(Line5,7) else setbit(Line5,c-34);
     c:=c+1;
   end;
   Line1:=0xFF;
   Line2:=0xFF;
   Line3:=0xFF;
   Line4:=0xFF;
end;
   setMAX7219(0x08,Line1);     // Зажигание элементов шкалы
   setMAX7219(0x07,Line2);
   setMAX7219(0x06,Line3);
   setMAX7219(0x05,Line4);
   setMAX7219(0x04,Line5);
end;
 
procedure get_temp;           // Чтение температуры из термометра  
begin
Ow_Reset(GPIO,home);                 // сбросшины
Ow_Write(GPIO,home,$CC);             // команда SKIP_ROM
Ow_Write(GPIO,home,$44);             // команда CONVERT_T
Delay_ms(600);                       // задержка на время преобразования
Ow_Reset(GPIO,home);                 // сбросшины
Ow_Write(GPIO,home,$CC);             // команда SKIP_ROM
Ow_Write(GPIO,home,$BE);             // команда READ_SCRATCHPAD
temp1 := Ow_Read(GPIO,home);         // чтение первого байта
temp2 := Ow_Read(GPIO,home);         // чтение второго байта
temp_home := temp1;                 // преобразование в слово
temp_home := (temp2 shl 8) + temp_home;
end;
 
procedure Calc_Temperature(temp2write: Word);   // преобразованиетемпературы
  const RES_SHIFT : byte = 4;
var temp_fraction : Word;
   dig : byte;
begin
port_array[0]:=0;
if (temp2write and $8000) = 0x8000 then
begin
     temp2write := not temp2write + 1;
     port_array[0]:=8;
end;
temp_whole := temp2write shr RES_SHIFT ;
dig:=(temp_whole/10) mod 10;
port_array[0] := dig;     //Установка 1 цифры
dig:=temp_whole mod 10;
port_array[1] := dig+128;   //Установка 2 цифрыизапятой
temp_fraction := temp2write shl (4-RES_SHIFT);
temp_fraction := temp_fraction and $000F;
temp_fraction := temp_fraction * 625;
dig:=temp_fraction/1000;
port_array[2] := dig;       //Установка 3 цифры
end; //~
 
begin  //Основной цикл
  Delay_ms(150);
GPIO:=0;
CMCON:=7;
TRISIO := %00001000;
 //настройка MAX7219
setMAX7219(0x0C,0x01);
setMAX7219(0x0A,0x08);
setMAX7219(0x0B,0x0f);
setMAX7219(0x09,0x07);
setMAX7219(0x0C,0x01);
//начальные цифры для MAX7219
setMAX7219(0x01,0x01);
setMAX7219(0x02,0x02);
setMAX7219(0x03,0x03);
while (1) do               //Основнойцикл
  begin
Delay_ms(1000);             //Задержка
get_temp;                   //Чтение температуры из датчика
Calc_Temperature(temp_home);//Вычисление цифр для индикации
line(temp_whole);           //Индикация на шкале
setMAX7219(0x01,port_array[0]); //Цифра 1
setMAX7219(0x02,port_array[1]); //Цифра 2
setMAX7219(0x03,port_array[2]); //Цифра 3
  end;
 
end.
 

 Еще по теме:

Термометр на микроконтроллере PIC12F629

Работа с драйвером индикаторов MAX7219