Добрый день! Подключаю 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(); }
Смотрите по схеме, может где-то ошиблись. Раз код скомпилировался без ошибок, значит все должно работать. По логике программы у вас задействовано serial соединение. Отправляли что-то в порт, был результат?
Да, вы правы. Не так выразился. Код похоже взят из примеров библиотеки U8g2lib, скорее проблема не в нем
Мама дарагая, да кто ж так варварски с памятью работает? Библиотека что-ли виновата, что ты пишешь void dS ( String I ) или это библиотека заставила тебя сделать глобальным ds_text, который используется только в одной функции? Программировать нормально. Вот это изучи (только именно изучи, а не по диагонали просмотри) и будет много счастья.
Совет хороший , но абсолютно бесполезный. Я убрал из скрипта все, кроме инициализации - памяти по-прежнему нет. Примеры ниже. Как запустить 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 байт. Недостаточно памяти, программа может работать нестабильно.
Так это не проблема, если память на донышке. У меня так же писал, но нормально вгрузилось и никаких сбоев в работе
Ну, если ты лучше меня знаешь что полезно, а что нет, то чего с вопросами пришёл? Так, а откуда ей взяться? Но немножко-то есть!. И всё работает. Я тебе подсказываю как выкрутиться и уместиться в то, что осталось, чтобы всё работало. А ты походу лучше меня знаешь, что полезно, а что нет. В общем, делай как говорят и всё дожмём. А ещё раз задерёшь хвост - будешь сам трахаться, мне оно нах не надо.. Как сказано в Писании "Всякому всякому взбрыкнувшему да отбрыкнется, ибо нефиг"
saer - всю эту память занимает библиотека экрана. И скорее всего меньше вы ее не сделаете. разве что искать другую либу (если есть). Поэтому слушайте Asper Daffy- ваша задача написать программу так, чтобы оставшейся памяти хватило для работы
что отличает пустозвона от эксперта? - для эксперта характерна лаконичность и смысловое наполнение речи. вопрос был понятный а вместо ответа - понты. Ибо тебе, Asper Daffy , предметно сказать нечего. Потому что ты - пустозвон. Вопрос решен - нашел другую либу. от DetSimen: Выбирай выражения с осторожностью.
я б все-таки советовал и на свой код обратить внимание. Так, как у вас написан скетч в первом сообщении - с любой либой можно всю память засрать засорить
Предложите, пожалуйства , какое нить формализованное решение, позволяющее забрать строку из Serial (опрос в loop) и передать эту строку в ряд функций (вне loop). Варианты переписать библиотеку на ассемблере или следовать советал коллег, которым "оно нах не надо" не рассматриваются. Мне нужно было быстро замакетировать прототип. Ардуино в этом плане идеален. Для танцев с бубном мне хватает stm )))
написать с использованием не String. а char* Или хотя бы на String. но с передачей обьекта по ссылке, а не по значению Если я правильно понял ваш намек. что "в СТМ я крутой прогер"...
формализованней некуды https://www.arduino.cc/reference/en/language/functions/communication/serial/readstring/