Оформи код соответствующим тэгом, см. Правила
Всем доброго дня! Решил собрать MP-3 плеер на базе arduino nano.
Ответ может быть: используй другие компоненты. Я бы очень хотел выполнить работу с этими компонентами, так как вижу не просто конечное изделие, а получение опыта в работе с дисплеем, слотом, разъемом 3.5 и самой ардуинкой.
Благодарю за помощь и ответы!
Компоненты:
-Arduino nano;
-Oled-дислей с контроллером SSD1306_128x64;
-слот для microSD- карты;
- разъем для minijack 3.5
Проблема:
ошибка компиляции:
Скетч использует 17270 байт (56%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 2338 байт (114%) динамической памяти, оставляя -290 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти; прочитайте https://support.arduino.cc/hc/en-us/articles/360013825179
раздел данных превышает доступное пространство на плате
Compilation error: раздел данных превышает доступное пространство на плате
Сейчас не хватает памяти, а мне необходимо еще вложенное меню в настройки сделать.
Вопрос:
Что в коде "кушает" память?
можно ли отправлять номера пинов кнопок в PROGMEM -память? Если да, то необходимо ли потомкаждый раз использовать функцию чтения изPROGMEM- памяти?
можно ли оптимизировать этот код?
КОД:
#include <GyverOLED.h>
#include <GyverOLEDMenu.h>
#include "GyverButton.h"
#include <SD.h>
#include "SPI.h"
#define btn_choice_delet 2 // выбор; зажать - удалить;
#define btn_record_stop 3 // начать запись; завершение запись – зажать
#define btn_up_back 4 // вверх; зажать вверх - назад
#define btn_down 5 // вниз.
GyverOLED<SSD1306_128x64, OLED_BUFFER> oled;
OledMenu<3, GyverOLED<SSD1306_128x64>> menu(&oled);
GButton buttonChoice(btn_choice_delet);
GButton buttonRecordStop(btn_record_stop);
GButton buttonUpBack(btn_up_back);
GButton buttonDown(btn_down);
const char menuItem1[] PROGMEM = "<- ВЫХОД";
const char menuItem2[] PROGMEM = "Воспроизведение";
const char menuItem3[] PROGMEM = "Настройки";
void setup() {
oled.init();
Wire.setClock(400000L);
oled.clear();
oled.update();
pinMode(btn_choice_delet, INPUT_PULLUP);
pinMode(btn_record_stop, INPUT_PULLUP);
pinMode(btn_up_back, INPUT_PULLUP);
pinMode(btn_down, INPUT_PULLUP);
menu.onChange(onItemChange, true);
menu.addItem(menuItem1);
menu.addItem(menuItem2);
menu.addItem(menuItem3);
menu.showMenu(true);
buttonChoice.setDebounce(20); // Установка задержки для устранения дребезга
buttonRecordStop.setDebounce(20);
buttonUpBack.setDebounce(20);
buttonDown.setDebounce(20);
Serial.begin(9600);
}
void onItemChange(const int index, const void* val, const byte valType) { //Это определение функции onItemChange, которая будет вызываться каждый раз,
// когда пользователь выбирает другой элемент в меню.Функция принимает три параметра:const int index: индекс элемента меню, который был выбран пользователем.
// const void* val: указатель на значение, связанное с элементом меню (может быть использован для передачи дополнительных данных).
// const byte valType: тип значения, переданного в обработчик. В данном случае используется для определения, является ли изменение
// действием (например, выбор элемента).
if (valType == VAL_ACTION) { //Этот условный оператор проверяет, является ли тип значения valType равным VAL_ACTION.
// VAL_ACTION — это, вероятно, константа, определенная в библиотеке, которая указывает, что событие связано с действием (например, выбор элемента меню).
if (index == 0) { //Если тип значения является действием, то проверяется, является ли индекс выбранного элемента равным 0.
// Индекс 0 соответствует первому элементу меню, который в вашем случае — это "<- ВЫХОД".
menu.showMenu(false); //Если индекс равен 0, вызывается метод showMenu(false), который, вероятно, закрывает текущее меню или скрывает его.
// Параметр false может указывать, что меню должно быть скрыто, а не показано.
}
}
}
void loop() {
Btn_H ();
}
void Btn_H () {
buttonChoice.tick();
buttonRecordStop.tick();
buttonUpBack.tick();
buttonDown.tick();
// Обработка кнопок для перемещения по меню
if (buttonUpBack.isPress()) { // Если нажата кнопка "вверх"
menu.selectPrev(); // Используем selectPrev() для перемещения вверх
}
if (buttonDown.isPress()) { // Если нажата кнопка "вниз"
menu.selectNext(); // Используем selectNext() для перемещения вниз
}
// Проверка нажатия кнопки выбора
if (buttonChoice.isPress()) {
// Здесь можно добавить код для обработки выбора
Serial.println("Кнопка выбора нажата");
}
// Обновляем меню
// menu.tick(); // Используем tick() для обновления состояния меню
delay(50); // Небольшая задержка для устранения дребезга
}
Ответ может быть: используй другие компоненты. Я бы очень хотел выполнить работу с этими компонентами, так как вижу не просто конечное изделие, а получение опыта в работе с дисплеем, слотом, разъемом 3.5 и самой ардуинкой.
Благодарю за помощь и ответы!
Компоненты:
-Arduino nano;
-Oled-дислей с контроллером SSD1306_128x64;
-слот для microSD- карты;
- разъем для minijack 3.5
Проблема:
ошибка компиляции:
Скетч использует 17270 байт (56%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 2338 байт (114%) динамической памяти, оставляя -290 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти; прочитайте https://support.arduino.cc/hc/en-us/articles/360013825179
раздел данных превышает доступное пространство на плате
Compilation error: раздел данных превышает доступное пространство на плате
Сейчас не хватает памяти, а мне необходимо еще вложенное меню в настройки сделать.
Вопрос:
Что в коде "кушает" память?
можно ли отправлять номера пинов кнопок в PROGMEM -память? Если да, то необходимо ли потомкаждый раз использовать функцию чтения изPROGMEM- памяти?
можно ли оптимизировать этот код?
КОД:
#include <GyverOLED.h>
#include <GyverOLEDMenu.h>
#include "GyverButton.h"
#include <SD.h>
#include "SPI.h"
#define btn_choice_delet 2 // выбор; зажать - удалить;
#define btn_record_stop 3 // начать запись; завершение запись – зажать
#define btn_up_back 4 // вверх; зажать вверх - назад
#define btn_down 5 // вниз.
GyverOLED<SSD1306_128x64, OLED_BUFFER> oled;
OledMenu<3, GyverOLED<SSD1306_128x64>> menu(&oled);
GButton buttonChoice(btn_choice_delet);
GButton buttonRecordStop(btn_record_stop);
GButton buttonUpBack(btn_up_back);
GButton buttonDown(btn_down);
const char menuItem1[] PROGMEM = "<- ВЫХОД";
const char menuItem2[] PROGMEM = "Воспроизведение";
const char menuItem3[] PROGMEM = "Настройки";
void setup() {
oled.init();
Wire.setClock(400000L);
oled.clear();
oled.update();
pinMode(btn_choice_delet, INPUT_PULLUP);
pinMode(btn_record_stop, INPUT_PULLUP);
pinMode(btn_up_back, INPUT_PULLUP);
pinMode(btn_down, INPUT_PULLUP);
menu.onChange(onItemChange, true);
menu.addItem(menuItem1);
menu.addItem(menuItem2);
menu.addItem(menuItem3);
menu.showMenu(true);
buttonChoice.setDebounce(20); // Установка задержки для устранения дребезга
buttonRecordStop.setDebounce(20);
buttonUpBack.setDebounce(20);
buttonDown.setDebounce(20);
Serial.begin(9600);
}
void onItemChange(const int index, const void* val, const byte valType) { //Это определение функции onItemChange, которая будет вызываться каждый раз,
// когда пользователь выбирает другой элемент в меню.Функция принимает три параметра:const int index: индекс элемента меню, который был выбран пользователем.
// const void* val: указатель на значение, связанное с элементом меню (может быть использован для передачи дополнительных данных).
// const byte valType: тип значения, переданного в обработчик. В данном случае используется для определения, является ли изменение
// действием (например, выбор элемента).
if (valType == VAL_ACTION) { //Этот условный оператор проверяет, является ли тип значения valType равным VAL_ACTION.
// VAL_ACTION — это, вероятно, константа, определенная в библиотеке, которая указывает, что событие связано с действием (например, выбор элемента меню).
if (index == 0) { //Если тип значения является действием, то проверяется, является ли индекс выбранного элемента равным 0.
// Индекс 0 соответствует первому элементу меню, который в вашем случае — это "<- ВЫХОД".
menu.showMenu(false); //Если индекс равен 0, вызывается метод showMenu(false), который, вероятно, закрывает текущее меню или скрывает его.
// Параметр false может указывать, что меню должно быть скрыто, а не показано.
}
}
}
void loop() {
Btn_H ();
}
void Btn_H () {
buttonChoice.tick();
buttonRecordStop.tick();
buttonUpBack.tick();
buttonDown.tick();
// Обработка кнопок для перемещения по меню
if (buttonUpBack.isPress()) { // Если нажата кнопка "вверх"
menu.selectPrev(); // Используем selectPrev() для перемещения вверх
}
if (buttonDown.isPress()) { // Если нажата кнопка "вниз"
menu.selectNext(); // Используем selectNext() для перемещения вниз
}
// Проверка нажатия кнопки выбора
if (buttonChoice.isPress()) {
// Здесь можно добавить код для обработки выбора
Serial.println("Кнопка выбора нажата");
}
// Обновляем меню
// menu.tick(); // Используем tick() для обновления состояния меню
delay(50); // Небольшая задержка для устранения дребезга
}
Вложения
-
50.1 KB Просмотры: 5