Rgb светильник на pic12f629/675

Введение

DHT11 – это датчик температуры и влажности воздух, который использует один провод для передачи 40 бит данных. Первые 16 бит – это целая и дробная части значения влажности, следующие 16 бит – целая и дробная части значения температуры, и последние 8 бит – это контрольная сумма.

Чтобы DHT11 и микроконтроллер начали общаться друг с другом, их необходимо засинхронизировать. Чтобы засинхронизировать их, микроконтроллер посылает сигнал старта, который представляет собой импульс длительностью 20 мкс на выводе данных. После импульса, микроконтроллер ждет получения данных. В программе мы должны изменить направление вывода данных. Вы можете прочитать подробности о DHT11 в техническом описании. У вас может быть датчик, как в 4-выводном, так и в 3-выводном корпусе; но мы используем 3-выводную версию. Между этими версиями нет никакой разницы, а дополнительный вывод ни к чему не подключен.

Датчик температуры и относительной влажности воздуха DHT11

Конструкция

Принципиальная схема предлагаемого решения показана на рисунке ниже.

Использование микроконтроллера ATtiny13A компании ATMEL позволило значительно упростить конструкцию устройства. Этот тип микроконтроллера идеально подходит для использования в данном случае. Он имеет небольшой корпус SO8, возможность использования напряжения от 1,8В и различные режимы снижения энергопотребления. Кроме того, это один из самых популярных и дешевых микроконтроллеров этого класса, который доступен практически в любом магазине электроники.

Для питания используется литиевая батарея типа CR2032, обеспечивающая напряжение 3В, что вполне достаточно для питания компонентов устройства.

Конденсаторы C1 … C3 уменьшают сопротивление источника питания

Это особенно важно для батарей, находящихся на границе разряда, у которых возрастает внутреннее сопротивление

Визуальная информация представлена с помощью двух синих светодиодов. Хотя их рабочее напряжение близко к напряжению питания, но это хватает, чтобы они светили ярко. В то же время синий цвет хорошо заметен человеческому глазу, особенно в условиях недостаточной освещенности. Для переключения светодиодов используется ключ на транзисторе VT1 (BC847).

Цифровой мультиметр AN8009
Большой ЖК-дисплей с подсветкой, 9999 отсчетов, измерение TrueRMS…

Подробнее

Звуковое оповещение об истечении заданного промежутка времени производится с помощью пьезоэлектрического излучателя со встроенным генератором. Он достаточно громкий и его можно услышать даже тогда, когда устройство спрятано, например, в кармане. Управление звуковым излучателем осуществляется с помощью транзистора VТ2 (BC847).

Запуск обратного отсчета и остановка осуществляется одним нажатием кнопки SW1, контакт которого предварительно подтянут резистором R6 (10кОм) к плюсу питания.

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

Выбор временного интервала производится путем переключения одной из четырех секций переключателя SW2, типа DIP-SWITCH. Замкнутая секция подключает на минус питания один из четырех резисторов (R7 до R10), образуя с резистором R11 делитель напряжения.

Микроконтроллер, подавая высокий логический уровень на резистор R11, измеряет с помощью АЦП (аналого-цифрового преобразователя) напряжение, которое образуется на делителе.

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

Аппаратная часть

Первая умная вещь, которую стоит сделать при создании гаджета, это нарисовать его структурную схему. Это поможет вам увидеть, что вам необходимо, и как это реализовать. Ниже приведена структурная схема нашего термометра.

Структурная схема термометра на PIC16F628, DHT11 и LCD
(может показаться избыточным, составлять структурную схему для каждой мелочи, но это может быть полезно)

Мы хотим, чтобы DHT11 передавал данные микроконтроллеру.

Мы хотим, чтобы микроконтроллер обрабатывал данные и отображал их на LCD дисплее.

Мы хотим, чтобы у нас была возможность прошивать микроконтроллер через ICSP.

Термостат на PIC контроллере

Термостат

– поддерживает заданную температуру, в определённой среде.

Задумка

Появилось у меня помещение для станка. Там должна быть температура определённого уровня, при влаге и холоде на улице. Электрокамин и печи не по мне, много дров, топлива и большое энергопотребление, при не так уж и большой производительности тепла на выходе. Присмотрел и приобрёл тепловентилятор, промышленного образца, с минимумом пластиковых, горючих материалов:

Характеристики:

