Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

termoПродолжаем осваивать периферию, на очереди измерение температуры. Рассмотрим вариант измерения, при помощи датчика температуры DS18b20.

Характеристики датчика: диапазон измерения от -55 до +125°С. Точность измерения ±0,5°С гарантируется в диапазоне от -10 до +85°С. Возможность измерения с разрешением 9, 10, 11 и 12 бит, т.е. с шагом 0,5; 0,25; 0,125; 0,0625°С. Для обмена информацией с AVR микроконтроллером используется 1-Wire протокол. Каждый датчик имеет свой уникальный адрес, поэтому имеется возможность посадить на шину сразу несколько датчиков.

les12-2

Для сборки схемы понадобится жк дисплей, датчик и резистор на 4,7кОм. Теперь перейдем непосредственно к прошивке.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <mega8.h>
#include <delay.h>
// 1 Wire Bus functions
#asm
   .equ __w1_port=0x18 ;PORTB
   .equ __w1_bit=2
#endasm
#include <1wire.h>
#include <ds18b20.h>
 
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#include <stdio.h> 
 
char lcd_buf[17];
void main(void)
{
 
float temper;  
lcd_init(16);   
w1_init();
ds18b20_init(0,-20,50,DS18B20_12BIT_RES); 
 
while(1)                 
      {
          temper=ds18b20_temperature(0);  
          sprintf(lcd_buf,"t=%.1f\xdfC",temper);    
          lcd_clear();                
          lcd_puts(lcd_buf);        
          delay_ms(1500);              
      }; 
}

Теперь обо всем по порядку:

1
2
3
4
#asm
   .equ __w1_port=0x18 ;PORTB
   .equ __w1_bit=2
#endasm

Данный код означает, что датчик подключен к порту В, PB2 ножке

1
2
#include <1wire.h>
#include <ds18b20.h>

Используется протокол 1wire, тип датчика ds18b20

1
2
3
float temper;  
w1_init();
ds18b20_init(0,-20,50,DS18B20_12BIT_RES);

Переменная temper (с плавающей точкой) используется для хранения температуры,
w1_init(); — ищем датчик,
ds18b20_init(0,-20,50,DS18B20_12BIT_RES); — настройка датчика: 0-номер датчика, -20 -нижний предел измерения, 50 — верхний предел измерения,
DS18B20_12BIT_RES используется 12 битный режим(с шагом 0,0625°С). В принципе настройку можно не производить, по умолчанию выставлен 12 битный режим. Показано лишь для того, чтобы вы могли самостоятельно изменить режим измерения, если это понадобится.

1
2
3
4
5
6
          temper=ds18b20_temperature(0);  
 
          sprintf(lcd_buf,"t=%.1f\xdfC",temper);    
          lcd_clear();                
          lcd_puts(lcd_buf);        
          delay_ms(1500);

temper=ds18b20_temperature(0); — читаем значение температуры с датчика
sprintf(lcd_buf,»t=%.1f\xdfC»,temper); преобразовываем к понятному для lcd виду %.1f — вывод числа с плавающей точкой 1 знак после запятой, не забываем в свойствах проекта указать (s)printf features float.
\xdf — вывод на экран значка градуса.

В результате должно получиться нечто похожее
les12-4

Отрицательной температуры поблизости не было :D, поэтому попробовал остудить бутылочкой соуса из холодильника, результат что то не сильно впечатлил.
les12-5

Зато от нагрева рукой, температура довольно быстро повысилась.
les12-3
Проект доступен тут
Проект для DS18s20
Проект для двух датчиков
Проект для DS18b20 на семисегментниках
Проект Алексея(Alyes)для Atmega16 и шести сегментов + бонус видео устройства

259 комментариев: Урок 12. Измерение температуры при помощи AVR. Простой термометр на AVR.

  • Проблема возникает не сразу, а через некоторое время секунд через 10 ,15 включаются на одну секунду часть портов и выключается видео сделаю вышлю. Спасибо большок, что посмотрели.

  • При моделировании в протеусе примера с одним датчиком выскакивает ошибка:
    Invalid opcode 0xFFFF at PC=0x0002
    Компиляция кода в CodevisioAVR 3.15 просиходит без ошибок.
    Частота МК в протеусе установлена 8МГц.
    В чём может быть ошибка?

  • Кривой протеус. Или криво собрано. Причин мильен.

  • Пробовал с разными версиями протеуса и кодевижн, ошибка везде одинаковая вылазит.
    Значит это какие то настройки. В свойствах проетка кодевижн: частота мк 8МГц, LCD включен на порту D, протокол 1-wire пробовал включать и включать. Для sprinf настройки произведены. Фьюзы три галочки проставлены.

    Ккстати если включить протокол 1-wire в свойствах проекта, то ругается на
    #asm
    .equ __w1_port=0x18 ;PORTB
    .equ __w1_bit=2
    #endasm
    поскольку переопределенние параметров.
    Ошибка таже самая выскакивает в протуесе. Не пойму в чём дело.

  • создаете пустой проект, грузите в протеус, смотрите — если работает, значит ок. Если нет значит проблема в протеусе. Потом постепенно добавляете куски кода и смотрите, когда все сломается.

  • Есть возможность подключать датчики влажности, давления?

  • Конечно

  • Какие модели датчиков посоветуете? Чтоб знать куда рыть

  • и так вопрос с Гуру простой, есть проект на 7Seg индикаторе + N количество датчиков DS18B20 в моем случае 8, на макетной плате 3, Как пример 1 датчик находится в одной комнате, второй во второй, третий на улице.
    При опросе

    Вопрос 1.сколько датчиков может находится на одной шине?
    Вопрос 2. В Proteus 7 если я выключаю питание, а потом включаю нумерация датчиков меняется.
    Как сот варить чудо, что бы датчики оставались на своем месте?

  • 1. вроде до 127
    2. думаю никак

  • С данной ситуацией столкнулся когда делал терморегулятор для теплого пола. с 3 датчиками . Оказалось все просто каждый датчик имеет уникальный серийный номер .
    А пример как это реализовать я посмотрел в примерах CVAVR на данный температурный датчик. Там правда на знакосинтезирующий дисплей вывод, но суть не меняется .

  • можете пример или url скинуть, где этот пример кода есть?

  • в директории CAVR есть папка examples

  • Добрый День. Подскажите Как связать Proteus 7 + AVR Studio Debuger, что бы можно было отслеживать симуляцию.

  • avr studio по сути не нужен, в протеусе все есть, только нужно выбирать не HEX файл в качестве прошивки а COFF. Тогда в протеусе в меню Debug будут доступные регистры AVR и пошаговая отладка

  • Реализовал Ваш проект на Atmega 16, добавил прерывание по таймеру, с некоторым интервалом выскакивает температура 9999.0, сам не замечаю, догадываюсь по не стертым символам на ЖК. При тесте в протеусе ошибка выскакивает через 20 мин. Объясните пожалуйста новичку. Это норма? И что означает код из вашего примера :
    if (temper>1000)
    {
    temper=4096.0-temper;
    temper=-temper;
    }
    Это и есть защита от случайной ошибки. Заранее спасибо.

  • ошибка выскакивает скорее всего из за прерываний, а этот код просто уберите, он не нужен

  • Помогите, зашел в тупик. Убрал прерывание ошибка выскакивает по прежнему. При написании по образцу вашего алгоритма на Atmega8 ошибки нет.
    Если Вас, не затруднит посмотрите мой проект здесь https://yadi.sk/d/PCGGUQNNgWpaw
    это ссылка на мой Яндекс диск. Помогите только с алгоритмом обработки температуры.
    Очень буду Вам признателен.

  • Сделал Build — Clean up и пересобрал проект, вроде глюка не стало. На будущее, не делайте вы названия и пути на русском языке, что протеус, что CAVR этого жутко не любят. Могут появиться глюки даже в рабочих проектах.

  • Огромное спасибо что посмотрели мой проект. Наверно я делаю что-то не так при создании проекта. Буду искать.

  • Я по поводу моего сообщение от 09.05.2015 01:34, возможно кому-то пригодится. Ошибка была в следующем: настройки компилятора (установка всех «галочек») должны быть в точности как в уроке №10 с АЦП. После чего ошибка пропала, тестировал 3 часа.
    Еще раз хочу выразить глубокую благодарность администратору этого сайта, за выложенные уроки и пояснения.

  • Здравствуйте, понравился Ваш урок, но мы только начинаем изучать мк и очень нужна любая помощь с проектом :
    Спроектировать счетчик потребляемой тепловой энергии. Контролируется объем потребляемой горячей воды и разность температур в трубах горячей и холодной воды. Показания счетчика должны быть доступны как визуально, так и через последовательный протокол с компьютерный консоли. Счетчик должен вести ежедневный журнал тепловой энергии, также доступный через последовательный протокол.
    Подскажите если вас не затруднит, возможно ли использовать схему из данного занятия и что следует добавить?

  • данные датчики не подойдут для измерения температуры воды

  • День добрый! Подскажите пожалуйста решение проблемы, у меня она такая же как и у Максима, цитата:

    «Максим on 04.03.2015 в 17:36
    При построении проекта, появляется ошибка Error(s) occured during assembly. И в сообщениях, две ошибки . Invalid redefinition of ‘ _ w1 port ‘ и Invalid redefinition of ‘ _ w1 bit ‘Сталкивался кто с таким?»

    ответа в комментариях не нашёл, ткните носом пожалуйста если он там есть.

  • скорее всего из за того, что датчик подключен в свойствах проекта и в основном коде. Поэтому получается дублирование

  • Спасибо!!! Вы были правы! Всё заработало! есть ещё один вопросик, если Вас не затруднит: как записать в коде подключение LCD к разным портам (например три ноги к порту В и четыре к порту D) ?

  • в кодвижне версии 2+ ноги можно выбирать в свойствах проекта

  • использовал ваш проект для атмеги32 вместо восемь.в конфигурациях поменял название контроллера.переименовал библиотеку на мега 32h.залил в протеус а на дисплее пишется «t=-999,9c»в конфигурациях хотел назначить ножку во вкладке библиотеки,но такого пункта там не оказалось…вообщем что на железе что в протеусе таким образам работает..помогите пожалуйста((

  • сгенерите проект заново

  • сгенерил тоже самое получается((

  • проверьте чтобы проект был на 8 мгц и в протеусе тоже

  • Сделал термометр на два датчика все работает , но через час или два показание пропадают
    и на дисплее t=-999,9c . Пробовал менять датчики , прошивки в проекте, частоту и 8мкг и 1мкг.Поработает час или два и опять » t=-999,9c «.Купил другие датчики ds18b20 все равно через час сбой. Не хотелос Вас напрягать но я уже не знаю что делать кажется все перепробывал. Подскажите.

  • попробуйте запуститься от внешнего кварца

  • Спасибо завтра попробую .

  • Здравствуйте я наверно задам довольно глупый вопрос но точного конкретного ответа я не нашел ни где. Везде пишут о востановлении фьюзов. Но нигде не пишут могу ли я поставить
    фьюзфы дапустим на 1мкг а потом перешить на 8мкг, или вообще на любую другую частоту? (вообще то проще купить мк.чем заморачиваться востанавливать фьюзы)
    Подскажите.

  • фьюзы можно перешивать как угодно. я так и делаю — у меня для опытов 3 платки с кварцами на 8, 12 и 16МГц

  • Можно ли прошитый мк. на внутреный генератор на 4мгц .перепрошить на наружный генератор кварц на 4мгц, или на другую частоту . Тоесть можно ли перешивать фьюзы на одном мк.менять прошивку и фьюзы. Можно ли мк прошитый на 16мгц перапрошить на 1мгц.
    или надо покупать другой мк.

  • можно

  • Спасибо. Почему спрашиваю? я прошил и поставил фьюзы на 4мкц с кварцем (на 8 небыло но в проекте я исправил на 4мкц )мк. мертвый , я перепрошил на 4мкц внутренный генератор заработал, но опять через 30минут термометр стал показывать 9999. извините что напрягаю но я уже сломал голову и перепробывал все и просто не знаю что делать. Менял датчики. Пробовал разные блоки питания питания .Остался один вариант разобрать и собрать по новой. Спасибо за информацию .

  • протестируйте с одним датчиком

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

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

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика