Оформи код соответствующим тэгом
Привет! Xочу с вами поделится проектом устройства, применимого для тактических игр живого действия.
Проект называется "База доминации/Точка захвата"
Устройство создано для применения в тактических играх живого действия (airsoft, paintball, etc.)
Оно имеет функционал : Каждая команда имеет свою точку доминации. Чтобы ее активировать вам просто нужно поставить физический предмет (флаг) на кнопку захвата.
Пока кнопка нажата, идет начиление очков. Кнопка отжата - очки перестают начисляться. Кнопка рестарт перезагружает время раунда и обнуляет очки.
Arduino Uno
LCD1602
Пищалка
LED
LED лента WS2812B (60 пикеслей)
Диниамики (пока не реализованы в коде) 40hm 5W
кнопка tact switch (кнопка рестарта)
кнопка - концевой выключатель 5A 125-250V (кнопка захвата)
Реализация:
На текущем этапе добился верной работы кнопки захвата, работы счетчика очков и отображение на экране, а также кнопка рестарт работает испрравно.
При подлючении LED ленты счетчик на экране начинает фризить и глючить. То он перестает считать на 100, то не считает пока не нажмешь 2 раза и т.д.
#include <LiquidCrystal_I2C_Hangul.h>. // библиотека подключения экрана
#include <FastLED.h> // библиотека поделючения LED ленты
#define LED_COUNT 60 // кол-во пикселей в LED ленте
#define LAMP_PIN 7 // LED лента подключена к 7 пину
int points = 0; // очки начисления
const int RestartBtn = 9; //кнопка рестарта
const int interval = 50; // интервал/шаг начисления очков..50,100,150...
const int keyPin = 12; //кнопка захвата
const int LedPin = 13; //кнопка светодиода (просто маркер) - в последствии будет заменен LED лентой.
unsigned long startTime;
const unsigned long duration = 65000; // время раунда
const int SoundPin = 8; // пищалка
unsigned long currentMillis = 0; // для перезагрузки millis()
CRGB leds[LED_COUNT];
LiquidCrystal_I2C_Hangul lcd(0x27,16,2);
void setup() {
FastLED.addLeds<WS2812B, LAMP_PIN, GRB> (leds, LED_COUNT);
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.print(points);
pinMode(keyPin,INPUT);
pinMode(LedPin,OUTPUT);
pinMode(RestartBtn,INPUT);
startTime = millis();
}
CRGB color = CRGB(0,0,255); //выбор цвета
void loop()
{
currentMillis = millis();
if(digitalRead(keyPin) == HIGH && digitalRead(RestartBtn) == LOW) // Начинается захват точки. Кнопка захвата нажата
{
digitalWrite(LedPin,HIGH); // зажигаем сетодиод
fill_solid(leds, 60, color);
FastLED.setBrightness(120);
FastLED.show(); //включение LED ленты
if (currentMillis - startTime < duration) { //проверка не вышло ли еще время раунда
if ((currentMillis - startTime) % 1000 == 0) {
points = points + 50; //прибавляем 50 очков к имеющимся уже
delay(100);
if (points % interval == 0) { //задаем условие, что при приросте каждых 50 очков, информация выводится на экран
Serial.println(points);
lcd.setCursor(0,0);
lcd.setDelayTime(1000);
lcd.print(points);
}
// Delay for a short period
delay(100);
}
}
}
else
{
digitalWrite(LedPin,LOW); // выключение сетодиода, если кнопка захвата отжата
}
if (digitalRead(RestartBtn) == HIGH) //условие для нажатия кнопки рестарт
{
currentMillis = 0; //обнуление времени раунда
points = 0; // обнуление очков
Serial.println(" Restart Round! ");
lcd.clear(); //очистка экрана
delay(300);
lcd.print(points); //выод очков на экран (соответственно 0)
}
if (currentMillis - startTime == duration)
{
Serial.println(" Congratulations ASTRAL! "); //вывод названия команды с поздравлением
Serial.println(" You earned: "); // "Вы заработали:"
Serial.println(points); // столько -то очков
lcd.setCursor(0,0);
lcd.print("POINTS: "); // вывод на экран "POINTS:"
lcd.setCursor(2,1);
lcd.print(points); // вывод количества очков на экран
analogWrite(SoundPin, 300); //пищалка срабатывает, извещая о конце раунда
delay (500);
analogWrite(SoundPin,0); //пищалка умолкает
delay(300);
}
}
Проект называется "База доминации/Точка захвата"
Устройство создано для применения в тактических играх живого действия (airsoft, paintball, etc.)
Оно имеет функционал : Каждая команда имеет свою точку доминации. Чтобы ее активировать вам просто нужно поставить физический предмет (флаг) на кнопку захвата.
Пока кнопка нажата, идет начиление очков. Кнопка отжата - очки перестают начисляться. Кнопка рестарт перезагружает время раунда и обнуляет очки.
Arduino Uno
LCD1602
Пищалка
LED
LED лента WS2812B (60 пикеслей)
Диниамики (пока не реализованы в коде) 40hm 5W
кнопка tact switch (кнопка рестарта)
кнопка - концевой выключатель 5A 125-250V (кнопка захвата)
Реализация:
На текущем этапе добился верной работы кнопки захвата, работы счетчика очков и отображение на экране, а также кнопка рестарт работает испрравно.
При подлючении LED ленты счетчик на экране начинает фризить и глючить. То он перестает считать на 100, то не считает пока не нажмешь 2 раза и т.д.
#include <LiquidCrystal_I2C_Hangul.h>. // библиотека подключения экрана
#include <FastLED.h> // библиотека поделючения LED ленты
#define LED_COUNT 60 // кол-во пикселей в LED ленте
#define LAMP_PIN 7 // LED лента подключена к 7 пину
int points = 0; // очки начисления
const int RestartBtn = 9; //кнопка рестарта
const int interval = 50; // интервал/шаг начисления очков..50,100,150...
const int keyPin = 12; //кнопка захвата
const int LedPin = 13; //кнопка светодиода (просто маркер) - в последствии будет заменен LED лентой.
unsigned long startTime;
const unsigned long duration = 65000; // время раунда
const int SoundPin = 8; // пищалка
unsigned long currentMillis = 0; // для перезагрузки millis()
CRGB leds[LED_COUNT];
LiquidCrystal_I2C_Hangul lcd(0x27,16,2);
void setup() {
FastLED.addLeds<WS2812B, LAMP_PIN, GRB> (leds, LED_COUNT);
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.print(points);
pinMode(keyPin,INPUT);
pinMode(LedPin,OUTPUT);
pinMode(RestartBtn,INPUT);
startTime = millis();
}
CRGB color = CRGB(0,0,255); //выбор цвета
void loop()
{
currentMillis = millis();
if(digitalRead(keyPin) == HIGH && digitalRead(RestartBtn) == LOW) // Начинается захват точки. Кнопка захвата нажата
{
digitalWrite(LedPin,HIGH); // зажигаем сетодиод
fill_solid(leds, 60, color);
FastLED.setBrightness(120);
FastLED.show(); //включение LED ленты
if (currentMillis - startTime < duration) { //проверка не вышло ли еще время раунда
if ((currentMillis - startTime) % 1000 == 0) {
points = points + 50; //прибавляем 50 очков к имеющимся уже
delay(100);
if (points % interval == 0) { //задаем условие, что при приросте каждых 50 очков, информация выводится на экран
Serial.println(points);
lcd.setCursor(0,0);
lcd.setDelayTime(1000);
lcd.print(points);
}
// Delay for a short period
delay(100);
}
}
}
else
{
digitalWrite(LedPin,LOW); // выключение сетодиода, если кнопка захвата отжата
}
if (digitalRead(RestartBtn) == HIGH) //условие для нажатия кнопки рестарт
{
currentMillis = 0; //обнуление времени раунда
points = 0; // обнуление очков
Serial.println(" Restart Round! ");
lcd.clear(); //очистка экрана
delay(300);
lcd.print(points); //выод очков на экран (соответственно 0)
}
if (currentMillis - startTime == duration)
{
Serial.println(" Congratulations ASTRAL! "); //вывод названия команды с поздравлением
Serial.println(" You earned: "); // "Вы заработали:"
Serial.println(points); // столько -то очков
lcd.setCursor(0,0);
lcd.print("POINTS: "); // вывод на экран "POINTS:"
lcd.setCursor(2,1);
lcd.print(points); // вывод количества очков на экран
analogWrite(SoundPin, 300); //пищалка срабатывает, извещая о конце раунда
delay (500);
analogWrite(SoundPin,0); //пищалка умолкает
delay(300);
}
}
Вложения
-
159.5 KB Просмотры: 5
Изменено: