ЛДЦ в паре с Ардуино зависает и зависает. Закончились СПРАМ?

Я делаю будильник, используя ЖК-дисплей 4x20, RTC и Arduino Pro Mini 3,3 В. Я реализовал систему меню для установки времени/даты, которая мигает текстом на ЖК-дисплее, чтобы указать, что я его выбрал, но мигание случайным образом прекращается, и Arduino перестает печатать по последовательному порту примерно через десять секунд.

После долгих поисков и поиска в Google я пришел к выводу, что все мои строки lcd.print() использовали всю мою оперативную память. Я пытался создать переменные PROGMEM для использования в командах печати, но мне не удалось заставить их работать, поэтому я просто добавил макрос F() в каждый оператор печати (их много). Теперь все печатается, как и ожидалось, но Arduino все равно зависает через такое же время. Я неправильно использую F() или проблема в чем-то другом, например в мощности???

В коде Visual Studio указано, что при загрузке кода я использую 643/2048 байт данных/оперативной памяти и 14960/30720 байт флэш-памяти. (то есть с реализованным макросом F())

--------------РЕДАКТИРОВАНИЕ----------------

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

#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClibExtended.h>

LiquidCrystal_I2C lcd(0x27,20,4);
RTC_DS3231 clock;

void setup() {
    Serial.begin (9600);
    lcd.init();
    clock.begin();
    clock.adjust (DateTime (__DATE__, __TIME__));
    lcd.backlight();
}

bool on = true;

void loop() {
    lcd.setCursor (0, 0);

    if (on) {
        for (int i = 0; i < 4; i++) {
            lcd.setCursor (0, i);
            for (int j = 0; j < 20; j++) {
                lcd.print ("#");
            }
        }
    }
    else {
        for (int i = 0; i < 4; i++) {
            lcd.setCursor (0, i);
            for (int j = 0; j < 20; j++) {
                lcd.print (" ");
            }
        }
    }

    on = !on;
    delay (200);
}

, 👍0

Обсуждение

добавьте свой код в вопрос., @Juraj

Для ЖК-дисплея требуется 5 В, а для Arduino — профессиональная мини-плата с напряжением 3,3 В. Как ты это подключил? Есть ли длинные провода к rtc и дисплею?, @Jot

Учитывая то, что сказал Джот и мой собственный WAG, похоже, что вы пытаетесь получить слишком большую мощность, что может привести к перегреву регулятора мощности. Как только вы добавите некоторый код, мы увидим, есть ли это альтернативная возможность., @computercarguy

У меня Arduino подключен к USB-порту моего компьютера, а rtc и ЖК-дисплей подключены к контакту vcc на Arduino. Я использую ЖК-дисплей без подсветки, так ему все равно нужно 5 В? Кроме того, я попытался использовать 9-вольтовую батарею для питания схемы (подключил Arduino к батарее через необработанный контакт и подключил ЖК-дисплей и RTC непосредственно к батарее вместо контакта VCC от Arduino), но ЖК-дисплей все равно зависает. Было бы полезно, если бы я выложил схему? Мой код имеет длину более 1000 строк, поэтому я не уверен, как лучше всего поделиться им с вами., @cr5519

создайте небольшой тестовый эскиз, чтобы проверить, связана ли проблема с питанием или перегревом, @Juraj

@Юрай, я опубликовал один, @cr5519

*Есть еще идеи?* — в вашем более длинном коде есть проблема, которой нет в меньшем коде. Трудно сказать, что это такое, не видя более длинного кода., @Nick Gammon


1 ответ


Лучший ответ:

0

Я нашел проблему! это было специфично для моего кода и не имело ничего общего с оперативной памятью или питанием. Проблема была в том, что я не отключил прерывание от rtc, когда разбудил его кнопкой. Казалось бы, он зависал случайно, потому что rtc подавал сигнал прерывания, когда тикала следующая минута, пока Arduino не спал. Я предполагаю, что это вызывает проблемы, когда вы пытаетесь прервать сон Arduino, а он на самом деле не спит. Все, что мне нужно было сделать, это отключить оба прерывания при нажатии кнопки. Спасибо всем за помощь :)

,