Содержание статьи:
- Схема и проект кодового замка
- Барометр с расширенными функциями
- Подарочная книга с секретом на Ардуино
Предлагаем создать своими руками интересные и простые проекты на Ардуино. Сначала мы рассмотрим схему кодового замка, который можно использовать в сейфах, шкатулках и прочих тайниках. Затем уделим внимание ещё одному проекту на Ардуино для дома — барометру с дисплеем. А в последнюю очередь рассмотрим интересную самоделку — подарочную книгу с загадками!
Схема и проект кодового замка на Arduino
Кодовый замок на Arduino можно приспособить для различных целей. Это могут быть двери, шкатулки, сейфы или запуск какого-либо действия.
Задача была следующая: разработать кодовый замок на Arduino, который управляет электромагнитным реле. При правильном вводе 5-значного кода, срабатывает реле и загорается зеленый светодиод. Через 5 секунд реле приходит в изначальное состояние и зеленый светодиод гаснет. Если код введен неверно, то загорается красный светодиод в течение 5 секунд. Код можно вводить бесконечное количество раз.
- Смотрите также, как сделать часы реального времени на ЖК-дисплее
Для начала моделируем схему в Proteus:
На схеме видим матрицу из кнопок и два светодиода. Вместо катушки реле для удобства взят спикер, который при эмуляции начинает трещать. При правильном наборе кода загорается светодиод L_1 и трещит спикер LS1 в течение 5 секунд.
Код программы и его детальное описание
#define LED1 10 // красный светодиод
#define LED2 11 // зеленый светодиод
#define RELAY 12 // реле на замок
#define NUM_KEYS 5 // количество знаков в коде
char key;
char myarraw[NUM_KEYS] = { ‘1’, ‘2’, ‘3’, ‘4’, ‘5’}; // массив с верным кодом
char button_pressed[NUM_KEYS]; //массив для хранения нажатых кнопок
int k=0; // счетчик нажатий
int s=0; // счетчик совпадений нажатых кнопок с верными
const byte ROWS = 4; // количество строк в матрице клавиатуры
const byte COLS = 4; // количество столбцов
char keys[ROWS][COLS] = { // таблица соответствия кнопок символам
{‘1′,’2′,’3′,’A’},
{‘4′,’5′,’6′,’B’},
{‘7′,’8′,’9′,’C’},
{‘*’,’0′,’#’,’D’}};
byte rowPins[ROWS] = {5, 4, 3, 2}; // пины подключенных строк
byte colPins[COLS] = {9, 8, 7, 6}; // пины подключенных столбцов
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // создаем объект клавиатуры для работы с ней
void setup() {
pinMode(LED1, OUTPUT); // красный светодиод
pinMode(LED2, OUTPUT); // зеленый светодиод
pinMode(RELAY, OUTPUT); // реле управления замком
digitalWrite(RELAY, HIGH); // вход реле инверсный, поэтому его сразу включаем (?!)
}
void loop ()
{ key = keypad.getKey(); // спрашиваем у клавиатуры, есть нажатая кнопка?
if ( key != NO_KEY ) // если она все-таки есть
{
button_pressed [k] = key; //сохраняем эту кнопочку в массиве
k = k + 1; // запоминаем сколько уже кнопок нажали
if(k == NUM_KEYS) // если нажали нужное количество кнопок
{for ( uint8_t i = 0; i < NUM_KEYS; i++) // пройдемся по всему массиву
{
if (button_pressed[i] == myarraw[i]) // и проверим нажатые кнопки с верным кодом
{s = s + 1; // плюсуем счетчик совпадений
}
}
if(s == NUM_KEYS) //если у нас все кнопки совпали с кодом, то включаем реле
{
digitalWrite (RELAY, LOW); // включили реле
digitalWrite (LED2, HIGH); // зажгли зеленый свет (пользователь ввел верный код)
delay (5000); // ждем 5 секунд пока горит зеленый свет и включено реле
digitalWrite (RELAY, HIGH); // гасим реле
digitalWrite (LED2, LOW); // гасим свет
k=0; //сбрасываем счетчик нажатий нашей переменной
s=0; // сбрасываем счетчик совпадений нашей переменной
} else { // если не все кнопки совпали с верным кодом
digitalWrite (LED1, HIGH); // включаем красный свет (пользователь ввел неверный код)
delay (5000); // ждем 5 секунд
digitalWrite (LED1, LOW); // гасим красный свет
k=0; // обнуляем счетчики, чтобы начать все заново
s=0; //
}
}
}
}
Давайте подробнее разберемся в коде:
#include
Чтобы мы могли обрабатывать нажатия клавиш на клавиатуре, можно было написать библиотеку обработки самим, с нуля, но это заняло бы много времени. В данном случае, программируя на Ардуино, на языке высокого уровня, в этом нет необходимости. Достаточно только подключить готовую библиотеку, которая идет в комплекте библиотек с Arduino IDE.
#define LED2 11 // зеленый светодиод
#define RELAY 12 // реле на замок
#define NUM_KEYS 5 // количество знаков в коде
В данном проекте нам потребуется использовать 3 значения при написании кода. Можно было бы пойти стандартным путем: создать 3 переменные, присвоить им имена и значения, а затем просто использовать их. Но мы решили пойти немножко дальше и показать, как можно еще более удобным способом решить данную задачу.
- Смотрите схему миниатюрного датчика света на микроконтроллере
Создаем 4 директивы, LED1, LED2 и RELAY, NUM_KEYS и присваиваем им постоянное значение, которое идет после названия директивы. После значения точку с запятой, как мы привыкли, ставить не требуется.
char myarraw[NUM_KEYS] = { ‘1’, ‘2’, ‘3’, ‘4’, ‘5’}; // массив с верным кодом
char button_pressed[NUM_KEYS]; //массив для хранения нажатых кнопок
Здесь мы знакомимся с новым типом массивов и переменных char, в котором помимо цифровых значений могут храниться символьные, например, буквы, и различные знаки.
Итак, мы создаем массив myarraw, который содержит 5 знаков, (не забываем про создание директивы). В данный массив мы записываем 5 значений, которые содержатся в фигурных скобках. Они будут являться кодом, по которому будет открываться наш замок, их вы впоследствии сможете поменять на любые другие. Затем нам нужно создать еще один массив (также 5 знаков), в котором будут храниться значения, наших нажатых кнопок.
int s=0; // счетчик совпадений нажатых кнопок с верными
Здесь мы объявляем две переменные — k и s, и присваиваем им значение 0. В первой из них у нас будет храниться количество нажатий, а во второй — количество совпадений кода для открытия замка, который мы задали ранее в массиве, с кодом, набранным на клавиатуре.
const byte COLS = 4; // количество столбцов
Здесь же, мы задаем 2 константы формата byte. В целях экономии памяти нашего контроллера мы пользуемся форматом для хранения переменных byte, а не привычным форматом int. В данном случае он будет избыточен для наших задач.
{‘1′,’2′,’3′,’A’},
{‘4′,’5′,’6′,’B’},
{‘7′,’8′,’9′,’C’},
{‘*’,’0′,’#’,’D’}};
Теперь нам нужно будет создать, таблицу соответствия кнопок клавиатуры символам, которые будут сохраняться в наших массивах. Как мы видим, их расположение совпадает с нанесенными значками на клавиатуре.
byte colPins[COLS] = {9, 8, 7, 6}; // пины подключенных столбцов
Ну а здесь нам требуется создать 2 массива по 4 знака каждый, соответственно по количеству строк и столбцов. А затем задать, к каким пинам ардуино они у нас будут подключены. Формат переменной, как и в прошлом случае, у нас выбран byte.
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // создаем объект клавиатуры для работы с ней
Здесь нужно остановиться подробнее. Библиотека Keypad, описывает класс работы с клавиатурой, то есть создает тип данных «клавиатура». У этого типа данных свои параметры, которые мы указываем в скобках (что клавиатура 4х4, к каким пинам подключены строки, к каким столбцы, таблицу соответствия кнопок нашим символам). То есть Keypad — это тип данных наподобие int или char.
Затем мы пишем имя своей переменной (создаваемого объекта) keypad с параметрами этой переменной в скобках. Как будто присваиваем значение этой переменной. И дальше работаем как с переменной, у которой можно менять параметры.
У этого класса есть разные методы — функции, к которым мы можем обращаться, чтобы работать с объектом. Также есть внутренние, закрытые функции, которые работают сами, и мы не можем к ним обращаться. То есть keypad.getKey() — метод, к которому мы обращаемся, чтобы получить значение нажатой клавиши, но у конкретной клавиатуры keypad.
- Пошаговое изготовление блока управления зарядкой в солнечной электростанции
Классы позволяют создать несколько объектов. Таким образом мы можем подключить к ардуино 100 клавиатур и создать 100 объектов этих клавиатур. И потом работать с каждой по отдельности — keypad1.getKey(), keypad2.getKey() и так далее. В рамках данной статьи подробно разбирать работу с классами и объектами будет излишним.
pinMode(LED2, OUTPUT); // зеленый светодиод
pinMode(RELAY, OUTPUT); // реле управления замком
digitalWrite(RELAY, HIGH); // вход реле инверсный, поэтому его сразу включаем
Как мы помним, в начале программы, мы создавали директивы, которые вызываем здесь, и просто подставляем их значения. В данном случае это будут номера пинов Ардуино. Тем самым мы конфигурируем наши 3 указанные пина на выход, а затем один из них притягиваем по умолчанию к единице. Если с пинами все понятно, они будут зажигать и гасить наши светодиоды, управлять реле, то выход 12 пина, мы устанавливаем равным логической единице из-за того, что наше реле включается при подаче логического нуля, на пин ардуино. А открытый по умолчанию замок нам, разумеется, не требуется.
{ key = keypad.getKey(); // спрашиваем у клавиатуры, есть нажатая кнопка?
Здесь мы опрашиваем нашу клавиатуру, были ли нажаты какие-либо кнопки на клавиатуре.
button_pressed [k] = key; //сохраняем эту кнопочку в массиве
k = k + 1; // запоминаем сколько уже кнопок нажали
if(k == NUM_KEYS) // если нажали нужное количество кнопок
Если была нажата какая-либо из кнопок, выполняем действие — сохраняем кнопку в массиве button_pressed. Затем наш счетчик нажатий после нажатия первой кнопки мы увеличиваем на единицу. Если количество нажатий соответствует значению, нашей директиве NUM_KEYS, то есть 5, мы выполняем код.
Итак, в цикле for мы присваиваем переменной uint8_t i, что означает INT 8 бит, значение 0. Затем проводим сравнение: если значение i меньше 5, мы увеличиваем на единицу значение i, и выполняем условие 5 раз. Сравниваем посимвольно значения наших массивов, в которых хранятся набранные значения кнопок, и заданные нами в начале для проверки на совпадение, на открытие замка. Если совпали значения, то счетчик совпадений увеличиваем на единицу.
Для изменения кода доступа достаточно поменять значения цифр в строке 11 на свои цифры.
Сборка кодового замка на Ардуино в железе
Для работы в железе нам понадобится собственно сама плата Arduino Uno:
Матричная клавиатура 4х4:
И модуль электромагнитного реле:
А вот и видео работы:
Все необходимые файлы можно скачать ниже:
Файлы для скачивания:
Далее остается только залить прошивку в Arduino и провести эмуляцию в Proteus.
- Смотрите также, алгоритм создания устройства для контроля за осанкой при сидении
Барометр с расширенными функциями на Ардуино для дома своими руками
Эта самоделка относится к простым проектам Ардуино для дома. Величина атмосферного давления, а также скорость и характер его изменений играют важную роль в предсказании погоды. Кроме того, они сильно влияют на самочувствие людей с метеозависимостью.
Для измерения атмосферного давления используются барометры. Механический барометр анероид имеет две стрелки. Одна показывает текущее давление. Другая стрелка, которую можно вручную установить в любое положение, позволяет отметить измеренное значение, чтобы через некоторое время определить тенденцию изменения атмосферного давления. Желательно, чтобы электронный барометр также показывал не только величину атмосферного давления, но и позволял определить рост или спад и скорость изменения параметров.
Недорогие метеостанции бытового назначения показывают только пиктограммы с изображениями дождевых капель, туч или солнца. Трудно сказать, как эти пиктограммы связаны с атмосферным давлением и имеется ли у данной метеостанции барометрический датчик. Более продвинутые метеостанции показывают текущее значение давления в виде числа, а изменение давления за несколько предшествующих часов в виде грубой столбчатой диаграммы, несущей главным образом декоративную функцию. Такие метеостанции стоят существенно дороже. Также на рынке имеются практически совершенные устройства, предназначенные для моряков, яхтсменов. Они с высокой точностью показывают и изменения давления, и текущее значение, но стоят такие устройства очень дорого.
Сейчас рассмотрим пошаговое изготовление простого проекта на ардуино с дисплеем — самодельный барометр, показывающий величину и скорость изменения атмосферного давления, а также температуру воздуха.
Результаты измерений выводятся на двухстрочный знакосинтезирующий дисплей. В первую строку выводится результат измерения текущего атмосферного давления в мм рт. ст., отклонение текущего значения давления от среднего значения для данного места (положительным считается превышение текущего значения давления над средним), а также температура воздуха в градусах Цельсия. Данные, приведенные в верхней строке, обновляются каждые 6 секунд. Вывод новых данных сопровождается вспышкой светодиода, расположенного над индикатором.
Во вторую строку индикатора выводятся показатели роста давления за последний час, 3 часа и 10 часов. Если давление за указанный временной промежуток возросло, то соответствующий рост выводится с плюсом, в противном случае — с минусом. Данные во второй строке обновляются каждые 10 минут. Сразу после включения барометра вторая строка будет пуста. Числовые значения появятся там по прошествии 1-го, 3-х и 10-ти часов соответственно.
Барометр предназначен для работы в сухом отапливаемом помещении при температуре 0…40 °C и атмосферном давлении 600…825 мм рт. ст.
Точность измерения давления и температуры полностью определяется точностью использованного датчика давления BMP180 фирмы Bosch. Типовая погрешность измерения давления составляет -1hPa, что примерно соответствует 0.75 мм рт. ст. Шумовая составляющая при измерении давления — 0.02 hPa (0.015 мм рт. ст.). Типовая погрешность измерения температуры вблизи значения 25 °C составляет +/- 0.5°C.
Интервалы времени в данном устройстве отсчитываются программно. Погрешность формирования этих интервалов, измеренная автором, не превышает одной минуты за 10 часов.
Схема барометра с дисплеем на Ардуино и необходимые детали
Список необходимых элементов:
- Модуль с датчиком BMP180 (A1).
- Плата Arduino (A2) — Arduino Nano 3.0.
- Выпрямительный диод (VD1) — 1N4007.
- LCD-дисплей (HG1) — WH1602L Winstar.
- Светодиод (HL1) — L-1154GT Kingbright.
- 2 электролитических конденсатора (С1, С2) — 4700 мкФ х 16 В и 220 мкФ х 16 В соответственно.
- 2 резистора (R1, R3) — 1 кОм и 100 Ом 0.5 ВА соответственно.
- Подстроечный резистор (R2) — 10 кОм.
Рекомендации по монтажу барометра для дома на Arduino
Основным элементом устройства является модуль Arduino Nano. Мы используем 3-ю версию с микроконтроллером ATmega 328. Память модуля в данном случае занята только на треть, поэтому возможно применение модуля Arduino Nano с микроконтроллером ATmega 168.
Дисплей Winstar WH1602L — двухстрочный на 16 знакомест в каждой строке. Его основой является контроллер HD44780. Резистор R2 позволяет подстроить контрастность изображения. Если напряжение на выводе 3 (Vo) будет сильно отличаться от оптимального, то на дисплее совсем не будет видно никакого изображения. Это обстоятельство необходимо учитывать при первом включении устройства. Для данного экземпляра дисплея оптимальным оказалось напряжение на выводе 3 около 1 В. Резистор R3 определяет величину тока светодиодов подсветки.
Датчик давления BMP180 имеет металлический корпус размером 3.6х3.6×1 мм. Выводы его представляют собой контактные площадки, расположенные на дне корпуса. Кроме того, датчик требует питания 1.8–3.6 В. Уровни сигналов, которыми датчик обменивается с внешним устройством, также отличаются от требуемых. Эти обстоятельства затрудняют непосредственное использование BMP180. К счастью, данная проблема легко решается. В продаже имеются модули на основе датчиков BMP180, в состав которых входят сами датчики и все согласующие элементы. Эти модули представляют собой плату размером 10×13 мм. Их стоимость — примерно 1.4 USD.
Светодиод HL1 вспыхивает каждые 6 секунд сигнализируя о том, что на табло барометра выведены новые результаты. Мы использовали зелёный светодиод диаметром 3 мм L-1154GT фирмы Kingbright.
Конденсатор C1 имеет довольно большую ёмкость, что делает устройство нечувствительным к кратковременным сбоям питания. Если это не требуется, то C1 можно уменьшить до 500 мкФ.
Диод D1 отключает подсветку индикатора при сбоях питания. Это увеличивает время автономной работы барометра от энергии, запасённой в конденсаторе C1.
Устройство можно питать от любого источника постоянного тока (зарядного устройство сотового телефона, блока питания какого-либо гаджета и т. п.) с выходным напряжением 8…12 В. При напряжении 9 В барометр потребляет около 80 мА.
Устройство собрано на макетной плате размером 85 х 55 мм, которая прикреплена к дисплею с помощью пластины из оргстекла.
Датчик BMP180 располагается внизу — как можно дальше от основных тепловыделяющих элементов, которыми являются резистор R3 и дисплей со светодиодной подсветкой. Корпусом устройства является пластмассовая коробка размером 160х160х25. В нижней и верхней стенках коробки следует просверлить ряд вентиляционных отверстий.
Прошивка барометра на Ардуино для дома
Скетч, который нужно прошить в память модуля Arduino Nano, представлен в архиве, который можно скачать ниже. Использована среда Arduino IDE 1.8.1. Для поддержки датчика давления требуется установить библиотеку Adafruit-BMP085. Соответствующий файл тоже есть в архиве.
Перед загрузкой скетча в строке 17 следует вместо числа 740.0, которое соответствует среднему давлению в месте установки барометра, вписать среднее давление в мм рт. ст., соответствующее тому месту, где будет установлен Ваш барометр. В первом приближении этот параметр можно определить по формуле Рср = 760-0.091h, где h —высота над уровнем моря в метрах. Высоту проще всего определить с помощью GPS-навигатора.
Стоит учесть, что данная формула не учитывает многие факторы, влияющие на атмосферное давление и применима только для высот до 500 м.
Файлы для скачивания:
Простой и интересный проект на Ардуино — подарочная книга с секретом на Ардуино
Внутри этой книги установлен механизм, открывающий специальный отсек, если отгадать все тайны этой книги. Механизмы и датчики книги управляются с помощью Ардуино. Открыть у книги можно только несколько страниц посередине. В тексте представлено несколько загадок. Отгадав первую, пользователь поймет, что нужно повернуть диск на обложке. При правильном положении диска загорится светодиод.
Далее нужно разгадать судоку и найти фразу «Повернуть книгу». Удерживая книгу вертикально, ее нужно повернуть. Третья загадка шахматная — необходимо поставить шахматные фигуры на определенные клетки. Если все сделано правильно и три загадки разгаданы, с помощью сервомотора открывается потайной отсек. Размер отсека конечно не велик, но там можно разместить, например, конфету или кольцо.
Можно придумать свои загадки и установить другие датчики, например, температуры, датчик света или даже GPS, тогда отсек откроется при нахождении пользователя с книгой в определенной точке.
Необходимые инструменты и материалы для книги с секретом на Ардуино
- Бумага.
- Картон.
- Бархатный картон.
- Декоративные камни.
- Черный чай.
- Ардуино.
- Сервопривод.
- 3 светодиода.
- Акселерометр MPU 6050.
- 2 геркона.
- 2 резистора 10 кОм.
- Резистор 220 Ом.
- Переключатель.
- Потенциометр 1 кОм.
- Батарея 9 В.
- Провода.
- Клей.
- Ножницы.
- Краска.
- 3D принтер.
- Утюг.
- Паяльник.
- Клеевой пистолет.
Шаг первый: подготовка листов
У нас древняя книгу, поэтому нужно сделать так, чтобы бумага выглядела в этом стиле. Сначала печатаем на бумаге нужный текст и рисунки. Для образца текст будет в архиве ниже.
Затем сминаем бумагу и опускаем смятые листы в круто заваренный черный чай на 15 минут. Через 15 минут листы достаем и высушиваем через полотенце утюгом.
Шаг второй: сервопривод
Используем сервопривод Tower Pro 9g SG90. Остальные детали напечатаны на 3D принтере. Вся информация по ним доступна для скачивания в архиве ниже.
Собираем сервопривод.
Шаг третий: отсеки
Книга, как бы разделена на несколько частей: обложка, передняя часть с ардуино, часть с текстом и рисунками, часть с тайником. Берем пачку листов А4 и делим пополам. В одной части вырезаем нишу под Ардуино и батарею, в другой — под сервопривод и тайник. Торцы листов внутри отсеков проклеиваем термоклеем.
Тайник, в отличие от отсека с Ардуино, будет виден, поэтому проклеиваем его картоном.
Видимые части замачиваем в чае.
Шаг четвертый: установка сервопривода
Закрепляем сервопривод в отсеке. Выводим провод. На отдельных листах закрепляем петлю замка. В нормальном положении язычок привода цепляем за петлю и отсек закрыт.
Шаг пятый: обложка
Обложку изготавливаем из картона и оклеиваем бархатным картоном.
Шаг шестой: сборка книги
Соединяем части книги с помощью степлера и клея.
Приклеиваем обложку.
В обложке сверлим отверстие для ручки потенциометра. Сам потенциометр закрепляем в большом отсеке. Для управления потенциометром печатаем ручку в виде круга. Информация по ней будет в архиве.
Прохождение каждого задания информируют загорающиеся светодиоды. В обложке делаем под них отверстия, вклеиваем их и закрываем сверху декоративными стеклами.
На кусок картона клеим с одной стороны лист с шахматным полем, с другой — два геркона по центру клеток. Этот лист будет закрывать отсек электроники, поэтому устанавливаем на него магнитную пластину, а на книгу — полоску металла.
Шаг седьмой: Ардуино
Подключаем все электронные устройства к Ардуино и загружаем код. Вся информация есть в архиве ниже.
Шаг восьмой: шахматные фигуры
Шахматные фигуры можно напечатать на 3D-принтере. В нижнюю часть вклеиваем магниты (информация есть в архиве).
Подарочная книга с секретом на Ардуино готова.
Файлы для скачивания:
- Возможно, вас также заинтересует статья о ТОП-3 проектах Ардуино для начинающих