... einen Statusbalken 16-teilig auf einem 20x4 I2C Display erstellen ...
BMS hat´s Dir ja schon schön gezeigt. Noch´n Vorschlag, oder ne Frage, von mir. Ich verwende so einen Bargraph-Zappelphillipp in EINEM Zeichen. Da läuft halt der "Füllstand" rauf und runter, Beispiel hier, bei Sekunde 8. Und die Programmiererei der Sonderzeichen mache ich entweder "graphisch" - da sieht man gleich im Kommentar des Quelltextes was für ein Zeichen das ist, oder z.B. für den Bargraph als Linienzahl - ein Byte als Strich hat nämlich den Wert 39. Zur Erläuterung der Code (ok ok, Du hast kein C sondern Arduino - aber für die Sonderzeichen wirds wohl recht C-nahe werden *gg*.

Code:
// ============================================================================== =
//  Generierung von LCD-Sonderzeichen für DEM162xx, Satz 1 = Balken vertikal
// ============================================================================== =
  void LCD_SZ1(void)            // Generiere LCD-Sonderzeichen, Satz 1 = Balken
 {                              //   vertikal, 7 Zeichen
// - - - - - - - - - - - - - - - -// Es folgen LCD-Daten für den Balken 1 bis 7 Pixelreihen hoch
//      der "Balken8" ist DEM-Code 255, der leere Balken ist DEM-Code 254
  uint8_t LCD_c_1[8] =          // LCD-Character 1, unterste Linie
    { 0,  0,  0,  0,  0,  0,  0,  31 };
  lcd_generatechar(LCD_GC_CHAR1, LCD_c_1);
  uint8_t LCD_c_2[8] =          // LCD-Character 2
    { 0,  0,  0,  0,  0,  0, 31,  31 };
  lcd_generatechar(LCD_GC_CHAR2, LCD_c_2);
  uint8_t LCD_c_3[8] =          // LCD-Character 3
    { 0,  0,  0,  0,  0, 31, 31,  31 };
  lcd_generatechar(LCD_GC_CHAR3, LCD_c_3);
  uint8_t LCD_c_4[8] =          // LCD-Character 4
    { 0,  0,  0,  0, 31, 31, 31,  31 };
  lcd_generatechar(LCD_GC_CHAR4, LCD_c_4);
  uint8_t LCD_c_5[8] =          // LCD-Character 5
    { 0,  0,  0, 31, 31, 31, 31,  31 };
  lcd_generatechar(LCD_GC_CHAR5, LCD_c_5);
  uint8_t LCD_c_6[8] =          // LCD-Character 6
    { 0,  0, 31, 31, 31, 31, 31,  31 };
  lcd_generatechar(LCD_GC_CHAR6, LCD_c_6);
  uint8_t LCD_c_7[8] =          // LCD-Character 7
    { 0, 31, 31, 31, 31, 31, 31,  31 };
  lcd_generatechar(LCD_GC_CHAR7, LCD_c_7);
  return;                       //
 }              // Ende void LCD_SZ1(void)
// === Ende
// ============================================================================== =

// ============================================================================== =
//  Generierung von LCD-Sonderzeichen für DEM162xx, Satz 4 = RETURN
// ============================================================================== =
  void LCD_SZ4(void)            // LCD-Sonderzeichen, Satz 4, Return, Pfeile etc.
 {                              //   3 Zeichen : 0, 1 und 2
// - - - - - - - - - - - - - - - -
//      Returnzeichen
  uint8_t LCD_c_0[8] = {     // LCD-Character 0 => RETURN
        0b00000000,     //  -----
        0b00000010,     //  ---X-
        0b00000001,     //  ----X
        0b00000101,     //  --X-X
        0b00001001,     //  -X--X
        0b00011110,     //  XXXX-
        0b00001000,     //  -X---
        0b00000100      //  --X--
        };
  lcd_generatechar(LCD_GC_CHAR0, LCD_c_0);
// - - - - - - - - - - - - - - - -
//      Pfeil auf
  uint8_t LCD_c_1[8] = {     // LCD-Character 1 => Pfeil-auf
        0b00000000,     //  -----
        0b00000000,     //  -----
        0b00000100,     //  --X--
        0b00001110,     //  -XXX-
        0b00010101,     //  X-X-X
        0b00000100,     //  --X--
        0b00000100,     //  --X--
        0b00000000      //  -----
        };
  lcd_generatechar(LCD_GC_CHAR1, LCD_c_1);
  
// - - - - - - - - - - - - - - - -
//      Pfeil ab
  uint8_t LCD_c_2[8] = {     // LCD-Character 2 => Pfeil-ab
        0b00000000,     //  -----
        0b00000000,     //  -----
        0b00000100,     //  --X--
        0b00000100,     //  --X--
        0b00010101,     //  X-X-X
        0b00001110,     //  -XXX-
        0b00000100,     //  --X--
        0b00000000      //  -----
        };
  lcd_generatechar(LCD_GC_CHAR2, LCD_c_2);
  
// - - - - - - - - - - - - - - - -
//      Plus-Minus  ±
  uint8_t LCD_c_3[8] = {     // LCD-Character 3 => ±
        0b00000000,     //  -----
        0b00000100,     //  --X--
        0b00001110,     //  -XXX-
        0b00000100,     //  --X--
        0b00000000,     //  -----
        0b00001110,     //  -XXX-
        0b00000000,     //  -----
        0b00000000      //  -----
        };
  lcd_generatechar(LCD_GC_CHAR3, LCD_c_3);
  
// - - - - - - - - - - - - - - - -
//      Doppelpfeil ´ schräg linksunten<=>rechtsoben
  uint8_t LCD_c_4[8] = {     // LCD-Character 4 => Pfeil-lu-ro
        0b00000000,     //  -----
        0b00000111,     //  --XXX
        0b00000011,     //  ---XX
        0b00010101,     //  X-X-X
        0b00011000,     //  XX---
        0b00011100,     //  XXX--
        0b00000000,     //  -----
        0b00000000      //  -----
        };
  lcd_generatechar(LCD_GC_CHAR4, LCD_c_4);
  
// - - - - - - - - - - - - - - - -
//      linke Hälfte Copyright  ©
  uint8_t LCD_c_5[8] = {     // LCD-Character 5 => © linke Hälfte
        0b00000011,     //  ---XX
        0b00000100,     //  --X--
        0b00001001,     //  -X--X
        0b00001010,     //  -X-X-
        0b00001010,     //  -X-X-
        0b00001001,     //  -X--X
        0b00000100,     //  --X--
        0b00000011      //  ---XX
        };
  lcd_generatechar(LCD_GC_CHAR5, LCD_c_5);
  
// - - - - - - - - - - - - - - - -
//      Rechte Hälfte Copyright  ©
  uint8_t LCD_c_6[8] = {     // LCD-Character 6 => © rechte Hälfte
        0b00011000,     //  XX---
        0b00000100,     //  --X--
        0b00010010,     //  X--X-
        0b00000010,     //  ---X-
        0b00000010,     //  ---X-
        0b00010010,     //  X--X-
        0b00000100,     //  --X--
        0b00011000      //  XX---
        };
  lcd_generatechar(LCD_GC_CHAR6, LCD_c_6);
  
// - - - - - - - - - - - - - - - -
//      Rechte Hälfte Copyright  ©
  uint8_t LCD_c_7[8] = {     // LCD-Character 7 => Delta 
        0b00000000,     //  -----
        0b00000100,     //  --X--
        0b00000100,     //  --X--
        0b00001010,     //  -X-X-
        0b00001010,     //  -X-X-
        0b00010001,     //  X---X
        0b00011111,     //  XXXXX
        0b00000000      //  -----
        };
  lcd_generatechar(LCD_GC_CHAR7, LCD_c_7);
  return;                       //
 }              // Ende void LCD_SZ4(void)
// === Ende
// ============================================================================== =

Dazu noch der Zappelphilip-Testloop aus dem Video - und im Code sieht man, dass so ein Sonderzeichensatz auch mittendrin einfach neu generiert wird.

Code:
  LCD_SZ1 ();                   // Eigene Sonderzeichen generieren, Satz 1      kal
  for ( u8 ll=1; ll<16; ll++ )  // Zappelphilip-Testloop
  {                             //
    SetCursor (2, 5);
    if ( llptr <  8 ) lcd_data ( llptr );
    if ( llptr == 8 ) lcd_data ( 255 );
    if ( llptr == 8 ) wms (  200);
    llptr  = llptr  + llinc;
    if ( llptr == 8 ) llinc = -1;
    if ( llptr == 1 ) llinc =  1;
    wms (   40);
  }             // Ende for ( u8 ll=1; ll<16; ll++ )
  LCD_SZ4 ();                   // Eigene Sonderzeichen generieren, Satz 4      kal