这是一个连接到 4 位 7 段显示器的 Arduino Uno,从 60 秒开始倒计时,红外传感器在触发时增加 10 秒。当倒计时达到 0 时,计时器显示应关闭。还有一个运行手部检测程序的 python 代码,如果检测到手势,它会通过串行向 Arduino 发送信号以重置并允许计时器从 60 秒开始倒计时。问题是即使使用 clearLED,定时器也不会完全关闭。所有数字都关闭,但最后一个数字仍保持打开状态。
这里是完整代码
int data;
const int a = 12;
const int b = 10;
const int c = 8;
const int d = 7;
const int e = 6;
const int f = 11;
const int g = 9;
int ir = 5;
int y;
int startStopReset = 1;
const int d1 = 13;
const int d2 = 2;
const int d3 = 3;
const int d4 = 4;
long n = 60000; //start time
int x = 10;
int del = 55; //delay value
void pickDigit(int x) //changes digit
{
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
switch (x)
{
case 1:
digitalWrite(d1, LOW);
break;
case 2:
digitalWrite(d2, LOW);
//digitalWrite(p, HIGH);
break;
case 3:
digitalWrite(d3, LOW);
break;
default:
digitalWrite(d4, LOW);
break;
}
}
void pickNumber(int x) //changes value of number
{
switch (x)
{
default:
zero();
break;
case 1:
one();
break;
case 2:
two();
break;
case 3:
three();
break;
case 4:
four();
break;
case 5:
five();
break;
case 6:
six();
break;
case 7:
seven();
break;
case 8:
eight();
break;
case 9:
nine();
break;
}
}
void clearLEDs()
{
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void zero()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
}
void one()
{
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void two()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
void three()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
void four()
{
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void five()
{
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void six()
{
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void seven()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void eight()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void nine()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void setup() {
//serialData.begin();
Serial.begin(9600);
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
//pinMode(p, INPUT_PULLUP);
pinMode(startStopReset, INPUT_PULLUP);
digitalWrite(startStopReset, HIGH);
pinMode(5, INPUT);
}
void (* resetFunc) (void) = 0;
void loop() {
delay(1);
clearLEDs();
pickDigit(1);
pickNumber((n / x / 1000) % 10);
delayMicroseconds(del);
clearLEDs();
pickDigit(2);
pickNumber((n / x / 100) % 10);
delayMicroseconds(del);
clearLEDs();
pickDigit(3);
pickNumber((n / x / 10) % 10);
delayMicroseconds(del);
clearLEDs();
pickDigit(4);
pickNumber(n / x % 10);
delayMicroseconds(del);
Serial.print(data);
n--; //'n++' for stopwatch
y = digitalRead(ir);
if (y == 0)
{
n += 10000;
delay(200);
}
do {
if (Serial.available() > 0)
{
data = Serial.read();
if (data == '1')
{
delay(1000);
resetFunc();
}
}
}
while (n == 0); {
clearLEDs();
}
在代码的另一个变体中,do...while 循环被替换为以下代码。当定时器达到 0000 时可以完全关闭,但是当有串行数据 1 时无法执行重启。
do {
while (n == 0); {
clearLEDs();
}
}
while (Serial.available());
{
data = Serial.read();
if (data == '1')
{
delay(1000);
resetFunc();
}
}
}