Arduino случайно зависает во время выполнения?

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

//Используемые библиотеки
#include<Servo.h>


//Объявление переменной
int red1 = 10;
int yellow1 = 9;
int green1 = 8;
int red2 = 13;
int yellow2 = 12;
int green2 = 11;
int debug = 3;
int PIR = 5;

int button1 = 2;
int buttonState = 0;

int light = 0;

unsigned long previousTime = 0;
unsigned long currentTime = 0;
int currentState = 0;

int currentPIR = 0;
int pirState = LOW;

Servo servo;

void setup()
{
  pinMode(red1, OUTPUT);
  pinMode(yellow1, OUTPUT);
  pinMode(green1, OUTPUT);
  pinMode(red2, OUTPUT);
  pinMode(yellow2, OUTPUT);
  pinMode(green2, OUTPUT);
  pinMode(debug, OUTPUT);

  pinMode(PIR, INPUT);

  pinMode(button1, INPUT);

  servo.attach(4);
  servo.write(90);
}

void loop()
{

  currentPIR = digitalRead(PIR);
  if(currentPIR == 1){
    servo.write(180);
  }else{
    servo.write(90);
  }


  buttonState = digitalRead(2);
  light = analogRead(A0);

  if(light > 100){
    digitalWrite(debug, HIGH); 
  }else{
    digitalWrite(debug, LOW);
  }

  if(buttonState == HIGH){
    if(currentState == 3){
      digitalWrite(debug, HIGH);
      currentState++;
    }
  }
  //Используем millis() вместо delay(), чтобы программа не останавливалась полностью.
  currentTime = millis();
  changeLights();
}

void changeLights(){
  if(currentState == 0){
    //Красный зеленый
    digitalWrite(red2, LOW);
    digitalWrite(red1, HIGH);
    digitalWrite(green2, HIGH);
    asyncDelay(4000);
  }
  else if(currentState == 1){
    //Красно-желтый
    digitalWrite(green2, LOW);
    digitalWrite(yellow2, HIGH);
    asyncDelay(2000);
  }
  else if(currentState == 2){
    //Красный, красный
    digitalWrite(yellow2, LOW);
    digitalWrite(red2, HIGH);
    asyncDelay(750);
  }
  else if(currentState == 3){
    //Зеленый, красный
    digitalWrite(red1, LOW);
    digitalWrite(green1, HIGH);
    asyncDelay(4000);
  }
  else if(currentState == 4){
    //Желтый, красный
    digitalWrite(green1, LOW);
    digitalWrite(yellow1, HIGH);
    asyncDelay(2000);
  }
  else if(currentState == 5){
    //Красный, красный
    digitalWrite(yellow1, LOW);
    digitalWrite(red2, HIGH);
    asyncDelay(750);
  }
}

void asyncDelay(int delayTime){
  if(currentTime - previousTime == delayTime){
    currentState++; 
    previousTime = currentTime;
    if(currentState == 6){
      currentState = 0;
    }
  }
}

, 👍0

Обсуждение

добавить код отладки в свой скетч, @jsotola


1 ответ


Лучший ответ:

0

Вы должны заменить:

if(currentTime - previousTime == delayTime){

с

if(currentTime - previousTime >= delayTime){

Всегда существует вероятность того, что, поскольку вы используете сервопривод, который довольно интенсивно использует прерывания, millis() может пропустить бит, и это утверждение никогда не будет истинным.

,

Спасибо! Я не знаю, почему я не подумал об этом раньше, но спасибо за такое простое решение! Я приму ваш ответ как решенный через несколько минут, когда это позволит мне, но большое вам спасибо, я был так сбит с толку этим весь день., @Bill Bai

@BillBai Вы должны подтвердить, что это исправляет - это всего лишь предложение ..., @Majenko

да, я подтвердил, что это сработало, и оно работает уже несколько минут, а не максимум 20 секунд, как раньше., @Bill Bai