Преобразование int в unsigned char для отображения на Nokia 5110

Я работал над небольшим проектом, получая некоторые изображения, отображаемые на экране Nokia 5110 через Arduino. Я получаю его работу, но одна из проблем, которые у меня есть, заключается в том, что я хотел бы иметь список целых чисел и преобразовать этот массив беззнаковых символов, который требуется для отображения. Вообще у меня есть что-то вроде этого, что работает из коробки.

unsigned char src [] PROGMEM = {0x00, 0x00}

Удивительно, но я обнаружил, что это также работает

unsigned char src [] PROGMEM = {255, 255}

Но когда у меня есть такой список

int src [] = {255,255}

и попробуйте преобразовать его в массив беззнаковых символов, вещи не отображаются правильно

unsigned char new_src[2];

for (int i=0; i<2; i++){
    new_src[i] = (unsigned char) src[i];
} 

Когда я пытаюсь показать это, оно явно сломано. Я думал, что достаточно просто бросить int в unsigned char (он не работает, даже если я его не бросаю).

Вот как я отображаю массив (для 84x48 вышеуказанные массивы были просто примером) :

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
display.drawBitmap(0, 0,  src, 2, 48, BLACK);
display.display();

На более заметке:

В конце игры должен быть файл со списком int. Затем я бы прочитал этот список int в массив и преобразовал его в массив беззнаковых символов, а затем отобразил его.

, 👍-2

Обсуждение

Как вы отображаете " src`?, @Edgar Bonet

@EdgarBonet отредактировано в исходном сообщении, @Snuh

1. Что вы подразумеваете под "_работами"? 2. Почему массивы длины 2? Для растрового изображения 84×48 вам нужен массив размером 528 байт. 3. По-прежнему ли это работает, если массивы "PROGMEM" являются "const"? 4. Зачем вам нужен список " int`? Кроме пустой траты оперативной памяти, что это дает вам такого, чего нет в списке "uint8_t"?, @Edgar Bonet

1. "работает", как при правильном отображении изображения. 2. Это был просто пример для простоты. 3. Да, это все еще работает. 4. Потому что я считываю целочисленные значения из файла. 4. Мои навыки C не так остры, как ваши, поэтому мне жаль, что я трачу ОЗУ впустую. @EdgarBonet, @Snuh

Помимо упоминания об этом, я не думаю, что @EdgarBonet имел в виду дополнительную оперативную память (или флэш - память), но тот факт, что хранение ваших данных в качестве 'unsigned char src [] PROGMEM' работает для вас-почему бы не использовать это?, @JRobert

@JRobert Я не могу поместить их в код Arduino во время компиляции. Идея заключается в том, что я бы прочитал список int из файла ( у меня есть несколько файлов, которые я бы пересмотрел) и преобразовал этот список в массив символов без знака на каждой итерации цикла. Если есть способ сохранить массив символов без знака в файле и прочитать его напрямую, я с таким же успехом мог бы это сделать. Я пытаюсь автоматизировать процесс перехода на веб-сайт, чтобы преобразовать свое растровое изображение, а затем скопировать результат в свой код Arduino. У меня есть часть преобразования, выполненная с помощью скрипта Python, и теперь я пытаюсь передать ее в Arduino., @Snuh


1 ответ


0

Идея заключается в том, что я прочитал бы список int из файла ( у меня есть несколько файлов, которые я бы перебрал) и преобразовал бы этот список в массив беззнаковых символов на каждой итерации цикла.

Файл может быть как потоком байтов, так и потоком ints (или uints). Если бы это было так, преобразование не нужно было бы делать - просто прочитайте байт и сохраните его, прочитайте байт и сохраните его .... Если вместо этого это символьное представление значений, "37, 150, 8, ...", снова прочитайте символы одного значения, преобразуйте их в int8_t или uint8_t и сохраните их в своем байтовом массиве. Найдите функции atoi() или sscanf (), чтобы выполнить преобразование.

,