В данной статье пойдет речь о том, как подключить датчик температуры 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