Arduino 定时器没有完全关闭

问题描述 投票:0回答:0

这是一个连接到 4 位 7 段显示器的 Arduino Uno,从 60 秒开始倒计时,红外传感器在触发时增加 10 秒。当倒计时达到 0 时,计时器显示应关闭。还有一个运行手部检测程序的 python 代码,如果检测到手势,它会通过串行向 Arduino 发送信号以重置并允许计时器从 60 秒开始倒计时。问题是即使使用 clearLED,定时器也不会完全关闭。所有数字都关闭,但最后一个数字仍保持打开状态。

enter image description here

这里是完整代码

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();
      }
    }
  }
c++ arduino arduino-uno arduino-ide led
© www.soinside.com 2019 - 2024. All rights reserved.