– Номинальное напряжение, частота сети, В/Гц __220 / 50; – Потребляемая мощность, кВт ____ 1 / 2 кВт; – Отдача тепла, м3/час _____200;

Управление

Тепловентилятор есть, теперь необходимо сделать умную систему управления и контроля. Поискав в интернете нашлась схема из журнала Р-К №11/2008г., – «Цифровой термостат». Конструкция оказалась простой, как по мне, с двухстрочным цифровым экранчиком. Ниже приведена схема, нарисованная в программе SPlan 7.0.


По характеристикам термостат способен задавать температуру от -25 до +75°С, при шаге 0,25°С. Так же можно задать в предустановках меню спад и нарастание температуры шагом по 0,1°С. Работа с термостатом осуществляется с помощью кнопок. Кнопками «+» и «-» (S1 и S2) определяется значения температуры или спада (нарастания), кнопка «MODE» (S3) – режим установки.

Для того чтобы задать температуру поддержания, нажимаем кнопку S3 и удерживаем её пока на экране не засветится «SET TEMPERATURE».


Кнопкой S1 и S2 устанавливаем необходимый спад (нарастание).


При последующем нажатии кнопки S3, происходит возврат к отображению текущей температуры.


Контроль температуры осуществляется при помощи цифрового термометра А1 – DS1820. Это готовый элемент, не нуждающийся в настройке. Термодатчик изготовлен в виде отдельного элемента, присоединяемого к основному блоку экранированным проводом со штекером 3,5мм (аудио).


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


Управление схемой происходит микроконтроллером PIC16F628. Тактовая частота организована кварцом ZQ1 с частотой резонанса – 4МГц.

Управление тепловентилятором происходит с симистором VS1 – BT136. Управление симистором осуществляется при помощи оптопары MOC3043. Силовую схему управления тепловентилятора я дополнил промежуточным реле. Катушка реле стала играть роль нагрузки симистора, а её контакты запараллелил и скомутировал в цепь питания тепловентилятора.

Схема оперативного питания выполнена на малогабаритном герметичном трансформаторе, у него сдвоенная вторичная обмотка, 9V-0-9V, на номинальный ток 100mA. Выпрямитель исполнен на на двух диодах VD1и VD2. Если трансформатор с одной понижающей обмоткой необходимо применить схему моста. Контроллер и дисплей запитан от +5V через стабилизатор напряжения А2 (7805).

Для отключения подсветки пин 16 экрана можно отключить, или как я поставил выключатель. Печатная плата термостата, чисто моя разработка.


Собранный вид платы управления:


В файле термостат.lay есть несколько страниц.

Корпус

Третья задача – корпус. Выбрал Z20. Ниже приведена технология подгонки корпуса и изготовления отверстий при помощи шаблонов.

Файлы:

datasheet.rar (скачиваний: 636) plata-spl.rar (скачиваний: 687) rk_2008_11.rar (скачиваний: 785) termo.hex.rar (скачиваний: 765)

Источник (Source)

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

Таймер на PIC для управления электроприборами

Таймер на PIC для управления электроприборами

Электрический таймер предназначен для программного управления бытовыми устройствами, освещением и другими устройствами. Таймер можно использовать для аквариумного и другого оборудования. Использование таймера позволит сберегать электроэнергию, не понижая уровень комфорта.

Вариант 1

В состав данного устройства заходит три таймера. Таймер 1.1 и таймер 1.2 любой из их позволяет задавать время включения и выключения нагрузки, которая подключается к реле KV1. Таймер 2.1 и таймер 2.2 также позволяет задавать время включения и выключения нагрузки, которая подключается к общему реле KV2. Таймер 3 представляет собой оборотный таймер, который управляет нагрузкой через KV3.

В данном устройстве использован микроконтроллер PIC16F628A. Элементы С1, С2, ZQ1 являются наружными частотозадающими элементами внутреннего тактового генератора. Для отображения инфы употребляется индикатор HG1 с контроллером KS0066. Индикатор может отображать две строчки по шестнадцать знаков. Подстроечным резистором R4 можно регулировать контрастность изображения.

При использовании реле с током катушки более 100 мА, то транзисторы КТ315В следует поменять на транзисторы очень допустимый ток коллектора, которых больше тока катушки реле.

Режим отображения текущего времени.

SB1, SB2 – уменьшение или повышение значений времени при настройке.

Режим отображения таймера 1.1.

Если время включения установлено равным времени выключения то считается не применяемым.

Предназначение кнопок и управление ими такое же, как и в режиме текущего времени.

Таймеры 1.2, 2.1 и 2.2 по индикации и управлению подобны таймеру 1.1.

Режим отображения таймера 3

Таймер 3 — это оборотный таймер.

Для входа в режим опции таймера 3 нужно надавить и задерживать, до возникновения мигающего курсора, кнопку SB5.

В режиме опции перемещение курсора осуществляется клавишами SB3 и SB4, а изменение значений клавишами SB1 и SB2. При отсчете времени приостановить таймер 3 можно нажав SB5.

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

Переключение меж режимами отображения осуществляется кнопками SB1 и SB2.

Биты конфигурации микроконтроллера.

Вариант 2

Режим отображения текущего времени

SB1, SB2 – уменьшение или повышение значений времени при настройке.

Режим отображения таймера

Перечень радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот DD1 МК PIC 8-бит PIC16F628A 1 Поиск в win-sourceВ блокнотHG1 LCD 16x2BC1602B21 Поиск в win-sourceВ блокнотZQ1 Кварцевый резонатор4 МГц1 Поиск в win-sourceВ блокнотVD1-VD3 Диодик КД105Б 3 Поиск в win-sourceВ блокнотVT1-VT3 Биполярный транзистор КТ315В 3 Поиск в win-sourceВ блокнотC1, C2 Конденсатор15…30 пФ2 Поиск в win-sourceВ блокнотR1, R3, R5 Резистор 1 кОм 3 Поиск в win-sourceВ блокнотR2, R6 Резистор 4.7 кОм 2 Поиск в win-sourceВ блокнотR4 Подстроечный резистор10 кОм1 Поиск в win-sourceВ блокнотДобавить все

Скачать перечень частей (PDF)

ВАРИАНТ 1.hex (9 Кб) ВАРИАНТ 2.hex (8 Кб)Таймер PIC Микроконтроллер

Алгоритм работы программы термометра на ATmega и DS18B20

Все установки микроконтроллера заводские, FUSE-биты трогать не надо.

Для работы программы задействовано два таймера/счетчика микроконтроллера:- восьмиразрядный Т0- шестнадцатиразрядный Т1
С помощью восьмиразрядного таймера Т0 настроенного на вызов прерывания по переполнению, с внутренней частотой СК/8 (период 2 миллисекунды) организован:- расчет текущей температуры- динамический вывод результатов измерения температуры датчиком DS18B20
С помощью шестнадцатиразрядного таймера Т1 настроенного на вызов прерывания по переполнению, с внутренней частотой СК/64 (период 4 секунды) организованно:- подача команды датчику DS18B20 на измерение температуры- считывание измеренной температуры с датчика
В принципе, можно задействовать и один восьмиразрядный таймер/счетчик, также настроенный на вызов прерывания по переполнению, с внутренней частотой СК/8, и всю работу схемы организовать в процессе обработки прерывания. Но дело в том, что смысла в этом нет — датчику DS18B20 необходимо чуть меньше 1 секунды (при 12-ти битном разрешении) для конвертирования (определения) температуры, т.е., чаще чем 1 раз в секунду мы не сможем обновлять данные температуры. Кроме того, столь частое обновление температуры приведет к нагреву датчика и, соответственно, к искажению реальных данных. Использование второго счетчика позволяет отдельно задавать промежутки времени измерения температуры.

Вот так выглядит основная часть программы в Algorithm Builder:

Где:

— SP — настройка начального адреса стека 

— Timer 0 — настройка таймера T0:

— Timer 1 — настройка таймера Т1:

— TIMSK — настройка прерываний от таймеров:

— Init_Display — подпрограмма настройки разрядов портов, участвующих в динамической индикации вывода данных на трехразрядный семисегментный индикатор

— 1 —> I  —  глобальное разрешение прерываний

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

Если возникнут вопросы, если что-то изложено не понятно или есть вопросы по программе, пишите — отвечу.

  Программа термометра в HEX файле (2,4 KiB, 7 692 hits)

  Программа термометра в Algorithm Builder (7,1 KiB, 5 449 hits)

Второй вариант программы, без 4-х секундной задержки измерения температуры. Температура измеряется непрерывно (интервал менее 1 секунды)

  Термометр 2 — HEX файл (2,4 KiB, 4 473 hits)

  Термометр 2 в AlgorithmBuilder (11,1 KiB, 4 202 hits)

