Термометр.AVR+DS18B20.

Автор: | 13.08.2016

Термометр на AtMega8 и DS18B20.

Необходимые компоненты:

  1. AtMega8-16PU.

  2. Датчик температуры DS18B20.

  3. WH1602 или аналоги.

  4. Резистор 4.7кОм.

  5. Источник питания 5в.

Часто возникает необходимость обработки параметров внешней среды. Например, давления, температуры, влажности и так далее. Работу со всеми этими параметрами можно легко и элегантно возложить на плечи микроконтроллера.

Сегодня мы соберем простейший термометр, показания которого будут выводиться на LCD WH1602. Датчиком температуры выступит DS18B20, который подключается к микроконтроллеру по однопроводному интерфейсу 1-wire.

Обозначение выводов DS18B20:

4

Схема устройства:

Для управления дисплеем используется 4 линии данных, что позволяет уменьшить количество задействованных контактов контроллера, и освободить их под другие нужды. Данные передаются дисплею тетрадами (по 4 бита).

Чтение показаний температуры осуществляется по однопроводному интерфейсу 1 wire. Для удобства работы была написана простейшая библиотека на языке ассемблера.

Проект для Atmel Studio.

Проект для Atmel Studio (12 MHz)

В итоге получаем:


Любое копирование, воспроизведение, цитирование материала, или его частей разрешено только с письменного согласия администрации MKPROG.RU. Незаконное копирование, цитирование, воспроизведение преследуется по закону!

Читайте также  Программаторы AVR.

