I need to loss min. 150 bytes of dynamic memory PLEASE HELP

Hello, I'm programming a calculator with oled display and IR remote (using lightIRRecv).
I need around 350 bytes of dynamic memory (I'm using ARDUINO UNO) to get IR and OLED to work.

/////////////////////////////////////////

Here is memory usage

Sketch uses 24876 bytes (77%) of program storage space. Maximum is 32256 bytes.
Global variables use 1786 bytes (87%) of dynamic memory, leaving 262 bytes for local variables. Maximum is 2048 bytes.
:red_circle: Low memory available, stability problems may occur.

==========================

Here is the code (it's so long)
#include <Wire.h>
#include <U8g2lib.h>
#include "lightIRRecv.h"

#define ir 3




U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);


const unsigned char PROGMEM intro_frame0 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xEE, 0xFF, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x80, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x80, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0xFF, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0xF7, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x94, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2E, 0x94, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20, 0xF7, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2E, 0xF7, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x94, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x94, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0xF7, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0xF7, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x94, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x94, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xEE, 0xF7, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

const unsigned char PROGMEM intro_frame1 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xE3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x2C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x5A, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x55, 0xE3, 0x80, 0x00, 0x00, 0x00, 0x01, 0x40, 0x55, 0x1C, 0x70, 0x00, 0x00, 0x00, 0x01, 0x40, 0xA5, 0x03, 0x0E, 0x00, 0x00, 0x00, 0x02, 0xC0, 0xA8, 0xE1, 0x71, 0x00, 0x00, 0x00, 0x02, 0x80, 0xA8, 0x1E, 0x5C, 0x00, 0x00, 0x00, 0x02, 0x81, 0x53, 0x06, 0x83, 0x00, 0x00, 0x00, 0x05, 0x01, 0x35, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x05, 0x03, 0x04, 0xB8, 0x1C, 0x00, 0x00, 0x00, 0x0D, 0x02, 0x8E, 0xA5, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x02, 0xE1, 0x45, 0xE0, 0x00, 0x00, 0x00, 0x0A, 0x05, 0xAE, 0x3A, 0x28, 0x00, 0x00, 0x00, 0x12, 0x05, 0x51, 0x0A, 0x57, 0x00, 0x00, 0x00, 0x14, 0x05, 0x52, 0xF1, 0xD2, 0x00, 0x00, 0x00, 0x17, 0x0A, 0x5E, 0x96, 0x1A, 0x00, 0x00, 0x00, 0x31, 0xCA, 0xA2, 0x95, 0x84, 0x00, 0x00, 0x00, 0x0E, 0x3A, 0xBC, 0x64, 0xB1, 0x00, 0x00, 0x00, 0x01, 0xC7, 0x25, 0x8D, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x38, 0x69, 0xE3, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3A, 0x5C, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC3, 0x52, 0x8A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xD2, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1E, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

const unsigned char PROGMEM intro_frame2 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xB3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x61, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xC0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x80, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x01, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x03, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x06, 0x92, 0x80, 0x00, 0x00, 0x00, 0x01, 0xB0, 0x0D, 0x27, 0x40, 0x00, 0x00, 0x00, 0x03, 0x60, 0x1A, 0x49, 0xA0, 0x00, 0x00, 0x00, 0x06, 0xC0, 0x34, 0x88, 0xD0, 0x00, 0x00, 0x00, 0x0D, 0x80, 0x63, 0x04, 0x68, 0x00, 0x00, 0x00, 0x05, 0x80, 0xD0, 0x62, 0x34, 0x00, 0x00, 0x00, 0x02, 0xC1, 0xA8, 0x91, 0x12, 0x00, 0x00, 0x00, 0x01, 0x63, 0x49, 0x90, 0xA5, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x92, 0xE4, 0x4E, 0x80, 0x00, 0x00, 0x00, 0x5D, 0x25, 0x4A, 0x13, 0x40, 0x00, 0x00, 0x00, 0x2A, 0x48, 0x91, 0x11, 0xA0, 0x00, 0x00, 0x00, 0x16, 0x8D, 0x1A, 0x08, 0xD0, 0x00, 0x00, 0x00, 0x0B, 0x36, 0x64, 0xC4, 0x68, 0x00, 0x00, 0x00, 0x04, 0x48, 0x91, 0x22, 0x24, 0x00, 0x00, 0x00, 0x02, 0xC9, 0x91, 0x21, 0x4A, 0x00, 0x00, 0x00, 0x01, 0x72, 0xE4, 0xC8, 0x9D, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x4A, 0x14, 0x26, 0x00, 0x00, 0x00, 0x00, 0x48, 0x91, 0x22, 0x43, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x1A, 0x14, 0x81, 0x00, 0x00, 0x00, 0x00, 0x16, 0x6C, 0xC9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x91, 0x22, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x93, 0x24, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0xE5, 0xC8, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4A, 0x90, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x20, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x40, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x80, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x86, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xCD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

const unsigned char PROGMEM intro_frame3 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8D, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x70, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xC0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x03, 0x98, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x60, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x11, 0x80, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x07, 0x34, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x18, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x63, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0x9C, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x04, 0x86, 0x0B, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x02, 0xB9, 0xCC, 0x25, 0x00, 0x00, 0x00, 0x00, 0x02, 0xE6, 0x41, 0x26, 0x80, 0x00, 0x00, 0x00, 0x01, 0x18, 0xCF, 0x12, 0x80, 0x00, 0x00, 0x00, 0x01, 0x67, 0x2C, 0x92, 0x40, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xD5, 0x89, 0x40, 0x00, 0x00, 0x00, 0x00, 0xB2, 0x96, 0x09, 0x20, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x98, 0xCD, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x63, 0x26, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0x1D, 0x21, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x35, 0xE2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x31, 0xA6, 0x92, 0x28, 0x00, 0x00, 0x00, 0x00, 0x16, 0xDC, 0x79, 0x28, 0x00, 0x00, 0x00, 0x00, 0x12, 0x51, 0x49, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xCF, 0x4C, 0x94, 0x00, 0x00, 0x00, 0x00, 0x09, 0x29, 0x30, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x04, 0xE5, 0x8C, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x05, 0x96, 0x32, 0x61, 0x00, 0x00, 0x00, 0x00, 0x02, 0x90, 0xD2, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x02, 0xE3, 0x5E, 0x74, 0x80, 0x00, 0x00, 0x00, 0x01, 0x1A, 0x29, 0xC2, 0x80, 0x00, 0x00, 0x00, 0x01, 0x75, 0xE6, 0x02, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x98, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x60, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x51, 0x80, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x19, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x03, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x0E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x39, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

const unsigned char PROGMEM intro_frame4 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x03, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3F, 0xFC, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xC0, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x03, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x1F, 0xFC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x03, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1E, 0x7C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE2, 0x43, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x1E, 0x7C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x03, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1E, 0xF2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xD9, 0x49, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0x29, 0x49, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0x2F, 0x79, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE0, 0x01, 0x28, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0F, 0x79, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE9, 0x49, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0x29, 0x49, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x05, 0x2F, 0x78, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE0, 0x01, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0F, 0x79, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE9, 0x49, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0x29, 0x48, 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0x97, 0xBC, 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0xBC, 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF4, 0xA4, 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0x94, 0xA4, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x97, 0xBC, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0F, 0xFE, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4F, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x70, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

const unsigned char PROGMEM intro_frame5 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFE, 0x7F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x40, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFE, 0x7F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF3, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF3, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF3, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF3, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

double math1 = 0;
double math2 = 0;
double output = 0;
short page1 = 0;
//byte page2 = 0;
char pageb1 = 0;
//byte pageb2 = 0;
char op1 = 1;
//byte op2 = 1;
char step1 = 1;
char err = 0;
char frame = 0;


void u8g2drawBitmap(int16_t x, int16_t y, int16_t w, int16_t h, const unsigned char *bitmap, bool mirrorX) {

  int16_t i, j, byteWidth = (w + 7) / 8;
  uint8_t byte;
  if (mirrorX) {
    for (j = 0; j < h; j++) {
      for (i = 0; i < w; i++) {
        if (i & 7) byte <<= 1;
        else      byte   = pgm_read_byte(bitmap + j * byteWidth + i / 8);
        if (byte & 0x80) u8g2.drawPixel((x + w) - i, y + j);
      }
    }
  } else {
    for (j = 0; j < h; j++) {
      for (i = 0; i < w; i++) {
        if (i & 7) byte <<= 1;
        else      byte   = pgm_read_byte(bitmap + j * byteWidth + i / 8);
        if (byte & 0x80) u8g2.drawPixel(x + i, y + j);
      }
    }
  }

}

/*String dtostrl( double val, byte precision) {
  // prints val with number of decimal places determine by precision
  // precision is a number from 0 to 6 indicating the desired decimial places
  // example: printDouble( 3.1415, 2); // prints 3.14 (two decimal places)
  String dbl;
  dbl += String(int(val));  //prints the int part

  if (val < 0.0) {
    dbl += String('-');
    val = -val;
  }

  dbl += String(int(val));  //prints the int part
  if ( precision > 0) {
    dbl += String("."); // print the decimal point
    unsigned long frac;
    unsigned long mult = 1;
    byte padding = precision - 1;
    while (precision--)
      mult *= 10;

    if (val >= 0)
      frac = (val - int(val)) * mult;
    else
      frac = (int(val) - val ) * mult;
    unsigned long frac1 = frac;
    while ( frac1 /= 10 )
      padding--;
    while (  padding--)
      dbl += String("0");
    dbl += String(frac, DEC) ;

    return dbl;
  }
  }*/

/*String getDoubleString(double val, int maxDig) {
  // prints val with number of decimal places determine by precision
  // NOTE: precision is 1 followed by the number of zeros for the desired number of decimial places
  // example: printDouble( 3.1415, 100); // prints 3.14 (two decimal places)
  String valStr;
  valStr += floor(val);
  int digits = 0;
  double val2 = val - floor(val);
  do {
    digits++;
    val2 = val / 10;
  } while (val2 > 0.0000000000);
  unsigned long frac;
    for (int i = (val2 + 1); i < maxDig; i++) {
      frac = frac * 10 + String(val).substring(i, i + 1).toInt();
    }

  if (frac != 0) {
    valStr += ".";
    valStr += String(frac, DEC);
  }

  return valStr;
  }*/

void u8g2_overlayPrint(String printStr, /* 0 = none, 1 = center, 2 = right -> */ byte align, /* false = replaces only width of text, true = replaces from right to left */ bool horiz, bool sCPAB, byte x, byte y) {
  u8g2.setDrawColor(0);
  byte gw = u8g2.getStrWidth(printStr.c_str());
  byte gh1 = u8g2.getAscent();
  byte gh2 = u8g2.getDescent();
  byte gh = gh1 + gh2 + 1;
  byte ghf = gh * 1.5;
  byte cx = (u8g2.getDisplayWidth() - gw) / 2;
  //byte cy = (u8g2.getDisplayHeight()) / 2;
  byte rx = (u8g2.getDisplayWidth() - gw);
  y += gh;
  if (sCPAB) {
    x = u8g2.tx;
    y = u8g2.ty;
  }
  if (align == 0 && !horiz) {
    u8g2.drawBox(x, y - (gh), gw, ghf);
    u8g2.setDrawColor(1);
    u8g2.setCursor(x, y);
  } else if (align == 0 && horiz) {
    u8g2.drawBox(0, y - (gh), u8g2.getDisplayWidth(), gh);
    u8g2.setDrawColor(1);
    u8g2.setCursor(x, y);
  } else if (align == 1 && !horiz) {
    u8g2.drawBox(cx, y - (gh), gw, ghf);
    u8g2.setDrawColor(1);
    u8g2.setCursor(cx, y);
  } else if (align == 1 && horiz) {
    u8g2.drawBox(0, y - (gh), u8g2.getDisplayWidth(), gh);
    u8g2.setDrawColor(1);
    u8g2.setCursor(cx, y);
  } else if (align == 2 && !horiz) {
    u8g2.drawBox(rx, y - (gh), gw, ghf);
    u8g2.setDrawColor(1);
    u8g2.setCursor(rx, y);
  } else if (align == 2 && horiz) {
    u8g2.drawBox(0, y - (gh), u8g2.getDisplayWidth(), gh);
    u8g2.setDrawColor(1);
    u8g2.setCursor(rx, y);
  }
  u8g2.print(printStr);
  //Serial.print(printStr + ": "); Serial.print("gw = " + gw); Serial.print(" gh1 = " + gh1); Serial.print(" gh2 = " + gh2); Serial.print(" gh = " + gh); Serial.println(" cx = " + cx);
}

void drawIntro(byte x, byte y, bool reversed, bool mirrored) {
  if (!reversed) {
    if (frame == 0) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame0, mirrored);
      frame++;
    } else if (frame == 1) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame1, mirrored);
      frame++;
    } else if (frame == 2) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame2, mirrored);
      frame++;
    } else if (frame == 3) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame3, mirrored);
      frame++;
    } else if (frame == 4) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame4, mirrored);
      frame++;
    } else if (frame == 5) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame5, mirrored);
      //frame = 0;
    }
  } else {
    if (frame == 0) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame5, mirrored);
      frame++;
    } else if (frame == 1) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame4, mirrored);
      frame++;
    } else if (frame == 2) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame3, mirrored);
      frame++;
    } else if (frame == 3) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame2, mirrored);
      frame++;
    } else if (frame == 4) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame1, mirrored);
      frame++;
    } else if (frame == 5) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame0, mirrored);
    }
  }

}

void u8g2_overlayPrintLn(String printStr, /* 0 = none, 1 = center, 2 = right -> */ byte align, /* false = replaces only width of text, true = replaces from right to left */ bool horiz, bool sCPAB, byte x, byte y) {
  u8g2.setDrawColor(0);
  byte gw = u8g2.getStrWidth(printStr.c_str());
  byte gh1 = u8g2.getAscent();
  byte gh2 = u8g2.getDescent();
  byte gh = gh1 + gh2 + 1;
  byte ghf = gh * 1.5;
  byte cx = (u8g2.getDisplayWidth() - gw) / 2;
  //byte cy = (u8g2.getDisplayHeight()) / 2;
  byte rx = (u8g2.getDisplayWidth() - gw);
  y += gh;
  if (sCPAB) {
    x = u8g2.tx;
    y = u8g2.ty;
  }
  if (align == 0 && !horiz) {
    u8g2.drawBox(x, y - (gh), gw, ghf);
    u8g2.setDrawColor(1);
    u8g2.setCursor(x, y);
  } else if (align == 0 && horiz) {
    u8g2.drawBox(0, y - (gh), u8g2.getDisplayWidth(), gh);
    u8g2.setDrawColor(1);
    u8g2.setCursor(x, y);
  } else if (align == 1 && !horiz) {
    u8g2.drawBox(cx, y - (gh), gw, ghf);
    u8g2.setDrawColor(1);
    u8g2.setCursor(cx, y);
  } else if (align == 1 && horiz) {
    u8g2.drawBox(0, y - (gh), u8g2.getDisplayWidth(), gh);
    u8g2.setDrawColor(1);
    u8g2.setCursor(cx, y);
  } else if (align == 2 && !horiz) {
    u8g2.drawBox(rx, y - (gh), gw, ghf);
    u8g2.setDrawColor(1);
    u8g2.setCursor(rx, y);
  } else if (align == 2 && horiz) {
    u8g2.drawBox(0, y - (gh), u8g2.getDisplayWidth(), gh);
    u8g2.setDrawColor(1);
    u8g2.setCursor(rx, y);

  }
  u8g2.println(printStr);
  u8g2.setCursor(u8g2.tx - gw, u8g2.ty + ghf);
  //Serial.print(printStr + ": "); Serial.print("gw = " + gw); Serial.print(" gh1 = " + gh1); Serial.print(" gh2 = " + gh2); Serial.print(" gh = " + gh); Serial.println(" cx = " + cx);
}

void u8g2_clearDisplay() {
  u8g2.setDrawColor(0);
  u8g2.drawBox(0, 0, u8g2.getDisplayWidth(), u8g2.getDisplayHeight());
  u8g2.setDrawColor(1);
}


void draw() {

  if (page1 == 0) {
    if (frame == 0) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(64, 0, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(64, 0, 64, 64, intro_frame0, false);
      frame++;
    } else if (frame == 1) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(64, 0, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(64, 0, 64, 64, intro_frame1, false);
      frame++;
    } else if (frame == 2) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(64, 0, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(64, 0, 64, 64, intro_frame2, false);
      frame++;
    } else if (frame == 3) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(64, 0, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(64, 0, 64, 64, intro_frame3, false);
      frame++;
    } else if (frame == 4) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(64, 0, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(64, 0, 64, 64, intro_frame4, false);
      frame++;
    } else if (frame == 5) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(64, 0, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(64, 0, 64, 64, intro_frame5, false);
      //frame = 0;
    }
    u8g2_overlayPrintLn(F("Welcome to "), 0, false, false, 0, 10);
    u8g2_overlayPrint(F("Calculator!"), 0, false, true, 0, 0);
    u8g2_overlayPrint(F("Help"), 2, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    u8g2_overlayPrint(F("Next"), 0, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    //u8g2_overlayPrint(F("Replay"), 1, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
  }
  else if (page1 == 1) {
    //char* behind;
    u8g2.drawHLine(20, 25, 108);
    String operatorStr = "";
    if (op1 == 1) operatorStr = "+";
    else if (op1 == 2) operatorStr = "-";
    else if (op1 == 3) operatorStr = "*";
    else if (op1 == 4) operatorStr = "/";
    else if (op1 == 5) operatorStr = "^";
    u8g2.setDrawColor(1);
    u8g2_overlayPrint(String(printf("%g", output)), 2, false, false, 0, (u8g2.getDisplayHeight() - u8g2.getDisplayHeight()));
    u8g2_overlayPrint(String(operatorStr), 0, false, false, 6, 22);
    if (step1 == 1) {
      u8g2_overlayPrint(String("<"), 0, false, false, 0, 22);
      u8g2_overlayPrint(String(">"), 0, false, false, 13, 22);
      u8g2_overlayPrint(F("Choose"), 1, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    }
    if (step1 >= 2) {
      u8g2_overlayPrint(String(printf("%g", output)), 2, false, false, 0, (u8g2.getDisplayHeight() - u8g2.getDisplayHeight()) + 10);
    }
    if (step1 == 2) {
      u8g2_overlayPrint(F("Equals"), 1, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    }
    if (step1 == 3) {
      u8g2_overlayPrint(F("Next"), 1, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
      if (err == 0) {
        u8g2_overlayPrint(String(printf("%g", output)), 2, false, false, 0, 27);
      } else if (err == 1) {
        u8g2_overlayPrint(String("Error!"), 2, false, false, 0, 27);
      } else if (err == 2) {
        String digLeft = String("e+" + String(String(printf("%g", output)).length()));
        u8g2_overlayPrint(String(String(printf("%g", output)).substring(0, 16) + digLeft), 2, false, false, 0, 27);
      } else if (err == 3) {
        u8g2_overlayPrint(String("Can't divide by zero."), 2, false, false, 0, 27);
      }
    }

    u8g2_overlayPrint(F("Clear"), 0, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    u8g2_overlayPrint(F("Help"), 2, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
  }
  else if (page1 == 2) {
    u8g2_overlayPrint(F("Back"), 0, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    u8g2_overlayPrint(F("About"), 2, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    u8g2_overlayPrintLn(F("0-9 - Numbers"), 0, false, false, 0, 0);
    u8g2_overlayPrintLn(F("Up arrow - backspace"), 0, false, true, 0, 0);
  }
}

void typeNumber(int num1) {
  if (step1 == 1) {
    if ((math1 * 10 + num1) < 1000000001 && (math1 * 10 + num1) > -1000000001)
      math1 = math1 * 10 + num1;
  } else if (step1 == 2) {
    if ((math2 * 10 + num1) < 1000000001 && (math2 * 10 + num1) > -1000000001)
      math2 = math2 * 10 + num1;
  } else if (step1 == 3) {
    resetCalc();
    if ((math1 * 10 + num1) < 1000000001 && (math1 * 10 + num1) > -1000000001)
      math1 = math1 * 10 + num1;
  }
}

void backSp() {
  if (step1 == 1) {
    if (floor(math1 / 10) < 1000000001 && floor(math1 / 10) > -1000000001)
      math1 = floor(math1 / 10);
    if (math1 < 0) math1 = 0;
  } else if (step1 == 2) {
    if (floor(math2 / 10) < 1000000001 && floor(math2 / 10) > -1000000001)
      math2 = floor(math2 / 10);
    if (math2 < 0) math2 = 0.00;
  } else if (step1 == 3) {
    resetCalc();
  }
}

void nextOp() {
  if (step1 == 1) {
    if ((op1 + 1) <= 5) {
      op1++;
    }
    else {
      op1 = 1;
    }
  }
}

void prevOp() {
  if (step1 == 1) {
    if ((op1 - 1) >= 1) {
      op1--;
    }
    else {
      op1 = 5;
    }
  }
}

void resetCalc() {
  math1 = 0;
  math2 = 0;
  output = 0;
  step1 = 1;
}

void calcEquals() {
  if (op1 == 0) {
    err = 1;
  } else if (op1 == 1) {
    output = math1 + math2;
  } else if (op1 == 2) {
    output = math1 - math2;
  } else if (op1 == 3) {
    output = math1 * math2;
  } else if (op1 == 4) {
    output = math1 / math2;
  } else if (op1 == 5) {
    output = pow(math1, math2);
  }
  if (output > 1000000000.00) {
    if (op1 == 4) err = 3;
    else err = 2;
  }
  if (isnan(output)) {
    err = 1;
  }

}

void calcOk() {
  if (step1 == 1) {
    step1 = 2;
  } else if (step1 == 2) {
    step1 = 3;
    calcEquals();
  } else if (step1 == 3) {
    if (err == 0) {
      math1 = output;
      calcEquals();
    } else {
      err = 0;
      resetCalc();
    }

  }
}

void belowZero() {
  if (step1 == 1) {
    if (math1 < 0) {
      math1 = (math1 - (math1 * 2));
    } else if (math1 > 0) {
      math1 = (math1 - (math1 * 2));
    }
  } else if (step1 == 2) {
    if (math2 < 0) {
      math2 = (math2 - (math2 * 2));
    } else if (math2 > 0) {
      math2 = (math2 - (math2 * 2));
    }
  } else if (step1 == 3) {
    math1 = 0;
    double output1;
    if (output1 < 0) {
      output1 = (output1 + (output1 * 2));
    } else if (output1 > 0) {
      output1 = (output1 - (output1 * 2));
    }
    if ((math1 + output1) > -1000000001 && (math1 + output1) < 1000000001) {
      math1 = output1;
    }
    math2 = 0;
    output = 0;
    step1 = 1;
  }
}

void clearCalc() {
  if (step1 == 1) {
    math1 = 0;
  } else if (step1 == 2) {
    math2 = 0;
    step1 = 1;
  } else if (step1 == 3) {
    resetCalc();
  }
}

void irtasks() {
  //String btnLS PROGMEM = "ff6897";
  //String btnRS PROGMEM = "ffb04f";
  //String btn1 PROGMEM = "ffa25d";
  //String btn2 PROGMEM = "ff629d";
  //String btn3 PROGMEM = "ffe21d";
  //String btn4 PROGMEM = "ff22dd";
  //String btn5 PROGMEM = "ff02fd";
  //String btn6 PROGMEM = "ffc23d";
  //String btn7 PROGMEM = "ffe01f";
  //String btn8 PROGMEM = "ffa857";
  //String btn9 PROGMEM = "ff906f";
  //String btn0 PROGMEM = "ff9867";
  //String btnOK PROGMEM = "ff38c7";
  //String btnR PROGMEM = "ff5aa5";
  //String btnL PROGMEM = "ff10ef";
  //String btnD PROGMEM = "ff4ab5";
  //String btnU PROGMEM = "ff18e7";
  remoteEvents_t remoteEvents = lirrGetEvents();
  if (page1 == 0) {
    switch (remoteEvents.buttonState)
    {
      case (BUTTON_RELEASED):
        if (String(remoteEvents.buttonCode, HEX) == "ff6897") {
          page1 = 1;
          //page2 = page1;
        }
        if (String(remoteEvents.buttonCode, HEX) == "ff38c7") {
          frame = 0;
          u8g2.firstPage();
          for (char i = 0; i < 5; i++) {
            do {
              if (i == 0) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame5, true);
              } else if (i == 1) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame4, true);
              } else if (i == 2) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame3, true);
                frame++;
              } else if (i == 3) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame2, true);
                frame++;
              } else if (i == 4) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame1, true);
                frame++;
              } else if (i == 5) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame0, true);
                //frame = 0;
              }
              u8g2_overlayPrintLn(F("Welcome to "), 0, false, false, 0, 10);
              u8g2_overlayPrint(F("Calculator!"), 0, false, true, 0, 0);
              u8g2_overlayPrint(F("Help"), 2, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
              u8g2_overlayPrint(F("Next"), 0, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
            } while (u8g2.nextPage());
          } do {
            u8g2_clearDisplay();
            u8g2_overlayPrintLn(F("Welcome to "), 0, false, false, 0, 10);
            u8g2_overlayPrint(F("Calculator!"), 0, false, true, 0, 0);
            u8g2_overlayPrint(F("Help"), 2, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
            u8g2_overlayPrint(F("Next"), 0, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
          } while (u8g2.nextPage());
          delay(10);
          for (char i = 0; i < 5; i++) {
            u8g2.firstPage();
            do {
              if (i == 0) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame0, false);
              } else if (i == 1) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame1, false);
              } else if (i == 2) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame2, false);
              } else if (i == 3) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame3, false);
                frame++;
              } else if (i == 4) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame4, false);
                frame++;
              } else if (i == 5) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame5, false);
                //frame = 0;
              }
              u8g2_overlayPrintLn(F("Welcome to "), 0, false, false, 0, 10);
              u8g2_overlayPrint(F("Calculator!"), 0, false, true, 0, 0);
              u8g2_overlayPrint(F("Help"), 2, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
              u8g2_overlayPrint(F("Next"), 0, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
            } while (u8g2.nextPage());
          }
        }
        if (String(remoteEvents.buttonCode, HEX) == "ffb04f") {
          pageb1 = page1;
          //pageb2 = pageb1;
          page1 = 2;
          //page2 = page1;
        }
    }
  }
  else if (page1 == 1) {
    switch (remoteEvents.buttonState) {
      case (BUTTON_PRESSED):
        if (String(remoteEvents.buttonCode, HEX) == "ffffff") {

        } else if ( String(remoteEvents.buttonCode, HEX) == "ff6897" ) {

          clearCalc();
        }
        else if (String(remoteEvents.buttonCode, HEX) == "ff9867") {
          typeNumber(0);
        } else if (String(remoteEvents.buttonCode, HEX) == "ffa25d") {
          typeNumber(1);
        } else if (String(remoteEvents.buttonCode, HEX) == "ff629d") {
          typeNumber(2);
        } else if (String(remoteEvents.buttonCode, HEX) == "ffe21d") {
          typeNumber(3);
        } else if (String(remoteEvents.buttonCode, HEX) == "ff22dd") {
          typeNumber(4);
        } else if (String(remoteEvents.buttonCode, HEX) == "ff02fd") {
          typeNumber(5);
        } else if (String(remoteEvents.buttonCode, HEX) == "ffc23d") {
          typeNumber(6);
        } else if (String(remoteEvents.buttonCode, HEX) == "ffe01f") {
          typeNumber(7);
        } else if (String(remoteEvents.buttonCode, HEX) == "ffa857") {
          typeNumber(8);
        } else if (String(remoteEvents.buttonCode, HEX) == "ff906f") {
          typeNumber(9);
        } else if (String(remoteEvents.buttonCode, HEX) == "ff10ef") {
          prevOp();
        } else if (String(remoteEvents.buttonCode, HEX) == "ff5aa5") {
          nextOp();
        } else if (String(remoteEvents.buttonCode, HEX) == "ff4ab5") {
          belowZero();
        } else if (String(remoteEvents.buttonCode, HEX) == "ff18e7") {
          backSp();
        } else if (String(remoteEvents.buttonCode, HEX) == "ff38c7") {
          calcOk();
        }
        else if (String(remoteEvents.buttonCode, HEX) == "ffb04f") {
          pageb1 = page1;
          //pageb2 = pageb1;
          page1 = 2;
          //page2 = page1;
        }
    }
  }
}



void setup() {
  //Serial.begin(115200);
  lirrBegin(ir, PROTOCOL_NEC);
  u8g2.begin();
  u8g2.setFont(u8g2_font_nokiafc22_tr);
  u8g2.firstPage();

}

void loop() {
  do {
    u8g2_clearDisplay();
    draw();
  } while (u8g2.nextPage());
  irtasks();
  delay(10);
}

/////////////////////////////////////////

Please help. Any help will be appreciated. Thank You.

1 Like

Is there a reason why you did not use the drawBitmap() function from the library ?

1 Like

Because I need to print mirrored animation.

How does the compiler know how much dynamic memory is used by global variables?

Does the compiler allocate copies in RAM?

1 Like

I don't know how but I'm using ARDUINO IDE 1.8.19

The Arduino Uno is not really suitable for the u8g2 library. The u8x8 is for the Arduino Uno.
My suggestion is to use a board with more memory (for example a ESP32) or use the u8x8.

1 Like

Can I also buy Arduino Mega?
Because it has more pins and I can connect an TFT touchscreen in past.

Yes, but they are expensive :moneybag:
The Raspberry Pi Pico and the ESP32 are cheap and have so much more.

1 Like

But so much less pins :confused:

Looking at your "posted code" oops it disappeared. Try using the "F" macro. Example: Serial.print("Hello"); use Serial.print(F(:Hello");, that should save you about 5 bytes of ram as the message is stored in program memory. As I understand it when C start begins it copies all the messages and other data into RAM before your program is started. That memory is permanently allocated until it is reset. You can also print from EEPROM or external memory such as FRAM.

1 Like

Look at the Teensy. Fast, loads of RAM and some of them have a lot of pins too.

1 Like

I'm using F() macro. Here is the code if it disappeared for You:

#include <Wire.h>
#include <U8g2lib.h>
#include "lightIRRecv.h"

#define ir 3




U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);


const unsigned char PROGMEM intro_frame0 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xEE, 0xFF, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x80, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x80, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0xFF, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0xF7, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x94, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2E, 0x94, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20, 0xF7, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2E, 0xF7, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x94, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x94, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0xF7, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0xF7, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x94, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2A, 0x94, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xEE, 0xF7, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

const unsigned char PROGMEM intro_frame1 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xE3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x2C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x5A, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x55, 0xE3, 0x80, 0x00, 0x00, 0x00, 0x01, 0x40, 0x55, 0x1C, 0x70, 0x00, 0x00, 0x00, 0x01, 0x40, 0xA5, 0x03, 0x0E, 0x00, 0x00, 0x00, 0x02, 0xC0, 0xA8, 0xE1, 0x71, 0x00, 0x00, 0x00, 0x02, 0x80, 0xA8, 0x1E, 0x5C, 0x00, 0x00, 0x00, 0x02, 0x81, 0x53, 0x06, 0x83, 0x00, 0x00, 0x00, 0x05, 0x01, 0x35, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x05, 0x03, 0x04, 0xB8, 0x1C, 0x00, 0x00, 0x00, 0x0D, 0x02, 0x8E, 0xA5, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x02, 0xE1, 0x45, 0xE0, 0x00, 0x00, 0x00, 0x0A, 0x05, 0xAE, 0x3A, 0x28, 0x00, 0x00, 0x00, 0x12, 0x05, 0x51, 0x0A, 0x57, 0x00, 0x00, 0x00, 0x14, 0x05, 0x52, 0xF1, 0xD2, 0x00, 0x00, 0x00, 0x17, 0x0A, 0x5E, 0x96, 0x1A, 0x00, 0x00, 0x00, 0x31, 0xCA, 0xA2, 0x95, 0x84, 0x00, 0x00, 0x00, 0x0E, 0x3A, 0xBC, 0x64, 0xB1, 0x00, 0x00, 0x00, 0x01, 0xC7, 0x25, 0x8D, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x38, 0x69, 0xE3, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3A, 0x5C, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC3, 0x52, 0x8A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xD2, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1E, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

const unsigned char PROGMEM intro_frame2 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xB3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x61, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xC0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x80, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x01, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x03, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x06, 0x92, 0x80, 0x00, 0x00, 0x00, 0x01, 0xB0, 0x0D, 0x27, 0x40, 0x00, 0x00, 0x00, 0x03, 0x60, 0x1A, 0x49, 0xA0, 0x00, 0x00, 0x00, 0x06, 0xC0, 0x34, 0x88, 0xD0, 0x00, 0x00, 0x00, 0x0D, 0x80, 0x63, 0x04, 0x68, 0x00, 0x00, 0x00, 0x05, 0x80, 0xD0, 0x62, 0x34, 0x00, 0x00, 0x00, 0x02, 0xC1, 0xA8, 0x91, 0x12, 0x00, 0x00, 0x00, 0x01, 0x63, 0x49, 0x90, 0xA5, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x92, 0xE4, 0x4E, 0x80, 0x00, 0x00, 0x00, 0x5D, 0x25, 0x4A, 0x13, 0x40, 0x00, 0x00, 0x00, 0x2A, 0x48, 0x91, 0x11, 0xA0, 0x00, 0x00, 0x00, 0x16, 0x8D, 0x1A, 0x08, 0xD0, 0x00, 0x00, 0x00, 0x0B, 0x36, 0x64, 0xC4, 0x68, 0x00, 0x00, 0x00, 0x04, 0x48, 0x91, 0x22, 0x24, 0x00, 0x00, 0x00, 0x02, 0xC9, 0x91, 0x21, 0x4A, 0x00, 0x00, 0x00, 0x01, 0x72, 0xE4, 0xC8, 0x9D, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x4A, 0x14, 0x26, 0x00, 0x00, 0x00, 0x00, 0x48, 0x91, 0x22, 0x43, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x1A, 0x14, 0x81, 0x00, 0x00, 0x00, 0x00, 0x16, 0x6C, 0xC9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x91, 0x22, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x93, 0x24, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0xE5, 0xC8, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4A, 0x90, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x20, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x40, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x80, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x86, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xCD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

const unsigned char PROGMEM intro_frame3 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8D, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x70, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xC0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x03, 0x98, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x60, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x11, 0x80, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x07, 0x34, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x18, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x63, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0x9C, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x04, 0x86, 0x0B, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x02, 0xB9, 0xCC, 0x25, 0x00, 0x00, 0x00, 0x00, 0x02, 0xE6, 0x41, 0x26, 0x80, 0x00, 0x00, 0x00, 0x01, 0x18, 0xCF, 0x12, 0x80, 0x00, 0x00, 0x00, 0x01, 0x67, 0x2C, 0x92, 0x40, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xD5, 0x89, 0x40, 0x00, 0x00, 0x00, 0x00, 0xB2, 0x96, 0x09, 0x20, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x98, 0xCD, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x63, 0x26, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0x1D, 0x21, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x35, 0xE2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x31, 0xA6, 0x92, 0x28, 0x00, 0x00, 0x00, 0x00, 0x16, 0xDC, 0x79, 0x28, 0x00, 0x00, 0x00, 0x00, 0x12, 0x51, 0x49, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xCF, 0x4C, 0x94, 0x00, 0x00, 0x00, 0x00, 0x09, 0x29, 0x30, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x04, 0xE5, 0x8C, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x05, 0x96, 0x32, 0x61, 0x00, 0x00, 0x00, 0x00, 0x02, 0x90, 0xD2, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x02, 0xE3, 0x5E, 0x74, 0x80, 0x00, 0x00, 0x00, 0x01, 0x1A, 0x29, 0xC2, 0x80, 0x00, 0x00, 0x00, 0x01, 0x75, 0xE6, 0x02, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x98, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x60, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x51, 0x80, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x19, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x03, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x0E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x39, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

const unsigned char PROGMEM intro_frame4 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x03, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3F, 0xFC, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xC0, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x03, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x1F, 0xFC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x03, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1E, 0x7C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE2, 0x43, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x1E, 0x7C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x03, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1E, 0xF2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xD9, 0x49, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0x29, 0x49, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0x2F, 0x79, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE0, 0x01, 0x28, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0F, 0x79, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE9, 0x49, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0x29, 0x49, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x05, 0x2F, 0x78, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE0, 0x01, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0F, 0x79, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE9, 0x49, 0x28, 0x00, 0x00, 0x00, 0x00, 0x05, 0x29, 0x48, 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0x97, 0xBC, 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0xBC, 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF4, 0xA4, 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0x94, 0xA4, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x97, 0xBC, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0F, 0xFE, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4F, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x70, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

const unsigned char PROGMEM intro_frame5 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFE, 0x7F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x40, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFE, 0x7F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF3, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF3, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF3, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x52, 0x92, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0xF3, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

double math1 = 0;
double math2 = 0;
double output = 0;
short page1 = 0;
//byte page2 = 0;
char pageb1 = 0;
//byte pageb2 = 0;
char op1 = 1;
//byte op2 = 1;
char step1 = 1;
char err = 0;
char frame = 0;


void u8g2drawBitmap(int16_t x, int16_t y, int16_t w, int16_t h, const unsigned char *bitmap, bool mirrorX) {

  int16_t i, j, byteWidth = (w + 7) / 8;
  uint8_t byte;
  if (mirrorX) {
    for (j = 0; j < h; j++) {
      for (i = 0; i < w; i++) {
        if (i & 7) byte <<= 1;
        else      byte   = pgm_read_byte(bitmap + j * byteWidth + i / 8);
        if (byte & 0x80) u8g2.drawPixel((x + w) - i, y + j);
      }
    }
  } else {
    for (j = 0; j < h; j++) {
      for (i = 0; i < w; i++) {
        if (i & 7) byte <<= 1;
        else      byte   = pgm_read_byte(bitmap + j * byteWidth + i / 8);
        if (byte & 0x80) u8g2.drawPixel(x + i, y + j);
      }
    }
  }

}

/*String dtostrl( double val, byte precision) {
  // prints val with number of decimal places determine by precision
  // precision is a number from 0 to 6 indicating the desired decimial places
  // example: printDouble( 3.1415, 2); // prints 3.14 (two decimal places)
  String dbl;
  dbl += String(int(val));  //prints the int part

  if (val < 0.0) {
    dbl += String('-');
    val = -val;
  }

  dbl += String(int(val));  //prints the int part
  if ( precision > 0) {
    dbl += String("."); // print the decimal point
    unsigned long frac;
    unsigned long mult = 1;
    byte padding = precision - 1;
    while (precision--)
      mult *= 10;

    if (val >= 0)
      frac = (val - int(val)) * mult;
    else
      frac = (int(val) - val ) * mult;
    unsigned long frac1 = frac;
    while ( frac1 /= 10 )
      padding--;
    while (  padding--)
      dbl += String("0");
    dbl += String(frac, DEC) ;

    return dbl;
  }
  }*/

/*String getDoubleString(double val, int maxDig) {
  // prints val with number of decimal places determine by precision
  // NOTE: precision is 1 followed by the number of zeros for the desired number of decimial places
  // example: printDouble( 3.1415, 100); // prints 3.14 (two decimal places)
  String valStr;
  valStr += floor(val);
  int digits = 0;
  double val2 = val - floor(val);
  do {
    digits++;
    val2 = val / 10;
  } while (val2 > 0.0000000000);
  unsigned long frac;
    for (int i = (val2 + 1); i < maxDig; i++) {
      frac = frac * 10 + String(val).substring(i, i + 1).toInt();
    }

  if (frac != 0) {
    valStr += ".";
    valStr += String(frac, DEC);
  }

  return valStr;
  }*/

void u8g2_overlayPrint(String printStr, /* 0 = none, 1 = center, 2 = right -> */ byte align, /* false = replaces only width of text, true = replaces from right to left */ bool horiz, bool sCPAB, byte x, byte y) {
  u8g2.setDrawColor(0);
  byte gw = u8g2.getStrWidth(printStr.c_str());
  byte gh1 = u8g2.getAscent();
  byte gh2 = u8g2.getDescent();
  byte gh = gh1 + gh2 + 1;
  byte ghf = gh * 1.5;
  byte cx = (u8g2.getDisplayWidth() - gw) / 2;
  //byte cy = (u8g2.getDisplayHeight()) / 2;
  byte rx = (u8g2.getDisplayWidth() - gw);
  y += gh;
  if (sCPAB) {
    x = u8g2.tx;
    y = u8g2.ty;
  }
  if (align == 0 && !horiz) {
    u8g2.drawBox(x, y - (gh), gw, ghf);
    u8g2.setDrawColor(1);
    u8g2.setCursor(x, y);
  } else if (align == 0 && horiz) {
    u8g2.drawBox(0, y - (gh), u8g2.getDisplayWidth(), gh);
    u8g2.setDrawColor(1);
    u8g2.setCursor(x, y);
  } else if (align == 1 && !horiz) {
    u8g2.drawBox(cx, y - (gh), gw, ghf);
    u8g2.setDrawColor(1);
    u8g2.setCursor(cx, y);
  } else if (align == 1 && horiz) {
    u8g2.drawBox(0, y - (gh), u8g2.getDisplayWidth(), gh);
    u8g2.setDrawColor(1);
    u8g2.setCursor(cx, y);
  } else if (align == 2 && !horiz) {
    u8g2.drawBox(rx, y - (gh), gw, ghf);
    u8g2.setDrawColor(1);
    u8g2.setCursor(rx, y);
  } else if (align == 2 && horiz) {
    u8g2.drawBox(0, y - (gh), u8g2.getDisplayWidth(), gh);
    u8g2.setDrawColor(1);
    u8g2.setCursor(rx, y);
  }
  u8g2.print(printStr);
  //Serial.print(printStr + ": "); Serial.print("gw = " + gw); Serial.print(" gh1 = " + gh1); Serial.print(" gh2 = " + gh2); Serial.print(" gh = " + gh); Serial.println(" cx = " + cx);
}

void drawIntro(byte x, byte y, bool reversed, bool mirrored) {
  if (!reversed) {
    if (frame == 0) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame0, mirrored);
      frame++;
    } else if (frame == 1) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame1, mirrored);
      frame++;
    } else if (frame == 2) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame2, mirrored);
      frame++;
    } else if (frame == 3) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame3, mirrored);
      frame++;
    } else if (frame == 4) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame4, mirrored);
      frame++;
    } else if (frame == 5) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame5, mirrored);
      //frame = 0;
    }
  } else {
    if (frame == 0) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame5, mirrored);
      frame++;
    } else if (frame == 1) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame4, mirrored);
      frame++;
    } else if (frame == 2) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame3, mirrored);
      frame++;
    } else if (frame == 3) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame2, mirrored);
      frame++;
    } else if (frame == 4) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame1, mirrored);
      frame++;
    } else if (frame == 5) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(x, y, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(x, y, 64, 64, intro_frame0, mirrored);
    }
  }

}

void u8g2_overlayPrintLn(String printStr, /* 0 = none, 1 = center, 2 = right -> */ byte align, /* false = replaces only width of text, true = replaces from right to left */ bool horiz, bool sCPAB, byte x, byte y) {
  u8g2.setDrawColor(0);
  byte gw = u8g2.getStrWidth(printStr.c_str());
  byte gh1 = u8g2.getAscent();
  byte gh2 = u8g2.getDescent();
  byte gh = gh1 + gh2 + 1;
  byte ghf = gh * 1.5;
  byte cx = (u8g2.getDisplayWidth() - gw) / 2;
  //byte cy = (u8g2.getDisplayHeight()) / 2;
  byte rx = (u8g2.getDisplayWidth() - gw);
  y += gh;
  if (sCPAB) {
    x = u8g2.tx;
    y = u8g2.ty;
  }
  if (align == 0 && !horiz) {
    u8g2.drawBox(x, y - (gh), gw, ghf);
    u8g2.setDrawColor(1);
    u8g2.setCursor(x, y);
  } else if (align == 0 && horiz) {
    u8g2.drawBox(0, y - (gh), u8g2.getDisplayWidth(), gh);
    u8g2.setDrawColor(1);
    u8g2.setCursor(x, y);
  } else if (align == 1 && !horiz) {
    u8g2.drawBox(cx, y - (gh), gw, ghf);
    u8g2.setDrawColor(1);
    u8g2.setCursor(cx, y);
  } else if (align == 1 && horiz) {
    u8g2.drawBox(0, y - (gh), u8g2.getDisplayWidth(), gh);
    u8g2.setDrawColor(1);
    u8g2.setCursor(cx, y);
  } else if (align == 2 && !horiz) {
    u8g2.drawBox(rx, y - (gh), gw, ghf);
    u8g2.setDrawColor(1);
    u8g2.setCursor(rx, y);
  } else if (align == 2 && horiz) {
    u8g2.drawBox(0, y - (gh), u8g2.getDisplayWidth(), gh);
    u8g2.setDrawColor(1);
    u8g2.setCursor(rx, y);

  }
  u8g2.println(printStr);
  u8g2.setCursor(u8g2.tx - gw, u8g2.ty + ghf);
  //Serial.print(printStr + ": "); Serial.print("gw = " + gw); Serial.print(" gh1 = " + gh1); Serial.print(" gh2 = " + gh2); Serial.print(" gh = " + gh); Serial.println(" cx = " + cx);
}

