Подключение датчика температуры DS18B20 к ATtiny2313 и вывод температуры на LCD

ds18b20В данной статье пойдет речь о том, как подключить датчик температуры DS18B20 к ATtiny2313 и отображать данные на ЖКИ-дисплее 16×1 на базе HD44780. Для проверки работоспособности программы и схемы я использовал эмулятор Proteus 7 (ISIS 7 Professional). Код программы (проект в Atmel Studio 7 целиком) вы сможете скачать по ссылке в конце статьи. Прошивку (.hex файл) можно установить и на реальный микроконтроллер ATtiny2313, программа будет работать нормально, главное не забыть менять фьюзы: CKSEL3…0 = 0100 – Внутренний тактовый генератор — частота 8 МГц и поставить галочку на SCKDIV8 – деление тактовой частоты на 8.

Цифровой датчик температуры 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 можно подключить двумя способами:

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

Независимо от способа подключения, сигнальный провод необходимо соединить с питанием через резистор 4,7 кОм. При подключении только одного датчика, подойдёт и резистор на 10 кОм.

Назначение выводов

DS18B20 pinout

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.

Подключение LCD на базе HD44780 и DS18B20 к ATtiny2313 схема Proteus

В микроконтроллере ATtiny2313 заводская установленная частота внутреннего RC генератора равняется 8000000Гц (8МГц), также по умолчанию установлен фьюз деления частоты — CLKDIV8 (Clock Divide by 8), поэтому реальная рабочая частота кристалла 1000000Гц (1МГц). По этому не забываем снять этот фьюз.

Подключение LCD на базе HD44780 и DS18B20 к ATtiny2313 fuse divide by 8

Температура ниже нуля

Подключение LCD на базе HD44780 и DS18B20 к ATtiny2313 ниже нуля

Температура выше нуля

Подключение LCD на базе HD44780 и DS18B20 к ATtiny2313 выше нуля

Скачать:
DS18B20 — документация на русском (datasheet ru)
проект в Atmel Studio 7 DS18B20 + LCD HD44780 + ATtiny2313
проект в Proteus 7 DS18B20 + LCD HD44780 + ATtiny2313

Купить ATTINY2313A на Aliexpress


Купить LCD1602 HD44780 на Aliexpress


Купить DS18B20 на Aliexpress

Похожие записи

Комментарии 14

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *