В данной статье пойдет речь о том, как подключить датчик температуры DS18B20 к ATtiny2313 и отображать данные на ЖКИ-дисплее 16×1 на базе HD44780. Для проверки работоспособности программы и схемы я использовал эмулятор Proteus 7 (ISIS 7 Professional). Код программы (проект в Atmel Studio 7 целиком) вы сможете скачать по ссылке в конце статьи. Прошивку (.hex файл) можно установить и на реальный микроконтроллер ATtiny2313, программа будет работать нормально, главное не забыть менять фьюзы: CKSEL3…0 = 0100 – Внутренний тактовый генератор — частота 8 МГц и поставить галочку на SCKDIV8 – деление тактовой частоты на 8.
- 1 Цифровой датчик температуры DS18B20
- 2 Пример программы в Atmel Studio 7
- 3 Схема подключения LSD дисплея на базе HD44780 и датчика температуры DS18B20 к ATtiny2313 в ISIS 7 Professional — Proteus. Симуляция.
- 4 Купить ATTINY2313A на Aliexpress
- 5 Купить LCD1602 HD44780 на Aliexpress
- 6 Купить DS18B20 на Aliexpress
- 7 Похожие записи
Цифровой датчик температуры DS18B20
DS18B20 цифровой датчик температуры (термометр) с программируемым разрешением, от 9 до 12–bit, которое может сохраняться в EEPROM памяти прибора. DS18B20 обменивается данными по 1-Wire шине и при этом может быть как единственным устройством на линии так и работать в группе. Все процессы на шине управляются центральным микропроцессором: AVR, PIC, Arduino, STM, Raspberry Pi и др..
Диапазон измерений от –55°C до +125°C и точностью 0.5°C в диапазоне от –10°C до +85°C. В дополнение, DS18B20 может питаться напряжением линии данных («parasite power»), при отсутствии внешнего источника напряжения.
Каждый DS18B20 имеет уникальный 64-битный последовательный код, который позволяет, общаться с множеством датчиков DS18B20 установленных на одной шине. Такой принцип позволяет использовать один микропроцессор, чтобы контролировать множество датчиков DS18B20, распределенных по большому участку.
Смотрите также:
Подключение LCD на базе HD44780 к ATmega16 (LM016L LCD 16×2)
Мигание светодиодом на ATmega16/32
Atmel Studio 7 — Создание нового проекта
Характеристики
Диапазон измеряемых температур | −55…+125 °C |
Точность | ±0,5°C (в пределах −10…+85 °C) |
Время получения данных | 750 мс при 12-битном разрешении; 94 мс при 9-битном разрешении |
Напряжение питания | 3–5.5 В |
Потребляемый ток при бездействии | 750 нА |
Потребляемый ток при опросе | 1 мА |
Подключение
Герметичный датчик на основе микросхемы DS18B20 можно подключить двумя способами:
- По трём проводам: питание (красный), земля (чёрный) и сигнал (белый).
- По двум проводам: земля и сигнал. В этом случае датчик изредка может давать неверные показания, которые легко исключить из конечного результата фильтрацией.
Независимо от способа подключения, сигнальный провод необходимо соединить с питанием через резистор 4,7 кОм. При подключении только одного датчика, подойдёт и резистор на 10 кОм.
Назначение выводов
SO* | SOP* | TO-92 | СИМВОЛ | ОПИСАНИЕ |
---|---|---|---|---|
5 | 4 | 1 | GND | Общий. |
4 | 1 | 2 | DQ | Вывод данных ввода/вывода (Input/Output pin). Open-drain 1-Wire interface pin. По этой линии подается питание в режиме работы с паразитным питанием. |
3 | 8 | 3 | VDD | VDD ножка питания. Для режима работы с паразитным питание VDD необходимо соединить с общим проводом. |
*Все остальные выводы должны оставаться не подключенными.
Пример программы в Atmel Studio 7
ds18b20.h
#ifndef DS18B20_H_
#define DS18B20_H_
#include <avr/io.h>
// установки подключения к DS18B20
#define DS18B20_PORT PORTB
#define DS18B20_DDR DDRB
#define DS18B20_PIN PINB
#define DS18B20_DQ PB7
// команды
#define DS18B20_CMD_CONVERTTEMP 0x44
#define DS18B20_CMD_RSCRATCHPAD 0xbe
#define DS18B20_CMD_WSCRATCHPAD 0x4e
#define DS18B20_CMD_CPYSCRATCHPAD 0x48
#define DS18B20_CMD_RECEEPROM 0xb8
#define DS18B20_CMD_RPWRSUPPLY 0xb4
#define DS18B20_CMD_SEARCHROM 0xf0
#define DS18B20_CMD_READROM 0x33
#define DS18B20_CMD_MATCHROM 0x55
#define DS18B20_CMD_SKIPROM 0xcc
#define DS18B20_CMD_ALARMSEARCH 0xec
// остановить любое прерывание во время чтения данных с DS18B20
#define DS18B20_STOPINTERRUPTONREAD 1
//functions
extern double getTempDS18B20();
#endif
ds18b20.c
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "ds18b20.h"
/*
* ds18b20 - инициализация
*/
uint8_t resetDS18B20() {
uint8_t i;
// импульс сброса, минимум 480?s
DS18B20_PORT &= ~(1 << DS18B20_DQ);
DS18B20_DDR |= (1 << DS18B20_DQ); // выход
_delay_us(480);
// Когда DS18B20 обнаруживает положительный перепад, он ждет от 15?s до 60?s
DS18B20_DDR &= ~(1 << DS18B20_DQ); // вход
_delay_us(60);
// и затем передает импульс присутствия, перемещая шину в логический «0» на длительность от 60?s до 240?s.
i = (DS18B20_PIN & (1 << DS18B20_DQ));
_delay_us(420);
//return the read value, 0=ok, 1=error
return i;
}
/*
* написать один бит
*/
inline void writeBitDS18B20(uint8_t bit) {
// логический «0» на 1?s
DS18B20_PORT &= ~(1 << DS18B20_DQ);
DS18B20_DDR |= (1 << DS18B20_DQ); // выход
_delay_us(1);
// если нужно написать 1, нужно освободить линию (если не - держать низкий уровень)
if (bit) {
DS18B20_DDR &= ~(1 << DS18B20_DQ); // вход
}
// ждать 60?s и освободить линию
_delay_us(60);
DS18B20_DDR &= ~(1 << DS18B20_DQ); // вход
}
/*
* прочитать один бит
*/
uint8_t readBitDS18B20(void) {
uint8_t bit = 0;
// логический «0» на 1?s
DS18B20_PORT &= ~(1 << DS18B20_DQ);
DS18B20_DDR |= (1 << DS18B20_DQ); // вход
_delay_us(1);
// освободить линию и ждать 14?s
DS18B20_DDR &= ~(1 << DS18B20_DQ); // вход
_delay_us(14);
// прочитать значение
if (DS18B20_PIN & (1 << DS18B20_DQ)) {
bit = 1;
}
// ждать 45?s и вернуть значение
_delay_us(45);
return bit;
}
/*
* написать один байт
*/
void writeByteDS18B20(uint8_t byte) {
uint8_t i = 8;
while (i--) {
writeBitDS18B20(byte & 1);
byte >>= 1;
}
}
/*
* прочитать один байт
*/
uint8_t readByteDS18B20(void) {
uint8_t i = 8, n = 0;
while (i--) {
n >>= 1;
n |= (readBitDS18B20() << 7);
}
return n;
}
/*
* получить температуру
*/
double getTempDS18B20() {
uint8_t temperatureL;
uint8_t temperatureH;
double retd = 0;
if (DS18B20_STOPINTERRUPTONREAD == 1) {
cli();
}
resetDS18B20(); // сброс
writeByteDS18B20(DS18B20_CMD_SKIPROM); // пропуск ПЗУ(ROM)
writeByteDS18B20(DS18B20_CMD_CONVERTTEMP); // начать преобразование показаний температуры
while (!readBitDS18B20()); // ждать, пока преобразование не завершится
resetDS18B20(); // сброс
writeByteDS18B20(DS18B20_CMD_SKIPROM); // пропуск ПЗУ(ROM)
writeByteDS18B20(DS18B20_CMD_RSCRATCHPAD); // читать scratchpad
// прочитать 2 байта из scratchpad
temperatureL = readByteDS18B20();
temperatureH = readByteDS18B20();
if (DS18B20_STOPINTERRUPTONREAD == 1) {
sei();
}
// преобразовать полученное 12 битное значение
retd = ((temperatureH << 8) + temperatureL) * 0.0625;
return retd;
}
main.c
// site: http://micro-pi.ru
// подключение LSD на базе HD44780 и DS18B20 к ATtiny2313
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <math.h>
#include "ds18b20.h"
#include "LCD.h"
/*
* -123.4
* numbers[0] = 123
* numbers[1] = 4
*/
inline void explodeDoubleNumber(int* numbers, double flt) {
/*
* Функция abs() вычисляет абсолютное значение и возвращает модуль значения flt (|flt|).
*/
numbers[0] = abs((int) flt); /* из -123.4 получаем 123 */
numbers[1] = abs((int) ((flt - ((int) flt)) * 10)); /* из -123.4 получаем 4 */
}
inline void printTemp(double d) {
char text[17] = "T=";
int fs[2];
char num[5];
explodeDoubleNumber(fs, d);
if (d < 0) {
strcat(text, "-");
}
itoa(fs[0], num, 10);
strcat(text, num);
strcat(text, ".");
itoa(fs[1], num, 10);
strcat(text, num);
strcat(text, "'C");
lcdClear();
lcdGotoXY(0, 0);
lcdPuts(text);
}
int main(void) {
_delay_ms(100);
lcdInit();
lcdClear();
lcdSetDisplay(LCD_DISPLAY_ON);
lcdSetCursor(LCD_CURSOR_OFF);
while (1) {
double d = getTempDS18B20();
printTemp(d);
_delay_ms(1000);
}
}
*библиотека для работы с LSD дисплеем находится в архив проекта. Скачать можно по ссылке ниже.
Схема подключения LSD дисплея на базе HD44780 и датчика температуры DS18B20 к ATtiny2313 в ISIS 7 Professional — Proteus. Симуляция.
Соединяем все компоненты так, как указано на картинке. Если не знаете как сделать проект в Протеус, переходим на страницу Мигание светодиодом на ATmega16/32.
В микроконтроллере ATtiny2313 заводская установленная частота внутреннего RC генератора равняется 8000000Гц (8МГц), также по умолчанию установлен фьюз деления частоты — CLKDIV8 (Clock Divide by 8), поэтому реальная рабочая частота кристалла 1000000Гц (1МГц). По этому не забываем снять этот фьюз.
Температура ниже нуля
Температура выше нуля
Скачать:
DS18B20 — документация на русском (datasheet ru)
проект в Atmel Studio 7 DS18B20 + LCD HD44780 + ATtiny2313
проект в Proteus 7 DS18B20 + LCD HD44780 + ATtiny2313
online pharmacies legitimate