Problema com tamanho do codigo Arduino Mini

Bom dia, gostaria de saber se alguem pode me ajudar a diminuir esse codigo para caber em um arduino pro Atmega 168P. se precisar explico o funcionamento do codigo.

//Programa: Arduino e DHT11 controle de rele por temperatura
//Autor: Arduino e Cia

#include "U8glib.h"
#include <DHT.h>

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

int posicao = 0;
int temp_min = 25; // TEMPERATURA MINIMA PARA DESLIGAR
int temp_max = 28; // TEMPERATURA MAXIMA PARA LIGAR
int ahoras = 0;            //VARIAVEL PARA MOSTRAR HORAS NO LCD
int aminutos = 0;          //VARIAVEL PARA MOSTRAR MINUTOS NO LCD
int asegundos = 0;         //VARIAVEL PARA MOSTRAR SEGUNDOS NO LCD
int segundostotal = 0;     //Tempo total
int msg = 0;               //BARREIRA PARA MENSAGEM DE BEM VINDO
int empieza = 1024;        // VARIAVEL PARA BOTAO DE START FUNCIONAR
int varbuth = 0;           //VARIAVEL PARA MUDAR VALOR DE HORAS
int varbutm = 0;           //VARIAVEL PARA MUDAR VALOR DE MINUTOS
int varbuts = 0;           //VARIAVEL PARA MUDAR VALOR DE SEGUNDOS

// CONFIGURACOES DE PINOS PARA O CIRCUITO

int buzzer = 13;           // PINO DIGITAL PARA RELE TIMER
int start = A2;            //PINO ANALOGICO PARA BOTAO DE START
int buth = A5;             //PINO ANALOGICO BOTAO HORAS
int butm = A4;             //PINO ANALOGICO BOTAO MINUTOS
int buts = A3;             //PINO ANALOGICO BOTAO SEGUNDOS
#define pino_DHT A0  // PINO ANALOGICO SENSOR DE TEMPERATURA DHT11
#define pino_aumenta 5 // PINO DIGITAL PARA BOTAO AUMENTA TEMPERATURA MAXIMA
#define pino_diminui 4 // PINO DIGITAL PARA BOTAO DIMINUI TEMPERATURA MAXIMA
#define pino_rele 7 // PINO DIGITAL RELE TEMPERATURA
#define DHTTYPE DHT11 // TIPO SENSOR DE TEMPERATURA

DHT dht(pino_DHT, DHTTYPE);

int temperatura;
int aumenta, diminui;

unsigned long previousMillis = 0;
//Intervalo de medicao temperatura
const long interval = 2000;

void draw()
{
  //Retangulo temperatura atual
  u8g.drawRFrame(0, 17, 84, 46, 2);
  u8g.setFont(u8g_font_fub20);
  //Atualiza a temperatura no display
  u8g.setPrintPos(13, 50);
  u8g.print(temperatura);
  //Circulo grau
  u8g.drawCircle(51, 33, 3);
  u8g.drawStr( 56, 50, "C");

  //Box superior amarelo
  u8g.setFont(u8g_font_8x13B);
  u8g.drawRBox(0, 0, 127, 16, 2);
  u8g.setColorIndex(0);

  //box temperatura maxima
  u8g.drawRFrame(86, 17, 42, 46, 2);
  u8g.drawRBox(86, 17, 42, 22, 2);
  u8g.setColorIndex(0);
  u8g.drawStr(96, 33, "MIN");
  u8g.setColorIndex(1);

  //Se a temperatura estiver abaixo da variavel (temp_min), desarma o rele
  if (temp_min <= temperatura)
  {
    digitalWrite(pino_rele, LOW);
  }

  //Se a temperatura estiver acima da variavel (temp_max), aciona o rele
  if (temperatura >= temp_max)
  {
    digitalWrite(pino_rele, HIGH);
    //Atualiza na tela o valor da temp. maxima
    u8g.setPrintPos(100, 55);
    u8g.print(temp_min);
    u8g.drawCircle(120, 47, 2);
    u8g.setColorIndex(1);
  }
  //Atualiza na tela o valor da temp. maxima
  u8g.setPrintPos(100, 55);
  u8g.print(temp_min);
  u8g.drawCircle(120, 47, 2);
  u8g.setColorIndex(1);
}

void setup(void)
{
  pinMode(buzzer, OUTPUT);  //PINO DE ALARM ---> SAIDA
  pinMode(buth, INPUT);     //PINO BOTAO HORAS --> Entrada
  pinMode(butm, INPUT);     //PINO BOTAO MINUTOS --> Entrada
  pinMode(buts, INPUT);     //PINO BOTAO SEGUNDOS --> Entrada
  pinMode(start, INPUT);    //PINO BOTAO START --> Entrada
  digitalWrite(buzzer, HIGH);

  msg = 0;                  //BARREIRA MENSAGEM BEM VINDO
  empieza = 1024;           //BARREIRA START

  varbuth = 1;              //BARREIRA DE HORAS
  varbutm = 1;              //BARREIRA DE MINUTOS
  varbuts = 1;              //BARREIRA DE SEGUNDOS
  Serial.begin(9600);
  pinMode(pino_rele, OUTPUT);
  pinMode(pino_aumenta, INPUT);
  pinMode(pino_diminui, INPUT);
  dht.begin();
}

void loop(void)
{
  do
  {

    varbuth = analogRead(buth);   //LEITURA BOTAO HORAS
    varbutm = analogRead(butm);   //LEITURA BOTAO MINUTOS
    varbuts = analogRead(buts);   //LEITURA BOTAO SEGUNDOS

    if (varbuth == 0)             //SE PRESSIONAR O BOTAO AUMENTA UMA HORA
    {
      ahoras = ahoras + 1 ;
      delay(250);
    }

    if (varbutm == 0)           //SE PRESSIONAR O BOTAO AUMENTA UM MINUTO
    {
      aminutos = aminutos + 1;
      delay(250);
    }

    if (varbuts == 0)           //SE PRESSIONAR O BOTAO AUMENTA UM SEGUNDO
    {
      asegundos = asegundos + 1;
      delay(250);
    }
    u8g.setPrintPos(21, 13);
    u8g.setColorIndex(1);


    if (ahoras < 10) u8g.print("0");    // SE AS HORAS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
    u8g.print(ahoras);                 // SEM ESSE CODIGO SE MOSTARIA ASSIM: H:M:S  (1:M:S)
    u8g.print(":");

    if (aminutos < 10) u8g.print("0");  // SE OS MINUTOS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
    u8g.print(aminutos);               // SEM ESSE CODIGO SE MOSTARIA ASSIM: H:M:S  (H:1:S)

    u8g.print(":");
    if (asegundos < 10) u8g.print("0"); // SE OS SEGUNDOS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
    u8g.print(asegundos);              // SEM ESSE CODIGO SE MOSTARIA ASSIM: H:M:S  (H:M:1)

    empieza = analogRead(start);   //LEITURA DO BOTAO DE START

    if (empieza == 0)              //Si el boton de arranque, fue pulsado...
    {
      segundostotal = asegundos + (aminutos * 60) + (ahoras * 60 * 60);  // CONVERTE TEMPO TOTAL EM SEGUNDOS
    }

  } while (empieza != 0); // VOLTA AO MENU DE AJUSTE PARA APENAS APERTAR O BOTAO START
  while (segundostotal > 0)
  {
    delay (1000);          //DESCONTADO 1 SEGUNDO DO TIMER
    segundostotal--;

    ahoras = ((segundostotal / 60) / 60);  //CONVERTE OS SEGUNDOS TOTAIS EM HORAS
    aminutos = (segundostotal / 60) % 60;  //CONVERTE OS SEGUNDOS TOTAIS EM MINUTOS
    asegundos = segundostotal % 60;        //CONVERTE OS SEGUNDOS TOTAIS EM SEGUNDOS

    u8g.setPrintPos(21, 13);
    u8g.setColorIndex(1);
    if (ahoras < 10) u8g.print("0");     // SE AS HORAS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
    u8g.print(ahoras);                   // SEM ESSE CODIGO SE MOSTARIA ASSIM: H:M:S  (1:M:S)
    u8g.print(":");

    if (aminutos < 10) u8g.print("0");   // SE OS MINUTOS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
    u8g.print(aminutos);                 // SEM ESSE CODIGO SE MOSTARIA ASSIM: H:M:S  (H:1:S)

    u8g.print(":");
    if (asegundos < 10) u8g.print("0");  // SE OS SEGUNDOS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
    u8g.print(asegundos);                // SEM ESSE CODIGO SE MOSTARIA ASSIM: H:M:S  (H:M:1)

    if (segundostotal == 0)            //FINALIZA O TEMPO DO TIMER
    {
      while (1)                       //FINALIZA O TEMPO E DESARMA O RELE
      {
        digitalWrite(buzzer, LOW);
        delay(200);
      }
    }
  }
  unsigned long currentMillis = millis();
  //Timer para ler o valor da temperatura
  if (currentMillis - previousMillis >= interval)
  {
    temperatura = dht.readTemperature();
    previousMillis = currentMillis;
  }

  //Testa botao aumenta temperatura
  aumenta = digitalRead(pino_aumenta);
  if (aumenta == 1)
  {
    temp_min++;
  }
  while (digitalRead(pino_aumenta) == 1)
  {
    delay(10);
  }

  //testa botao diminui temperatura
  diminui = digitalRead(pino_diminui);
  if (diminui == 1)
  {
    temp_min--;
  }
  while (digitalRead(pino_diminui) == 1)
  {
    delay(10);
  }

  u8g.firstPage();
  // Chama a rotina de desenho na tela
  do
  {
    draw();
  }
  while ( u8g.nextPage() );
  delay(50);
}

O teu problema no tamanho do código está na biblioteca para esse display... certamente que se fosse um display mais simples, seria muito menos código.
Talvez uma biblioteca mais leve?
Experimenta fazer um sketch apenas a imprimir texto e a limpar com essa biblioteca. Nada de complexo e vê quanto ocupa.

Podes alterar grande parte das tuas variáveis int para unsigned char.
Os pinos, podem passar para const unsigned char. Tanto é que alguns dos pinos estão definidos e não são variáveis.

bubulindo:
O teu problema no tamanho do código está na biblioteca para esse display... certamente que se fosse um display mais simples, seria muito menos código.
Talvez uma biblioteca mais leve?
Experimenta fazer um sketch apenas a imprimir texto e a limpar com essa biblioteca. Nada de complexo e vê quanto ocupa.

Podes alterar grande parte das tuas variáveis int para unsigned char.
Os pinos, podem passar para const unsigned char. Tanto é que alguns dos pinos estão definidos e não são variáveis.

Valeu pelas dicas, vou ver se funciona abaixei boa parte mudando para unsigned char e para unsigned short int, removi tambem as linhas que escolhiam as fontes para ser escrita na tela, u8g.setFont(u8g_font_fub20);
nao estou com o arduino no momento para testar, mas sem as fontes sera que vai ser printado em alguma fonte padrao ou corre o risco de nao printar nada??

bubulindo:
Experimenta fazer um sketch apenas a imprimir texto e a limpar com essa biblioteca. Nada de complexo e vê quanto ocupa.

Nao da tambem, quando carrega as fontes ele ocupa muito espaco, sera que tem alguma maneira de diminuir essas fontes? eu limpei o arquivo de fonte, mas sem sucesso. so com uma la ainda continua carregando muito a flash,

Alguma ideia??