Простой термометр с использованием DS18B20 и Attiny24

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

Термометр который хотим изготовить, будет выглядеть как то так:

Плату естественно можно сделать самому другого размера и формата. Но для начала разберемся со схемой. В целом схема простая.

Итак, схема состоит из микроконтроллера Attiny24, дисплей ОБЩИЙ АНОД SH4301BS, диод BAT54C, три транзистора PNP BC807-40, конденсатор 0.1 мкФ, 4-ре резистора 1кОм, 8 резисторов (75-150 Ом). Вот и все компоненты. Конденсатор 10мкФ я не использовал, хотя место на плате для него есть. Диод BAT54C нужен для защиты платы, в случае ошибки полярности при подключении питания. Если вы уверены, что у вас этого не произойдет, то его можно не использовать. Вместо него можно впаять перемычку, на плате для этого есть место. Сам микроконтроллер находится под дисплеем. Питание платы от 3.3 до 5.5 вольт.

Прошивка.
Управляющую программу для микроконтроллера я написал в AtmelStudio6.2. Вот главный цикл программы.

 

* Имя проекта:              Attiny24A_DS18B20
 * Тип МК:		            Attiny24A, Flash 2 Kbytes, SRAM 128 bytes, EEPROM 128 bytes.
 * Vcc                      2,7V - 5,5V.
 * Тактовая частота:        F_CPU 8 мГц.
 * Дата создания файла:     01.04.2015 18:07:09
 * Версия ПО:               ATMEL STUDIO VERSION 6.2.1153
 * FUSES МК:                HIGH 0x5F, LOW 0xE2;
 * Описание:                Данная программа считывает показания температуры с датчика DS18B20 
 *				    и выводит показания на семисегментный индикатор FYT_4031BS_21-общ.анод.
 *				    Показания от -55 до +125 градусов С.
 */ 

#include "define.h"
#include "init_mcu.h"
#include "bits_macros.h"
#include "ds18b20.h"
#include "sev_3segm_OA.h"
#include <util/delay.h> 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>

uint8_t buff[3]={0};
	
ISR(TIM0_COMPA_vect)//прерывание по СТС.
{
	
	//тут будем вызывать функцию вывода данных на индикатор
	//не совсем правильно это делать здесь но других вариантов нету
	//так как у нас в цикле стоит фиксированная задержка которая портит всю малину
	//хотя можно ее убрать чрез таймер но надо экономить место во флэш памяти
	sev_segm_control_ind_3(buff[0],buff[1],buff[2]);
	
}

int main(void)
{
	mcu_init_ports();
	mcu_init_an_comp();
	mcu_init_timer0();
	sev_segm_init_ind();
	ds18b20_port_init();
	sei();
    while(1)
    {
        //Считывание температуры.
       	
        uint16_t Temperatura=ds18b20_read_temp16();//считали два байта данных по температуре из DS18B20.
		//надо выяснить температура отрицательная или положительная.
		//для этого проверим 16 бит регистра.
		if (Temperatura!=ERROR_CRC)
		{
			if (BitIsSet(Temperatura,15))//если set, то температура отрицательная, тогда надо данные инвертировать, см. datasheet на DS18B20
			{
				Temperatura= (~Temperatura)+1;//инвертировали
				buff[2]=0;//это значит температура отрицательная
			}
			else
			{
				buff[2]=1;//это значит температура положительная
			}
		
			buff[0]=HI(Temperatura);//разделим побайтно
			buff[1]=LO(Temperatura);//чтоб легче было обрабатывать данные
		
			//а теперь надо отдельно разместить целую чать замера и дробную часть.
			buff[0]=(buff[0]<<4)|(buff[1]>>4);//тут целая часть.
			buff[1]=buff[1] & 0b00001111;     //тут дробная часть.
			buff[1]=(buff[1]*10)/16;          //преобразовали дробную часть, до 10й части
		
			//вот как бы и все.
		}	
    }
}

 

В конце статьи в архиве можно глянуть всю программу целиком. Те кто занимаются микроконтроллерами, прошить Attiny24 не составит труда. Но если нет программатора, тогда как быть? Не покупать же программатор ради разового использования. Можно заказать готовый спаянный градусник или только прошитый микроконтроллер и плату, а остальное собрать самому.

Как прошить микроконтроллер? В архиве в конце статьи надо найти файл Attiny24A_for_DS18B20.elf этот файл и заливаем в чип. Для этого я использовал программатор AVRISP-MKII. Подключил программатор и открыл окно загрузки прошивки в чип.

В этом окне выбираем наш файл Attiny24A_for_DS18B20.elf выставляем все галочки как на экране и нажимаем кнопку Program. Прошивка закатывается в чип и так же автоматом выставляются нужные нам FUSE биты в нужное нам значение. Нужные значения FUSE битов уже находятся внутри файла Attiny24A_for_DS18B20.elf  После прошивки чипа, надо сделать еще одно важное дейтвие, отключить вывод RESET у микроконтроллера. Этот вывод после отключения станет обычным выходом в микроконтроллере который будет включать точку на дисплее. После отключения RESET, сделать что либо с чипом уже будет невозможно (по крайней мере этим программатором). Поэтому надо как то не перепутать, что за чем делать. Сперва прошиваем чип, а потом отключаем RESET.

Вывод RESET отключаем в этом окне

Ставим галочку на бите RSTDISBL и нажимаем Program. После этого действия вывод RESET будет отключен. Теперь достучаться до микроконтроллера будет невозможно. Чтоб снова подключить RESET обратно нужно использовать параллельный программатор.

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

Вот так выглядела разработка данного градусника.


 

Качаем архив отсюда.
Заказать готовую запаянную плату можно здесь.
Заказать набор для самостоятельной сборки здесь.
Заказать только плату  здесь.
Заказать прошитый микроконтроллер здесь.
Вопросы и пожелания сюда dmalash@gmail.com