Игровые автоматы с лазерным запуском Время прохождения круга GLCD Дисплей
Компоненты и расходные материалы
![]() |
| × | 1 | |||
| × | 1 |
Приложения и онлайн-сервисы
![]() |
|
Об этом проекте
Введение
Я купил пару лазерных модулей KY008 и соответствующий датчик, и я знал, что мне нужно сделать с ними какой-нибудь крутой проект. Итак, взял пару и создал электрические ворота для отсчета времени для трека слот-машины, который уже был на столе для моего проекта с самоуправляемым слот-автомобилем.
Оборудование
Три основных компонента:лазерный модуль, датчик лазерного приемника и экран GLCD.
Мне очень нравится использовать GLCD, вы можете найти информацию о распиновке здесь:https://playground.arduino.cc/Code/GLCDks0108/
А скачать библиотеку можно отсюда:
https://bitbucket.org/bperrybap/openglcd
Я создал для него красивый и простой соединитель, как показано на изображении ниже.

Лазерный модуль KY008 имеет 3 контакта, -, + и S, я просто сокращаю S и + до 5V. Если вы не хотите, чтобы лазер был включен все время, подключите вывод S к цифровому выводу на Arduino. когда вы установите его высоко, лазер включится.
Датчик также имеет 3 контакта:GND, VCC и SIGNALE. подключите к источнику питания и входному контакту на Arduino.
Самой сложной задачей в этой сборке было согласовать все.

Вы можете посмотреть окончательный результат в этом ролике.
Код
- Файл без названия
Файл без названия Arduino
/ ** Цифровой шлюз с сохранением времени * Код:Tal Ofer * [email protected]*/#include "openGLCD.h" // проходит infounsigned long currentRunStartMillis; unsigned long lastRunInMillis; unsigned long bestRunInMillis; int currentLap; unsigned long saveMillis; gText t1; // определим время выполнения позже gText t2; // определим среду выполнения позже gText t3; // время выполнения будет определено позже // глобально для displayint sec_val, milli_val; // лазерный вентиль const int gateSensorPin =2; // номер пина датчика ворот gateSensorState; // текущее показание датчика int lastgateSensorState =LOW; // предыдущее чтение от sensorunsigned long lastDebounceTime =0; // последний раз, когда вывод датчика был переключен int debounceDelay =50; // время дребезга; увеличить, если вывод мерцаетvoid setup () {// режим вывода pinMode (gateSensorPin, INPUT); задержка (50); // опаздываем срабатывание датчика и лазера, поэтому мы не сможем сработать круг. // запускаем GLCD GLCD.Init (NON_INVERTED); // определяем области t1.DefineArea (textAreaTOP, lcdnums14x24); t2.DefineArea (0, GLCD.CenterY, 8, 2, fixednums7x15); t3.DefineArea (GLCD.CenterX, GLCD.CenterY, 8, 2, фиксированные числа7x15); t3.SetFontColor (БЕЛЫЙ); // установить цвет шрифта t3.ClearArea (); // выводим текст GLCD.SelectFont (System5x7); GLCD.CursorTo (1, 4); GLCD.print («ПОСЛЕДНИЙ»); GLCD.CursorTo (11, 4); GLCD.print («ЛУЧШИЙ»); // сбросить параметры currentRunStartMillis =0; lastRunInMillis =0; bestRunInMillis =0; currentLap =0;} void loop () {// считываем состояние лазерного датчика:int reading =digitalRead (gateSensorPin); // Если переключатель изменился из-за шума или нажатия:if (reading! =LastgateSensorState) {// сбросить таймер устранения дребезга lastDebounceTime =millis (); } // завершаем, если // если прошло время устранения дребезга if ((millis () - lastDebounceTime)> debounceDelay) {if (reading! =gateSensorState) {gateSensorState =reading; // Если мы опустились на низкое значение, это означает, что луч был сломан if (gateSensorState ==LOW) {// сохраняем миллисекунды, чтобы все вычисления выполнялись с тем же значением. saveMillis =миллис (); // если это не первый круг if (currentLap> 0) {// сохранить последний прогон lastRunInMillis =savedMillis - currentRunStartMillis; // если последний запуск был быстрее, то лучше всего if (lastRunInMillis0) {calcResultFromMillis (savedMillis - currentRunStartMillis, &sec_val, &milli_val); } еще {calcResultFromMillis (0, &sec_val, &milli_val); } // конец, если // ТЕКУЩИЙ ЗАПУСК t1.CursorTo (3, 0); // столбец и строка относятся к текстовой области t1.Printf (F ("% 02d.% 03d"), sec_val, milli_val); // ПОСЛЕДНИЙ ЗАПУСК calcResultFromMillis (lastRunInMillis, &sec_val, &milli_val); t2.CursorTo (1, 1); // столбец и строка относятся к текстовой области t2.Printf (F ("% 02d.% 03d"), sec_val, milli_val); // ЛУЧШИЙ ЗАПУСК calcResultFromMillis (bestRunInMillis, &sec_val, &milli_val); t3.CursorTo (1, 1); t3.Printf (F ("% 02d.% 03d"), sec_val, milli_val);} // цикл wnd // вычисляем миллисекунды в 2 значения, секунды и миллисекунды для displayvoid calcResultFromMillis (unsigned long value, int * sec_val, int * milli_val) {* sec_val =int (значение / 1000); * milli_val =значение - * sec_val * 1000;}
Производственный процесс