Сигнализация с датчиком наклона на микроконтроллере AVR ATmega8

В этой статье мы рассмотрим сигнализацию на микроконтроллере ATmega8 (семейство AVR), основанную на анализе колебаний.

Сигнализация с датчиком наклона на микроконтроллере AVR ATmega8: внешний вид

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

Внешний вид датчика наклона

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

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

Аппаратное обеспечение

Микроконтроллер ATmega8
Источник питания с напряжением 5 Вольт
Программатор AVR-ISP, USBASP или другой подобный
Конденсатор 1000 мкФ
Светодиод
Резистор 220 Ом
Фоторезистор
Резистор 10 кОм
Резистор 1 кОм
Транзистор 2n3906
Звонок (зуммер)
Датчик наклона
Резистор 1 кОм (5 шт.)
Кнопки (5 шт.)
Светодиод 2 Вт
Транзистор TIP122

Программное обеспечение

Atmel Studio версии 6.1 (или выше)
Progisp или flash magic (необязательно)

Работа схемы

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

Схема сигнализации с датчиком наклона на микроконтроллере AVR

В данном случае у нас нет необходимости в использовании внешнего тактового генератора – возможностей внутреннего RC-генератора микроконтроллера ATmega8 нам будет вполне достаточно. Внешний тактовый генератор, в основном, востребован в приложениях реального времени, в которых важна точность измерения временных интервалов. При покупку микроконтроллера его фьюзы сконфигурированы на работу от внутреннего RC-генератора.

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

После этого только авторизованное лицо может отключить сигнализацию. Для этой цели служат 5 кнопок, представленные на схеме, которые реализуют 4999 возможных комбинаций. И только одна из этих комбинаций (назначенная) отключает сигнализацию. Таким образом, только лицо, знающее правильную комбинацию, может отключить сигнал тревоги.

Исходный код программы на языке С (Си) с пояснениями

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

#include <avr/io.h> // заголовок чтобы разрешить контроль данных на контактах
#define F_CPU 1000000 // установка тактовой частоты микроконтроллера
#include <util/delay.h> // заголовок чтобы задействовать функции задержки в программе
int check();
volatile int alarm = 0;
volatile int chec = 0;
int main(void)
{
DDRD = 0;//устанавливаем PORTD на ввод данных
DDRC = 0;// устанавливаем PORTС на ввод данных
DDRB = 0xFF;// устанавливаем PORTB на вывод данных
while(1)
{
if ((bit_is_clear(PIND,0)))
{
alarm=1;// после срабатывания датчика устанавливаем бит ALARM
}
if (bit_is_clear(PINC,4))
{
if (bit_is_clear(PINC,2))
{
if (bit_is_clear(PINC,1))
{
if ((bit_is_set(PINC,0))&&(bit_is_set(PINC,3)))
{
_delay_ms(220);
check();
// если нажаты только кнопки 5,3 и 2, то выход из цикла
}
}
}
}
if (alarm==1) //если бит ALARM установлен
{
PORTB |=(1<<PINB0); // включаем светодиод
PORTB &=~(1<<PINB1); // включаем звонок
}
if (alarm==0) // если бит ALARM не установлен
{
PORTB |=(1<<PINB1);//выключаем светодиод
PORTB &=~(1<<PINB0); //выключаем звонок
}
}
}
int check()
{
if (bit_is_clear(PINC,4))
{
if (bit_is_clear(PINC,2))
{
if (bit_is_clear(PINC,1))
{
if ((bit_is_set(PINC,0))&&(bit_is_set(PINC,3)))
{
if (chec==1)
{
alarm=0;
// если кнопки все еще нажаты по истечении 5 сек, то сбрасываем бит ALARM
}
if (chec==0)
{
for (int i=0;i<15;i++)
{
_delay_ms(220);
// проверяем сброшены ли биты по истечении 5 секунд
}
chec=1;
check();
}
}
else
{
chec=0;
}
}
}
}
}

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

(Проголосуй первым!)
Загрузка...
1 просмотров


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

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