Sketch Size Too Large

Hello all,

I am trying to build the Tamaguino project found here: Tamaguino - Tamagotchi clone for Arduino

As the instructions show you have to use older versions of the libraries to get the sketch size to be small enough. I have gone ahead and done so, however, the sketch is still too big. I am using an Arduino Pro Micro Atmega32U4 5V 16MHz with a bootloader.

Are there any other small form factor boards I can try or does anyone know how to get the sketch smaller?

Thank you!

The newer Nano Every has about 50% more code space. The sketch doesn't seem to compile for that, due to some programming errors (expecting round() to return an int, mostly? I guess maybe round() is different for megaavr than normal avr.)

or does anyone know how to get the sketch smaller?
With the up-to-date libraries, the code is 21% too large for a 32u4 with it's large-ish bootloader. that would be a lot of coed to get rid of.

An Uno or Pro Mini (with ATmega328) has a smaller bootloader and core code, and is slightly more efficient, so the code just barely fits...

Please let me know if you are able to get it working on the Nano Every. Where I am confused is that the code was proven to previously work on these boards so I don't know why I can't get it to compile smaller.

Some time ago, a compiler and linker optimization was enabled (LinkTimeOptimization). It makes smaller code, but the Adafruit libraries got larger anyway.

I looked at this code: https://github.com/alojzjakob/Tamaguino/tree/master/Tamaguino-noInputResistor
I can not make that smaller.

That is good enough!

In the Arduino IDE 2.1.0 with the newest Adafruit libraries, I get this:
Sketch uses 31826 bytes (98%) of program storage space.
Global variables use 524 bytes (25%) of dynamic memory

Then it should be able to run (with the newest Adafruit libraries) in the Wokwi simulator, and it does!

I made these changes:

//   - Buttons have now INPUT_PULLUP
//   - Array in getItem() is now static
//   - Added SCREEN_WIDTH and SCREEN_HEIGHT
//   - Changed declaration of 'display' object

Question: What shall I do with the round() ? replace it with a cast to int ?
You might not know that I made this Issue: round() macro in Arduino.h · Issue #76 · arduino/ArduinoCore-API · GitHub

Edit the Adafruit_SSD1306.h file to un-comment the following line:

 35 // Uncomment to disable Adafruit splash logo
 36 //#define SSD1306_NO_SPLASH

This will remove the Adafruit logo splash image that the library loads to the display buffer at initialization and save a bit of program memory.

@david_2018 Thank you.

With the newest Adafruit libraries, but without the splash image, compiled with Arduino IDE 2.1.0 for an Arduino Uno, with the sketch with some changes as I have on Wokwi:

Sketch uses 30402 bytes (94%) of program storage space
Global variables use 524 bytes (25%) of dynamic memory

However, for a Leonard (ATmega32U4) it is:

Sketch uses 33506 bytes (116%) of program storage space. Maximum is 28672 bytes.

That is a big difference. A compressing algorithm can make the data smaller, but I don't know if that is enough.
[UPDATE] I did a small test, about 1kbyte can be gained by compressing the data.

Ideally, it would be great to have this working on a small form factor board. Any help getting there would be much appreciated.

#define MENUSIZE 8
#define STRING_SIZE 11

const char mainMenu[MENUSIZE][8][STRING_SIZE] PROGMEM = {
  {"food","apple","steak","water",NULL},
  {"game",NULL},
  {"sleep",NULL},
  {"clean",NULL},
  {"doctor",NULL},
  {"discipline",NULL},
  {"stats","hunger","happiness","health","discipline","weight","age",NULL},
  {"settings","sound",
    //"something",
    NULL
  },
};

This looks very wasteful of space, requiring 8 x 8 x 11 = 704 bytes. Possibly make mainMenu an array of char*, which would be 8 x 8 x 2 = 128 bytes, plus about 125 bytes for the individual texts (counted quickly, may be off by a few). ALso NULL is not a char, it is a pointer, causing the compiler to issue warnings.

      char oneItem [STRING_SIZE];
      memcpy_P (&oneItem, &mainMenu[menu][0], sizeof oneItem);
      //display.println(getItem(menu,0));
      display.println(oneItem);

Copying the text from PROGMEM to ram should not be needed, println() can work directly with PROGMEM.

      display.println((__FlashStringHelper*)mainMenu[menu][0]);

Nano or Pro Mini use the same processor as an UNO, how much smaller do you want to go? Would require putting a new bootloader on the Nano, by default 2K of program memory is set aside for the bootloader, although only the old bootloader needed this much.

Can you help me make the changes you suggested, don't 100% understand what you are recommending. I can try a Pro Mini, right now I am using a Pro Micro

I'll have to look closer at the code tomorrow, too late at night here to do much testing.

Might be possible to eliminate the float variables, and use all integers instead.

Thank you. The code here with the option to save your game to EEPROM is what I would like to get working on my device if possible.

replace with lround()
Standards apparently say that round(float) returns a float.
The old Arduino.h (used by 328p, 32u4, etc) defines a round() that returns an int, but the megaAVR uses a better-defined API and uses the standard definition from math.h

Sigh.

The Pro Mini will work. With all the ideas we have, I think it is still not possible to make it fit in a Pro Micro.

Thank you :smiley: I checked the code that the result is used as a integer, and it is.

The updated version of 6 May 2023 is on Wokwi: Tamaguino - Wokwi ESP32, STM32, Arduino Simulator

I will show the sketch here as well:

// Forum: https://forum.arduino.cc/t/sketch-size-too-large/1123722/
// This Wokwi project: https://wokwi.com/projects/363935868605227009
// Sketch from: https://github.com/alojzjakob/Tamaguino/blob/master/Tamaguino-noInputResistor/
// Using the newest Adafruit libraries for the display.
// Changes by Koepel, 6 May 2023:
//   - Buttons have now INPUT_PULLUP
//   - Array in getItem() is now static
//   - Added SCREEN_WIDTH and SCREEN_HEIGHT
//   - Changed declaration of 'display' object
//   - Replaced round() with lround()
// No EEPROM storage used yet.
//


/* Tamaguino
  by Alojz Jakob <http://jakobdesign.com>

 ********** TAMAGUINO ***********
   Tamagotchi clone for Arduino
 ********************************

*/

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH        128 // OLED display width, in pixels
#define SCREEN_HEIGHT        64 // OLED display height, in pixels
#define OLED_RESET 4
// Adafruit_SSD1306 display(OLED_RESET);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const int button1Pin = 9;
const int button2Pin = 8;
const int button3Pin = 7;

const int sound = 6;

int button1State = 0;
int button2State = 0;
int button3State = 0;



// splash 48x26
const unsigned char splash1 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00,
  0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
  0x00, 0x00, 0x00, 0x00, 0x07, 0xb9, 0xce, 0x78, 0x0f, 0xc0, 0x0f, 0xf9, 0xcf, 0xfc, 0x1f, 0xe0,
  0x1f, 0xf9, 0xcf, 0xfe, 0x3f, 0xf0, 0x3c, 0x79, 0xcf, 0x1e, 0x38, 0x78, 0x38, 0x39, 0xce, 0x0e,
  0x70, 0x38, 0x38, 0x39, 0xce, 0x0e, 0x70, 0x38, 0x38, 0x39, 0xce, 0x0e, 0x70, 0x38, 0x38, 0x39,
  0xce, 0x0e, 0x70, 0x38, 0x38, 0x39, 0xce, 0x0e, 0x70, 0x38, 0x3c, 0x79, 0xce, 0x0e, 0x78, 0x70,
  0x1f, 0xf9, 0xce, 0x0e, 0x3f, 0xf0, 0x0f, 0xf9, 0xce, 0x0e, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x10, 0x25, 0x37, 0x53, 0x90, 0xe1, 0xb8, 0x29, 0x22,
  0x51, 0xd0, 0x93, 0x90, 0x19, 0x22, 0x52, 0x50, 0x92, 0x10, 0x11, 0x23, 0x73, 0xd0, 0xf1, 0x98,
  0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

//splash dino 80x40
const unsigned char splash2 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xff, 0xe0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
  0xe1, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x3e, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x5e, 0xc1, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x80, 0x2f,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x01, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x07, 0xf4,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, 0xe0, 0x1f, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
  0xaa, 0xbc, 0x7f, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x55, 0x5f, 0xff, 0xa0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0xea, 0xaa, 0xaf, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd5, 0x55, 0xff,
  0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xab, 0xae, 0xbf, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x1f, 0x5f, 0xdf, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xee, 0xfb, 0x6f, 0xf4, 0x00,
  0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf7,
  0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00,
  0x00, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdf, 0xff, 0xfe, 0xfe,
  0x80, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xef, 0xef, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff,
  0x9f, 0xdf, 0xff, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x1f, 0xa1, 0xfc, 0x7f, 0x80, 0x00,
  0x0f, 0xff, 0xff, 0xe0, 0x1f, 0xb0, 0x03, 0xbf, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x0f, 0xc0,
  0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

// front grass 32x10
const unsigned char grass_front [] PROGMEM = {
  0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x08, 0x89, 0xc0, 0x48, 0x5c, 0x50, 0x84,
  0x9c, 0x48, 0x50, 0x22, 0x88, 0x80, 0x44, 0x22, 0x40, 0x84, 0x2e, 0x21, 0x49, 0x24, 0xa4, 0xb1,
};

//grass 2 (dino walking on) 4x8
const unsigned char grass [] PROGMEM = {
  0xff, 0xee, 0xbb, 0x55, 0xaa, 0x11,
};

//trees
const unsigned char trees [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x10, 0x05, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x15, 0x00,
  0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0x40, 0x00, 0x55, 0x40, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x15, 0x04, 0x40, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x02, 0xa0, 0x00, 0x00, 0x01, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  0x00, 0x28, 0x84, 0x24, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x82, 0x00,
  0x00, 0x01, 0x10, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00,
  0x41, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x88, 0x82, 0x40, 0x91, 0x04, 0x24,
  0x41, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x44, 0x44, 0x11, 0x04, 0x10, 0x11, 0x04, 0x01, 0x00, 0x00,
  0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
  0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x10, 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00,
  0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
};

const unsigned char mountains [] PROGMEM = {
  0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
  0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
  0x03, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
  0x07, 0x74, 0x07, 0x80, 0x10, 0x00, 0x00, 0x80, 0x00, 0x06, 0x80, 0x00, 0x00, 0x00, 0x00, 0xd5,
  0x0e, 0xc2, 0x0d, 0xc0, 0x28, 0x01, 0x01, 0xc1, 0x00, 0x1f, 0x40, 0x00, 0x00, 0x00, 0x01, 0x28,
  0x1d, 0x13, 0x1b, 0x60, 0x54, 0x03, 0x83, 0xa3, 0x80, 0x36, 0x20, 0x00, 0x00, 0x00, 0x06, 0xd0,
  0x3a, 0x41, 0xb4, 0x30, 0xe2, 0xcc, 0xf7, 0x57, 0xc0, 0xd8, 0x10, 0x00, 0x00, 0x00, 0x19, 0x20,
  0x68, 0x84, 0x49, 0x19, 0xa1, 0x36, 0x5d, 0x2a, 0xa1, 0xa0, 0x10, 0x00, 0x00, 0x00, 0xe6, 0x40,
  0xd2, 0x10, 0xa4, 0x0c, 0x80, 0x8c, 0x1a, 0x15, 0x57, 0x40, 0x88, 0x00, 0x00, 0x1f, 0x38, 0x80,
  0x49, 0x08, 0x00, 0x06, 0x02, 0xc0, 0x24, 0x18, 0x0b, 0x80, 0x05, 0x0b, 0x8c, 0xe0, 0x23, 0x00,
  0xa0, 0x20, 0x00, 0x11, 0x00, 0x00, 0x48, 0x84, 0x84, 0x02, 0x20, 0x5d, 0xf3, 0x00, 0xcd, 0xc0,
  0x50, 0x00, 0x04, 0x04, 0x01, 0x44, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x04, 0x07, 0x10, 0x20,
  0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x10,
  0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x01, 0x11, 0x01, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x20, 0x02,
};

const unsigned char cloud2 [] PROGMEM = {
  0x04, 0x70, 0x18, 0x00, 0x6e, 0xfb, 0x7c, 0xee, 0xff, 0xff, 0xfd, 0xff, 0x6f, 0xfb, 0x38, 0xee,
  0x07, 0x70, 0x52, 0x00,
};

// walking sprites
// walk right
const unsigned char dinoWalk0 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x60, 0x00,
  0x00, 0x00, 0x1f, 0xf1, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x7b, 0xff,
  0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x00, 0x00, 0x03, 0xff, 0x7f, 0xe0, 0x00, 0x00, 0x0f,
  0xf7, 0xde, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x3c, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x7a, 0x00, 0x00,
};

const unsigned char dinoWalk1 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x60, 0x00,
  0x00, 0x00, 0x1f, 0xf1, 0xf0, 0x00, 0x00, 0x00, 0x37, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x7f, 0xff,
  0xfc, 0x00, 0x00, 0x00, 0xff, 0x7f, 0xd8, 0x00, 0x00, 0x03, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f,
  0xbf, 0xda, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00,
};

const unsigned char dinoWalk2 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x60, 0x00,
  0x00, 0x00, 0x1b, 0xf1, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x7f, 0x7f,
  0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x00, 0x00, 0x03, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f,
  0xbf, 0xfa, 0x00, 0x00, 0x00, 0x7f, 0x78, 0x3c, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x5e, 0x00, 0x00,
};

// walk left
const unsigned char dinoWalk3 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xe0, 0x00, 0x00,
  0x00, 0x0f, 0x8f, 0xf8, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xde,
  0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, 0xfe, 0xff, 0xc0, 0x00, 0x00, 0x00,
  0x7b, 0xef, 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x5e, 0x3d, 0x00, 0x00,
};

const unsigned char dinoWalk4 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xe0, 0x00, 0x00,
  0x00, 0x0f, 0x8f, 0xf8, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xec, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfe,
  0x00, 0x00, 0x00, 0x1b, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00,
  0x5b, 0xfd, 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00,
};

const unsigned char dinoWalk5 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xe0, 0x00, 0x00,
  0x00, 0x0f, 0x8f, 0xd8, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0xfe,
  0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00,
  0x5f, 0xfd, 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x1e, 0xfe, 0x00, 0x00, 0x00, 0x7a, 0x2f, 0x00, 0x00,
};


/* --------- GAME SPRITES ---------- */
const unsigned char dinoJump [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x60, 0x00,
  0x00, 0x00, 0x1f, 0xf1, 0xf0, 0x00, 0x00, 0x00, 0x3b, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x7f, 0xdf,
  0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x00, 0x00, 0x03, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f,
  0xff, 0xfe, 0x00, 0x00, 0x00, 0x7d, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x07, 0x80, 0x00,

};

const unsigned char obstacle1 [] PROGMEM = {
  0x00, 0x00, 0x1e, 0x00, 0x2f, 0x00, 0x5e, 0x80, 0x5f, 0xc0, 0xb7, 0xc0,
};

const unsigned char obstacle2 [] PROGMEM = {
  0x14, 0x00, 0x08, 0x00, 0x52, 0x00, 0x34, 0x00, 0x69, 0x40, 0xf0, 0x80,
};

const unsigned char poop [] PROGMEM = {
  0x80, 0x88, 0x01, 0x81, 0x02, 0xe0, 0x27, 0x10, 0x0b, 0xf0, 0x1c, 0x08,
};


#define WALKSIZE 6
//const unsigned char* const dinoWalk[WALKSIZE] PROGMEM = {
const unsigned char* dinoWalk[WALKSIZE] = {
  //dinoWalk0,dinoWalk0,dinoWalk1,dinoWalk1,dinoWalk2,dinoWalk2,
  //dinoWalk3,dinoWalk3,dinoWalk4,dinoWalk4,dinoWalk5,dinoWalk5
  dinoWalk0, dinoWalk1, dinoWalk2,
  dinoWalk3, dinoWalk4, dinoWalk5
};

int walkPos = 0;
int walkXPos = 0;
bool walkAnimReverse = false;
bool walkRight = false;
int walkDirOffset = 2;


// EATING
const unsigned char eating1 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff,
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00,
  0x7f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfc, 0x00,
  0x00, 0x03, 0x7c, 0x7f, 0xfe, 0x00, 0x00, 0x02, 0xf9, 0xff, 0xfe, 0x00, 0x00, 0x0c, 0xf3, 0xff,
  0xff, 0x00, 0x00, 0x1f, 0xf4, 0x7f, 0xff, 0x80, 0x00, 0x7f, 0xf0, 0x7f, 0xff, 0xc0, 0x00, 0xff,
  0xf8, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0,
  0x1f, 0xe7, 0xff, 0xe0, 0xff, 0xe0, 0x3f, 0xdf, 0xff, 0xde, 0xff, 0xf0, 0x7f, 0xbf, 0xff, 0xbf,
  0x7f, 0xf0, 0x7f, 0x7f, 0xfe, 0x77, 0xbf, 0xf8, 0x7f, 0x7f, 0xf9, 0xf7, 0xbf, 0xfc, 0x3f, 0xff,
  0xe7, 0xef, 0xbf, 0xfe, 0x5f, 0xfe, 0x1f, 0x1f, 0xbf, 0xff, 0x67, 0xf1, 0xf9, 0x1f, 0xbf, 0xff,
  0x38, 0x0f, 0xe8, 0x3f, 0xbf, 0xff, 0x1f, 0xff, 0xe0, 0x3f, 0xbf, 0xff, 0x0e, 0xfe, 0x40, 0xbf,
  0x6f, 0xff, 0x04, 0x54, 0x00, 0xff, 0x57, 0xff, 0x00, 0x10, 0x01, 0xfe, 0xab, 0xff, 0x00, 0x18,
  0x01, 0xfd, 0x55, 0xff, 0x00, 0x18, 0x05, 0xfa, 0xaa, 0xff, 0x00, 0x1d, 0x27, 0xf1, 0x55, 0x5f,
  0x00, 0x0f, 0x7f, 0xe0, 0xaa, 0xaf, 0x00, 0x07, 0xff, 0x80, 0x55, 0x57, 0x00, 0x03, 0xfe, 0x00,
  0x2a, 0xab, 0x00, 0x01, 0xf0, 0x00, 0x15, 0x55, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xaa, 0x00, 0x00,
  0x00, 0x00, 0x05, 0x55, 0x00, 0x00, 0x00, 0x00, 0x02, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x55,
};

const unsigned char eating2 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff,
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00,
  0x7f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfc, 0x00,
  0x00, 0x03, 0x7c, 0x7f, 0xfe, 0x00, 0x00, 0x02, 0xf9, 0xff, 0xfe, 0x00, 0x00, 0x0c, 0xf3, 0xff,
  0xff, 0x00, 0x00, 0x1f, 0xf4, 0x7f, 0xff, 0x80, 0x00, 0x7f, 0xf0, 0x7f, 0xff, 0xc0, 0x00, 0xff,
  0xf8, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0,
  0x1f, 0xe7, 0xff, 0xe0, 0xff, 0xe0, 0x3f, 0xdf, 0xff, 0xde, 0xff, 0xf0, 0x7f, 0xbf, 0xff, 0xbf,
  0x7f, 0xf0, 0x7f, 0x7f, 0xfe, 0x77, 0xbf, 0xf8, 0x7f, 0x7f, 0xf9, 0xf7, 0xbf, 0xfc, 0x3f, 0xff,
  0xe7, 0xef, 0xbf, 0xfe, 0x5f, 0xfe, 0x1f, 0x1f, 0xbf, 0xff, 0x67, 0xf1, 0xf9, 0x1f, 0xbf, 0xff,
  0x38, 0x0f, 0xe8, 0x3f, 0xbf, 0xff, 0x1f, 0xff, 0xe1, 0x7f, 0x3f, 0xff, 0x0e, 0xfe, 0x41, 0xfe,
  0xef, 0xff, 0x04, 0xd4, 0x0b, 0xfd, 0x57, 0xff, 0x00, 0xd4, 0x0f, 0xfa, 0xab, 0xff, 0x00, 0x60,
  0x9f, 0xf5, 0x55, 0xff, 0x00, 0x75, 0xff, 0xca, 0xaa, 0xff, 0x00, 0x3f, 0xff, 0x05, 0x55, 0x5f,
  0x00, 0x1f, 0xfc, 0x02, 0xaa, 0xaf, 0x00, 0x07, 0xc0, 0x01, 0x55, 0x57, 0x00, 0x00, 0x00, 0x00,
  0xaa, 0xab, 0x00, 0x00, 0x00, 0x00, 0x15, 0x55, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xaa, 0x00, 0x00,
  0x00, 0x00, 0x05, 0x55, 0x00, 0x00, 0x00, 0x00, 0x02, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x55,
};

const unsigned char eating3 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff,
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00,
  0x7f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfc, 0x00,
  0x00, 0x03, 0x7c, 0x7f, 0xfe, 0x00, 0x00, 0x02, 0xf9, 0xff, 0xfe, 0x00, 0x00, 0x0c, 0xf3, 0xff,
  0xff, 0x00, 0x00, 0x1f, 0xf4, 0x7f, 0xff, 0x80, 0x00, 0x7f, 0xf0, 0x7f, 0xff, 0xc0, 0x00, 0xff,
  0xf8, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0,
  0x1f, 0xe7, 0xff, 0xe0, 0xff, 0xe0, 0x3f, 0xdf, 0xff, 0xde, 0xff, 0xf0, 0x7f, 0xbf, 0xff, 0xbf,
  0x7f, 0xf0, 0x7f, 0x7f, 0xfe, 0x77, 0xbf, 0xf8, 0x7f, 0x7f, 0xf9, 0xf7, 0xbf, 0xfc, 0x3f, 0xff,
  0xe7, 0xef, 0xbf, 0xfe, 0x5f, 0xfe, 0x1f, 0xdf, 0xbf, 0xff, 0x67, 0xf1, 0xff, 0x3f, 0xbf, 0xff,
  0x38, 0x0f, 0xfc, 0xff, 0xbf, 0xff, 0x1f, 0xff, 0xf3, 0xff, 0x3f, 0xff, 0x0f, 0xff, 0xcf, 0xfe,
  0xef, 0xff, 0x00, 0x38, 0x3f, 0xf9, 0x57, 0xff, 0x07, 0x83, 0xff, 0xea, 0xab, 0xff, 0x01, 0xff,
  0xfe, 0x15, 0x55, 0xff, 0x00, 0xff, 0xf0, 0x0a, 0xaa, 0xff, 0x00, 0x3f, 0xc0, 0x05, 0x55, 0x5f,
  0x00, 0x00, 0x00, 0x02, 0xaa, 0xaf, 0x00, 0x00, 0x00, 0x05, 0x55, 0x57, 0x00, 0x00, 0x00, 0x02,
  0xaa, 0xab, 0x00, 0x00, 0x00, 0x01, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
  0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x55,
};

const unsigned char* eating[4] = {
  eating1, eating2, eating3, eating2
};

//const unsigned char apple0 [] PROGMEM = {
const unsigned char apple [] PROGMEM = {
  0x00, 0x01, 0xf0, 0x00, 0x07, 0xe0, 0x00, 0x0f, 0xe0, 0x3f, 0x1f, 0xc0, 0x00, 0xdf, 0x80, 0x00,
  0x20, 0x00, 0x0f, 0xd7, 0xf0, 0x3f, 0xff, 0xfc, 0x7f, 0xff, 0xfe, 0x78, 0xff, 0xfe, 0xf0, 0x7f,
  0xff, 0xe0, 0x7f, 0xff, 0xe0, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfe, 0x7f, 0xff, 0xfe, 0x3f, 0xff, 0xfc, 0x1f,
  0xff, 0xf8, 0x0f, 0xff, 0xf0, 0x07, 0xc3, 0xe0,
};

const unsigned char steak [] PROGMEM = {
  0x0f, 0xe0, 0x00, 0x3f, 0xf8, 0x00, 0x31, 0xfe, 0x00, 0x6e, 0x7f, 0x00, 0xd1, 0x7f, 0x80, 0xa0,
  0xbf, 0x80, 0xa0, 0xbf, 0xc0, 0xa0, 0xbf, 0xc0, 0xd1, 0x3f, 0xc0, 0xae, 0xff, 0xe0, 0xd1, 0xff,
  0xe0, 0xef, 0xff, 0xe0, 0x77, 0xff, 0xf0, 0x7b, 0xff, 0xd0, 0x3d, 0xff, 0x78, 0x1e, 0xf9, 0xfe,
  0x0f, 0x67, 0xff, 0x07, 0x7f, 0xff, 0x03, 0x9f, 0xfc, 0x03, 0xc3, 0xf9, 0x01, 0xf8, 0xc3, 0x00,
  0xff, 0x1e, 0x00, 0x1f, 0xfe, 0x00, 0x01, 0xfc,
};


//ground
int grassXPos = 0;
float treesXPos = -20;
//sky
float couldsXPos = 0;
const int sunRadius = 3;
bool sunOrMoon = false;
const int moonShadow = 2;
float sunXPos = -2 * sunRadius;
//clouds
const int cloud1Width = 32;
float cloud1XPos = display.width() + cloud1Width;

int stars [6][2];

// menus
bool menuOpened = false;
int menu = 0;
int subMenu = 1;
bool menuDepth = false;
bool justOpened = false;
#define MENUSIZE 8
#define STRING_SIZE 11

const char mainMenu[MENUSIZE][8][STRING_SIZE] PROGMEM = {
  {"food", "apple", "steak", "water", NULL},
  {"game", NULL},
  {"sleep", NULL},
  {"clean", NULL},
  {"doctor", NULL},
  {"discipline", NULL},
  {"stats", "hunger", "happiness", "health", "discipline", "weight", "age", NULL},
  { "settings", "sound",
    //"something",
    NULL
  },
};

/* ------- PET STATS ------- */

float hunger = 100;
float happiness = 100;
float health = 100;
float discipline = 100;
float weight = 1;
float age = 0;

//settings
bool soundEnabled = true;

int action = 0;
int setting = 0;

bool notification = false;
int notificationBlink = 0;
bool dead = false;

bool sleeping = false;

//game
bool game = false;
bool paused = false;
bool gameOver = false;
int score = 0;
int hiScore = 0;
int level = 0;
bool newHiScore = false;
bool jumping = false;
bool jumpUp = true;
int jumpPos = 0;
bool obstacle1show = false;
bool obstacle2show = false;
int obstacle1XPos = 0;
int obstacle2XPos = 0;

float poopometer = 0;
int poops [3] = {
  0, 0, 0,
};

#define ACTIVATED LOW

void setup() {
  /*
    pinMode(button1Pin, INPUT);
    pinMode(button2Pin, INPUT);
    pinMode(button3Pin, INPUT);

    digitalWrite(button1Pin, HIGH);
    digitalWrite(button2Pin, HIGH);
    digitalWrite(button3Pin, HIGH);
  */

  // or just
  pinMode(button1Pin, INPUT_PULLUP);
  pinMode(button2Pin, INPUT_PULLUP);
  pinMode(button3Pin, INPUT_PULLUP);

  pinMode(sound, OUTPUT);

  pinMode(13, OUTPUT);

  randomSeed(analogRead(0));

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();

  // splash
  display.setTextColor(WHITE);
  //display.println(F("jakobdesign presents"));
  display.print(F(" jakobdesign presents"));
  display.drawBitmap(15, 24, splash1, 48, 26, WHITE);
  display.drawBitmap(48, 24, splash2, 80, 40, WHITE);
  display.display();

  //splash tone

  tone(sound, 500, 200);
  delay(200);
  tone(sound, 1000, 200);
  delay(400);
  tone(sound, 700, 200);
  delay(200);
  tone(sound, 1100, 200);

  delay(2200);
  // end splash

  display.clearDisplay();
}



void loop() {
  button1State = digitalRead(button1Pin);
  button2State = digitalRead(button2Pin);
  button3State = digitalRead(button3Pin);

  //char* str = "";

  if (!dead) {
    /* -------- MODIFY PET STATS -------- */
    // TODO: different gradients regarding to age
    if (sleeping) {
      hunger -= 0.00005;
      poopometer += 0.00005;
      if (happiness - 0.0001 > 0) {
        happiness -= 0.0001;
      }
      health -= 0.00005 + countPoops() * 0.0001;
      if (discipline - 0.0001 > 0) {
        discipline -= 0.0001;
      }
    } else {
      hunger -= 0.00025;
      poopometer += 0.00025;
      if (happiness - 0.0002 > 0) {
        happiness -= 0.0002;
      }
      health -= 0.0001 + countPoops() * 0.0001;
      if (discipline - 0.0002 > 0) {
        discipline -= 0.0002;
      }
      //discipline-=0.02;
    }
    age += 0.0000025;

    //diarrhea :) for testing
    //poopometer+=0.005;

    //health-=1;
    //health-=countPoops()*0.0001;
    //health-=countPoops()*0.05;

    if (poopometer >= 10) {
      poopometer = countPoops();
      poops[lround(poopometer)] = random(20, display.width() + 32);
      if (soundEnabled) {
        tone(sound, 200, 50);
      }
      poopometer = 0;
    }

    if ((hunger > 19.99975 && hunger < 20.00025) || (happiness > 19.9998 && happiness < 20.0002) || (health > 19.9999 && health < 20.0001) && soundEnabled) {
      if (soundEnabled) {
        tone(sound, 200, 50);
      }
    }

    if (hunger <= 20 || countPoops() > 0 || happiness <= 20 || health <= 20) {
      notification = true;
    }
    if (hunger > 20 && countPoops() == 0 && happiness > 20 && health > 20) {
      notification = false;
      digitalWrite(13, LOW);
    }

    if (hunger <= 0 || health <= 0 || happiness <= 0) {
      dead = true;
      if (soundEnabled) {
        tone(sound, 500, 500);
        delay(550);
        tone(sound, 400, 500);
        delay(550);
        tone(sound, 300, 600);
      }
    }

    display.clearDisplay();
    display.setCursor(0, 0);

    /* ------- BUTTON PRESS ACTIONS ------- */

    /* ------- BUTTON 1 - MENU ------- */
    if (button1State == ACTIVATED) {

      // JUMP IN GAME
      if (game) {
        if (!jumping && !paused) {
          if (soundEnabled) {
            tone(sound, 200, 50);
          }
          jumping = true;
        }

      } else {
        // MENU
        if (soundEnabled) {
          tone(sound, 300, 80);
        }

        if (!menuOpened) {
          menuOpened = true;
        } else {
          if (menuDepth) {

            if ((const char*)pgm_read_word(&(mainMenu[menu][subMenu + 1])) == NULL) {
              subMenu = 1;
            } else {
              ++subMenu;
            }
            setting = 100 * (menu + 1) + subMenu;
          } else {
            if (menu == MENUSIZE - 1) {
              menu = 0;
            } else {
              ++menu;
            }

            if ((const char*)pgm_read_word(&(mainMenu[menu][1])) != NULL) {
              subMenu = 1;

              justOpened = true;
            }
            setting = 100 * (menu + 1) + subMenu;
          }
        }
        delay(60);
      }

    }
    /* ------- BUTTON 2 - SELECT ------- */
    if (button2State == ACTIVATED) {

      if (game) {
        if (!gameOver) {
          paused = !paused;
          if (soundEnabled) {
            tone(sound, 600, 80);
          }
          delay(60);
        }
      } else {
        if (soundEnabled) {
          tone(sound, 600, 80);
        }

        if (menuOpened) {
          if (subMenu != 1 && (const char*)pgm_read_word(&(mainMenu[menu][1][0])) != NULL) {
            action = 100 * (menu + 1) + subMenu;
          }
          if (subMenu == 1 && (const char*)pgm_read_word(&(mainMenu[menu][1][0])) == NULL) {
            action = 100 * (menu + 1) + subMenu;
          }
          if (subMenu == 1 && (const char*)pgm_read_word(&(mainMenu[menu][1][0])) != NULL && menuDepth) {
            action = 100 * (menu + 1) + subMenu;
          }
          if ((const char*)pgm_read_word(&(mainMenu[menu][1][0])) != NULL) {
            setting = 100 * (menu + 1) + subMenu;
            menuDepth = true;
          }
        } else {
          action = NULL;

          menuOpened = true;
          menuDepth = true;
          subMenu = 1;
          menu = 6;
          action = 701;
          setting = 701;
        }
        justOpened = false;

        delay(60);
      }
    }

    /* ------- BUTTON 3 - BACK ------- */
    if (button3State == ACTIVATED) {
      if (soundEnabled) {
        tone(sound, 1000, 80);
      }

      if (game || gameOver) {
        walkPos = 0;
        walkXPos = 0;
        walkAnimReverse = false;
        walkRight = true;
        walkDirOffset = 0;
        treesXPos = -20;
        grassXPos = 0;
        obstacle1show = false;
        obstacle2show = false;
        jumping = false;
        jumpPos = 0;
        jumpUp = true;
        game = false;
        score = 0;
        newHiScore = false;
        gameOver = false;
        level = 0;
        paused = false;
      } else {
        if (!menuDepth) {
          menuOpened = false;
          menu = 0;
          setting = 0;
        } else {
          menuDepth = false;
          setting = 100 * (menu + 1) + 1;
        }
        action = NULL;
        subMenu = 1;
      }
      delay(60);
    }


    /* ------- SCENERY AND WALKING ------- */

    //draw sun
    sunXPos += 0.1;
    if (sunXPos > display.width() + 2 * sunRadius) {
      sunXPos = -2 * sunRadius;
      sunOrMoon = !sunOrMoon;
    }
    if (sleeping) {
      sunOrMoon = true;
    }

    if (sleeping) {
      sunOrMoon = true;
    }

    if (!sunOrMoon) {
      display.fillCircle(sunXPos, 2 * sunRadius, sunRadius, WHITE);
    } else {
      display.fillCircle(sunXPos, 2 * sunRadius, sunRadius, WHITE);
      display.fillCircle(sunXPos - moonShadow, 2 * sunRadius, sunRadius, BLACK);
      //if(walkPos == 5){
      if (lround(cloud1XPos) % 5 == 0) {
        for (int i = 0; i < 6; i++) {
          stars[i][0] = random(0, display.width());
          stars[i][1] = random(0, 10);
        }
      } else {
        for (int i = 0; i < 6; i++) {

          display.drawPixel(stars[i][0], stars[i][1], WHITE);
        }
      }
    }

    //cloud 1
    cloud1XPos -= 0.3;
    if (cloud1XPos < -cloud1Width) {
      cloud1XPos = display.width() + cloud1Width;
    }
    display.drawBitmap(cloud1XPos, 5, cloud2, cloud1Width, 5, WHITE);

    //mountains
    display.drawBitmap(0, 7, mountains, 128, 16, WHITE);

    //walk and move ground perspective

    if (game) {

      /* ------ GAME -----*/
      level = lround(score / 10);

      if (jumping && !gameOver && !paused) {
        if (jumpUp) {
          jumpPos = jumpPos + 1 + level;
          if (jumpPos >= 12) {
            jumpUp = false;
          }
        } else {
          //jumpPos--;
          jumpPos = jumpPos - 1 - level;
          if (jumpPos <= 0) {
            jumpUp = true;
            jumping = false;
            if (soundEnabled) {
              tone(sound, 100, 50);
            }
            score += 1;
          }
        }
      }

      if (!gameOver && !paused) {
        if (walkAnimReverse) {
          walkPos -= 1;
          if (walkPos == -1) {
            walkPos = 0;
            walkAnimReverse = false;
          }
        } else {
          walkPos += 1;
          if (walkPos == 3) {
            walkPos = 2;
            walkAnimReverse = true;
          }
        }

        walkXPos += 2;
        grassXPos += 4;
        treesXPos = treesXPos + 1 + level;
        obstacle1XPos = obstacle1XPos + 2 + level;
        obstacle2XPos = obstacle2XPos + 2 + level;

        if (!jumping &&
            (
              (obstacle1show && display.width() - obstacle1XPos >= 20 && display.width() - obstacle1XPos <= 46)
              ||
              (obstacle2show && display.width() - obstacle2XPos >= 20 && display.width() - obstacle2XPos <= 46)
            )
           ) {
          gameOver = true;
          jumping = true;
          jumpPos = -2;
          if (soundEnabled) {
            tone(sound, 500, 40);
            delay(50);
            tone(sound, 350, 40);
            delay(50);
            tone(sound, 200, 60);
          }

          if (score > hiScore) {
            hiScore = score;
            newHiScore = true;
          }
          if (happiness + 15 < 100) {
            happiness += 15;
          } else {
            happiness = 100;
          }
          health -= 1;
          if (weight - score * 0.0025 > 5) {
            weight -= score * 0.0025;
          }
        }
      }

      if (walkXPos == display.width()) {
        walkXPos = 0;
      }
      if (grassXPos == display.width()) {
        grassXPos = 0;
      }
      if (treesXPos == display.width()) {
        treesXPos = -128;
      }

      if (jumping) {
        display.drawBitmap(10, 26 - jumpPos, dinoJump, 48, 24, WHITE);
      } else {
        display.drawBitmap(10, 26, dinoWalk[walkPos], 48, 24, WHITE);
      }

      for (int i = 0; i < display.width() / 4 + 1; i++) {
        display.drawBitmap(-walkXPos + i * 8, 50, grass, 8, 6, WHITE);
      }


      // obstacles 1

      if (obstacle1XPos - 16 >= display.width()) {
        obstacle1XPos = 0;
        obstacle1show = false;
      }
      if (!obstacle1show && random(1, 10) == 1 && obstacle2XPos > 40) {
        obstacle1show = true;
        obstacle1XPos = 0;
      }
      if (obstacle1show) {
        display.drawBitmap(display.width() - obstacle1XPos, 44, obstacle1, 16, 6, WHITE);
      }

      // obstacles 2
      if (obstacle2XPos - 16 >= display.width()) {
        obstacle2XPos = 0;
        obstacle2show = false;
      }
      if (!obstacle2show && random(1, 10) == 1 && obstacle1XPos > 40) {
        obstacle2show = true;
        obstacle2XPos = 0;
      }

      if (obstacle2show) {
        display.drawBitmap(display.width() - obstacle2XPos, 44, obstacle2, 16, 6, WHITE);
      }

      //draw front grass
      for (int i = 0; i < display.width() / 16 + 1; i++) {
        display.drawBitmap(-grassXPos + i * 32, 60, grass_front, 32, 8, WHITE);
      }
      //draw trees
      display.drawBitmap(-treesXPos, 23, trees, 112, 20, WHITE);

      if (!gameOver) {
        display.setCursor(0, 56);
        display.setTextColor(WHITE);
        display.print(F("lvl: "));
        display.print(level);
        display.setCursor(64, 56);
        display.setTextColor(WHITE);
        display.print(F("pts: "));
        display.print(score);
      }

      if (paused && lround(cloud1XPos) % 2 == 0) {
        display.fillRect(24, 11, 80, 15, BLACK);
        display.fillRect(25, 12, 78, 13, WHITE);
        display.setCursor(47, 15);
        display.setTextColor(BLACK);
        display.println(F("PAUSED"));
      }

      /* ---------- END GAME ----------*/

    } else {

      /* ------ NO GAME -----*/
      if (!sleeping) {
        display.drawBitmap(walkXPos, 26, dinoWalk[walkPos + walkDirOffset], 48, 24, WHITE);
      } else {
        display.drawBitmap(walkXPos, 29, dinoWalk[walkPos + walkDirOffset], 48, 24, WHITE);
        if (walkRight) {
          if (lround(cloud1XPos) % 3 == 0) {
            display.setCursor(walkXPos + 48, 36);
            display.print(F("Z"));
          } else {
            display.setCursor(walkXPos + 46, 38);
            display.print(F("z"));
          }
        } else {
          if (lround(cloud1XPos) % 3 == 0) {
            display.setCursor(walkXPos - 4, 36);
            display.print(F("Z"));
          } else {
            display.setCursor(walkXPos - 2, 38);
            display.print(F("z"));
          }
        }
      }
      if (walkRight) {
        if (!sleeping) {
          walkXPos += 1;
          grassXPos += 2;
          treesXPos += 0.5;
        }
        if (walkXPos > 80) {
          walkRight = false;
          walkDirOffset = 3;
        }
      } else {
        if (!sleeping) {
          walkXPos -= 1;
          grassXPos -= 2;
          treesXPos -= 0.5;
        }
        if (walkXPos < 0) {
          walkRight = true;
          walkDirOffset = 0;
        }
      }

      //draw grass (ground)
      for (int i = 0; i < 2 * display.width() / 4; i++) {
        display.drawBitmap(-walkXPos + i * 8, 50, grass, 8, 6, WHITE);
      }
      // draw poops
      for (int i = 0; i < 3; i++) {
        if (poops[i] > 0) {
          display.drawBitmap(-walkXPos + poops[i], 44, poop, 16, 6, WHITE);
        }
      }
      //draw front grass
      for (int i = 0; i < 2 * display.width() / 16; i++) {
        display.drawBitmap(-grassXPos + i * 32, 56, grass_front, 32, 8, WHITE);
      }
      //draw trees
      display.drawBitmap(-treesXPos, 23, trees, 112, 20, WHITE);


      if (!sleeping) {
        if (walkAnimReverse) {
          --walkPos;
          if (walkPos == -1) {
            walkPos = 0;
            walkAnimReverse = false;
          }
        } else {
          ++walkPos;
          if (walkPos == 3) {
            walkPos = 2;
            walkAnimReverse = true;
          }
        }
      }
    }


    /* ------- MENUS AND ACTIONS ------- */
    //render menu
    if (menuOpened and !game) {
      display.fillRect(0, 0, display.width(), 30, BLACK);
      display.drawRect(0, 0, display.width(), 29, WHITE);
      display.fillRect(1, 1, display.width() - 2, 27, BLACK);
      display.drawRect(0, 0, display.width(), 12, WHITE);
      display.setCursor(8, 2);
      display.setTextSize(1);
      if (menuDepth) {
        display.fillRect(0, 0, display.width(), 12, WHITE);
        display.fillRect(1, 18, 1, 5, WHITE);
        display.fillRect(2, 19, 1, 3, WHITE);
        display.fillRect(3, 20, 1, 1, WHITE);
        display.setTextColor(BLACK, WHITE);
      } else {
        display.fillRect(1, 3, 1, 5, WHITE);
        display.fillRect(2, 4, 1, 3, WHITE);
        display.fillRect(3, 5, 1, 1, WHITE);
        display.setTextColor(WHITE);
      }
      char oneItem [STRING_SIZE];
      memcpy_P (&oneItem, &mainMenu[menu][0], sizeof oneItem);
      //display.println(getItem(menu,0));
      display.println(oneItem);
      if (subMenu) {
        display.setTextColor(WHITE);
        display.setCursor(8, 16);
        char subItem [STRING_SIZE];
        memcpy_P (&subItem, &mainMenu[menu][subMenu], sizeof subItem);
        //display.println(getItem(menu,subMenu));
        display.println(subItem);
      }
    }

    //do actions

    if (action > 0) {
      if ((action == 101 || action == 102 || action == 103) && !sleeping && random(1, (11 - lround(discipline / 10))) == 1 ) {
        //95-100 discipline = 100% chance to feed
        //85-95 discipline = 50% chance
        //75-85 discipline = 33.33% chance
        //65-75 discipline = 25% chance
        //55-65 discipline = 20% chance
        //45-55 discipline = 16.67% chance
        //35-45 discipline = 14.28% chance
        //25-35 discipline = 12.5% chance
        //15-25 discipline = 12.5% chance
        //5-15 discipline = 10% chance
        //0-5 discipline = 9% chance

        //animate eating

        display.fillRect(0, 0, display.width(), display.height(), BLACK);
        for (int j = 0; j < 3; j++) {
          for (int i = 0; i < 4; i++) {
            display.clearDisplay();
            switch (action) {
              case 101:
                //apple
                display.drawBitmap(50, 40, apple, 24, 24, WHITE);
                if (j > 0) display.fillCircle(76, 54, 12, BLACK);
                if (j == 2) display.fillCircle(47, 55, 12, BLACK);
                break;
              case 102:
                //steak
                display.drawBitmap(50, 40, steak, 24, 24, WHITE);
                if (j > 0) display.fillCircle(76, 59, 13, BLACK);
                if (j == 2) display.fillCircle(60, 63, 13, BLACK);
                break;
              case 103:
                //water ripples
                display.drawCircle(80, 55, 1 + 1 * i, WHITE);
                display.drawCircle(80, 55, 5 + 2 * i, WHITE);
                display.drawCircle(80, 55, 10 + 4 * i, WHITE);
                break;
            }
            display.drawBitmap(80, 24, eating[i], 48, 40, WHITE);
            delay(150);
            display.display();
          }
        }

        switch (action) {
          //apple
          case 101:
            if (hunger + 10 > 100) {
              hunger = 100;
              weight += 0.1;
            } else {
              hunger += 10;
            }
            if (health + 1 <= 100) {
              health += 1;
            }
            poopometer += 0.02;
            break;
          //steak
          case 102:
            if (hunger + 20 > 100) {
              hunger = 100;
              weight += 0.2;
            } else {
              hunger += 20;
              weight += 0.1;
            }
            if (health - 1 > 0) {
              health -= 1;
            }
            poopometer += 0.05;
            break;
          //water
          case 103:
            if (hunger + 5 <= 100) {
              hunger += 5;
            }
            poopometer += 0.01;
            break;
        }
      } else {
        if (action == 101 || action == 102 || action == 103) {
          if (soundEnabled) {
            tone(sound, 500, 200);
            delay(250);
          }
        }
      }

      switch (action) {
        case 201:
          //game
          if (!sleeping && health > 20) {
            game = true;
            walkPos = 0;
            walkXPos = 0;
            walkAnimReverse = false;
            walkRight = false;
            walkDirOffset = 2;
            treesXPos = -20;
            grassXPos = 0;
          }
          break;
        case 301:
          //sleep
          sleeping = !sleeping;
          if (!sleeping) {
            sunOrMoon = false;
          } else {
            for (int i = 0; i < 6; i++) {
              stars[i][0] = random(0, display.width());
              stars[i][1] = random(0, 10);
            }
          }
          break;
        case 401:
          //bath
          resetPoops();
          break;
        case 501:
          //doctor
          if (health < 60) {
            health = 100;
            for (int i = 0; i < 5; i++) {
              display.clearDisplay();
              if (i % 2 != 0) {
                display.fillRect(32, 23, 64, 16, WHITE);
                display.fillRect(56, 0, 16, 64, WHITE);
              }
              display.display();
              delay(300);
            }
          }

          break;
        case 601:
          //discipline
          if (action == 601 && !sleeping) {
            if (discipline + 12 <= 100) {
              discipline += 12;
            } else {
              discipline = 100;
            }
            if (happiness - 3 > 0) {
              happiness -= 3;
            }
            delay(150);
            for (int i = 0; i < 5; i++) {
              if (soundEnabled) {
                tone(sound, 200 * i, 100);
              }
              display.setCursor(100 + 3 * i, 32);
              display.print(F("!"));
              display.display();
              delay(150);
            }
          }
          break;

        case 801:
          soundEnabled = !soundEnabled;
          break;
      }
      action = 0;
    }

    //display settings
    if (setting > 0 and !game) {
      display.setCursor(8, 16);
      if (setting == 201) {
        display.println(F("increase happiness"));
      }
      if (setting == 301) {
        display.println(F("get some rest"));
      }
      if (setting == 401) {
        display.println(F("keep it healthy"));
      }
      if (setting == 501) {
        display.println(F("when health is bad"));
      }
      if (setting == 601) {
        display.println(F("get smarter"));
      }
      if (setting == 701 || setting == 702 || setting == 703 || setting == 704) {
        display.drawRect(70, 17, 52, 7, WHITE);
      }
      if (setting == 701) {
        drawBar(hunger);
      }
      if (setting == 702) {
        drawBar(happiness);
      }
      if (setting == 703) {
        drawBar(health);
      }
      if (setting == 704) {
        drawBar(discipline);
      }
      if (setting == 705 || setting == 706 || setting == 801) {
        display.setCursor(80, 16);
      }
      if (setting == 705) {
        //display.setCursor(80,16);
        display.print(weight, 1);
        display.println(F(" t"));
      }
      if (setting == 706) {
        display.print(age, 1);
        display.println(F(" y."));
      }
      if (setting == 801) {
        if (soundEnabled) {
          display.println(F("on"));
        } else {
          display.println(F("off"));
        }
      }
    }

    //display notification
    if (notification) {
      ++notificationBlink;
      if (notificationBlink == 10) {
        notificationBlink = 0;
      }
      if (notificationBlink != 1) {
        display.drawRect(117, 28, 11, 11, WHITE);
        display.setTextColor(WHITE);
        digitalWrite(13, LOW);
      } else {
        display.fillRect(117, 28, 11, 11, WHITE);
        display.setTextColor(BLACK);
        digitalWrite(13, HIGH);
      }
      display.setCursor(120, 30);
      display.println(F("!"));
      if (dead) {
        digitalWrite(13, LOW);
      }
    }

    // GAME OVER
    if (gameOver) {

      display.fillRect(15, 11, 98, 43, BLACK);
      display.drawRect(16, 12, 96, 41, WHITE);
      display.fillRect(16, 12, 96, 13, WHITE);
      display.setCursor(36, 15);
      display.setTextColor(BLACK);
      display.println(F("GAME OVER"));
      display.setTextColor(WHITE);
      display.setCursor(21, 29);
      if (newHiScore) {
        display.println(F("NEW HI-SCORE!"));
        display.setCursor(21, 40);
      } else {
        display.println(F("SCORE:"));
        display.setCursor(21, 40);
      }
      display.println(score);
    }

    display.display();

  } else {
    //dead...
    display.clearDisplay();
    display.setCursor(0, 0);
    display.setTextColor(WHITE);
    display.println(F("Pet died...\n\nPress button 1\nto restart"));
    display.display();

    if (button1State == HIGH) {
      if (soundEnabled) {
        tone(sound, 300, 80);
        delay(200);
      }
      noTone(sound);
      asm volatile ("  jmp 0");
    }
  }
}

void drawBar(float value) {
  display.fillRect(72, 19, 48 * value / 100, 3, WHITE);
}

char* getItem(int menu, int index) {
  static char oneItem [STRING_SIZE];         // was a bug ! now 'static'
  memcpy_P (&oneItem, &mainMenu[menu][index], sizeof oneItem);
  return oneItem;
}

int countPoops() {
  int poopsCnt = 0;
  for (int i = 0; i < 3; i++) {
    if (poops[i] > 0) {
      ++poopsCnt;
    }
  }
  return poopsCnt;
}

void resetPoops() {
  for (int i = 0; i < 3; i++) {
    poops[i] = 0;
  }
}

There are some significant errors with the eeprom code, such as several instances of only allocating one byte of eeprom to store a float.

The processor used in the Pro Micro contains the USB port hardware, the bootloader is larger because of the code needed to control that, and that likely also contributes to the larger sketch size.

Thank you for this. I ordered a Pro Mini, hoping to receive it tomorrow. Are we able to get the EEPROM saves to work?

Your topic has been moved to a more suitable location on the forum as it has nothingto do with avrdude-stk500-bootloader-issues.

The major problem with the EEPROM saves is that the code is writing data to EEPROM constantly. The EEPROM has a wear limit of 100,000 writes to each address, so it will fail fairly rapidly, particularly with things like the age variable that are constantly changing. The code also uses EEPROM.write(), instead of EEPROM.put(). put() reads the EEPROM first, and only writes data if it has changed, while write() performs a write cycle unconditionally.

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