Термометр.AVR+DS18B20.: 22 комментария

  1. Андрей

    Здравствуйте! У меня контроллер atmega32 LCD1602 ds18b20/
    Все сделал как в статье только порты другие для lcd и датчика определил.
    Слово Temperature is: появляется.
    А где температура должна выводиться пишет: 0 С’ и все…
    Что сделал не так???
    Очень нужна помощь!!!

    1. DamiKK Автор записи

      Здравствуйте!
      Передача данных по шине 1-wire очень сильно зависит от временных задержек. Поэтому, проверьте тактирование контроллера (Должно быть 16 МГц, но Вы можете запросто это изменить).
      Если это не поможет, пишите ещё, помогу переделать библиотеку под другую частоту.

  2. Андрей

    Да конечно изменил частоту. У меня макетная плата на atmega32a где стоит кварц на 12. А где нужно указать частоту в проекте??? Я работал в Atmel Studio 4, а ваш проект сделан в 6.2 я в ней только учусь…
    И еще у вас функция используется printf для ее использования нужно в Atmel Studio 6.2 какие-то настройки делать???

    1. DamiKK Автор записи

      Библиотека написана на ASM. Соответственно необходимо пересчитать задержки.
      Переносил проекты из Atmel Studio 4 в Atmel Studio 6.2, ошибок не встретил. Обратно не переносил.
      По поводу printf в Atmel Studio лучше будет загуглить. Там будет и с картинками и понятно)

    2. DamiKK Автор записи

      Быть может в Вашем случае проще использовать C?

  3. Андрей

    Ну проще конечно С.
    Но если объясните где в коде надо изменить то думаю разберусь…Но если у Вас есть библиотека на С то было бы хорошо…

    1. DamiKK Автор записи

      Посмотрите содержимое файла dela_16.h.
      В нем определены функции задержек, для частоты в 16МГц. Их необходимо изменить для Вашей частоты. AVR Delay Calculator поможет(поищите в гугле).
      Либо по образу и подобию моей библиотеки на ассемблере, напишите свою на С)

    1. DamiKK Автор записи

      Так я и пытаюсь Вам помочь)
      Либо ждите, и я напишу библиотеку на C.

  4. Андрей

    Время через которое происходит прерывание важно??? Я на 12мгц установил TCNT1=37383 В delay_16.s надо пересчитать .
    global delay_480us
    .global delay_60us
    .global delay_420us
    .global delay_750ms
    .global delay_60ms
    .global delay_100ms
    Но если Вы на С напишите, то я подожду…

  5. Андрей

    12mГц у меня кварц. Может уже Вашу на ASM подогнать под 12 намекните на примере что в коде библиотеки надо менять с ассемблером не дружу, может научусь

  6. Андрей

    Да спасибо увидел!
    Вопрос:
    В инициализации счетчика
    Стоит TCNT1=60000;
    А в самой функции прерывания TCNT1=49910;
    Это правильно???

    1. DamiKK Автор записи

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

  7. Андрей

    У меня макетка с atmega32a. Порт PORTD не могу использовать свободен PORTA. Пытаюсь подключить в проекте LCD на порт А мне куча ошибок вылетает…:
    Build started 25.4.2017 at 10:26:15
    avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT AVR_Thermometr_12.o -MF dep/AVR_Thermometr_12.o.d -c ../AVR_Thermometr_12.c
    In file included from ../AVR_Thermometr_12.c:13:0:
    ../lcd_new.h: In function ‘lcd_init_4d’:
    ../lcd_new.h:58:2: error: ‘DDRA’ undeclared (first use in this function)
    ../lcd_new.h:58:2: note: each undeclared identifier is reported only once for each function it appears in
    ../lcd_new.h:58:17: error: ‘PORTA7’ undeclared (first use in this function)
    ../lcd_new.h:58:33: error: ‘PORTA6’ undeclared (first use in this function)
    ../lcd_new.h:58:49: error: ‘PORTA5’ undeclared (first use in this function)
    ../lcd_new.h:58:65: error: ‘PORTA4’ undeclared (first use in this function)
    ../lcd_new.h:60:19: error: ‘PORTA0’ undeclared (first use in this function)
    ../lcd_new.h:61:20: error: ‘PORTA1’ undeclared (first use in this function)
    ../lcd_new.h:63:5: error: ‘PORTA’ undeclared (first use in this function)
    ../lcd_new.h: In function ‘lcd_write_character_4d’:
    ../lcd_new.h:107:5: error: ‘PORTA’ undeclared (first use in this function)
    ../lcd_new.h:107:24: error: ‘PORTA1’ undeclared (first use in this function)
    ../lcd_new.h:108:24: error: ‘PORTA0’ undeclared (first use in this function)
    ../lcd_new.h: In function ‘lcd_write_instruction_4d’:
    ../lcd_new.h:115:5: error: ‘PORTA’ undeclared (first use in this function)
    ../lcd_new.h:115:25: error: ‘PORTA1’ undeclared (first use in this function)
    ../lcd_new.h:116:24: error: ‘PORTA0’ undeclared (first use in this function)
    ../lcd_new.h: In function ‘lcd_write_4’:
    ../lcd_new.h:123:3: error: ‘PORTA’ undeclared (first use in this function)
    ../lcd_new.h:123:22: error: ‘PORTA7’ undeclared (first use in this function)
    ../lcd_new.h:124:22: error: ‘PORTA6’ undeclared (first use in this function)
    ../lcd_new.h:125:22: error: ‘PORTA5’ undeclared (first use in this function)
    ../lcd_new.h:126:22: error: ‘PORTA4’ undeclared (first use in this function)
    ../lcd_new.h:128:23: error: ‘PORTA0’ undeclared (first use in this function)
    make: *** [AVR_Thermometr_12.o] Îøèáêà 1
    Build failed with 20 errors and 0 warnings…

  8. Андрей

    Сделал проект с нуля ошибки исчезли.
    Но опять показывает:
    Temperature is:
    0 C’

    Что не так… :-(
    Что-то беда у меняя какая-то немогу научиться измерять температуру а мне нужно!

    1. DamiKK Автор записи

      Уже и не знаю чем Вам помочь.Ждите, напишу на C.На выходных скорее всего.

  9. Андрей

    очень познавательно, не все еще понимаю, читаю, сам программист но на php))) решил попробовать себя в микроконтроллерах….у вас на сайте информация написана доступным мне языком без всяких там «да на Си только быдло пишет! пишите на асме» ) Гы) Еще раз спасибо!

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

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