Как то заказали подобный проект, мало ли кому будет полезно:
Внешний вид (крепится на магнитах встроенных в корпус), подключение телефонным кабелем, крученным, в разъем
http://instagr.am/p/B4SzCsNBcJW/ 3D модель корпуса для понимания, кружочки снизу, как раз для магнитиков
Видео работы прибора (на руку плохо отзывается, но на железные предметы отлично): http://instagr.am/p/B4KnhNmhINr/
И собственно код, единственное, немного модифицировал библиотеку ик дальномера, чтобы он не в см присылал значения, а мс/10, для большей точности
Внешний вид (крепится на магнитах встроенных в корпус), подключение телефонным кабелем, крученным, в разъем
http://instagr.am/p/B4SzCsNBcJW/ 3D модель корпуса для понимания, кружочки снизу, как раз для магнитиков
Видео работы прибора (на руку плохо отзывается, но на железные предметы отлично): 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();
}
}
Изменено: