Рубрики
Схемы на PIC

Будильник на микроконтроллере PIC

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

Отображение и установку времени в нашем проекте будильника мы будем производить с помощью ЖК дисплея 16×2. Установку времени срабатывания будильника мы будем производить с помощью кнопок. Точное время мы будем считывать из модуля часов реального времени DS3231, подключение которого к микроконтроллеру PIC мы рассматривали в этой статье. Если вы начинающий в изучении микроконтроллеров PIC, то для лучшего понимания материала данной статьи рекомендуем ознакомиться со статьями про подключение ЖК дисплея к микроконтроллеру PIC и использованию интерфейса I2C в данном микроконтроллере.

Также на нашем сайте мы рассматривали проекты будильников на основе других электронных плат:

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

  1. Микроконтроллер PIC16F877A (купить на AliExpress).
  2. Модуль часов реального времени DS3231 (купить на AliExpress).
  3. ЖК дисплей 16х2 (купить на AliExpress).
  4. Программатор PICkit 3 (купить на AliExpress).
  5. Кварцевый генератор 20 МГц (купить на AliExpress).
  6. Конденсаторы 22 пФ (2 шт.) (купить на AliExpress).
  7. Резисторы 4,7 кОм (2 шт.), 10 кОм (купить на AliExpress).
  8. Потенциометр 10 кОм (купить на AliExpress).
  9. Кнопки – 5 шт.
  10. Зуммер (купить на AliExpress).
  11. Источник напряжения питания 5V.
  12. Светодиод (купить на AliExpress).
  13. Макетная плата – 2 шт.
  14. Соединительные провода.

Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158

Схема проекта

Схема будильника на основе микроконтроллера PIC представлена на следующем рисунке.

5 кнопок в схеме используются для установки времени срабатывания будильника. Один контакт кнопок подключен к земле (общему проводу), а второй – к контактам порта PORTB микроконтроллера. Зуммер, подающий сигнал срабатывания будильника, подключен к PORT S. Точное время хранится в модуле DS3231 и оттуда передается в микроконтроллер PIC по интерфейсу I2C, соответственно, линии SCL и SDA модуля DS3231 подключены к линиям SCL и SDA микроконтроллера. ЖК дисплей подключен к PORTD микроконтроллера.

Внешний вид собранной на двух макетных платах конструкции проекта показан на следующем рисунке.

Объяснение программы будильника

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Кроме текста программы проект также содержит библиотеки для работы с ЖК дисплеем, интерфейсом I2C и модулем часов реального времени. Все эти файлы в виде ZIP архива можно скачать по следующей ссылке. После этого их можно открыть с помощью программы MPLABX.

Первым делом в программе настроим биты конфигурации и дадим используемым контактам микроконтроллера осмысленные имена.

Далее внутри функции main мы зададим режимы работы используемых контактов (на ввод или вывод данных). Контакты port B сконфигурируем для режима работы с внутренними подтягивающими резисторами – это предотвратит от ложного срабатывания кнопки, подключенные к ним.

Далее инициализируем ЖК дисплей и связь по протоколу I2C с частотой 100 кГц (поскольку модуль часов реального времени работает на этой частоте). Мы это делаем очень просто, с помощью вызова соответствующих функций поскольку в программе мы подключили заголовочные файлы библиотек для работы с ЖК дисплеем и интерфейсом I2C.

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

Далее покажем на экране ЖК дисплея приветственное сообщение.

Затем внутри цикла while мы будем считывать текущие дату и время из модуля часов реального времени.

Затем разделим значения времени на отдельные символы чтобы в последующем их можно было отобразить на экране ЖК дисплея.

Затем обновим информацию на экране ЖК дисплея. Текущее время будет отображаться на первой строчке дисплея, а время срабатывания будильника – на второй.

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

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

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

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

После того как время срабатывания будильника будет установлено, пользователь снова нажмет среднюю кнопку. После этого мы начнем сравнивать текущее время с установленным временем срабатывания будильника. Сравнение времени осуществляется с помощью посимвольного сравнения текущего времени и времени срабатывания будильника. Если эти значения будут равны, то присваиваем переменной trigger_alarm значение 1.

Если значение переменной trigger_alarm равно 1, то мы будем включать и выключать сигнал зуммера через определенные интервалы времени, что будет означать срабатывание будильника.

Моделирование работы проекта

Смоделировать работу схемы можно с помощью симулятора proteus. Для этого просто нарисуйте в нем схему проекта и загрузите hex файл программы в микроконтроллер PIC. Данный hex файл можно найти в ZIP архиве, ссылка на скачивание которого приводилась ранее в статье. Схема проекта, нарисованная в симуляторе proteus, представлена на следующем рисунке.

Моделирование работы проекта особенно полезно когда вы хотите добавить какие-нибудь новые функции в проект. Также в симуляторе proteus можно использовать инструмент под названием I2C debugger, с помощью которого можно мониторить данные, передаваемые по шине I2C. Также в симуляторе вы можете с помощью кнопок протестировать установку времени срабатывания будильника.

Тестирование работы проекта

Соберите схему проекта на макетной плате, загрузите код программы в микроконтроллер PIC с помощью MplabX и XC8. Если вы загрузили код программы из приведенного ZIP архива, то проблем с его компиляцией возникнуть не должно поскольку в нем уже подключены все необходимые заголовочные файлы.

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

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

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

Исходный код программы

Видео, демонстрирующее работу проекта

Источник статьи

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

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