Есть что-нибудь ещё интересное, доступное в понимании, дешёвое?

Нет, у меня, примерно, как первая половина Вашей перерисовки. Весь экран несколько раз мигает, потом устанавливается новая картинка. Сама по себе картинка уже не мигает. Да и по времени, как половина Вашей. Меня не парит - экран используется в термометре, обновление - 1 раз в 10 минут (с частотой 0,0017Гц - это для @andriano :slight_smile: ), просто принимаю такое поведение как факт.

Тут ещё такой момент - есть функция epd.Sleep(); - положить в сон и она обязательно типа, иначе экран может сгореть. Вытащить экран обратно в рабочее состояние может epd.Init();. Но она не работает в лооп т.е. многократно в скетче повторять связку эту нельзя - приходится перезагружать плату. Если отбросить epd.Sleep(); проблема исчезает, но можно ли её отбрасывать?

Я (поскольку обновляю раз в 10 минут) питаю его от пина и просто выключаю ему питание, когда обновил. А через 10 минут опять полная инициализация дисплея. Никаких проблем не испытываю.

Могу дать кусок кода, но он очень “свой” (на многие мои вещи завязан). Тем не менее, если надо, могу дать.

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

Не, у меня повторно не инициализируется, только перезагрузка или перевключение.
В общем проще ставить в “параллель” второй экран и на нём выбирать вариант отрисовки.
VID_20240308_201525

А где такой взять?

Я брал вот здесь. Запускал. Код действительно работает. Задал вопрос производителю, там мне ответили, что мол: “Да, будет работать, но недолго” :slight_smile:

Спасибо, попробую на досуге. Просто функция которую я приводил в 55 сообщение она блокирует всю работу пока не появится этот 0 на выводе или 1 (в соседних примерах 0, только в этом 1 в условии - пробовал менять, перестаёт работать, пробовал условие игнорировать - перестаёт экран работать)

Смотрел, смотрел в код, сравнивал, не нашёл что автор изменил :slight_smile:
…Попробовал вариант с отключением питания на экране - итог тот же после epd.Sleep(); заново экран заставить работать можно только перезагрузкой платы. Как так может быть?

if(digitalRead(KN2)==LOW&&bedj==1){digitalWrite(pitanie, HIGH);delay(200);epd.Init();epd.ClearFrame();epd.DisplayFrame(IMAGE_DATA_1,0);epd.Sleep();digitalWrite(pitanie, LOW);}
if(digitalRead(KN2)==LOW&&bedj==2){digitalWrite(pitanie, HIGH);delay(200);epd.Init();epd.ClearFrame();epd.DisplayFrame(0,IMAGE_DATA_2);epd.Sleep();digitalWrite(pitanie, LOW);}
if(digitalRead(KN2)==LOW&&bedj==3){digitalWrite(pitanie, HIGH);delay(200);epd.Init();epd.ClearFrame();epd.DisplayFrame(IMAGE_DATA_3,0);epd.Sleep();digitalWrite(pitanie, LOW);}
if(digitalRead(KN2)==LOW&&bedj==4){digitalWrite(pitanie, HIGH);delay(200);epd.Init();epd.ClearFrame();epd.DisplayFrame(0,IMAGE_DATA_4);epd.Sleep();digitalWrite(pitanie, LOW);}
if(digitalRead(KN2)==LOW&&bedj==5){digitalWrite(pitanie, HIGH);delay(200);epd.Init();epd.ClearFrame();epd.DisplayFrame(IMAGE_DATA_5,IMAGE_DATA_05);epd.Sleep();digitalWrite(pitanie, LOW);}
if(digitalRead(KN2)==LOW&&bedj==6){digitalWrite(pitanie, HIGH);delay(200);epd.Init();epd.ClearFrame();epd.DisplayFrame(IMAGE_DATA_6,IMAGE_DATA_06);epd.Sleep();digitalWrite(pitanie, LOW);}

Кстати в коде от производителя зарезервирован пин под питание, хотя никак не комментирован.

Этта шо за говнище?

Сравни, только перед этим проверку вставь, что bedj в интервале 1…6

