Помощник судьи (подсчет повторений на тренажерах)

Scrypto

✩✩✩✩✩✩✩
25 Окт 2019
4
6
35
Петрозаводск
myWork2.ru
Как то заказали подобный проект, мало ли кому будет полезно:
Внешний вид (крепится на магнитах встроенных в корпус), подключение телефонным кабелем, крученным, в разъем
http://instagr.am/p/B4SzCsNBcJW/ 3D модель корпуса для понимания, кружочки снизу, как раз для магнитиков
2sEbbLyiYfY[1].jpg
Видео работы прибора (на руку плохо отзывается, но на железные предметы отлично): http://instagr.am/p/B4KnhNmhINr/
И собственно код, единственное, немного модифицировал библиотеку ик дальномера, чтобы он не в см присылал значения, а мс/10, для большей точности

C++:
#define CLK 4
#define DIO 5
#define butt 2
#define ledRed 11
#define ledBlue 12
#define zoomer 10
#define voltmeter A0
//Настройки
#define maxLength 30 // для настройки максимальной высоты при калибровке
#define pogreshnost 2

#include "GyverTM1637.h"
#include <Ultrasonic.h>
void(* resetFunc) (void) = 0;
Ultrasonic ultrasonic(8, 9, 9999); // (Trig PIN,Echo PIN)
GyverTM1637 disp(CLK, DIO);

boolean flag = true;
boolean flagButton = true;
boolean flagStandUp = false;
boolean flagBeep = true;

volatile int minDistance = 0;
volatile int maxDistance = 0;
volatile int sitDowns = 0;
volatile int distance = 0;

long beepTime = millis();

void setup() {
  pinMode(butt, INPUT_PULLUP);
  pinMode(voltmeter, INPUT);
  pinMode(ledRed, OUTPUT);
  pinMode(ledBlue, OUTPUT);
  pinMode(zoomer, OUTPUT);

  disp.clear();
  disp.brightness(7);  // яркость, 0 - 7 (минимум - максимум)
  double volts = 0;
  for (int x = 0; x < 50; x++)
  {
    volts += analogRead(voltmeter);
  }
  double voltsVal = ((volts / 50) * 5) / 1024 * 2;
  disp.displayInt(voltsVal);
  delay(1000);
  runningTextHello();

  attachInterrupt(0, buttonPress, FALLING);

  digitalWrite(ledRed, LOW);
  digitalWrite(ledBlue, LOW);
  digitalWrite(zoomer, LOW);

}

void loop() {
  distance = ultrasonic.Ranging(CM);
  delay(50);

  if (minDistance == 0)
  {
    if (maxDistance == 0)
        disp.displayByte(_N, _N, _N, _N);
      else
        disp.displayByte(_n, _n, _n, _n);
  }
  else
  {
    if (flag)
    {
      runningTextGo();
      flag = false;
    }
    else
    {
      if (flagStandUp == true)
      {
        if (distance <= (minDistance + pogreshnost))
        {
          LedsOn(1);

          sitDowns += 1;
          if (flagBeep != flagStandUp)
          {
            tone(zoomer, 2000, 100);
            flagBeep = flagStandUp;
          }
          flagStandUp = false;
        }
      }
      else
      {

        if (distance >= (maxDistance - pogreshnost) && distance < maxDistance + maxLength)
        {
          LedsOn(2);

          if (flagBeep != flagStandUp)
          {
            tone(zoomer, 1000, 100);
            flagBeep = flagStandUp;
          }
          flagStandUp = true;
        }
      }
      disp.displayInt(sitDowns);

    }

  }

}

void LedsOn(int x)
{
  switch (x)
  {
    case 1:
      {
        digitalWrite(ledRed, HIGH);
        digitalWrite(ledBlue, LOW);
        break;
      }
    case 2:
      {
        digitalWrite(ledRed, LOW);
        digitalWrite(ledBlue, HIGH);
        break;
      }
    case 3:
      {
        digitalWrite(ledRed, LOW);
        digitalWrite(ledBlue, LOW);
        break;
      }
  }

}

void runningTextHello() {
  byte welcome_banner[] = {_H, _E, _L, _L, _O, _empty, _empty };
  disp.runningString(welcome_banner, sizeof(welcome_banner), 150);  // 200 это время в миллисекундах!
}

void runningTextGo() {
  byte welcome_banner[] = {_G, _O, _empty, _empty };
  disp.runningString(welcome_banner, sizeof(welcome_banner), 150);  // 200 это время в миллисекундах!
}

void buttonPress () {
  tone(zoomer, 500, 50);
  if (flagButton)
  {
    if (maxDistance == 0)
      maxDistance = distance;
    else
    {
      minDistance = distance;
      flagButton = false;
    }
  }
  else
  {
    resetFunc();
  }
}
 
Изменено: