Arduino зависает во время выполнения кода
Я разочарован своим проектом Arduino, вы можете мне помочь? Я использую Arduino Uno, электрический замок (высокий/низкий), 4 дистанционных звуковых модуля. В основном у меня есть 4 ящика, я измеряю расстояние - насколько они открыты и если они открыты в заданных пределах, я ставлю электрозамок открытым (высокий).
Он работает, но через некоторое время останавливается и перестает работать. Я пробовал комментировать всю последовательную связь - не помогло. Я пытался использовать правильные типы переменных данных - то же самое. Пробовал покупать более мощный источник питания - 12В 3,5А и покупал электролитный конденсатор 4,7мФ для балансировки пиков мощности при закрывании замка - не помогло.
Замок включается с помощью реле, подключая его напрямую к источнику питания 12В. Реле питается от 5В питания Arduino и управляется цифровым выводом Arduino. 4 модуля Sonic Distance питаются от блока питания Arduino.
Еще более забавно, что он запускается примерно через 10 минут с нуля. Я запутался.
Код:
// определяет номера контактов
const int trigPin1 = 2;
const int echoPin1 = 3;
const int trigPin2 = 6;
const int echoPin2 = 5;
const int trigPin3 = 9;
const int echoPin3 = 8;
const int trigPin4 = 12;
const int echoPin4 = 11;
const int relayPin = 7;
//ограничения по расстоянию
const int minSuplik4=27;//suplik4
const int maxSuplik4=29;
const int minSuplik3=22;//suplik3
const int maxSuplik3=24;
const int minSuplik2=32;//suplik2
const int maxSuplik2=34;
const int minSuplik1=9;//suplik1
const int maxSuplik1=11;
/*
double PreDistance1[4]={0,0,0,0};//поставляется
double PreDistance2[4]={0,0,0,0};//предложение
double PreDistance3[4]={0,0,0,0};//предложение
*/
long distance[4]={0,0,0,0};//массив с расстояниями
int i;
int x;
int trigPinX[4]={trigPin1,trigPin2,trigPin3,trigPin4};//supliky
int echoPinX[4]={echoPin1,echoPin2,echoPin3,echoPin4};//поставляется
int maxD[4]={maxSuplik1,maxSuplik2,maxSuplik3,maxSuplik4};//supliky
int minD[4]={minSuplik1,minSuplik2,minSuplik3,minSuplik4};//supliky
void setup() {
pinMode(relayPin, OUTPUT);
pinMode(trigPin1, OUTPUT); // Устанавливает тригПин как Выход
pinMode(echoPin1, INPUT); // Устанавливает echoPin в качестве входа
pinMode(trigPin2, OUTPUT); // Устанавливает тригПин как Выход
pinMode(echoPin2, INPUT); // Устанавливает echoPin в качестве входа
pinMode(trigPin3, OUTPUT); // Устанавливает тригПин как Выход
pinMode(echoPin3, INPUT); // Устанавливает echoPin в качестве входа
pinMode(trigPin4, OUTPUT); // Устанавливает тригПин как Выход
pinMode(echoPin4, INPUT); // Устанавливает echoPin в качестве входа
digitalWrite(relayPin, LOW);
Serial.begin(9600); // Запускает последовательную связь
}
void loop() {
for (int i=0; i<4; i++)
{
delay(5);
distance[i]=DistanceFunction(trigPinX[i],echoPinX[i]);
delay(20);
/*********** DEBUG ************
Serial.print("Distance");// Печатает расстояние на последовательном мониторе
Serial.print(i+1);
Serial.print(":");
Serial.print(distance[i]);
Serial.print("<");
Serial.print(minD[i]);
Serial.print(":");
Serial.print(maxD[i]);
Serial.print(">");
Serial.print(";");
*********************************/
}
if(distance[0]>=minD[0] && distance[0]<=maxD[0] && distance[1]>=minD[1] && distance[1]<=maxD[1] && distance[2]>=minD[2] && distance[2]<=maxD[2] && distance[3]>=minD[3] && distance[3]<=maxD[3])
{
OpenFcn();
}
else
{
CloseFcn();
}
delay(100);
}
int DistanceFunction(int trigPin, int echoPin)
{
digitalWrite(trigPin, LOW);// Очищает тригПин
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);// Устанавливает тригПин в состояние HIGH на 10 микросекунд
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);// Считывает echoPin, возвращает время прохождения звуковой волны в микросекундах
long distanceFcn= duration*0.034/2;// Расчет расстояния
return distanceFcn;
}
int OpenFcn()
{
digitalWrite(relayPin, HIGH);
//Serial.println("ОТКРЫТО");
for (int x=5; x>0; x--)
{
//Serial.println("Отврено:");
//Серийный.println(x);
delay(1000);
}
}
int CloseFcn()
{
digitalWrite(relayPin, LOW);
//Serial.println("ЗАКРЫТО");
}
@Jasmin Jatić, 👍1
Обсуждение1 ответ
Похоже, проблема в релейном модуле или шнуре питания. Я изменил эти два элемента HW и, похоже, работает. Причина, по которой это вызвало сбой в работе Arduino, заключалась в том, что, когда я перемещал ящик, он слегка смещал шнур питания, у которого был плохой контакт, поэтому он вызывал падение напряжения на питании Arduino и начал делать сумасшедшие вещи. Спасибо всем за ваше время
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Это может быть проблема с памятью/стеком или проблема с электрическим импульсом. Я не могу определить проблему с памятью/стеком, поэтому давайте сосредоточимся на электрическом замке и реле. Сколько стоит 4,7мФ? Я предлагаю использовать 1000 мкФ для arduino 5v и земли. Если вы замените электрический замок или реле на светодиод плюс резисторы, это поможет? Что можете сказать об электрозамке и реле? Можешь дать ссылку на них? Пожалуйста, добавьте сообщение с Serial.println после Serial.begin в функции настройки, чтобы, по крайней мере, вы знали, сбросил ли Arduino., @Jot
Пожалуйста, добавьте всю дополнительную информацию к вашему вопросу. Цифровой контакт Arduino может дать 20 мА. 40 мА — это ток короткого замыкания, и его следует избегать. Вы питаете реле 70 мА с цифровым выводом? Тогда в этом проблема. Можете дать схему или чертеж или фото вашей проводки?, @Jot
пожалуйста, опубликуйте вывод последовательного терминала в виде текста вместо изображения ...... отключите электрический замок и посмотрите, не сработает ли программа по-прежнему, @jsotola
Я пытался подключить звуковые модули и реле к внешнему источнику питания, но проблема та же. Но я снабдил ардуино другим источником. Может ли это быть причиной? Реле вот это http://www.g7electronica.net/1444-2227-thickbox/rele-srd-05vdc-sl-c.jpg звуковые модули вот эти https://www.banggood.com/cs/10Pcs-HC-SR04-Ultrasonic-Ranging-Sensor-Ultrasonic-Module-For-Arduino-p-942912.html, @Jasmin Jatić
Итак, я попытался подключить все к внешнему источнику 5V 3,5A и только замок, подключенный к 12V. Все равно вылетает, такое же поведение., @Jasmin Jatić
Если я отключаю замок, управляя реле без замка, он работает хорошо., @Jasmin Jatić
"реле без блокировки, оно работает" звучит как отсутствие диода свободного хода, @Sim Son