void u8g2_clearDisplay() {
  u8g2.setDrawColor(0);
  u8g2.drawBox(0, 0, u8g2.getDisplayWidth(), u8g2.getDisplayHeight());
  u8g2.setDrawColor(1);
}


void draw() {

  if (page1 == 0) {
    if (frame == 0) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(64, 0, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(64, 0, 64, 64, intro_frame0, false);
      frame++;
    } else if (frame == 1) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(64, 0, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(64, 0, 64, 64, intro_frame1, false);
      frame++;
    } else if (frame == 2) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(64, 0, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(64, 0, 64, 64, intro_frame2, false);
      frame++;
    } else if (frame == 3) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(64, 0, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(64, 0, 64, 64, intro_frame3, false);
      frame++;
    } else if (frame == 4) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(64, 0, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(64, 0, 64, 64, intro_frame4, false);
      frame++;
    } else if (frame == 5) {
      u8g2.setDrawColor(0);
      u8g2.drawBox(64, 0, 64, 64);
      u8g2.setDrawColor(1);
      u8g2drawBitmap(64, 0, 64, 64, intro_frame5, false);
      //frame = 0;
    }
    u8g2_overlayPrintLn(F("Welcome to "), 0, false, false, 0, 10);
    u8g2_overlayPrint(F("Calculator!"), 0, false, true, 0, 0);
    u8g2_overlayPrint(F("Help"), 2, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    u8g2_overlayPrint(F("Next"), 0, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    //u8g2_overlayPrint(F("Replay"), 1, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
  }
  else if (page1 == 1) {
    //char* behind;
    u8g2.drawHLine(20, 25, 108);
    String operatorStr = "";
    if (op1 == 1) operatorStr = "+";
    else if (op1 == 2) operatorStr = "-";
    else if (op1 == 3) operatorStr = "*";
    else if (op1 == 4) operatorStr = "/";
    else if (op1 == 5) operatorStr = "^";
    u8g2.setDrawColor(1);
    u8g2_overlayPrint(String(printf("%g", output)), 2, false, false, 0, (u8g2.getDisplayHeight() - u8g2.getDisplayHeight()));
    u8g2_overlayPrint(String(operatorStr), 0, false, false, 6, 22);
    if (step1 == 1) {
      u8g2_overlayPrint(String("<"), 0, false, false, 0, 22);
      u8g2_overlayPrint(String(">"), 0, false, false, 13, 22);
      u8g2_overlayPrint(F("Choose"), 1, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    }
    if (step1 >= 2) {
      u8g2_overlayPrint(String(printf("%g", output)), 2, false, false, 0, (u8g2.getDisplayHeight() - u8g2.getDisplayHeight()) + 10);
    }
    if (step1 == 2) {
      u8g2_overlayPrint(F("Equals"), 1, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    }
    if (step1 == 3) {
      u8g2_overlayPrint(F("Next"), 1, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
      if (err == 0) {
        u8g2_overlayPrint(String(printf("%g", output)), 2, false, false, 0, 27);
      } else if (err == 1) {
        u8g2_overlayPrint(String("Error!"), 2, false, false, 0, 27);
      } else if (err == 2) {
        String digLeft = String("e+" + String(String(printf("%g", output)).length()));
        u8g2_overlayPrint(String(String(printf("%g", output)).substring(0, 16) + digLeft), 2, false, false, 0, 27);
      } else if (err == 3) {
        u8g2_overlayPrint(String("Can't divide by zero."), 2, false, false, 0, 27);
      }
    }

    u8g2_overlayPrint(F("Clear"), 0, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    u8g2_overlayPrint(F("Help"), 2, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
  }
  else if (page1 == 2) {
    u8g2_overlayPrint(F("Back"), 0, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    u8g2_overlayPrint(F("About"), 2, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
    u8g2_overlayPrintLn(F("0-9 - Numbers"), 0, false, false, 0, 0);
    u8g2_overlayPrintLn(F("Up arrow - backspace"), 0, false, true, 0, 0);
  }
}

void typeNumber(int num1) {
  if (step1 == 1) {
    if ((math1 * 10 + num1) < 1000000001 && (math1 * 10 + num1) > -1000000001)
      math1 = math1 * 10 + num1;
  } else if (step1 == 2) {
    if ((math2 * 10 + num1) < 1000000001 && (math2 * 10 + num1) > -1000000001)
      math2 = math2 * 10 + num1;
  } else if (step1 == 3) {
    resetCalc();
    if ((math1 * 10 + num1) < 1000000001 && (math1 * 10 + num1) > -1000000001)
      math1 = math1 * 10 + num1;
  }
}

void backSp() {
  if (step1 == 1) {
    if (floor(math1 / 10) < 1000000001 && floor(math1 / 10) > -1000000001)
      math1 = floor(math1 / 10);
    if (math1 < 0) math1 = 0;
  } else if (step1 == 2) {
    if (floor(math2 / 10) < 1000000001 && floor(math2 / 10) > -1000000001)
      math2 = floor(math2 / 10);
    if (math2 < 0) math2 = 0.00;
  } else if (step1 == 3) {
    resetCalc();
  }
}

void nextOp() {
  if (step1 == 1) {
    if ((op1 + 1) <= 5) {
      op1++;
    }
    else {
      op1 = 1;
    }
  }
}

void prevOp() {
  if (step1 == 1) {
    if ((op1 - 1) >= 1) {
      op1--;
    }
    else {
      op1 = 5;
    }
  }
}

void resetCalc() {
  math1 = 0;
  math2 = 0;
  output = 0;
  step1 = 1;
}

void calcEquals() {
  if (op1 == 0) {
    err = 1;
  } else if (op1 == 1) {
    output = math1 + math2;
  } else if (op1 == 2) {
    output = math1 - math2;
  } else if (op1 == 3) {
    output = math1 * math2;
  } else if (op1 == 4) {
    output = math1 / math2;
  } else if (op1 == 5) {
    output = pow(math1, math2);
  }
  if (output > 1000000000.00) {
    if (op1 == 4) err = 3;
    else err = 2;
  }
  if (isnan(output)) {
    err = 1;
  }

}

void calcOk() {
  if (step1 == 1) {
    step1 = 2;
  } else if (step1 == 2) {
    step1 = 3;
    calcEquals();
  } else if (step1 == 3) {
    if (err == 0) {
      math1 = output;
      calcEquals();
    } else {
      err = 0;
      resetCalc();
    }

  }
}

void belowZero() {
  if (step1 == 1) {
    if (math1 < 0) {
      math1 = (math1 - (math1 * 2));
    } else if (math1 > 0) {
      math1 = (math1 - (math1 * 2));
    }
  } else if (step1 == 2) {
    if (math2 < 0) {
      math2 = (math2 - (math2 * 2));
    } else if (math2 > 0) {
      math2 = (math2 - (math2 * 2));
    }
  } else if (step1 == 3) {
    math1 = 0;
    double output1;
    if (output1 < 0) {
      output1 = (output1 + (output1 * 2));
    } else if (output1 > 0) {
      output1 = (output1 - (output1 * 2));
    }
    if ((math1 + output1) > -1000000001 && (math1 + output1) < 1000000001) {
      math1 = output1;
    }
    math2 = 0;
    output = 0;
    step1 = 1;
  }
}

void clearCalc() {
  if (step1 == 1) {
    math1 = 0;
  } else if (step1 == 2) {
    math2 = 0;
    step1 = 1;
  } else if (step1 == 3) {
    resetCalc();
  }
}

void irtasks() {
  //String btnLS PROGMEM = "ff6897";
  //String btnRS PROGMEM = "ffb04f";
  //String btn1 PROGMEM = "ffa25d";
  //String btn2 PROGMEM = "ff629d";
  //String btn3 PROGMEM = "ffe21d";
  //String btn4 PROGMEM = "ff22dd";
  //String btn5 PROGMEM = "ff02fd";
  //String btn6 PROGMEM = "ffc23d";
  //String btn7 PROGMEM = "ffe01f";
  //String btn8 PROGMEM = "ffa857";
  //String btn9 PROGMEM = "ff906f";
  //String btn0 PROGMEM = "ff9867";
  //String btnOK PROGMEM = "ff38c7";
  //String btnR PROGMEM = "ff5aa5";
  //String btnL PROGMEM = "ff10ef";
  //String btnD PROGMEM = "ff4ab5";
  //String btnU PROGMEM = "ff18e7";
  remoteEvents_t remoteEvents = lirrGetEvents();
  if (page1 == 0) {
    switch (remoteEvents.buttonState)
    {
      case (BUTTON_RELEASED):
        if (String(remoteEvents.buttonCode, HEX) == "ff6897") {
          page1 = 1;
          //page2 = page1;
        }
        if (String(remoteEvents.buttonCode, HEX) == "ff38c7") {
          frame = 0;
          u8g2.firstPage();
          for (char i = 0; i < 5; i++) {
            do {
              if (i == 0) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame5, true);
              } else if (i == 1) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame4, true);
              } else if (i == 2) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame3, true);
                frame++;
              } else if (i == 3) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame2, true);
                frame++;
              } else if (i == 4) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame1, true);
                frame++;
              } else if (i == 5) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame0, true);
                //frame = 0;
              }
              u8g2_overlayPrintLn(F("Welcome to "), 0, false, false, 0, 10);
              u8g2_overlayPrint(F("Calculator!"), 0, false, true, 0, 0);
              u8g2_overlayPrint(F("Help"), 2, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
              u8g2_overlayPrint(F("Next"), 0, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
            } while (u8g2.nextPage());
          } do {
            u8g2_clearDisplay();
            u8g2_overlayPrintLn(F("Welcome to "), 0, false, false, 0, 10);
            u8g2_overlayPrint(F("Calculator!"), 0, false, true, 0, 0);
            u8g2_overlayPrint(F("Help"), 2, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
            u8g2_overlayPrint(F("Next"), 0, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
          } while (u8g2.nextPage());
          delay(10);
          for (char i = 0; i < 5; i++) {
            u8g2.firstPage();
            do {
              if (i == 0) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame0, false);
              } else if (i == 1) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame1, false);
              } else if (i == 2) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame2, false);
              } else if (i == 3) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame3, false);
                frame++;
              } else if (i == 4) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame4, false);
                frame++;
              } else if (i == 5) {
                u8g2.setDrawColor(0);
                u8g2.drawBox(64, 0, 64, 64);
                u8g2.setDrawColor(1);
                u8g2drawBitmap(64, 0, 64, 64, intro_frame5, false);
                //frame = 0;
              }
              u8g2_overlayPrintLn(F("Welcome to "), 0, false, false, 0, 10);
              u8g2_overlayPrint(F("Calculator!"), 0, false, true, 0, 0);
              u8g2_overlayPrint(F("Help"), 2, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
              u8g2_overlayPrint(F("Next"), 0, false, false, 0, (u8g2.getDisplayHeight() - (u8g2.getAscent() + u8g2.getDescent() + 2)));
            } while (u8g2.nextPage());
          }
        }
        if (String(remoteEvents.buttonCode, HEX) == "ffb04f") {
          pageb1 = page1;
          //pageb2 = pageb1;
          page1 = 2;
          //page2 = page1;
        }
    }
  }
  else if (page1 == 1) {
    switch (remoteEvents.buttonState) {
      case (BUTTON_PRESSED):
        if (String(remoteEvents.buttonCode, HEX) == "ffffff") {

        } else if ( String(remoteEvents.buttonCode, HEX) == "ff6897" ) {

          clearCalc();
        }
        else if (String(remoteEvents.buttonCode, HEX) == "ff9867") {
          typeNumber(0);
        } else if (String(remoteEvents.buttonCode, HEX) == "ffa25d") {
          typeNumber(1);
        } else if (String(remoteEvents.buttonCode, HEX) == "ff629d") {
          typeNumber(2);
        } else if (String(remoteEvents.buttonCode, HEX) == "ffe21d") {
          typeNumber(3);
        } else if (String(remoteEvents.buttonCode, HEX) == "ff22dd") {
          typeNumber(4);
        } else if (String(remoteEvents.buttonCode, HEX) == "ff02fd") {
          typeNumber(5);
        } else if (String(remoteEvents.buttonCode, HEX) == "ffc23d") {
          typeNumber(6);
        } else if (String(remoteEvents.buttonCode, HEX) == "ffe01f") {
          typeNumber(7);
        } else if (String(remoteEvents.buttonCode, HEX) == "ffa857") {
          typeNumber(8);
        } else if (String(remoteEvents.buttonCode, HEX) == "ff906f") {
          typeNumber(9);
        } else if (String(remoteEvents.buttonCode, HEX) == "ff10ef") {
          prevOp();
        } else if (String(remoteEvents.buttonCode, HEX) == "ff5aa5") {
          nextOp();
        } else if (String(remoteEvents.buttonCode, HEX) == "ff4ab5") {
          belowZero();
        } else if (String(remoteEvents.buttonCode, HEX) == "ff18e7") {
          backSp();
        } else if (String(remoteEvents.buttonCode, HEX) == "ff38c7") {
          calcOk();
        }
        else if (String(remoteEvents.buttonCode, HEX) == "ffb04f") {
          pageb1 = page1;
          //pageb2 = pageb1;
          page1 = 2;
          //page2 = page1;
        }
    }
  }
}



void setup() {
  //Serial.begin(115200);
  lirrBegin(ir, PROTOCOL_NEC);
  u8g2.begin();
  u8g2.setFont(u8g2_font_nokiafc22_tr);
  u8g2.firstPage();

}

void loop() {
  do {
    u8g2_clearDisplay();
    draw();
  } while (u8g2.nextPage());
  irtasks();
  delay(10);
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.