Другие конструкции на микроконтроллерах1. Простые электронные часы на микроконтроллере ATyni26, с использование микросхемы часов реального времени DS13072. Двухканальный термометр на микроконтроллере ATmega8 и датчиках температуры DS18B203. Двухканальный термостат, терморегулятор на ATmega8 и датчиках DS18B204. Двухканальный термометр, термостат, терморегулятор с возможностью работы по времени, одноканальный таймер реального времени на ATmega8 и датчиках DS18B205. Двухканальный термометр, часы на ATmega8, датчиках температуры DS18B20, RTC DS1307, LCD 1602

Термометр на микроконтроллере ATmega8 и цифрового датчика температуры DS18B20Схема, программа очень простого термометра на микроконтроллере ATmega8 с использование датчика температуры DS18B20
Published by: Мир микроконтроллеров

Date Published: 05/07/2015

Простой термометр на микроконтроллере PIC12F629 с батарейным питанием.

Подробности
Опубликовано 20.07.2013 09:50

Общее количество конструкций термометров на микроконтроллерах посчитать сложно. Каждый автор стремиться привнести что-то свое в этот простой прибор. В итоге увеличивается функциональность, точность и область практического применения электронных температурных измерителей. Ниже описан еще один вариант термометра, главными особенностями которого стали предельная простота конструкции и автономное питание.

В состав любого электронного измерителя температуры обычно входят четыре элемента: датчик температуры, микроконтроллер, индикатор и источник питания. Благодаря высокой степени интеграции современных радиоэлектронных компонентов, появилась возможность минимизировать количество соединительных линий между отдельными устройствами, создавать предельно простые и компактные конструкции. Низкий уровень потребляемой мощности каждым элементом позволил в качестве источников питания использовать литиевые батареи. Все вместе стало основой конструкции простого измерителя температуры, могущего стать отличной заменой бытовым термометрам.

Управляющая программа

Программа работы термометра  написана на языке MikroPASCAL. Использованы стандартные функции работы с устройствами шины 1-Wire.

Программа термометра

program Termo1;const TEMP_RESOLUTION  byte = 12;
      home  byte = 5; // номер пина домашнего термометра
      street  byte = 2; // номер пина уличного термометраvar port_array array3 of Byte;
    temp_home  word;
    temp_street  word;
    temp1  byte;
    temp2  byte;
    i  byte;function mask(num word) byte;   //преобразование в коды индикатораbegin
  case num of    //fgabpcde
       result= %10110111;
     1  result= %00010100;
     2  result= %01110011;
     3  result= %01110110;
     4  result= %11010100;
     5  result= %11100110;
     6  result= %11100111;
     7  result= %00110100;
     8  result= %11110111;
     9  result= %11110110;
   end; //case endend;//~procedure get_temp;           // чтение температуры из термометраbegin
    Ow_Reset(GPIO,home);            		  // сброс шины
    Ow_Write(GPIO,home,$CC);       // команда SKIP_ROM
    Ow_Write(GPIO,home,$44);       // команда CONVERT_T
 
    Ow_Reset(GPIO,street);            		  // сброс шины
    Ow_Write(GPIO,street,$CC);       // команда SKIP_ROM
    Ow_Write(GPIO,street,$44);       // команда CONVERT_T
 
    Delay_ms(600);                        // задержка на время преобразования
 
    Ow_Reset(GPIO,home);                 // сброс шины
    Ow_Write(GPIO,home,$CC);       // команда SKIP_ROM
    Ow_Write(GPIO,home,$BE);       // команда READ_SCRATCHPAD
    temp1 = Ow_Read(GPIO,home);         // чтение первого байта
    temp2 = Ow_Read(GPIO,home);         // чтение второго байта
    temp_home = temp1;                        // преобразование в слово
    temp_home = (temp2 shl 8) + temp_home;
 
    Ow_Reset(GPIO,street);                 // сброс шины
    Ow_Write(GPIO,street,$CC);       // команда SKIP_ROM
    Ow_Write(GPIO,street,$BE);       // команда READ_SCRATCHPAD
    temp1 = Ow_Read(GPIO,street);         // чтение первого байта
    temp2 = Ow_Read(GPIO,street);         // чтение второго байта
    temp_street = temp1;                        // преобразование в слово
    temp_street= (temp2 shl 8) + temp_street;
 end;procedure Calc_Temperature(temp2write Word;str Boolean);// преобразование температурыconst RES_SHIFT  byte = 4;var temp_whole  byte;
    temp_fraction  Word;
    dig  Word;
    dig1  byte;begin
  port_array=;
  if (temp2write and $8000) = 0x8000 then
  begin
     temp2write = not temp2write + 1;
     port_array=8;
  end;
  temp_whole = temp2write shr RES_SHIFT ;
  dig=(temp_whole10) mod 10;
  port_array = port_array + mask(dig);
  dig=temp_whole mod 10;
  port_array1 = mask(dig)+8;
  temp_fraction  = temp2write shl (4-RES_SHIFT);
  temp_fraction  = temp_fraction and $000F;
  temp_fraction = temp_fraction * 625;
  dig=temp_fraction1000;
  port_array2 = mask(dig);
  if str then port_array2=port_array2+8;end; //~procedure show_temp;          // отображение температурыvar digit_show  byte;
    dig_buf  byte;beginfor digit_show= to 2 do
    begin
      dig_buf = port_arraydigit_show;  // запись в буфер отображения
      for i=1 to 8 do
        begin
          if testbit(dig_buf,) then setbit(GPIO,) else clearbit(GPIO,);
          setbit(GPIO,1);            // включить тактовую линию
          dig_buf=dig_buf shr 1;  // сдвиг символа в буфере отображения
          clearbit(GPIO,1);        // отключить тактовую линию
          Delay_ms(75);            // задержка для красоты
        end;
    end;end;begin
GPIO=;
CMCON=7;
TRISIO = %00001000;
  while TRUE do                   // основной цикл
  begin
    setbit(GPIO,4);
    Delay_ms(10);
    get_temp;              // чтение домашней температуры
    clearbit(GPIO,4);
    Calc_Temperature(temp_home,);       // преобразование температуры
    show_temp;                   // индикация температуры
    Delay_ms(5000);
    Calc_Temperature(temp_street,1);       // преобразование температуры
    show_temp;                   // индикация температуры
    Delay_ms(5000);
  end;end.

You have no rights to post comments

Схема термометра на ATmega8 и датчике температуры DS18B20

Давайте посмотрим на схему термометра:

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

Напряжение питания конструкции — 5 вольт. Если вы примените микроконтроллер с низковольтным питанием (линейка микроконтроллеров ATmega), то можно и понизить питающее напряжение конструкции, но в этом случае, возможно придется уменьшить номинал гасящих сопротивлений в сегментах индикатора. Приблизительно номиналы сопротивлений можно брать:
— при питании 5 вольт — 200-300 Ом
— при питании 2,7 — 3 вольта — 100-150 Ом(здесь вы можете ознакомиться с расчетом гасящих сопротивлений для семисегментных индикаторов)(здесь вы можете ознакомиться с маркировкой микроконтроллеров)Транзисторы — любые, маломощные, структуры NPN.Датчик температуры — DS18B20 (ознакомиться с датчиком температуры DS18B20)Семисегментный индикатор — любой трехразрядный с общим катодом. Если вы захотите применить другие, с общим анодом, тогда придется заменить транзисторы на PNP и внести изменения в программу (заменить массив двоичных кодов для вывода цифр на индикатор). Я применил индикатор красного цвета свечения, и заодно, для следующей схемы, приготовил такой-же, но голубого цвета свечения.

Принципиальная схема и конструкция

В основе принципиальной схемы измерителя лежит микроконтроллер PIC12F629 от Microchip. Данный процессор выпускается в корпусах с 8 выводами и способен работать при напряжении питания от 2 до 5.5В. К его достоинством можно отнести встроенный генератор тактовой частоты и режим пониженного энергопотребления. Объем внутренней Flash-памяти программ — 1Кб позволяет легко реализовать опрос датчика и преобразование температуры.

Принципиальная схема термометра

Датчиком температуры выбран термометр с цифровым выходом MCP9800, опять же от Microchip.Эта микросхема интересна, прежде всего тем, что выпускается в компактном корпусе SOT-23. Использование  шины I2C делает ее подключение к микроконтроллеру элементарным. Опять же наличие спящего режима повышает привлекательность применения MCP9800 для систем с батарейным питанием.

Отображение показаний температуры производится на жидкокристаллическом индикаторе TIC3321. Он не требует подсветки, вследствие чего потребляет минимальный ток. Для передачи данных в индикатор необходимо подключить всего три линии.  Широкий температурный диапазон работы от -40 до +80ºС позволяет строить не только комнатные, но и уличные модели приборов.

Печатная плата Вид со стороны элементов

Конструктивно термометр выполнен на односторонней печатной плате, которая по длине и ширине не превышает размеры индикатора. Все элементы, в том числе и микроконтроллер, применены в корпусах для поверхностного монтажа. Для установки батареи типа CR2032 использован специальный батарейный модуль, также в SMD варианте.

Таймер

Таймер сна может быть активирован чуть более длительным нажатием настенной кнопки (если быть точным более 1,8 сек) или нажатием соответствующей кнопки на пульте дистанционного управления. Отмена таймера сна выполняется так же, как и активация. Когда таймер сна активен, можно увеличивать / уменьшать уровень освещенности.

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

Внимание! Это устройство подключается к сети и не имеет гальванической развязки с ней, поэтому требует большого внимания. Если вы не уверены в том, что делаете, лучше доверьте установку опытному электрику. Несмотря на то, что это устройство работает от 5 В постоянного тока, при подключении к сети оно все равно может ударить вас током, если вы дотронетесь до любой его части!

Скачать файл проекта (32,6 KiB, скачано: 283)

Управляющая программа

Программа работы термометра  написана на языке MikroPASCAL. Использованы стандартные функции работы с устройствами шины 1-Wire.

Программа термометра

program Termo1;const TEMP_RESOLUTION  byte = 12;
      home  byte = 5; // номер пина домашнего термометра
      street  byte = 2; // номер пина уличного термометраvar port_array array3 of Byte;
    temp_home  word;
    temp_street  word;
    temp1  byte;
    temp2  byte;
    i  byte;function mask(num word) byte;   //преобразование в коды индикатораbegin
  case num of    //fgabpcde
       result= %10110111;
     1  result= %00010100;
     2  result= %01110011;
     3  result= %01110110;
     4  result= %11010100;
     5  result= %11100110;
     6  result= %11100111;
     7  result= %00110100;
     8  result= %11110111;
     9  result= %11110110;
   end; //case endend;//~procedure get_temp;           // чтение температуры из термометраbegin
    Ow_Reset(GPIO,home);            		  // сброс шины
    Ow_Write(GPIO,home,$CC);       // команда SKIP_ROM
    Ow_Write(GPIO,home,$44);       // команда CONVERT_T
 
    Ow_Reset(GPIO,street);            		  // сброс шины
    Ow_Write(GPIO,street,$CC);       // команда SKIP_ROM
    Ow_Write(GPIO,street,$44);       // команда CONVERT_T
 
    Delay_ms(600);                        // задержка на время преобразования
 
    Ow_Reset(GPIO,home);                 // сброс шины
    Ow_Write(GPIO,home,$CC);       // команда SKIP_ROM
    Ow_Write(GPIO,home,$BE);       // команда READ_SCRATCHPAD
    temp1 = Ow_Read(GPIO,home);         // чтение первого байта
    temp2 = Ow_Read(GPIO,home);         // чтение второго байта
    temp_home = temp1;                        // преобразование в слово
    temp_home = (temp2 shl 8) + temp_home;
 
    Ow_Reset(GPIO,street);                 // сброс шины
    Ow_Write(GPIO,street,$CC);       // команда SKIP_ROM
    Ow_Write(GPIO,street,$BE);       // команда READ_SCRATCHPAD
    temp1 = Ow_Read(GPIO,street);         // чтение первого байта
    temp2 = Ow_Read(GPIO,street);         // чтение второго байта
    temp_street = temp1;                        // преобразование в слово
    temp_street= (temp2 shl 8) + temp_street;
 end;procedure Calc_Temperature(temp2write Word;str Boolean);// преобразование температурыconst RES_SHIFT  byte = 4;var temp_whole  byte;
    temp_fraction  Word;
    dig  Word;
    dig1  byte;begin
  port_array=;
  if (temp2write and $8000) = 0x8000 then
  begin
     temp2write = not temp2write + 1;
     port_array=8;
  end;
  temp_whole = temp2write shr RES_SHIFT ;
  dig=(temp_whole10) mod 10;
  port_array = port_array + mask(dig);
  dig=temp_whole mod 10;
  port_array1 = mask(dig)+8;
  temp_fraction  = temp2write shl (4-RES_SHIFT);
  temp_fraction  = temp_fraction and $000F;
  temp_fraction = temp_fraction * 625;
  dig=temp_fraction1000;
  port_array2 = mask(dig);
  if str then port_array2=port_array2+8;end; //~procedure show_temp;          // отображение температурыvar digit_show  byte;
    dig_buf  byte;beginfor digit_show= to 2 do
    begin
      dig_buf = port_arraydigit_show;  // запись в буфер отображения
      for i=1 to 8 do
        begin
          if testbit(dig_buf,) then setbit(GPIO,) else clearbit(GPIO,);
          setbit(GPIO,1);            // включить тактовую линию
          dig_buf=dig_buf shr 1;  // сдвиг символа в буфере отображения
          clearbit(GPIO,1);        // отключить тактовую линию
          Delay_ms(75);            // задержка для красоты
        end;
    end;end;begin