Спойлер
if (digitalRead(KN2) == LOW) {
	digitalWrite(pitanie, HIGH);
	delay(200);
	
	epd.Init();
	epd.ClearFrame();
	
	switch (bedj)
	{
		case 1:
			epd.DisplayFrame(IMAGE_DATA_1, 0);
			break;
		case 2:
			epd.DisplayFrame(0, IMAGE_DATA_2);
			break;
		case 3:
			epd.DisplayFrame(IMAGE_DATA_3, 0);
			break;
		case 4:
			epd.DisplayFrame(0, IMAGE_DATA_4);
			break;
		case 5:
			epd.DisplayFrame(IMAGE_DATA_5, IMAGE_DATA_05);
			break;
		case 6:
			epd.DisplayFrame(IMAGE_DATA_6, IMAGE_DATA_06);
			break;
	default:
		break;
	}

	epd.Sleep();
	digitalWrite(pitanie, LOW);
}

Это красивее, но не читабельно мною, условия могут такими складными не быть - поэтому так и только так :slight_smile: …
Но для конкретной поделки переделаю писание на приличное.


В общем такой концепт - в пику китайцам и буржуа. Как советская микросхема - 16 ножек и две ручки. ESP32 (УНО) примерно на 100 изображений бейджика, две кнопки (верхняя перебор картинок на встроенном экране, нижняя - загрузка на e-paper около 40 секунд).

на цветном принтере отпечатать получится бюджетней )))

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


го как бюджетней экранчик :slight_smile:

Хотел уточнить - есть в С++ возможность нумерации массивов-картинок по индексу типа такой:

arhiv []={IMAGE_DATA_1,IMAGE_DATA_2,IMAGE_DATA_3,IMAGE_DATA_4,...};

где элементы это массивы картинок

extern const unsigned char IMAGE_DATA_1[];
extern const unsigned char IMAGE_DATA_2[];
extern const unsigned char IMAGE_DATA_3[];
extern const unsigned char IMAGE_DATA_4[];
extern const unsigned char IMAGE_DATA_5[];
extern const unsigned char IMAGE_DATA_05[];
extern const unsigned char IMAGE_DATA_6[];
extern const unsigned char IMAGE_DATA_06[];
extern const unsigned char IMAGE_DATA_7[];
extern const unsigned char IMAGE_DATA_07[];
extern const unsigned char IMAGE_DATA_8[];
extern const unsigned char IMAGE_DATA_08[];

В С++ нет ничего “типа”. Есть только “конкретно”. У Вас же именно “типа”, т.к. переменная arhiv никак не описана. Такого в С++ нет - описывать надо обязательно!

А вот, когда Вы её опишете, тогда и будет понятно правильно это сделано или нет.

Пока из описания понимается:

const unsigned char arhiv[]

Тогда - нет, так не делается.

(ну, если конечно, всё остальное как в предыдущем посте - избавьтесь от привычки резать код на куски, по ним ни хрена не скажешь!)

:slight_smile:
Дело ясное, что дело тёмное - попробую через массив массивов.

структуру создай, Индекс и Указатель на картинку. Запхай константные структуры в массив и выбирай потом картинку по индексу.

Конечно по одной текстовой рекомендации я не допру, но к счастью тут мне помогли однажды:

void midi() {
  const struct { 
    int freq, duration, dly; 
  } sounds[] = {
    {293, 225, 250}, {493, 225, 250}, {440, 225, 250}, {391, 225, 250}, {293, 450, 750}, 
    {293, 225, 250}, {293, 225, 250}, {493, 225, 250}, {440, 225, 250}, {391, 225, 250}, 
    {329, 450, 750}, {329, 225, 250}, {329, 225, 250}, {523, 225, 250}, {493, 225, 250}, 
    {440, 225, 250}, {587, 450, 750}, {587, 225, 250}, {659, 225, 250}, {587, 225, 250}, 
    {523, 225, 250}, {440, 225, 250}, {493, 675, 750}, {293, 225, 250}, {293, 225, 250}, 
    {493, 225, 250}, {440, 225, 250}, {391, 225, 250}, {293, 450, 750}, {293, 225, 250}, 
    {293, 225, 250}, {493, 225, 250}, {440, 225, 250}, {391, 225, 250}, {329, 450, 750}, 
    {329, 225, 250}, {329, 225, 250}, {523, 225, 250}, {493, 225, 250}, {440, 225, 250}, 
    {587, 225, 250}, {587, 225, 250}, {587, 225, 250}, {587, 225, 250}, {659, 225, 250}, 
    {587, 225, 250}, {523, 225, 250}, {440, 225, 250}, {391, 450, 500}, {587, 450, 500}, 
    {493, 225, 250}, {493, 225, 250}, {493, 450, 500}, {493, 225, 250}, {493, 225, 250}, 
    {493, 450, 500}, {493, 225, 250}, {587, 225, 250}, {391, 337, 375}, {440, 112, 125}, 
    {493, 450, 1000}, {523, 225, 250}, {523, 225, 250}, {523, 337, 375}, {523, 112, 125}, 
    {523, 225, 250}, {493, 225, 250}, {493, 225, 250}, {493, 112, 125}, {493, 112, 125}, 
    {493, 225, 250}, {440, 225, 250}, {440, 225, 250}, {493, 225, 250}, {440, 450, 500}, 
    {587, 450, 500}, {493, 225, 250}, {493, 225, 250}, {493, 450, 500}, {493, 225, 250}, 
    {493, 225, 250}, {493, 450, 500}, {493, 225, 250}, {587, 225, 250}, {391, 337, 375}, 
    {440, 112, 125}, {493, 450, 1000}, {523, 225, 250}, {523, 225, 250}, {523, 337, 375}, 
    {523, 112, 125}, {523, 225, 250}, {493, 225, 250}, {493, 225, 250}, {493, 112, 125}, 
    {493, 112, 125}, {587, 225, 250}, {587, 225, 250}, {523, 225, 250}, {440, 225, 250}, 
    {391, 675, 750}
  };
  const uint8_t melodieLength = sizeof(sounds) / sizeof(sounds[0]);

  for (uint8_t i = 0; i < melodieLength; i++) {
    tone(tonePin, sounds[i].freq, sounds[i].duration);
    delay(sounds[i].dly);
  }
}

void loop()
{

midi();

}


Осталось лишь сообразить:

const struct { 
    const unsigned char *bitmap;
  } arhiv[]={IMAGE_DATA_1,IMAGE_DATA_2,IMAGE_DATA_3,IMAGE_DATA_4,IMAGE_DATA_5,IMAGE_DATA_6,IMAGE_DATA_7,IMAGE_DATA_8};

И теперь красивый (похожий на комнатные обои) код можно переписать:

if(bedj==1&&fl){fl=false;drawBitmap_(60,0,arhiv[bedj-1].bitmap,128,240,tft.color565(255,255,255),tft.color565(127,127,0));}
if(bedj==2&&fl){fl=false;drawBitmap_(60,0,arhiv[bedj-1].bitmap,128,240,tft.color565(255,255,255),tft.color565(127,127,0));}
if(bedj==3&&fl){fl=false;drawBitmap_(60,0,arhiv[bedj-1].bitmap,128,240,tft.color565(255,255,255),tft.color565(127,127,0));}
if(bedj==4&&fl){fl=false;drawBitmap_(60,0,arhiv[bedj-1].bitmap,128,240,tft.color565(255,255,255),tft.color565(127,127,0));}
if(bedj==5&&fl){fl=false;drawBitmap_(60,0,arhiv[bedj-1].bitmap,128,240,tft.color565(255,255,255),tft.color565(127,127,0));}
if(bedj==6&&fl){fl=false;drawBitmap_(60,0,arhiv[bedj-1].bitmap,128,240,tft.color565(255,255,255),tft.color565(127,127,0));}
if(bedj==7&&fl){fl=false;drawBitmap_(60,0,arhiv[bedj-1].bitmap,128,240,tft.color565(255,255,255),tft.color565(127,127,0));}
if(bedj==8&&fl){fl=false;drawBitmap_(60,0,arhiv[bedj-1].bitmap,128,240,tft.color565(255,255,255),tft.color565(127,127,0));}

уже без case

Самое обидное, что в реальной конструкции это никак не видно - пиши хоть коврами…
:slight_smile:
Жаль, что китайцы для экрана сделали блокирующий код, 30-40 секунд пока он перемаргивает картинку ничего другое не работает.