Почему это занимает больше байта?
Я заменяю только часть своего кода, где хочу использовать первый метод, но, как вы можете видеть, размер моего скетча немного увеличивается
//if(iBPM >= 40 || iBPM <= 170 )
{
char iBPMwav[50];
String thisString = String(iBPM);
String stringThree = "n" + thisString;
stringThree = stringThree + ".wav";
stringThree.toCharArray(iBPMwav, 50);
tmrpcm.play(iBPMwav);
}
Sketch использует 29678 байт (100%)
Это просто, но в конце концов я хочу перейти от числа 40 к 170, и поэтому я хочу использовать первый метод.
//if(iBPM >= 40 || iBPM <= 170 )
{
if(iBPM == 71)
tmrpcm.play("n71.wav");
else if(iBPM == 72)
tmrpcm.play("n72.wav");
else if(iBPM == 73)
tmrpcm.play("n73.wav");
else if(iBPM == 74)
tmrpcm.play("n74.wav");
else if(iBPM == 75)
tmrpcm.play("n75.wav");
else if(iBPM == 76)
tmrpcm.play("n76.wav");
else if(iBPM == 77)
tmrpcm.play("n77.wav");
else if(iBPM == 78)
tmrpcm.play("n78.wav");
else if(iBPM == 79)
tmrpcm.play("n79.wav");
else if(iBPM == 80)
tmrpcm.play("n80.wav");
else if(iBPM == 81)
tmrpcm.play("n81.wav");
else if(iBPM == 82)
tmrpcm.play("n82.wav");
else if(iBPM == 83)
tmrpcm.play("n83.wav");
else if(iBPM == 84)
tmrpcm.play("n84.wav");
else if(iBPM == 85)
tmrpcm.play("n85.wav");
else if(iBPM == 86)
tmrpcm.play("n86.wav");
else if(iBPM == 87)
tmrpcm.play("n87.wav");
else if(iBPM == 89)
tmrpcm.play("n89.wav");
else if(iBPM == 90)
tmrpcm.play("n90.wav");
else if(iBPM == 91)
tmrpcm.play("n91.wav");
else if(iBPM == 92)
tmrpcm.play("n92.wav");
else if(iBPM == 93)
tmrpcm.play("n93.wav");
else if(iBPM == 94)
tmrpcm.play("n94.wav");
else if(iBPM == 95)
tmrpcm.play("n95.wav");
else if(iBPM == 96)
tmrpcm.play("n96.wav");
else if(iBPM == 97)
tmrpcm.play("n97.wav");
else if(iBPM == 98)
tmrpcm.play("n98.wav");
else if(iBPM == 99)
tmrpcm.play("n99.wav");
else if(iBPM == 100)
tmrpcm.play("n100.wav");
else if(iBPM == 101)
tmrpcm.play("n101.wav");
else if(iBPM == 102)
tmrpcm.play("n102.wav");
else
tmrpcm.play("n170.wav");
}
Sketch использует 29024 байта (101%)
@Noajm IsMy Name, 👍0
Обсуждение2 ответа
Лучший ответ:
Я предлагаю использовать более простые имена файлов (одинаковый размер, всегда трехзначные числа)
/// Возвращаем текст "n000.wav" ... "n255.wav"
/// в зависимости от параметра
char* makeFileName(byte i) {
static char name[9] = "nxxx.wav";
byte digit = i/100;
name[1] = '0' + digit;
i -= digit*100;
digit = i/10;
name[2] = '0' + digit;
i -= digit*10;
name[3] = '0' + i;
return name;
}
Мне кажется умным. Я попробую сегодня., @Noajm IsMy Name
Хорошо, мне нравится твоя идея... изменение имени файлов будет для меня расшатыванием маховика. Вместо этого я сделал две версии вашего кода: первую для "nxx.wav"
и одну для "nxxx.wav"
., @Noajm IsMy Name
Хотя класс Strings делает программу C/C++ простой для понимания и сопровождения, как указано в комментариях, использование класса Strings требует интенсивного использования памяти, и его следует избегать при нехватке памяти. Например, встроенные процессоры, используемые в большинстве платформ Arduino.
Вот 2 примера, где Stings используется и не используется. Обратите внимание на сокращение с 2326 байт до 734 байт памяти программы, необходимой для хранения скетча во встроенном процессоре.
void setup()
{
}
void loop()
{
uint8_t iBPM;
uint8_t pointer;
for(iBPM = 40; iBPM <= 170; iBPM++)
{
char iBPMwav[50];
String thisString = String(iBPM);
String stringThree = "n" + thisString;
stringThree = stringThree + ".wav";
stringThree.toCharArray(iBPMwav, 50);
// tmrpcm.play(iBPMwav);
}
}
Sketch использует 2326 байт (7%) места для хранения программ. Максимум 32256 байт. Глобальные переменные используют 27 байт (1%) динамической памяти...
void setup()
{
}
void loop()
{
uint8_t iBPM;
uint8_t pointer;
for(iBPM = 40; iBPM <= 170; iBPM++)
{
char iBPMwav[50];
pointer = 0;
char temp_str[10];
// String thisString = String(iBPM);
// String stringThree = "n" + thisString;
// stringThree = stringThree + ".wav";
// stringThree.toCharArray(iBPMwav, 50);
itoa(iBPM, temp_str, 10);
if(iBPM < 100)
{
strncpy(&iBPMwav[pointer],"n0",2);
pointer += 2;
strncpy(&iBPMwav[pointer],temp_str,2);
pointer += 2;
}
else
{
strncpy(&iBPMwav[pointer],"n",1);
pointer += 1;
strncpy(&iBPMwav[pointer],temp_str,3);
pointer += 3;
}
strncpy(&iBPMwav[pointer],".wav",4);
// tmrpcm.play(iBPMwav);
}
}
Sketch использует 734 байта (2%) места для хранения программ. Максимум 32256 байт. Глобальные переменные используют 15 байт (0%) динамической памяти...
Кстати: String использует даже больше оперативной памяти, чем может видеть компилятор. А String+String ужасно сложный, создает много мусора :), @DataFiddler
- Есть ли какой-нибудь способ загрузить скетч с ардуино?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Асинхронные вызовы функций в скетче ардуино
- Проблема с загрузкой моего скетча на Ардуино
- Что произойдет, если возникнет ошибка времени выполнения?
- Проблема: "stray '#' in program"
- Двигатель постоянного тока шумит, но не вращается
- Цикл While не прерывается
Вы используете класс String, который довольно мощный и не легкий. Всегда рекомендуется НЕ использовать класс String на микроконтроллерах., @Kwasmich
Знаете ли вы, что
iBPM >= 40 || iBPM <= 170
всегда верно?, @Edgar Bonet@EdgarBonet Нет, я не знал, @Noajm IsMy Name
Затем вы должны узнать, что означают операторы
>=
,<=
и||
., @Edgar Bonet@EdgarBonet Да, я просмотрел это после того, как вы упомянули и узнали откуда-то еще. Скажи мне об этом, какая огромная ошибка, парень, ха-ха., @Noajm IsMy Name