GPIO=;
CMCON=7;
TRISIO = %00001000;
  while TRUE do                   // основной цикл
  begin
    setbit(GPIO,4);
    Delay_ms(10);
    get_temp;              // чтение домашней температуры
    clearbit(GPIO,4);
    Calc_Temperature(temp_home,);       // преобразование температуры
    show_temp;                   // индикация температуры
    Delay_ms(5000);
    Calc_Temperature(temp_street,1);       // преобразование температуры
    show_temp;                   // индикация температуры
    Delay_ms(5000);
  end;end.

You have no rights to post comments

Использование сдвиговых регистров в устройствах индикации.

Одной из проблем, возникающих при разработке микроконтроллерных устройств часто становится необходимость экономии линий портов ввода/вывода. Многие периферийные устройства, которые могут работать в связке с процессором, требуют для передачи информации большого количества соединительных проводников. Актуальность этой задачи не снизилась даже с появлением процессоров с большим количеством выводов, так как одновременно усложнились и периферийные устройства.   Для устройств индикации, одним из вариантов снижения количества требуемых линий может стать использование регистров сдвига (Shift register).

Регистр сдвига представляет собой цепочку из нескольких, последовательно соединенных D-триггеров. На первый триггер подключается информационный выход микроконтроллера. С каждым импульсом тактового сигнала, передаваемого по отдельной линии, уровень на входе каждого из триггеров записывается на выход. В итоге происходит сдвиг сигнала от начала к концу цепочки. Если использовать подключить выходные линии после каждого из триггеров, то сдвиговый регистр будет представлять собой последовательно-параллельный преобразователь. Это значит, что для организации каких-либо индикаторов, будет минимально необходимо использовать только два вывода микроконтроллера.

В настоящее время производители предлагают большое количество моделей регистров сдвига, с различными функциональными особенностями. Далее будут рассматриваться только микросхемы с последовательным входом и параллельным выходом. Также для описываемых целей можно использовать некоторые универсальные модели регистров.

Нагрев резистора R1

Одной из проблем этого устройства является возможный нагрев резистора R1. Это естественно для предотвращения пускового тока, который может разрушить конденсатор C1

Когда устройство загорается на полную яркость, форма волны выглядит примерно так (обратите внимание на задержку с перехватом энергии, чтобы мы могли держать C3 заряженным)

Во время максимальной яркости конденсатор C1 в бестрансформаторном источнике питания сохраняет небольшое количество энергии. Поэтому, когда симистор замыкает накоротко C1 через R1 и стабилитрон ZD1, вся эта энергия рассеивается на резисторе R1. К счастью, этой энергии не так много, поэтому R1 даже не греется. Проблемы начинают возникать, когда энергия, накопленная в C1, является значительной, например, когда устройство затемняет лампочку:

Как видно из диаграммы, количество энергии в C1 — это то, что требует нашего внимания. Когда срабатывает симистор, все, что рассеивается на нашем бедном R1 должно хорошо отводиться. Большие значения сопротивления R1 будут рассеивать больше тепла, но при этом C1 будет работать в комфортных условиях, а более низкие значения сопротивления R1 означают меньше тепла, но C1 начнет гудеть как сумасшедший.

Решение проблемы — использовать C1 с меньшей емкостью (чтобы он не мог удерживать слишком много энергии, но ее было бы достаточно для питания нашего устройства) и использовать правильное значение сопротивления R1. Я определил, что использование резистора R1 с сопротивлением 220…680 Ом и конденсатора C1 емкостью 0,22 мкФ является оптимальным решением.

Подключение устройства:

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Электрик в доме
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: