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); // Отображение текущей секунды
}
@Martin, 👍0
Обсуждение1 ответ
- Как преобразовать мою настройку Arduino в настройку PIC?
- Как использовать LCD I2C и RTC3231 на Arduino Pro Mini?
- ЖК-дисплей мигает после ввода кода: система напоминания о приеме лекарств с использованием Arduino Uno
- Есть ли в Sparkfun Redboard Arduino Uno встроенный RTC?
- Новичок в Arduino и ищет направление для исследования идеи проекта
- Печать string and integer LCD
- Преобразование в Unix Timestamp и обратно
- Как отобразить символ º на ЖК-дисплее?
На мой взгляд, это небольшая ошибка в коде. Я могу начать говорить случайные номера строк или .. Вы можете поставить КОД!!!, @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