Arduino зависает через 10-15 минут

У меня проблема с зависанием Arduino через небольшой промежуток времени. Я использую прорыв RTC DS1307, чтобы отслеживать время и отображать время на ЖК-дисплее. Он отображает часы, минуты и секунды (обновляется каждую секунду).

Затем у меня есть 25 В, которые питаются от трансформатора и подключены к набору светодиодов через CAT4101<. /a> Драйвер светодиода постоянного тока. Плата Arduino питается от 2-амперного USB-трансформатора.

В установленное время таймер должен запустить процесс приглушения света.

Все работает хорошо, если я выключу свет в течение нескольких минут. Однако, если я оставлю плату включенной более чем на 10-15 минут, то все как бы зависнет (т.е. время на ЖК-дисплее перестанет обновляться и застрянет на моменте зависания).

Сначала я думал, что это может быть как-то связано с моим кодом. Но затем я просмотрел все до самого необходимого и просто загрузил код, необходимый для обновления времени на ЖК-дисплее. И даже в этом случае зависает.

Единственный способ избежать зависания — это отсоединить контакт 1 CAT4101 от ШИМ Arduino и отсоединить контакт 2 от 5V Arduino.

Что может быть причиной этой проблемы?

CAT4101

pin 1 = connected to Arduino PWM
pin 2 = connected to +5v
pin 3 = connected to ground 
pin 4 = connected to ground with 2kOhm resistor
pin 5 = connected to LED cathode

ОБНОВЛЕНИЕ

Код ниже (я урезал код, удалив все дополнительные функции и оставив только голый код, который приводит к сбою приложения).

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>

RTC_DS1307 rtc;
DateTime now;
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

void setup() { 
  Wire.begin();
  rtc.begin();
  lcd.begin(16,2);

 if (!rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // следующая строка устанавливает RTC на дату & время составления этого скетча
    rtc.adjust(DateTime(__DATE__, __TIME__)); // время = формат чч:мм:сс, например, 06:01:01
  }

  lcd.clear();
}

void loop() { 
  now = rtc.now();
  updateDisplay();
}


void updateDisplay(){
 int h = now.hour(); // Получить часы прямо сейчас и сохранить их в целое число с именем h
 int m = now.minute(); // Получите минуты прямо сейчас и сохраните их в целое число с именем m
 int s = now.second(); // Получить секунды прямо сейчас и сохранить их в целое число с именем s

 lcd.setCursor(0, 0); // Устанавливаем курсор в нулевой столбец, верхняя строка...
 lcd.print(" The time is: "); // ...с пробелами для очистки символов от установки будильника.
 lcd.setCursor(4, 1); // Переместите курсор в четвертый столбец, нижний ряд
 if (h<10){   // При необходимости добавить ноль, как указано выше
  lcd.print(0);
 }
 lcd.print(h);   // Отображаем текущий час
 lcd.setCursor(6, 1); // Переход к следующему столбцу
 lcd.print(":");  // И печатаем двоеточие
 lcd.setCursor(7, 1); // Переход к следующему столбцу
 if (m<10){   // При необходимости добавить ноль, как указано выше
  lcd.print(0);
 }
 lcd.print(m);   // Отображаем текущую минуту
 lcd.setCursor(9, 1); // Переход к следующему столбцу
 lcd.print(":");  // И печатаем двоеточие
 lcd.setCursor(10, 1); // Переход к следующему столбцу
 if (s<10){   // При необходимости добавить ноль, как указано выше
  lcd.print(0);
 }
 lcd.print(s);   // Отображение текущей секунды
}

, 👍0

Обсуждение

На мой взгляд, это небольшая ошибка в коде. Я могу начать говорить случайные номера строк или .. Вы можете поставить КОД!!!, @frarugi87

@Martin, вы пробовали питать CAT4101 от внешнего источника, а не от Arduino? Попробуйте это, а также поместите конденсатор в Vin, как показано на схеме таблицы данных., @brtiberio

Да, пожалуйста, код и номер модели LCD., @slash-dev

Он по-прежнему падает при запуске кода примера мигания? Если нет, то проблема должна быть где-то в коде., @AMADANON Inc.

вы правы, ребята, это что-то в коде, так как та же установка все еще работает с простым примером кода «мигания». Я обновил пост, указав свой уменьшенный код, сохранив только основную часть, которая по-прежнему вызывает сбой системы., @Martin

Лично я бы избегал запускать его без задержек. Просто установите задержку 50-100 мс между запусками или используйте функцию millis(), если вы хотите избежать остановки остальной части программы. Затем я обновлял бы только те поля на ЖК-дисплее, которые мне нужны, а не все каждый раз. Поэтому сравните переменные h, m и s с той, которую вы сохранили в памяти, и обновите их, только если они отличаются. Это уменьшит трафик на линиях ЖК и уменьшит вероятность неисправности. И, пожалуйста, h, m и s никогда не будут больше 255, поэтому ПОЖАЛУЙСТА, используйте byte, а не int, @frarugi87

Можете ли вы подтвердить, что проблема все еще возникает, когда CAT4101 не только исключен из кода, но и отключен от цепи? Итак, у вас есть только ЖК-дисплей и модуль RTC, подключенные к Arduino. Попробуйте следующее, по очереди: **[1]** включите его *напрямую* через USB, а не через трансформатор 2A **[2]** Отключите RTC и пусть ЖК-дисплей просто обновляет произвольные числа ** [3]** Отсоедините ЖК-дисплей и подключите RTC. После каждого rtc.now() проверьте, совпадает ли now.second() с предыдущим вызовом – если нет, то переключите светодиод. Если светодиод перестает мигать, программа зависла., @CharlieHanson

Возникла проблема с библиотекой или комбинацией библиотеки и системного кода Arduino. Я провел много тестов только с одной строкой текста. Через несколько часов у меня возникла та же проблема с дисплеем (20x4). Я использую разные Arduino Mega и дисплеи, поэтому дефект в моем оборудовании можно исключить. Я также использую 2 разных источника питания. 1 — это лабораторный источник питания, поэтому источник питания также можно исключить. Использование delay или millis() для замедления скорости обновления не решает проблему (или может быть ее частью). Если я найду решение, я опубликую его здесь., @JOHI


1 ответ


1

Я бы добавил delay(100); в конец цикла()

Ставлю на равные шансы, что все решит.

,