Подключение LCD 12864 к UNO: Кончилась память. Что делать?

Тема в разделе "Arduino & Shields", создана пользователем saer, 22 окт 2019.

Метки:
  1. saer

    saer Нуб

    Добрый день!
    Подключаю LCD 12864 чип KS0108 к Uno. Использую библиотеку <U8g2lib.h>
    При компиляции пишет, что нет памяти.
    Код инициируется, но не работает.
    Я вырезал из библиотеки все лишние экраны, не помогло. Размер памяти не меняется.

    Каким образом запустить LCD 12864 чип KS0108 на Uno? Как можно сократить размер выделенной памяти? Может есть другая , менее прожорливая библиотека?

    Подробности ниже.

    Сообщение об ошибке:
    Скетч использует 14294 байт (44%) памяти устройства. Всего доступно 32256 байт.
    Глобальные переменные используют 1791 байт (87%) динамической памяти, оставляя 257 байт для локальных переменных. Максимум: 2048 байт.
    Недостаточно памяти, программа может работать нестабильно.

    Код:
    Код (C++):
    #include <U8g2lib.h>
    int DBG = 1;
    String Inc="";
    String S1, S2;
    int ds_x , ds_y, dl_x1, dl_x2, dl_y1, dl_y2;
    String ds_text;
    U8G2_KS0108_128X64_F u8g2 (U8G2_R0,  4, 5, 6, 7, 8, 9, 10, 11,  /*en=A0*/ A0,    /* di=A2*/ A2,  12,13,     U8X8_PIN_NONE, U8X8_PIN_NONE);
    void setup(void)
    {
      pinMode(3, OUTPUT);
      digitalWrite (3,HIGH);
      u8g2.begin();
      u8g2.clearBuffer();
      u8g2.setFont(u8g2_font_ncenB08_tr);
      u8g2.drawStr(0,10,"Start");
      u8g2.sendBuffer();

      Serial.begin (115200);
      Serial.setTimeout(100);

    }

    void loop(void)
    {
      Inc = "";

      while (Serial.available() > 0) {
        Inc = Serial.readString();
      }
      if ( Inc != "" ) {
        Serial.println ( "From Serial: " + Inc);
        S2 = Inc.substring (0,3);

          //drawSrtring    
          if (S2 == "ds:" ){
                dS ( Inc) ;  
                Inc = "";
          }
    }

    void dS ( String I ){

        ds_x = I.substring (3,6).toInt() ;
        ds_y = I.substring (6,9).toInt() ;
        ds_text = I.substring (9,I.length());

        if (DBG == 1){
          Serial.println ("Start dS with:" + I);
          Serial.print ( "dS_x:"); Serial.println (ds_x);
          Serial.print ( "dS_y:"); Serial.println (ds_y);
          Serial.print ( "dS_text:"); Serial.println (ds_text);
        }
        ds_text.getBytes(buf, 100, 0);
        u8g2.clearBuffer();
        u8g2.drawStr(ds_x,ds_y,str2);
        u8g2.sendBuffer();
    }
     
     
  2. Смотрите по схеме, может где-то ошиблись. Раз код скомпилировался без ошибок, значит все должно работать. По логике программы у вас задействовано serial соединение. Отправляли что-то в порт, был результат?
     
  3. parovoZZ

    parovoZZ Гуру

    Первое не означает выполнение второго.
     
  4. Да, вы правы. Не так выразился. Код похоже взят из примеров библиотеки U8g2lib, скорее проблема не в нем
     
  5. Asper Daffy

    Asper Daffy Гуру

    Мама дарагая, да кто ж так варварски с памятью работает?

    Библиотека что-ли виновата, что ты пишешь

    void dS ( String I )

    или это библиотека заставила тебя сделать глобальным ds_text, который используется только в одной функции?
    Программировать нормально. Вот это изучи (только именно изучи, а не по диагонали просмотри) и будет много счастья.
     
    b707 и ДеКодер нравится это.
  6. saer

    saer Нуб

    Совет хороший , но абсолютно бесполезный.
    Я убрал из скрипта все, кроме инициализации - памяти по-прежнему нет. Примеры ниже.

    Как запустить 12863 на Уно?
    Код (C++):
    #include <U8g2lib.h>

    U8G2_KS0108_128X64_F u8g2 (U8G2_R0,  4, 5, 6, 7, 8, 9, 10, 11,  /*en=A0*/ A0,    /* di=A2*/ A2,  12,13,     U8X8_PIN_NONE, U8X8_PIN_NONE);

    void setup(void)
    {
      u8g2.begin();
      u8g2.clearBuffer();
      u8g2.setFont(u8g2_font_ncenB08_tr);
      u8g2.drawStr(0,10,"Start");
      u8g2.sendBuffer();

      Serial.begin (115200);
      Serial.setTimeout(100);

    }

    void loop(void)
    {
    }
    Компилятор:
    Скетч использует 9644 байт (29%) памяти устройства. Всего доступно 32256 байт.
    Глобальные переменные используют 1589 байт (77%) динамической памяти, оставляя 459 байт для локальных переменных. Максимум: 2048 байт.
    Недостаточно памяти, программа может работать нестабильно.
     
  7. Так это не проблема, если память на донышке. У меня так же писал, но нормально вгрузилось и никаких сбоев в работе
     
  8. Asper Daffy

    Asper Daffy Гуру

    Ну, если ты лучше меня знаешь что полезно, а что нет, то чего с вопросами пришёл?
    Так, а откуда ей взяться? Но немножко-то есть!. И всё работает. Я тебе подсказываю как выкрутиться и уместиться в то, что осталось, чтобы всё работало. А ты походу лучше меня знаешь, что полезно, а что нет.

    В общем, делай как говорят и всё дожмём. А ещё раз задерёшь хвост - будешь сам трахаться, мне оно нах не надо.. Как сказано в Писании "Всякому всякому взбрыкнувшему да отбрыкнется, ибо нефиг"
     
    b707 и DetSimen нравится это.
  9. b707

    b707 Гуру

    saer - всю эту память занимает библиотека экрана. И скорее всего меньше вы ее не сделаете. разве что искать другую либу (если есть).
    Поэтому слушайте Asper Daffy- ваша задача написать программу так, чтобы оставшейся памяти хватило для работы
     
  10. saer

    saer Нуб

    что отличает пустозвона от эксперта? - для эксперта характерна лаконичность и смысловое наполнение речи.
    вопрос был понятный а вместо ответа - понты. Ибо тебе, Asper Daffy , предметно сказать нечего. Потому что ты - пустозвон.

    Вопрос решен - нашел другую либу.

    от DetSimen: Выбирай выражения с осторожностью.
     
    Последнее редактирование модератором: 29 окт 2019
  11. Asper Daffy

    Asper Daffy Гуру

    Таки да, вечерний. Успехов тебе, добрый человек.
     
  12. b707

    b707 Гуру

    я б все-таки советовал и на свой код обратить внимание.
    Так, как у вас написан скетч в первом сообщении - с любой либой можно всю память засрать засорить
     
  13. saer

    saer Нуб

    Предложите, пожалуйства , какое нить формализованное решение, позволяющее забрать строку из Serial (опрос в loop) и передать эту строку в ряд функций (вне loop).

    Варианты переписать библиотеку на ассемблере или следовать советал коллег, которым "оно нах не надо" не рассматриваются.

    Мне нужно было быстро замакетировать прототип. Ардуино в этом плане идеален. Для танцев с бубном мне хватает stm )))
     
  14. b707

    b707 Гуру

    написать с использованием не String. а char*
    Или хотя бы на String. но с передачей обьекта по ссылке, а не по значению
    Если я правильно понял ваш намек. что "в СТМ я крутой прогер"... :)
     
  15. DetSimen

    DetSimen Спамовредитель Модератор

  16. saer

    saer Нуб

    Да, вариант!)
     
  17. Asper Daffy

    Asper Daffy Гуру

    И ещё в 19-ти языках выше университетского.
     
    DetSimen нравится это.