Счетчики. Вариант 3 - Stattrak или счетчик фрагов из CS:GO

24.06.2017 01:33

jazon



        Всем доброго!!! Многие люди, которые играют в игру CS:GO конечно же видели счетчик Stattrak на игровом оружии. Не будем вдаваться в подробности по описанию этой штуки, на это есть русская фандомная вики по этой теме.  В этой статье попробуем изготовить демонстрационный прототип такого счетчика и установить его на страйкбольное оружие. За основу в общем то можно взять несколько компонентов: плата Digispark Attiny85, дисплей на базе драйвера MAX7219 и тактовую кнопку. Всё это будет обвязано косичкой из проводов, так сказать для удобства. Прежде чем расписывать что к чему - всё же хотелось бы познакомить читателя с тем что мы получили на выходе, об этом вы узнаете из видео ниже: 



Начнем поподробнее, нам потребуется:

  • Плата Digispark Attiny85
  • Дисплей на базе драйвера MAX7219
  • Тактовая кнопка
  • Провода с балансировочными разъёмами
  • Батарейка на 9 вольт типа "Крона"
  • Умение работать паяльником и немного терпения

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

#include "LedControl.h"

// Объявляем привязки к пинам модуля дисплея
#define DIN 1 //Синий DATA IN
#define CLK 3 //Серый CLK
#define CSL 2 //Белый LOAD[CS]

//Привязка к пина к кнопке
#define BUT 4 //Коричневый к кнопке

//Прототип функции обновления экрана
void DisplayUpdate();
//Прототип функции для подавления дребезга кнопки
boolean DebounceButton(int ScanPort, boolean last);

//Создаём объект LC класса LedControl для работы с дисплеем
LedControl LC = LedControl(DIN, CLK, CSL, 1);

//Теущий временый счетчик
static unsigned long currentCounter = 0;

bool BUTCurr = false;
bool BUTPrev = false;

unsigned long previousMillis = 0;
int resetCounter = 0;
int period = 500;

//Массив численных символов без точки
byte Digit[10]  = {126, 48, 109, 121, 51, 91, 95, 112, 127, 123};

void setup()
{
  //Устройство(7-ми сегментный дисплей) выводим из спящего режима
  LC.shutdown(0, false);
  //Установить яркость дисплея на 8
  //Всего возможных режимов яркости от 0 до 15
  LC.setIntensity(0, 8);
  //Очистить дисплей
  LC.clearDisplay(0);
  //
  pinMode(BUT, INPUT);
}

void loop()
{
  unsigned long currentMillis = millis();

  if(digitalRead(BUT))
  {
    if(currentMillis - previousMillis > period)
    {
      resetCounter ++;
      if(resetCounter == 7)
      {
        currentCounter = 0;
      }
      previousMillis = currentMillis;
    }
  }
  else
  {
    resetCounter = 0;
  }
 
  //Проверка кнопки инкремента - нажатие и обработка "Антидребезг"
  BUTCurr = DebounceButton(BUT, BUTPrev);
 
  if(BUTPrev == false && BUTCurr == true)
  {
    if(currentCounter == 99999999)
    {
      currentCounter = 0;
    }
    else
    {
      currentCounter ++;
    }
  }
  BUTPrev = BUTCurr;

  DisplayUpdate();
}

//Функция подавления дребезга контактов концевого датчика
boolean DebounceButton(int ScanPort, boolean last)
{
  boolean current = digitalRead(ScanPort);
  if(current != last)
  {
    delay(10);
    current = digitalRead(ScanPort);
  }
  return current;
}

void DisplayUpdate()
{
  unsigned long intValue = currentCounter;
  unsigned long divValue;

  for(int i = 0; i < 8; i ++)
  {
    divValue = intValue % 10;
    intValue = intValue / 10;
    //Блок программы если не нужно выводить нули влево
    //if(divValue == 0 && intValue == 0)
    //{
    //  continue;    
    //}
    //else
    //{
    //  LC.setRow(0, i, Digit[divValue]);
    //}
    //Если раскомментировать вышестоящий блок
    //то строку ниже надо закомментировать
    LC.setRow(0, i, Digit[divValue]);
  }
}


Итак, скетч успешно залит в плату. Далее - нужно соединить все компоненты по схеме коммутаций, она показана на чертеже ниже:


        

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



Расскажи о нас

Сообщение

Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.