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;
}
}
}
@Bill Bai, 👍0
Обсуждение1 ответ
Лучший ответ:
Вы должны заменить:
if(currentTime - previousTime == delayTime){
с
if(currentTime - previousTime >= delayTime){
Всегда существует вероятность того, что, поскольку вы используете сервопривод, который довольно интенсивно использует прерывания, millis()
может пропустить бит, и это утверждение никогда не будет истинным.
Спасибо! Я не знаю, почему я не подумал об этом раньше, но спасибо за такое простое решение! Я приму ваш ответ как решенный через несколько минут, когда это позволит мне, но большое вам спасибо, я был так сбит с толку этим весь день., @Bill Bai
@BillBai Вы должны подтвердить, что это исправляет - это всего лишь предложение ..., @Majenko
да, я подтвердил, что это сработало, и оно работает уже несколько минут, а не максимум 20 секунд, как раньше., @Bill Bai
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
добавить код отладки в свой скетч, @jsotola