Bitmap в EEPROM 24c256 (или любом другом внешнем)

Nefelisk
Offline
Зарегистрирован: 09.09.2017

Можно ли как нибудь сохранить изображение в внешнем EEPROM (скорее даже не так, ибо можно), но вот считав его вывести уже не получаеться. Я крайне поверхностно понимаю работу с памятью, но для drawBitmap изображение должно храниться во флеше, и если заранее прописав его

const char imgLock[64] PROGMEM					=	{0x10, 0x28, 0x28, 0x7c, 0x6c, 0x6c, 0x7c, 0x00};

оно выводиться отлично, а вот считав в том же виде побайтно из EEPROM я ен пойму как привести его к виду и месту для корректного вывода на дисплей.

MicroSD и SD мне малость не подходят, так как занимают библиотеки крайне много места да и не нужно столько места сколько даст SD. А вот в тех же DS1307 или же просто в 24c256 мне как раз хватает места.

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

Если, окажеться что я пытаюсь реализовать что-то бредовое или мой подход крайне дурацкий, сильно не пинайте)

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#include <Wire.h>
#include <Eeprom24C32_64.h>
#define EEPROM_ADDRESS  0x51

static Eeprom24C32_64 eeprom(EEPROM_ADDRESS);
Adafruit_ST7735 tft									=	Adafruit_ST7735(10, 9, 8);		//TFT_CS, TFT_DC, TFT_RST

byte		pin_brightness								=	3;
byte		set_brightness								=	5;

const char imgLock[64] PROGMEM					=	{0x10, 0x28, 0x28, 0x7c, 0x6c, 0x6c, 0x7c, 0x00};

void setup(void){
	analogWrite(pin_brightness,map(set_brightness, 0, 9, 0, 150));
	
	tft.initR(INITR_144GREENTAB);
	tft.cp437(true);
	tft.setTextWrap(true);
	tft.fillScreen(Black);
	tft.setTextColor(White, Black);

	Serial.begin(9600);

	eeprom.initialize();

	const word address	=	0;
	const byte count		=	sizeof(imgLock);
	char buffer[64];
	
	tft.drawBitmap(30, 30, imgLock, 8, 8, White);
	
	eeprom.writeBytes(address, count, imgLock);
	eeprom.readBytes(address, count, buffer);
	
	tft.drawBitmap(50, 30, buffer, 8, 8, Cyan);
}
void loop(){
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Nefelisk пишет:

MicroSD и SD мне малость не подходят, так как занимают библиотеки крайне много места да и не нужно столько места сколько даст SD. А вот в тех же DS1307 или же просто в 24c256 мне как раз хватает места.

Фраза "в DS1307 или же просто в 24c256 мне как раз хватает места" - довольно странно звучит. Как будто 24c256 самая маленькая из обсуждаемых альтернатив, но хватит даже ее :)

На самом деле в стандартном чипе 1307 всего 56 байт EEPROM, в наиболее распространненой плате 1307, продающейся на Али - установлено еще 4К EEPROM, а размер "просто 24c256" - 32К.

Сколько же на самом деле нужно памяти?

Вопрос не праздный, так как для хранения 4К и даже 8-ми я бы выбрал PROGMEM. Уверен, что сократив скетч, выгадать 4К памяти будет не проблема.

Nefelisk
Offline
Зарегистрирован: 09.09.2017

b707 пишет:

Nefelisk пишет:

MicroSD и SD мне малость не подходят, так как занимают библиотеки крайне много места да и не нужно столько места сколько даст SD. А вот в тех же DS1307 или же просто в 24c256 мне как раз хватает места.

Фраза "в DS1307 или же просто в 24c256 мне как раз хватает места" - довольно странно звучит. Как будто 24c256 самая маленькая из обсуждаемых альтернатив, но хватит даже ее :)

На самом деле в стандартном чипе 1307 всего 56 байт EEPROM, в наиболее распространненой плате 1307, продающейся на Али - установлено еще 4К EEPROM, а размер "просто 24c256" - 32К.

Сколько же на самом деле нужно памяти?

Вопрос не праздный, так как для хранения 4К и даже 8-ми я бы выбрал PROGMEM. Уверен, что сократив скетч, выгадать 4К памяти будет не проблема.

В модуле 1307 есть таки отдельный чип кажись с 8Кб...

Насчет, хватит, как сказать. Для проекта который я пытаюсь сделать, Можно было бы вообще без картинок обойтись, но с ними было бы лучше (читай симпатичнее), их предполагаеться до 20 в среднем 66х75. А в сухом остатке после всех возможных ужиманий у меня остаеться 2 - 3,5кб. А 24c256 у меня как бы есть и в часах память есть... И раз есть я бы хотел попытаться их использовать. Хотя бы разобраться как это делать, если это вообще возможно.

b707
Offline
Зарегистрирован: 26.05.2017

что касается кода, я не понимаю, что вы вообще пытаетесь сделать. Зачем вы в строке 35 пишете блок байт в EEPROM - и тут же в следующей строке его читаете? В чем смысл этой операции?

Nefelisk
Offline
Зарегистрирован: 09.09.2017

b707 пишет:

что касается кода, я не понимаю, что вы вообще пытаетесь сделать. Зачем вы в строке 35 пишете блок байт в EEPROM - и тут же в следующей строке его читаете? В чем смысл этой операции?

Ну... Проверял записались данные прочитав их. Там еще был цикл показывающий содержимое буфера, в сериал, что бы убедиться что прочитало то же что и записало. В данном случае, можно и без этого фрагмента обойтись, но меня интересует как вывести прочитанные данные как картинку.

b707
Offline
Зарегистрирован: 26.05.2017

Nefelisk пишет:

 меня интересует как вывести прочитанные данные как картинку.

Так вы вправильном направлении двигаетесь. Напрямую из eeprom выводить на экран нельзя, поэтому надо читать порциями в локальный буфер, и ссылку на буфер передавать функции вывода на экран.

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

Logik
Offline
Зарегистрирован: 05.08.2014

b707 пишет:

Nefelisk пишет:

 меня интересует как вывести прочитанные данные как картинку.

Напрямую из eeprom выводить на экран нельзя, поэтому надо читать порциями в локальный буфер, и ссылку на буфер передавать функции вывода на экран.

Вы уверены?

Это конкретно взятая либа не позволяет делать такое. А при правильном подходе ничто не мешает приняв байт с EEPROM по i2c тутже отправить его на экран по spi. Именно так получают максимальную скорость без лишней буферизации. Но это уже уровень не этих либ и этого форума ;)

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

Вы уверены?

Это конкретно взятая либа не позволяет делать такое. А при правильном подходе ничто не мешает приняв байт с EEPROM по i2c тутже отправить его на экран по spi. Именно так получают максимальную скорость без лишней буферизации. Но это уже уровень не этих либ и этого форума ;)

ну принцип-то тот же, только в вашем случае буфер в 1 байт:)

Говоря, что "напрямую из е-пром на экран выводить нельзя", я имел в виду именно ту конкретную либу, которой пользуется ТС.