ARDUINO Преобразуем изображения и GIF анимацию в код для Arduino

CyberLab

★✩✩✩✩✩✩
7 Сен 2018
48
25
Москва

Сейчас в продаже доступно много разных Ч/Б дисплеев, в том числе и OLED. Для того, чтобы получить красивое черно-белое изображение для этих дисплеев, с глубиной цвета всего 1 бит, но в тоже время с имитацией полутонов, как на представленной ниже картинке — нужно использовать преобразование по алгоритму «Floyd-Steinberg». Предлагаю онлайн конвертер, он может преобразовать изображение любого масштаба и с любой глубиной цвета в требуемый размер и сразу получить на выходе готовый Си код понятный Arduino IDE или другому компилятору. Как преобразовать анимированную GIF-ку смотрите на видео
bmw.png

Схема
4447.970.jpg

Скетч
C++:
#include <Wire.h>
#include <OLED_SH1106.h>

#include "chayka.h"
#include "butterfly.h"
#include "fish.h"
#include "snow.h"

//массивы указателей. В каждом массиве находятся указатели на все кадры анимации
//static const uint8_t * butterfly[] = { b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15 };
static const uint8_t * chayka[] =  { c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16 };
//static const uint8_t * fish[] = { f1,f2,f3,f4,f5,f6,f7,f6,f5,f4,f3,f2 };
//static const uint8_t * snow[] = { s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12 };

OLED_SH1106 display(-1);   // если на дисплее нет пина res то -1

void setup()  
{      
  display.begin(SH1106_SWITCHCAPVCC, 0x3c);  // Инициализация дисплея с I2C адресом 0x3C
}

void loop()
{
        animatoin_view( 64, 63, 0, sizeof(chayka)/2, 4, chayka, true);
}

void animatoin_view(uint8_t anim_widht, uint8_t anim_height, uint16_t anim_delay, uint8_t anim_frame, uint8_t anim_repeat, const uint8_t * const anim_n[], boolean inv )
{  
    display.invertDisplay(inv);           //инверсия экрана
    for( uint8_t j = 0; j<anim_repeat; j++)
    {
           for( uint8_t i = 0; i<anim_frame; i++)
            {
              display.clearDisplay();        // очистить видео буфер
              display.drawBitmap((128-anim_widht)/2, (64-anim_height)/2, anim_n[i], anim_widht, anim_height, 1); // загрузить указанный кадр анимации в видеобуфер
              display.display();            // отобразить на экране дисплея данные из видеобуфера
              delay(anim_delay);         // задержка между кадрами  
            }
    }      
  display.invertDisplay(false);  //отключить инверсию экрана
}
 
Изменено:
  • Лойс +1
Реакции: Un_ka

CyberLab

★✩✩✩✩✩✩
7 Сен 2018
48
25
Москва
Я их в esp8266 напихал с десяток и еще куча места свободного осталось.
Следующий проект будет на Wemos