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("ЗАКРЫТО");
}

Это момент, когда он начинает работать как сумасшедший

, 👍1

Обсуждение

Это может быть проблема с памятью/стеком или проблема с электрическим импульсом. Я не могу определить проблему с памятью/стеком, поэтому давайте сосредоточимся на электрическом замке и реле. Сколько стоит 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


1 ответ


1

Похоже, проблема в релейном модуле или шнуре питания. Я изменил эти два элемента HW и, похоже, работает. Причина, по которой это вызвало сбой в работе Arduino, заключалась в том, что, когда я перемещал ящик, он слегка смещал шнур питания, у которого был плохой контакт, поэтому он вызывал падение напряжения на питании Arduino и начал делать сумасшедшие вещи. Спасибо всем за ваше время

,