Недостаточно памяти или Not enough memory

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

В общем, решил сделать светильник с часами, взял два проекта, соеденил. Да вот беда, скетч получился слишком длинный. Как бы можно его убавить? Заранее могу сказать что температура мне нужна в цельсиях, т.е. убрать конвертацию, и время нужно только в 24 формате, т.е. конвертацию тоже можно убрать.

А что еще, ума не приложу. Вот, собственно, код:

#include <SPI.h> //Library for Adafruit communication to OLED display
#include <Wire.h> //I2C communication library
#include "ds3231.h" //Real Time Clock library
#include <Adafruit_GFX.h> //Graphics library
#include <Adafruit_SSD1306.h> //OLED display library
#include <IRremote.h> // библиотека IRremote

int RECV_PIN = 11; //вход ИК приемника

IRrecv irrecv(RECV_PIN);

decode_results results;


unsigned long Value100 = 0xFFC837; // переменная для хранения кода кнопки пульта - режим программирования

//Этот блог переменных дает возможность физический прописывать коды кнопок своего ИК пульта
// (как альтернатива программирования на лету с пульта)
// ВАЖНО !!! (1000809) это код кнопки - от моего пульта - у вашего пульта будет другой код - замените на свой 

unsigned long Value2 = 0xFF00FF;  // вкл пин 2
unsigned long Value3 = 0xFF807F;  // вкл пин 3
unsigned long Value4 = 0xFF40BF;  // вкл пин 4 
unsigned long Value5 = 0xFFC03F;  // вкл пин 4
unsigned long Value6 = 0xFF20DF;  // вкл пин 6
unsigned long Value7 = 0xFFA05F;  // вкл пин 7
//unsigned long Value8 = 0xFF708F;  // вкл пин 8
//unsigned long Value9 = 0xFF08F7;  // вкл пин 9

unsigned long Value10 = 0xFF48B7;    // выкл пин 2
unsigned long Value0 = 0xFF28D7;     // выкл пин 3
unsigned long Value11 = 0xFF609F;  //  выкл пин 4
unsigned long Value12 = 0xFFA857;  //  выкл пин 5
unsigned long Value13 = 0xFFE01F;  //  выкл пин 6
unsigned long Value14 = 0xFF906F;  //  выкл пин 7
//unsigned long Value15 = 0xFFF00F;  //  выкл пин 8
//unsigned long Value16 = 0xFF10EF;  //  выкл пин 9

unsigned long Value17 = 0xFF8877;      // вкл. все
unsigned long Value18 = 0xFF30CF;     // выкл. все




//Можно подать положительный сигнал на пин 14 (A0),  для начала программирования на лету.
//(как альтернатива начала программирования на лету с ИК пульта)//unsigned long Value100 =.

int butpin = 14;


//int q; // переменная q для хранения Bluetooth команд, пришедших через Bluetooth модуль HC-05.


//Даем имена пинам
int pultpin2 = 2;
int pultpin3 = 3;
int pultpin4 = 4;
int pultpin5 = 5;
int pultpin6 = 6;
int pultpin7 = 7;
//int pultpin8 = 8;
//int pultpin9 = 9;
//***

int ledpin[] = {
  2, 3, 4, 5, 6, 7}; // номера задействованных пинов, количество можно уменьшить или увеличить (по желанию)
int ledstate[] = {
  0, 0, 0, 0, 0, 0}; //количество  задействованных пинов, количество можно уменьшить или увеличить (по желанию)
int butrec = 0;
long prevcode[] = {
  1, 1, 1, 1, 1, 1}; //количество  задействованных пинов, количество можно уменьшить или увеличить (по желанию)
long prevM = 0;
long prevM1 = 0;
long timeEx = 0;
boolean expr = true;

#define OLED_RESET 4 //Define reset for OLED display
Adafruit_SSD1306 display(OLED_RESET); //Reset OLED display

//Check for proper display size - required
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

unsigned long prev, interval = 100; //Variables for display/clock update rate
byte flash = 0; //Flag for display flashing - toggle once per update interval
byte mode = 0; //Mode for time and date setting
int tempset; //Temporary variable for setting time/date
int framecount = 3; //Framecounter for animation. Initialized to last frame to start animation at first frame
int framecount2 = 0; //Counter for number of display update periods - for timing display image changes
int imagecounter = 4; //Counter for display of new static image - Initialized to 4 to start static image display at beginning
uint8_t secset = 0; //Index for second RTC setting
uint8_t minset = 1; //Index for minute RTC setting
uint8_t hourset = 2; //Index for hour RTC setting
uint8_t wdayset = 3; //Index for weekday RTC setting
uint8_t mdayset = 4; //Index for date RTC setting
uint8_t monset = 5; //Index for month RTC setting
uint8_t yearset = 6; //Index for year RTC setting

//Alarm time variables
uint8_t wake_HOUR = 0;
uint8_t wake_MINUTE = 0;
uint8_t wake_SECOND = 0;
uint8_t wake_SET = 1; //Default alarm to ON in case of power failure or reset
int beepcount = 0; //Variable for number of 100ms intervals since alarm started sounding


//First animation frame image
static const unsigned char PROGMEM frame_000[] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x70, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x01, 0xCC,
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0xCE, 0x0F, 0x8C, 0x00, 0x00, 0x00,
0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0xC7, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
0xC0, 0x00, 0x00, 0x1D, 0x83, 0xFF, 0x06, 0x38, 0x00, 0x00, 0x00, 0x00, 0x06, 0xC0, 0x00, 0x0F,
0xFF, 0x81, 0xFB, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x05, 0xC0, 0x00, 0xFF, 0xFF, 0xC0, 0x00,
0x33, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x07, 0xFE, 0x03, 0xE2, 0x00, 0x33, 0x80, 0x00,
0x00, 0x00, 0x00, 0x07, 0xC0, 0x1F, 0x0E, 0x00, 0x63, 0x80, 0xE1, 0x80, 0x00, 0x00, 0x00, 0x00,
0x07, 0x40, 0x7F, 0x8E, 0x00, 0x23, 0x80, 0x79, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0xE7,
0x84, 0x00, 0x27, 0x04, 0x39, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x06, 0xE1, 0xC7, 0x00, 0x1F, 0xE7,
0x0E, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE3, 0x80, 0x00, 0x1E, 0x07, 0x1E, 0x10, 0xC0,
0x00, 0x00, 0x00, 0x00, 0x03, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00,
0x01, 0x9C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1D, 0xFF, 0x00,
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0xFF, 0xF3, 0xC0, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0xF8, 0x79, 0xC0, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0x00, 0x00, 0xE0, 0x79, 0xE0, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
0x01, 0xC0, 0x7F, 0xE0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x80, 0x3F,
0xE0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x01, 0x80, 0x0F, 0x60, 0x00, 0x03,
0x00, 0x00, 0x00, 0x00, 0x06, 0x7B, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x03, 0x80, 0x00, 0x00,
0x00, 0x1F, 0xFE, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0xFB, 0x04,
0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x1F, 0xFB, 0x00, 0x00, 0x01, 0xC0,
0x07, 0xC0, 0x00, 0x00, 0x70, 0x00, 0x7F, 0xFE, 0x1E, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0xC0, 0x00,
0x00, 0x3D, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x0D, 0xF1,
0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x06, 0xC0, 0xF8, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

//Second animation frame image
static const unsigned char PROGMEM frame_001[] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07,
0xFF, 0xFF, 0x83, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0x03,
0xC0, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x03, 0xF0, 0x78, 0x07, 0x03, 0xFF, 0xCC, 0x00,
0x00, 0x00, 0x00, 0x3F, 0x00, 0x1F, 0xE0, 0x78, 0x01, 0x83, 0xBF, 0x0C, 0x00, 0x00, 0x00, 0x00,
0x3F, 0x80, 0x38, 0xE0, 0x30, 0x00, 0xC7, 0x3E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xE0, 0xF0,
0xE0, 0x00, 0x00, 0xC6, 0x04, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xF9, 0xC0, 0x00, 0x00, 0x38,
0x06, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xDF, 0x80, 0x00, 0x00, 0x7F, 0x9F, 0x01, 0xCC,
0xE0, 0x00, 0x00, 0x00, 0x07, 0xDF, 0x00, 0x00, 0x00, 0x01, 0x9C, 0x07, 0x8F, 0xE0, 0x00, 0x00,
0x00, 0x01, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x32, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
0x00, 0x00, 0xD9, 0xCF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x40, 0x00,
0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00,
0x0C, 0x39, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0xFF, 0x80,
0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x7F, 0xEF, 0xC0, 0x00, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xFC, 0x0F, 0xF0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x20, 0x01, 0xC0, 0x0F, 0xF0, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
0x01, 0x80, 0x0F, 0xF0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x03, 0x00, 0x07,
0xF0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x03, 0x00, 0x07, 0xD0, 0x00, 0x02,
0x70, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x03, 0x00, 0x01, 0xB0, 0x00, 0x03, 0xFF, 0x80, 0x00,
0x00, 0x0C, 0xFE, 0xF0, 0x01, 0x80, 0x00, 0x30, 0x00, 0x03, 0x83, 0xF3, 0xFF, 0xFF, 0xFE, 0xE0,
0x00, 0x01, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x77, 0xFF, 0xFC, 0x07, 0x60, 0x00, 0x01, 0xF8,
0x0D, 0xF0, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xBF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x0E, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

//Third animation frame image
static const unsigned char PROGMEM frame_002[] =
{
0x00, 0x00, 0x00, 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, 0xE0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x09, 0x80, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1F, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x3F,
0xFF, 0xFC, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x81, 0xFE, 0x0F, 0x1F, 0xC3,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xC7, 0x9E, 0x0F, 0x03, 0xC1, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x09, 0xFE, 0x1E, 0x0E, 0x0F, 0x01, 0xE0, 0x38, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0F, 0xF0, 0x0C, 0x06, 0x03, 0x81, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0,
0x00, 0x00, 0x01, 0xC1, 0xBF, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00,
0xC2, 0x3F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x37, 0x04,
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3F, 0xC3, 0x00, 0x06, 0x00, 0x00, 0x00,
0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x1C, 0x03, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x00, 0x0C, 0x23, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61,
0xC7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE1, 0xC4, 0x00, 0x00,
0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0C, 0x40, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00,
0x3F, 0x33, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3F, 0xFB, 0x00,
0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x7D, 0xFF, 0x80, 0x00, 0x02, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xE0, 0x0D, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x30, 0x01, 0x80, 0x1E, 0x70, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
0x01, 0x80, 0x1E, 0xF0, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x03, 0x00, 0x1F,
0xF0, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x07, 0xF0, 0x00, 0x00,
0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xEF, 0xC0, 0x00,
0x00, 0x00, 0x03, 0x80, 0x01, 0x00, 0x00, 0x60, 0x00, 0x00, 0x3D, 0xFF, 0x3C, 0x00, 0x00, 0x03,
0x00, 0x01, 0x80, 0x00, 0xE0, 0x00, 0x00, 0x3C, 0x0F, 0xBF, 0xFF, 0x81, 0xFB, 0x00, 0x01, 0xB0,
0x00, 0xC0, 0x00, 0x00, 0x08, 0x01, 0xB0, 0x3F, 0x9F, 0xFD, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00,
0x00, 0x00, 0x00, 0xF0, 0x00, 0xD8, 0x0D, 0x80, 0x00, 0xE7, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x40, 0x00, 0xD8, 0x07, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

//Fourth animation frame image
static const unsigned char PROGMEM frame_003[] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x0F, 0xE6, 0x73, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFF, 0xFF, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7E, 0x00, 0x0F, 0xDE, 0x1F, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x7E,
0x1E, 0x03, 0xC1, 0xC0, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0xFE, 0x1E, 0x00, 0xC1,
0xF8, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x83, 0xDE, 0x1C, 0x00, 0x41, 0xBF, 0xE6, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1F, 0xC7, 0x0E, 0x00, 0x3E, 0x67, 0xF7, 0x86, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1E, 0xFE, 0x00, 0x00, 0x07, 0x86, 0x26, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x78,
0x00, 0x00, 0x01, 0x87, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xF0, 0x00, 0x00, 0x00,
0x1F, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x3D, 0x00, 0xC6,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x18, 0x03, 0xC6, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xC0, 0x00, 0x00, 0x00, 0x01, 0xE3, 0xC7, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00,
0x00, 0x00, 0x33, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x31,
0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x00, 0x0E, 0x18, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
0x1F, 0x1D, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x3F, 0xFF, 0x80,
0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x38, 0x3F, 0x80, 0x00, 0x00, 0x60,
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x30, 0x1E, 0xE0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
0x00, 0x00, 0x60, 0x00, 0x60, 0x1E, 0xE0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
0x00, 0x60, 0x1E, 0xF0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0xC0, 0x1F,
0xF0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x0F, 0xE0, 0x00, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x01, 0xE0, 0x00, 0x00, 0x07, 0x00, 0x00,
0x00, 0x00, 0x07, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x01, 0xC4, 0x06, 0x70, 0x00, 0x0E,
0x00, 0x00, 0x60, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xE7, 0xFE, 0x7E, 0x60, 0x1C, 0x00, 0x00, 0x30,
0x01, 0xC0, 0x00, 0x00, 0x00, 0x73, 0xE3, 0xB6, 0x7F, 0xD8, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00,
0x00, 0x00, 0x3E, 0x01, 0xF6, 0x61, 0xD8, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0E,
0x00, 0x03, 0x60, 0x68, 0x00, 0x00, 0x04, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0,
0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x38, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

//Pusheen Teacup static image
static const unsigned char PROGMEM pusheen_teacup[] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00,
0x00, 0xE6, 0x0C, 0x61, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xFC, 0x3F, 0xFF, 0xC0, 0x00, 0x00,
0x00, 0x83, 0xF8, 0x3E, 0x3D, 0xF0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x38, 0xF8, 0x00, 0x00,
0x0F, 0x80, 0x00, 0x3C, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x9C, 0xC7, 0x3F, 0x00, 0x6E, 0x00, 0x00,
0x0F, 0x1C, 0xE7, 0x3D, 0x00, 0x03, 0x00, 0x00, 0x1F, 0x1D, 0xF3, 0x1E, 0x00, 0x03, 0x80, 0x00,
0x13, 0x01, 0x80, 0x02, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00,
0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xE0, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x08,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x8C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC4,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC4, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xC6,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xC6, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xC4,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x8C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x88,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x38,
0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x70, 0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0x80, 0xC0,
0x00, 0xC0, 0x00, 0x00, 0x00, 0x03, 0x07, 0x80, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x06, 0x3E, 0x00,
0x00, 0x60, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00,
0x00, 0x18, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
0x00, 0x07, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x00,
0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFE, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

//Pusheen Artist static image
static const unsigned char PROGMEM pusheen_artist[] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3E, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x37, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFC,
0xCF, 0x80, 0x00, 0x00, 0x00, 0x63, 0xF8, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x60, 0xF0, 0x41, 0xF8,
0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xCE, 0x00, 0x00,
0x0F, 0xDC, 0xC6, 0x00, 0x0F, 0x00, 0x00, 0x03, 0x9C, 0xCE, 0x7C, 0x0F, 0x80, 0x00, 0x0F, 0x8F,
0xEE, 0x1C, 0x01, 0x80, 0x00, 0x0F, 0x00, 0x60, 0x60, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x70,
0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0xC0, 0x00, 0x02, 0x00, 0x00, 0x18, 0x00, 0xC0,
0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06,
0x00, 0x00, 0x00, 0x00, 0x60, 0x07, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0xFA, 0x00, 0x00,
0x00, 0x00, 0xDC, 0x07, 0xFA, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x06, 0xFB, 0x00, 0x00, 0x00, 0x00,
0xDE, 0x04, 0xCF, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x04, 0xCD, 0x80, 0x00, 0x00, 0x01, 0xFE, 0x04,
0xE9, 0xC0, 0x00, 0x00, 0x03, 0xFE, 0x07, 0xF8, 0xE0, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x03, 0xFE,
0x00, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x7C, 0x01, 0xFF, 0xCF,
0xF8, 0x00, 0x38, 0x60, 0x00, 0xF7, 0xFF, 0xE0, 0x00, 0x7C, 0x70, 0x00, 0x03, 0x01, 0x80, 0x00,
0x7C, 0x38, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x7C, 0x1C, 0x00, 0x3C, 0x18, 0x0F, 0xC0, 0x6C, 0x07,
0x00, 0xF0, 0xFF, 0x8F, 0xFF, 0x6C, 0x03, 0x83, 0xC1, 0xCB, 0xC7, 0xFF, 0x6C, 0x01, 0xEF, 0x03,
0x1E, 0xF7, 0xFF, 0x3C, 0x10, 0x7C, 0x03, 0xD7, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x07, 0xFD, 0xD8,
0x00, 0x00, 0x2E, 0x00, 0x07, 0xE1, 0xD8, 0x00, 0x00, 0x3F, 0x00, 0x07, 0xE3, 0x98, 0x00, 0x00,
0x1F, 0x0F, 0x86, 0xC7, 0x38, 0x00, 0x00, 0x00, 0x3F, 0x86, 0x77, 0x70, 0x00, 0x00, 0x00, 0x7F,
0x86, 0xF7, 0xE0, 0x00, 0x00, 0x00, 0x7F, 0x03, 0xF1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF3,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00
};

//Pusheen Scooter static image
static const unsigned char PROGMEM pusheen_scooter[] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00,
0x00, 0x00, 0x00, 0x66, 0x03, 0x80, 0x00, 0x00, 0x0C, 0xC3, 0x07, 0xC0, 0x00, 0x00, 0x0F, 0x83,
0xFC, 0xC0, 0x00, 0x00, 0x3B, 0x83, 0xF8, 0x40, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x00,
0x07, 0x38, 0x00, 0xFC, 0x00, 0x00, 0x06, 0x39, 0x80, 0xFC, 0x00, 0x00, 0x0C, 0x03, 0xCC, 0x7C,
0x00, 0x00, 0x08, 0x00, 0xCC, 0x47, 0x80, 0x00, 0x18, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x18, 0x00,
0x00, 0x07, 0xF0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x30, 0x00, 0x00, 0x00, 0x7C, 0x00,
0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x30, 0x00, 0x00, 0x00,
0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0x00,
0x00, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00,
0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0F, 0x00, 0x00, 0x00,
0x03, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x78, 0x00, 0x00, 0x03, 0xFC, 0x03, 0xFF,
0x00, 0x00, 0x07, 0xFE, 0x01, 0xFB, 0xC1, 0xC0, 0x1F, 0xFE, 0x01, 0x60, 0x79, 0xE0, 0x7B, 0xF8,
0x03, 0x60, 0x1F, 0xFF, 0xE0, 0x00, 0x03, 0x20, 0x1F, 0xFF, 0x80, 0x00, 0x02, 0x30, 0x1F, 0xFF,
0xC0, 0x00, 0x02, 0x30, 0x1F, 0xFF, 0x80, 0x00, 0x1E, 0x18, 0x18, 0x01, 0x80, 0x1E, 0x38, 0x0C,
0x30, 0x01, 0x86, 0x3E, 0x6F, 0xEC, 0x30, 0xF8, 0xCF, 0x3A, 0x5C, 0x64, 0x61, 0xDC, 0xDF, 0xBE,
0x7F, 0xFF, 0xE7, 0xFE, 0x5F, 0x9E, 0x7C, 0x78, 0x07, 0x8F, 0x4F, 0x00, 0x7B, 0xAF, 0xFF, 0x77,
0xCE, 0x00, 0x1B, 0xA5, 0xFB, 0x75, 0xC0, 0x00, 0x19, 0x20, 0x03, 0x24, 0x00, 0x00, 0x0C, 0x60,
0x01, 0x8C, 0x00, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

//Pusheen Cookie static image
static const unsigned char PROGMEM pusheen_cookie[] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x0C, 0x00,
0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x80, 0x73, 0x00,
0x00, 0x00, 0x00, 0x00, 0x60, 0xC0, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0xFF, 0x81, 0x00,
0x00, 0x00, 0x00, 0x1E, 0xC0, 0x6F, 0x81, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x6D, 0x01, 0x9E,
0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0xF6, 0x80, 0x00, 0x01, 0xC0,
0x00, 0x00, 0x00, 0x1F, 0x07, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x3B, 0x07, 0x04, 0x3C, 0xFF,
0x00, 0x00, 0x00, 0x70, 0x07, 0x0C, 0x3C, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0x18, 0x40,
0x00, 0x00, 0x03, 0x80, 0x00, 0xE1, 0xC0, 0x40, 0x00, 0x00, 0x07, 0x00, 0x01, 0xC3, 0x60, 0x60,
0x00, 0x00, 0x0C, 0x00, 0x03, 0x83, 0x30, 0x60, 0x00, 0x00, 0x18, 0x00, 0x03, 0x32, 0x30, 0x60,
0x00, 0x00, 0x30, 0x00, 0x01, 0x30, 0x30, 0x20, 0x00, 0x00, 0x60, 0x00, 0x01, 0x87, 0x30, 0x20,
0x00, 0x00, 0xC0, 0x00, 0x01, 0x87, 0x70, 0x20, 0x00, 0x01, 0x80, 0x00, 0x00, 0xF7, 0xF0, 0x20,
0x00, 0x03, 0x00, 0x00, 0x00, 0xFF, 0xD0, 0x30, 0x00, 0x03, 0x00, 0x00, 0x01, 0xB0, 0x00, 0x30,
0x00, 0x06, 0x00, 0x00, 0x00, 0x60, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
0x00, 0x08, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x60, 0x00, 0x08, 0x00, 0xE7, 0xBE, 0x00, 0x00, 0x60,
0x00, 0x08, 0x01, 0xBF, 0xF7, 0x00, 0x00, 0x60, 0x00, 0x08, 0x03, 0x60, 0x1D, 0xE0, 0x00, 0x40,
0x00, 0x0C, 0x03, 0xC0, 0x06, 0xF0, 0x00, 0xC0, 0x00, 0x04, 0x07, 0x80, 0x00, 0x10, 0x00, 0xC0,
0x1F, 0xFE, 0x07, 0x80, 0x00, 0x90, 0x01, 0x80, 0x7E, 0x6E, 0x07, 0x00, 0x00, 0x90, 0x01, 0xC0,
0xF7, 0xFF, 0xFF, 0x00, 0x00, 0x9F, 0xFF, 0xC0, 0x7F, 0xE0, 0x05, 0x00, 0x00, 0x9F, 0xFF, 0xC0,
0x00, 0x00, 0x05, 0x00, 0x00, 0x97, 0x80, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x9F, 0x80, 0x00,
0x00, 0x00, 0x07, 0x80, 0x00, 0xBD, 0xFF, 0xFC, 0x00, 0x00, 0x03, 0x80, 0x00, 0xB3, 0x80, 0x0C,
0x00, 0x00, 0x03, 0xC0, 0x06, 0x31, 0xFF, 0xFC, 0x00, 0x00, 0x03, 0x77, 0xBD, 0xE3, 0x30, 0x00,
0x00, 0x00, 0x01, 0xDF, 0xFF, 0x03, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x00
};

//Pusheen Marshmallow static image
static const unsigned char PROGMEM pusheen_marshmallow[] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x03, 0x80, 0x00, 0x00, 0x00, 0x1E, 0x07, 0xC7,
0xF0, 0x00, 0x00, 0x36, 0x0C, 0xDF, 0xF8, 0x00, 0x00, 0x33, 0x7C, 0x79, 0xDE, 0x00, 0x00, 0x63,
0xF8, 0x63, 0xDF, 0x00, 0x00, 0x41, 0xF0, 0x1E, 0x1F, 0x00, 0x0F, 0xC0, 0x00, 0x3C, 0x1D, 0x80,
0x1F, 0xC0, 0x00, 0x30, 0x01, 0xC0, 0x00, 0xD8, 0x01, 0xBE, 0x00, 0xC0, 0x0F, 0x9E, 0x67, 0x00,
0x00, 0x60, 0x1D, 0x8E, 0x70, 0x00, 0x00, 0x60, 0x01, 0x80, 0x60, 0x00, 0x00, 0x60, 0x01, 0x80,
0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x30,
0x01, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, 0x30, 0x0F, 0xC0, 0x00, 0x00,
0x00, 0x38, 0x0C, 0xE0, 0x00, 0x00, 0x00, 0x3C, 0x18, 0x38, 0x00, 0x00, 0x02, 0x66, 0x30, 0x7E,
0x00, 0x00, 0x0F, 0xE6, 0x30, 0x67, 0x80, 0x00, 0x1F, 0xC2, 0x20, 0x21, 0xF8, 0x00, 0x7F, 0x83,
0x60, 0x30, 0x3F, 0xFF, 0xEE, 0x03, 0x60, 0x30, 0x03, 0xFF, 0xFC, 0x03, 0x40, 0x30, 0x00, 0x00,
0x78, 0x01, 0x40, 0x30, 0x00, 0x00, 0x70, 0x01, 0xC0, 0x10, 0x00, 0x00, 0x70, 0x01, 0xC0, 0x10,
0x00, 0x00, 0x60, 0x01, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x01,
0xC0, 0x10, 0x00, 0x00, 0x00, 0x01, 0x80, 0x10, 0x00, 0x00, 0x00, 0x01, 0x80, 0x10, 0x00, 0x00,
0x00, 0x01, 0x80, 0x10, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x30, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x30,
0x00, 0x00, 0x00, 0x01, 0xC0, 0x30, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x03,
0x40, 0x60, 0x00, 0x00, 0x00, 0x03, 0x60, 0x60, 0x00, 0x00, 0x00, 0x03, 0x60, 0xC0, 0x00, 0x00,
0x00, 0x02, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x06, 0x39, 0x80, 0x00, 0x00, 0x00, 0x06, 0x1C, 0x00,
0x00, 0x00, 0x00, 0x06, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x1C, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8
};


void setup()
{
Serial.begin(9600); //Initialize serial port, if needed (not used)
Wire.begin(); //Initializw I2C communication library
DS3231_init(0x00); //Initialize Real Time Clock for 1Hz square wave output (no RTC alarms on output pin)
Serial.setTimeout(30);

pinMode(8, INPUT); //Set pin for time/date mode button to input
digitalWrite(8, HIGH); //Turn on pullup resistors

pinMode(9, INPUT); //Set pin for time/date set button to input
digitalWrite(9, HIGH); //Turn on pullup resistors

pinMode(10, OUTPUT); //Set pin for external alarm indicator output
digitalWrite(10, LOW); //Initialize external alarm to off state

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  //pinMode(8, OUTPUT);
  //pinMode(9, OUTPUT);

for (int i=0; i <= 6; i++){   // цифру 8 и все восьмёрки ниже заменяем на цифру задействованных пинов (по желанию)
    pinMode(ledpin[i],OUTPUT);
  }
  for (int i=0; i <= 6; i++){  
  }
  pinMode(butpin, INPUT); 
  digitalWrite(butpin, LOW);

irrecv.enableIRIn();  // Start the receiver. включить ИК приемник.  
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
display.begin(SSD1306_SWITCHCAPVCC, 0x3D);  // initialize with the I2C addr 0x3D (for the 128x64 OLED display)
display.setTextSize(1); //Set default font size to the smalles
display.setTextColor(WHITE); //Set font to display color on black background
// init done
}

void loop()
{
char tempF[6]; //Local variable to store converted temperature reading from Real Time Clock module
float temperature; //Intermediate temperature variable to convert Celsius to Farenheit
unsigned long now = millis(); //Local variable set to current value of Arduino internal millisecond run-time timer
struct ts t; //Structure for retrieving and storing time and date data from real time clock

//Draw and update display every refresh period (100ms)
if ((now - prev > interval)) { //Determine whether to start a time and screen update
  framecount2 = framecount2 + 1; //Update counter of refresh periods
  if(framecount2 > 300){framecount2 = 0;} //Wrap the refresh period counter to 0 after 300 updates
  if(flash == 0){flash = 1;}else{flash = 0;} //Toggle flash flag for cursor blinking later
  DS3231_get(&t); //Get time and date and save in t structure
  
  get_alarm(); //Retrieve current alarm setting
  digitalWrite(10, LOW); //Turn off external alarm for flashing
  
  //Force a temperature conversion if one is not in progress for rapid update and better clock accuracy
  //Maintain 1Hz square wave output
  if((DS3231_get_addr(0x0E) & 0x20) == 0){DS3231_init(0x20);}
  temperature = DS3231_get_treg(); //Get temperature from real time clock
  temperature = (temperature * 1.8) + 32.0; // Convert Celsius to Fahrenheit
  dtostrf(temperature, 5, 1, tempF); //Convert temperature to string for display

  display.clearDisplay(); //Clear display buffer from last refresh

//NOTE: Alarm indicators are overwritten in display buffer if full-screen animation is displayed, so no check for that  
  if (mode <= 7){ //Alarm indicators and actions in normal and time set display mode only
  if (wake_SET){ //Display alarm on indicator if alarm turned on
    display.setCursor(73, 55); //Position text cursor for alarm on indicator
    display.print("*"); //Print character inside lower left corner of analog clock if alarm on
  }
  }

  if(wake_SET && DS3231_triggered_a1()){ //Display/sound alarm if enabled and triggered
      beepcount = beepcount + 1;
      if(beepcount <= 600){ //Sound alarm for 60 seconds
        if(!flash){ //Flash display and sound interrupted beeper
        if(mode <= 7){display.setCursor(111, 55); display.print("*");} //Flash alarm triggered indicator in lower right corner of analog clock, if displayed
        digitalWrite(10, HIGH); //Flash external alarm if alarm triggered, regardless of mode
        }
      }
      else{beepcount = 0; DS3231_clear_a1f();} //If alarm has sounded for 1 minute, reset alarm timer counter and alarm flag
  }

  if (mode <=7){         
  display.setCursor(92,8); //Set cursor for temperature display
  display.print(tempF); //Send temperature to display buffer
  display.drawCircle(124,8,2,WHITE); //Draw degree symbol after temperature

//DO NOT CHANGE CURSOR POSITIONING OF TIME AND DATE TEXT FIELDS OR TIME/DATE SET CURSOR WON'T MATCH!!!     
  display.setCursor(0,0); //Position cursor for day-of-week display
  printDay(t.wday); //Lookup day of week string from retrieved RTC data and write to display buffer
        
  printMonth(t.mon); //Lookup month string from retrieved RTC data and write to display buffer
        
  if(t.mday<10){display.print("0");} //Add leading zero to date display if date is single-digit
  display.print(t.mday); //Write date to display buffer
  display.print(", "); //Write spaces and comma between date and year
        
  display.print(t.year); //Write year to display buffer
        
  display.setCursor(0, 8); //Position text cursor for time display
        
  //RTC is operated in 24-hour mode and conversion to 12-hour mode done here, in software
  if(t.hour == 0){display.print("12");} //Convert zero hour for 12-hour display
    else if(t.hour < 13 && t.hour >= 10){display.print(t.hour);} //Just display hour if double digit hour
        else if(t.hour < 10){display.print(" "); display.print(t.hour);} //If single digit hour, add leading space
        else if(t.hour >= 13 && t.hour >= 22){display.print(t.hour-12);} //If double digit and PM, convert 24 to 12 hour
        else{display.print(" "); display.print(t.hour-12);} //If single digit and PM, convert to 12 hour and add leading space
        
        display.print(":"); //Display hour-minute separator
        if(t.min<10){display.print("0");} //Add leading zero if single-digit minute
        display.print(t.min); //Display retrieved minutes
        
        display.print(":"); //Display minute-seconds separator
        if(t.sec<10){display.print("0");} //Add leading zero for single-digit seconds
        display.print(t.sec); //Display retrieved seconds
        
        if(t.hour < 12){display.print(" AM");} //Display AM indicator, as needed
        else{display.print(" PM");} //Display PM indicator, as needed
        
        
  if(framecount2 > 50 ){ //Display analog clock for 250 of 300 frames in frame cycle
    // Now draw the clock face
    display.drawCircle(display.width()/2+30, display.height()/2 + 8, 20, WHITE); //Draw and position clock outer circle
    //display.fillCircle(display.width()/2+25, display.height()/2 + 8, 20, WHITE); //Fill circle only if displaying inverted colors
    if(flash){display.drawCircle(display.width()/2+30, display.height()/2 + 8, 2, WHITE);} //Draw, position and blink tiny inner circle
    display.drawRect(71,17,47,47,WHITE); //Draw box around clock

    //Position and draw hour tick marks
    for( int z=0; z < 360;z= z + 30 ){
    //Begin at 0° and stop at 360°
      float angle = z ;
      angle=(angle/57.29577951) ; //Convert degrees to radians
      int x2=(94+(sin(angle)*20));
      int y2=(40-(cos(angle)*20));
      int x3=(94+(sin(angle)*(20-5)));
      int y3=(40-(cos(angle)*(20-5)));
      display.drawLine(x2,y2,x3,y3,WHITE);
    }
  
    //Position and display second hand
    float angle = t.sec * 6 ; //Retrieve stored seconds and apply
    angle=(angle/57.29577951) ; //Convert degrees to radians  
    int x3=(94+(sin(angle)*(20)));
    int y3=(40-(cos(angle)*(20)));
    display.drawLine(94,40,x3,y3,WHITE);

   //Position and display minute hand
    angle = t.min * 6; //Retrieve stored minutes and apply
    angle=(angle/57.29577951) ; //Convert degrees to radians  
    x3=(94+(sin(angle)*(20-3)));
    y3=(40-(cos(angle)*(20-3)));
    display.drawLine(94,40,x3,y3,WHITE);

    //Position and display hour hand
    angle = t.hour * 30 + int((t.min / 12) * 6); //Retrieve stored hour and minutes and apply
    angle=(angle/57.29577951) ; //Convert degrees to radians  
    x3=(94+(sin(angle)*(20-11)));
    y3=(40-(cos(angle)*(20-11)));
    display.drawLine(94,40,x3,y3,WHITE);
  }

  if(framecount2 > 50){ //Display static image for 250 of 300 frames
    if(framecount2 == 51){ //Increment the image to be displayed once per 300 frames
      imagecounter = imagecounter + 1; //Advance the image counter
    }
    display.fillRect(0,16,64,48,WHITE); //Draw "white" background for static image display on left half of screen
    if(imagecounter > 4){imagecounter = 0;} //Roll over the image counter after all images have sequenced
    if(imagecounter == 0){display.drawBitmap(0, 16, pusheen_teacup, 64, 48, BLACK);} //Position and draw static bitmap
    if(imagecounter == 1){display.drawBitmap(5, 16, pusheen_artist, 56, 48, BLACK);} //Position and draw static bitmap
    if(imagecounter == 2){display.drawBitmap(10, 16, pusheen_scooter, 48, 48, BLACK);} //Position and draw static bitmap
    if(imagecounter == 3){display.drawBitmap(0, 16, pusheen_cookie, 64, 48, BLACK);} //Position and draw static bitmap
    if(imagecounter == 4){display.drawBitmap(10, 16, pusheen_marshmallow, 48, 48, BLACK);} //Position and draw static bitmap 
  }
  
    //Animated Pusheen
  framecount = framecount + 1; //Increment frame counter on each display update (5Hz frame rate on animation)
  if(framecount > 3){framecount = 0;} //Roll over frames after 4-frame animation plays
  if(framecount2 <= 50){ //Display animation for 50 of 300 frames of display frame counter
    display.fillRect(0,16,128,48,WHITE); //Set "white" baxkground for animation
    if(framecount == 0){display.drawBitmap(10, 16, frame_000, 104, 48, BLACK);} //Display frame 1
    if(framecount == 1){display.drawBitmap(10, 16, frame_001, 104, 48, BLACK);} //Display frame 2 on next display update
    if(framecount == 2){display.drawBitmap(10, 16, frame_002, 104, 48, BLACK);} //Display frame 3 on next display update
    if(framecount == 3){display.drawBitmap(10, 16, frame_003, 104, 48, BLACK);} //Display frame 4 on next display update
    }
  }
  
      if (mode > 7){ 
      display.setCursor(0, 0); //Position text cursor
      display.print("Alarm Set: ");
      if(wake_SET){display.print("ON");}else{display.print("OFF");}
      display.setCursor(0, 8); //Position text cursor for time display
        
      //RTC is operated in 24-hour mode and conversion to 12-hour mode done here, in software
      if(wake_HOUR == 0){display.print("12");} //Convert zero hour for 12-hour display
        else if(wake_HOUR < 13 && wake_HOUR >= 10){display.print(wake_HOUR);} //Just display hour if double digit hour
            else if(wake_HOUR < 10){display.print(" "); display.print(wake_HOUR);} //If single digit hour, add leading space
            else if(wake_HOUR >= 13 && wake_HOUR >= 22){display.print(wake_HOUR-12);} //If double digit and PM, convert 24 to 12 hour
            else{display.print(" "); display.print(wake_HOUR-12);} //If single digit and PM, convert to 12 hour and add leading space
        
            display.print(":"); //Display hour-minute separator
            if(wake_MINUTE<10){display.print("0");} //Add leading zero if single-digit minute
            display.print(wake_MINUTE); //Display retrieved minutes
        
            display.print(":"); //Display minute-seconds separator
            if(wake_SECOND<10){display.print("0");} //Add leading zero for single-digit seconds
            display.print(wake_SECOND); //Display retrieved seconds
        
            if(wake_HOUR < 12){display.print(" AM");} //Display AM indicator, as needed
            else{display.print(" PM");} //Display PM indicator, as needed
    }
    
    
//Time/Date setting button processing and cursor flashing
//CURSOR COORDINATES ARE SET TO MATCH TIME/DATE FIELD - DO NOT CHANGE!!
//Digital and analog time/date display updates with new settings at 5Hz as settings are changed
  switch(mode)
  {
    case 0: break;
    case 1: //Day-of-week setting
      if(flash){display.drawRect(0,0,18,8,WHITE);} //Display rectangle cursor every other display update (5Hz blink)
      if(!digitalRead(9) && (!flash)){ //Update setting at 5Hz rate if button held down
        tempset = t.wday; //Get the current weekday and save in temporary variable
        tempset = tempset + 1; //Increment the day at 5Hz rate
        if(tempset > 7){tempset = 1;} //Roll over after 7 days
        t.wday = tempset; //After each update, write the day back to the time structure
        set_rtc_field(t, wdayset); //Write the set field only back to the real time clock module after each update
      }
      break;
    case 2: //Month setting
      if(flash){display.drawRect(24,0,18,8,WHITE);} //Display rectangle cursor every other display update (5Hz blink)
      if(!digitalRead(9) && (!flash)){ //Update setting at 5Hz rate if button held down
        tempset = t.mon; //Get the current month and save in temporary variable
        tempset = tempset + 1; //Increment the month at 5Hz rate
        if(tempset > 12){tempset = 1;} //Roll over after 12 months
        t.mon = tempset; //After each update, write the month back to the time structure
        set_rtc_field(t, monset); //Write the set field only back to the real time clock module after each update
      }
      break;
    case 3: //Date setting
      if(flash){display.drawRect(48,0,12,8,WHITE);} //Display rectangle cursor every other display update (5Hz blink)
      if(!digitalRead(9) && (!flash)){ //Update setting at 5Hz rate if button held down
        tempset = t.mday; //Get the current date and save in temporary variable
        tempset = tempset + 1; //Increment the date at 5Hz rate
        //(RTC allows incorrect date setting for months < 31 days, but will use correct date rollover for subsequent months.
        if(tempset > 31){tempset = 1;} //Roll over after 31 days
        t.mday = tempset; //After each update, write the date back to the time structure 
        set_rtc_field(t, mdayset); //Write the set field only back to the real time clock module after each update
      }
      break;
    case 4: //Year setting
      if(flash){display.drawRect(72,0,24,8,WHITE);} //Display rectangle cursor every other display update (5Hz blink)
      if(!digitalRead(9) && (!flash)){ //Update setting at 5Hz rate if button held down
        tempset = t.year; //Get the current year and save in temporary variable
        tempset = tempset + 1; //Increment the year at 5Hz rate
        //RTC allows setting from 1900, but range limited here to 2000 to 2099
        if(tempset > 2099){tempset = 2000;} //Roll over after 2099 to 2000
        t.year = tempset; //After each update, write the year back to the time structure
        set_rtc_field(t, yearset); //Write the set field only back to the real time clock module after each update
      } 
      break;
    case 5: //Hour setting
      if(flash){display.drawRect(0,8,12,8,WHITE);} //Display rectangle cursor every other display update (5Hz blink)
      if(!digitalRead(9) && (!flash)){ //Update setting at 5Hz rate if button held down
        tempset = t.hour; //Get the current hour and save in temporary variable
        tempset = tempset + 1; //Increment the hour at 5Hz rate
        if(tempset > 23){tempset = 0;} //Roll over hour after 23rd hour (setting done in 24-hour mode)
        t.hour = tempset; //After each update, write the hour back to the time structure
        set_rtc_field(t, hourset); //Write the set field only back to the real time clock module after each update
      }
      break;
    case 6: //Minute setting
      if(flash){display.drawRect(18,8,12,8,WHITE);} //Display rectangle cursor every other display update (5Hz blink)
      if(!digitalRead(9) && (!flash)){ //Update setting at 5Hz rate if button held down
        tempset = t.min; //Get the current minute and save in temporary variable
        tempset = tempset + 1; //Increment the minute at 5Hz rate
        if(tempset > 59){tempset = 0;} //Roll over minute to zero after 59th minute
        t.min = tempset; //After each update, write the minute back to the time structure
        set_rtc_field(t, minset); //Write the set field only back to the real time clock module after each update
      }
      break;
      
     //Set clock + 1 minute, then press and hold to freeze second setting.
     //Release button at 00 seconds to synchronize clock to external time source.
    case 7: //Second synchronization
      if(flash){display.drawRect(36,8,12,8,WHITE);} //Display rectangle cursor every other display update (5Hz blink)
      if(!digitalRead(9) && (!flash)){ //Reset second to zero at 5Hz rate if button held down
        t.sec = 0; //After each update, write the zeroed second back to the time structure
        set_rtc_field(t, secset); //Write the set field only back to the real time clock module after each update
      }
      break;
                 
    case 8: //Alarm hour setting
      if(flash){display.drawRect(0,8,12,8,WHITE);} //Display rectangle cursor every other display update (5Hz blink)
      if(!digitalRead(9) && (!flash)){ //Update setting at 5Hz rate if button held down
        tempset = wake_HOUR; //Get the current hour and save in temporary variable
        tempset = tempset + 1; //Increment the hour at 5Hz rate
        if(tempset > 23){tempset = 0;} //Roll over hour after 23rd hour (setting done in 24-hour mode)
        wake_HOUR = tempset; //After each update, write the hour back to the alarm variable
        set_alarm(); //Write the alarm setting back to the RTC after each update
      }
    break;
       
    case 9: //Alarm minute setting
      if(flash){display.drawRect(18,8,12,8,WHITE);} //Display rectangle cursor every other display update (5Hz blink)
      if(!digitalRead(9) && (!flash)){ //Update setting at 5Hz rate if button held down
        tempset = wake_MINUTE; //Get the current minute and save in temporary variable
        tempset = tempset + 1; //Increment the minute at 5Hz rate
        if(tempset > 59){tempset = 0;} //Roll over minute to zero after 59th minute
        wake_MINUTE = tempset; //After each update, write the minute back to the alarm variable
        set_alarm(); //Write the alarm setting back to the RTC after each update
      }
    break;
    
     case 10: //Alarm enable/disable
      if(flash){display.drawRect(66,0,18,8,WHITE);} //Display rectangle cursor every other display update (5Hz blink)
      if(!digitalRead(9) && (!flash)){ //Update setting at 5Hz rate if button held down
        if(wake_SET){wake_SET = 0;}else{wake_SET = 1;} //Toggle alarm on/of variable at 5 Hz
      }
    break;
  }
        
prev = now; //Reset variables for display and time update rate
display.display(); //Display the constructed frame buffer for this framecount
    }
    
//Clock setting mode set - outside time/display update processing for faster button response
if(!digitalRead(8)){ //Read setting mode button
  delay(100); //100ms debounce time to avoid accidental triggering on button bump
  if(!digitalRead(8)){ //Activate setting mode change after 100ms button press
    mode = mode + 1; //Increment the time setting mode on each button press
    if(mode > 10){mode = 0;} //Roll the mode setting after 7th mode
    while(!digitalRead(8)){} //Wait for button release (freezes all display processing and time updates while button held, but RTC continues to keep time)
  }
 }

 if(!digitalRead(9)){ //Reset alarm flag if set button pressed
   delay(25); //25ms debounce time
   if(!digitalRead(9)){DS3231_clear_a1f();} //Clear alarm flag if set button pressed - insures alarm reset when turning alarm on
 }
}


//Function to display month string from numerical month argument
void printMonth(int month)
{
  switch(month)
  {
    case 1: display.print("Jan ");break;
    case 2: display.print("Feb ");break;
    case 3: display.print("Mar ");break;
    case 4: display.print("Apr ");break;
    case 5: display.print("May ");break;
    case 6: display.print("Jun ");break;
    case 7: display.print("Jul ");break;
    case 8: display.print("Aug ");break;
    case 9: display.print("Sep ");break;
    case 10: display.print("Oct ");break;
    case 11: display.print("Nov ");break;
    case 12: display.print("Dec ");break;
    default: display.print("--- ");break; //Display dashes if error - avoids scrambling display
  } 
}


//Function to display day-of-week string from numerical day-of-week argument
void printDay(int day)
{
  switch(day)
  {
    case 1: display.print("Mon ");break;
    case 2: display.print("Tue ");break;
    case 3: display.print("Wed ");break;
    case 4: display.print("Thu ");break;
    case 5: display.print("Fri ");break;
    case 6: display.print("Sat ");break;
    case 7: display.print("Sun ");break;
    default: display.print("--- ");break; //Display dashes if error - avoids scrambling display
  } 
}

//Subroutine to adjust a single date/time field in the RTC
void set_rtc_field(struct ts t,  uint8_t index)
{
    uint8_t century;

    if (t.year > 2000) {
        century = 0x80;
        t.year_s = t.year - 2000;
    } else {
        century = 0;
        t.year_s = t.year - 1900;
    }

    uint8_t TimeDate[7] = { t.sec, t.min, t.hour, t.wday, t.mday, t.mon, t.year_s };

    Wire.beginTransmission(DS3231_I2C_ADDR);
    Wire.write(index);
        TimeDate[index] = dectobcd(TimeDate[index]);
        if (index == 5){TimeDate[5] += century;}
        Wire.write(TimeDate[index]);
    Wire.endTransmission();
    
    //Adjust the month setting, per data sheet, if the year is changed
    if (index == 6){
      Wire.beginTransmission(DS3231_I2C_ADDR);
      Wire.write(5);
      TimeDate[5] = dectobcd(TimeDate[5]);
      TimeDate[5] += century;
      Wire.write(TimeDate[5]);
      Wire.endTransmission();
    } 
}


//Subroutine to set alarm 1
void set_alarm()
{

    // flags define what calendar component to be checked against the current time in order
    // to trigger the alarm - see datasheet
    // A1M1 (seconds) (0 to enable, 1 to disable)
    // A1M2 (minutes) (0 to enable, 1 to disable)
    // A1M3 (hour)    (0 to enable, 1 to disable) 
    // A1M4 (day)     (0 to enable, 1 to disable)
    // DY/DT          (dayofweek == 1/dayofmonth == 0)
    byte flags[5] = { 0, 0, 0, 1, 1 }; //Set alarm to trigger every 24 hours on time match

    // set Alarm1
    DS3231_set_a1(0, wake_MINUTE, wake_HOUR, 0, flags); //Set alarm 1 RTC registers

}

//Subroutine to get alarm 1
void get_alarm()
{
    uint8_t n[4];
    uint8_t t[4];               //second,minute,hour,day
    uint8_t f[5];               // flags
    uint8_t i;

    Wire.beginTransmission(DS3231_I2C_ADDR);
    Wire.write(DS3231_ALARM1_ADDR);
    Wire.endTransmission();

    Wire.requestFrom(DS3231_I2C_ADDR, 4);

    for (i = 0; i <= 3; i++) {
        n[i] = Wire.read();
        f[i] = (n[i] & 0x80) >> 7;
        t[i] = bcdtodec(n[i] & 0x7F);
    }

    f[4] = (n[3] & 0x40) >> 6;
    t[3] = bcdtodec(n[3] & 0x3F);
    
    wake_SECOND = t[0];
    wake_MINUTE = t[1];
    wake_HOUR = t[2];



 // Этот блок отвечает за приём и обработку пришедших ИК команд.
  // позволяет самостоятельно "вручную" прописывать коды кнопок от своего 
  // ИК инфракрасного пульта.
  
  {
    if (irrecv.decode(&results)) {
      //  Serial.println(results.value, HEX);
      irrecv.resume(); // Receive the next value
    }

    {

      // Управляем с заранее "вручную" записанных кодов кнопок от своего ИК пульта.



      if(results.value == Value2)digitalWrite(pultpin2, HIGH);
      if(results.value == Value3)digitalWrite(pultpin3, HIGH);
      if(results.value == Value4)digitalWrite(pultpin4, HIGH);
      if(results.value == Value5)digitalWrite(pultpin5, HIGH);
      if(results.value == Value6)digitalWrite(pultpin6, HIGH);
      if(results.value == Value7)digitalWrite(pultpin7, HIGH);
      //if(results.value == Value8)digitalWrite(pultpin8, HIGH);
      //if(results.value == Value9)digitalWrite(pultpin9, HIGH);


      if(results.value == Value10)digitalWrite(pultpin2, LOW);
      if(results.value == Value0)digitalWrite(pultpin3, LOW);
      if(results.value == Value11)digitalWrite(pultpin4, LOW);
      if(results.value == Value12)digitalWrite(pultpin5, LOW);
      if(results.value == Value13)digitalWrite(pultpin6, LOW);
      if(results.value == Value14)digitalWrite(pultpin7, LOW);
      //if(results.value == Value15)digitalWrite(pultpin8, LOW);
      //if(results.value == Value16)digitalWrite(pultpin9, LOW);


      //включаем все 
      if(results.value == Value17)digitalWrite(pultpin7, HIGH)
        ,digitalWrite(pultpin2, HIGH),digitalWrite(pultpin3, HIGH)
          ,digitalWrite(pultpin4, HIGH),digitalWrite(pultpin5, HIGH)
            ,digitalWrite(pultpin6, HIGH),digitalWrite(pultpin7, HIGH);
              //,digitalWrite(pultpin8, HIGH),digitalWrite(pultpin9, HIGH);

      //выключаем все
      if(results.value == Value18)digitalWrite(pultpin7, LOW)
        ,digitalWrite(pultpin2, LOW),digitalWrite(pultpin3, LOW)
          ,digitalWrite(pultpin4, LOW),digitalWrite(pultpin5, LOW)
            ,digitalWrite(pultpin6, LOW),digitalWrite(pultpin7, LOW);
              //,digitalWrite(pultpin8, LOW),digitalWrite(pultpin9, LOW);


  
  
  // Этот блок отвечает за программирование на лету, кнопками от любого ИК инфракрасного пульта.



      // Для запуска режима программирования на лету, кнопкой от ИК пульта. 
      if(results.value == Value100)digitalWrite(butpin, HIGH),
      digitalWrite(butpin, LOW); 



      {
        if (irrecv.decode(&results)){
          delay(150);
          for(int i=0; i<6; i++)    
            if (results.value == prevcode[i]){
              ledstate[i] = !ledstate[i];
              digitalWrite(ledpin[i], ledstate[i]);        
            }

        }
        butrec = digitalRead(butpin);
        if (butrec == HIGH){
          for (int i=0; i<6; i++){      
            ledstate[i] = 0;
            digitalWrite(ledpin[i], ledstate[i]);     
          }
          timeEx = millis() - prevM1;
          for (int i=0; i<6; i++){
            expr = true;
            timeEx = 0;
            prevM1 = millis();   
            // < 5000)время ожидания сигнала с пульта, для перехода к следующему пину (в момент программирования)              
            while (expr == true && timeEx < 5000){     
              timeEx = millis() - prevM1;
              if (millis() - prevM > 250){           
                prevM = millis();
                int ledstate1 = !ledstate1;
                digitalWrite(ledpin[i], ledstate1);
              }                                      
              if (irrecv.decode(&results)) {         
                delay(150);
                prevcode[i] = results.value;
                irrecv.resume();
                expr = !expr;
                prevM1 = millis();
              }                                      
            }
            digitalWrite(ledpin[i], LOW);
  
           }
         }
       }
     }
   }
  }
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Tails_MP пишет:

 Заранее могу сказать что температура мне нужна в цельсиях, т.е. убрать конвертацию, и время нужно только в 24 формате, т.е. конвертацию тоже можно убрать.

А чего не убрали?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

строки 21-41 заменить на 

const unsigned long Value2 = 0xFF00FF;  // вкл пин 2

строки 48-68 заменить на 

const byte pultpin2 = 2;

 

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

я как бы не совсем программист. профессия электромонте по ремонту и обслуживания электрооборудования, а ардуино как хобби, + я только начинающии

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вообще-то в Ардуино 3 вида памяти, хотелось бы для начала узнать, какого именно не хватает.

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015
//Было это
 
Arduino: 1.6.5 (Windows 7), Плата"Arduino/Genuino Uno"
 
Sketch uses 30 388 bytes (94%) of program storage space. Maximum is 32 256 bytes.
 
Global variables use 2 063 bytes (100%) of dynamic memory, leaving -15 bytes for local variables. Maximum is 2 048 bytes.
 
processing.app.debug.RunnerException: Not enough memory; see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing your footprint.
 
at processing.app.debug.Compiler.size(Compiler.java:344)
 
at processing.app.debug.Compiler.build(Compiler.java:123)
 
at processing.app.Sketch.build(Sketch.java:1109)
 
at processing.app.Sketch.build(Sketch.java:1084)
 
at processing.app.Editor$BuildHandler.run(Editor.java:1955)
 
at java.lang.Thread.run(Thread.java:745)
 
Not enough memory; see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing your footprint.
 
  Это сообщение будет содержать больше информации чем
  "Отображать вывод во время компиляции"
  включено в Файл > Настройки
 
 
//Стало Это
 
 
Sketch uses 30 032 bytes (93%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 993 bytes (97%) of dynamic memory, leaving 55 bytes for local variables. Maximum is 2 048 bytes.
Low memory available, stability problems may occur.
 
 
//Спасибо большое за помощь!!! Думаю все должно работать.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Tails_MP пишет:

Global variables use 1 993 bytes (97%) of dynamic memory, leaving 55 bytes for local variables. Maximum is 2 048 bytes.
 
Думаю все должно работать.

Эт вряд ли!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

кинь ссылку откуда брал исходники. зачем столько анимации интересно

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

55 байт для стека явно мало. Среда рекомендует, чтобы на стек оставалось не менее 512 байтов. На эту цифру желательно и ориентироваться.

Теперь по тексту скетча:

- У Вас подключена библилтека Adafruit, которая требует создания экранного буфера. А для экранного буфера в случае 1306/1308 нужен 1 Кбайт оперативной памяти. При том, что всего ее 2 Кбайта и 0.5 Кбатй нужно оставить для стека. Т.е. Adafruit сразу откусывает 2/3 доступной памяти.

В общем, что, что Вы хотите слделать, превышает возможности выбранного контроллера.

Собственно, если Вы используете контроллер на чипе 328, Вам следует определиться, насколько для Вас важен графический экран. Если он необходим, значит, следует быть готовым к тому, что все остальные функции будут сильно урезаны. Либо, если графический экран не критичен, следует заменить Adafruit на какую-нибудь другую библиотеку, не требующую экранного буфера.

Если же и графический буфер жизненно необходим, и на ограничение функциональности Вы не согласны, остается только перейти на другой контроллер, обладающий бОльшим объенмом оперативной памяти, например Mega 2560.

dachnik
Offline
Зарегистрирован: 26.07.2013

Тоже столкнулся с такой проблемой .... нашёл такую либу без экранного буфера:

https://github.com/greiman/SSD1306Ascii  

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

55 байт для стека явно мало. Среда рекомендует, чтобы на стек оставалось не менее 512 байтов. На эту цифру желательно и ориентироваться.

Теперь по тексту скетча:

- У Вас подключена библилтека Adafruit, которая требует создания экранного буфера. А для экранного буфера в случае 1306/1308 нужен 1 Кбайт оперативной памяти. При том, что всего ее 2 Кбайта и 0.5 Кбатй нужно оставить для стека. Т.е. Adafruit сразу откусывает 2/3 доступной памяти.

В общем, что, что Вы хотите слделать, превышает возможности выбранного контроллера.

Собственно, если Вы используете контроллер на чипе 328, Вам следует определиться, насколько для Вас важен графический экран. Если он необходим, значит, следует быть готовым к тому, что все остальные функции будут сильно урезаны. Либо, если графический экран не критичен, следует заменить Adafruit на какую-нибудь другую библиотеку, не требующую экранного буфера.

Если же и графический буфер жизненно необходим, и на ограничение функциональности Вы не согласны, остается только перейти на другой контроллер, обладающий бОльшим объенмом оперативной памяти, например Mega 2560.

+++