Problem optimize code arduino mini Atmega 168P

Need help to optimize this code for arduino pro Atmega 168P

//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);
}

Optimise for what? Speed? Size? Clarity? Comment Grammar?

What is wrong with what you have now?

KeithRB: Optimise for what? Speed? Size? Clarity? Comment Grammar?

What is wrong with what you have now?

Size, need run in ATMEGA 168P Arduino Mini

Which size? Flash or RAM?

KeithRB: Which size? Flash or RAM?

Flash, 21.364 bytes (149%)

You probably need to go into your libraries and start deleting stuff you don't use. For example, if the U8g library has tables of fonts you don't use, delete them.

(deleted)

KeithRB: You probably need to go into your libraries and start deleting stuff you don't use. For example, if the U8g library has tables of fonts you don't use, delete them.

remove u8g.setFont(u8g_font_fub20); line 48 and u8g.setFont(u8g_font_8x13B); line 57, Flash 9.932 bytes (69%).

WITHOUT THAT Command will print font standart or not print nothing??

You need to go into the actual library code and see if there is data you do not use that can be deleted.

spycatcher2k: Or spend a few £/$/EURO . . . on a 328p

What is wrong with this option? If you aren't doing mass production runs, the cost difference between the difference capacities doesn't matter and all the other performance benchmarks will be pretty much identical.

osadrac:
Flash, 21.364 bytes (149%)

And you are not using an Atmega328P why?

So, you know the code is too big because your flash is teeny.

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

So think about this… there is startup code you do not see for the Arduino (like when you compile an empty sketch with just startup/loop. Then there is library code (you have 2 libraries identified.) Then there is your Arduino sketch code. You can only adjust 3 out of the 4. Personally, the graphics code needs to go first … just use Serial.print instead of the u8g.print(…)

You can also look for a lean, mean DHT library or just make that a function routine if you know how to do that.

But the easy thing is to just use a more capable uC.

Ray

mrburnette:
And you are not using an Atmega328P why?

So, you know the code is too big because your flash is teeny.

#include "U8glib.h"

#include <DHT.h>




So think about this... there is startup code you do not see for the Arduino (like when you compile an empty sketch with just startup/loop. Then there is library code (you have 2 libraries identified.) Then there is your Arduino sketch code. You can only adjust 3 out of the 4. Personally, the graphics code needs to go first ... just use Serial.print instead of the u8g.print(...)

You can also look for a lean, mean DHT library or just make that a function routine if you know how to do that.

But the easy thing is to just use a more capable uC.

Ray

Ty u Help,
I removed the U8glib.h library and used LiquidCrystal.h.

code

//Programa: Arduino e DS18B20 controle de rele por temperatura e timer
//Autor: Junior Oliveira

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

int posicao = 0;
int temp_min = 24; // 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 rele_timer = 13;           // PINO DIGITAL PARA RELE TIMER
int rele_temp = 12; // PINO DIGITAL RELE TEMPERATURA
int start = A2;            //PINO ANALOGICO PARA BOTAO DE START
int buth = A0;             //PINO ANALOGICO BOTAO HORAS
int butm = A1;             //PINO ANALOGICO BOTAO MINUTOS
int buts = A3;             //PINO ANALOGICO BOTAO SEGUNDOS
#define ONE_WIRE_BUS 10  // PINO DIGITAL SENSOR DE TEMPERATURA
#define pino_aumenta 2 // BOTAO AUMENTA TEMPERATURA MAXIMA
#define pino_diminui 3 // DIMINUI TEMPERATURA MAXIMA

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

int temperatura;
int aumenta, diminui;

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

void setup(void)
{
  lcd.begin(16, 2);
  Serial.begin(9600);
  pinMode(rele_temp, OUTPUT);
  pinMode(rele_timer, OUTPUT);
  pinMode(pino_aumenta, INPUT);
  pinMode(pino_diminui, INPUT);
  digitalWrite(rele_timer, HIGH);
  digitalWrite(rele_temp, LOW);
  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
  sensors.begin();
}

void loop(void)
{
  do
  {
    sensors.requestTemperatures(); // REQUISITA TEMPERATURA DOS SENSORES

    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);
    }
    lcd.setCursor(1, 1);

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

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

    lcd.print(":");
    if (asegundos < 10) lcd.print("0"); // SE OS SEGUNDOS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
    lcd.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
    }
  
    //botao aumenta temperatura
    aumenta = digitalRead(pino_aumenta);
    if (aumenta == 0)
    {
      temp_max++;
    }
    while (digitalRead(pino_aumenta) == 0)
    {
      delay(10);
    }

    //botao diminui temperatura
    diminui = digitalRead(pino_diminui);
    if (diminui == 0)
    {
      temp_max--;
    }
    while (digitalRead(pino_diminui) == 0)
    {
      delay(10);
    }
    lcd.setCursor(0, 0);
    lcd.print(temperatura);
    lcd.setCursor(2, 0);
    lcd.print("C");
    lcd.setCursor(4, 0);
    lcd.print("MIN");
    lcd.setCursor(8, 0);
    lcd.print(temp_max);
    lcd.setCursor(10, 0);
    lcd.print("C");
    if (temp_min >= temperatura)
{
   digitalWrite(rele_temp, LOW);
}
else if (temp_max <= temperatura)
{
   digitalWrite(rele_temp, HIGH);
}
    unsigned long currentMillis = millis();
    //Timer para ler o valor da temperatura
    if (currentMillis - previousMillis >= interval)
    {
      temperatura = sensors.getTempCByIndex(0);
      previousMillis = currentMillis;
    }
  } while (empieza != 0); // VOLTA AO MENU DE AJUSTE PARA APENAS APERTAR O BOTAO START
  while (segundostotal > 0)
  {
    sensors.requestTemperatures(); // REQUISITA TEMPERATURA DOS SENSORES
    delay (235);          //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

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

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

    lcd.print(":");
    if (asegundos < 10) lcd.print("0");  // SE OS SEGUNDOS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
    lcd.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(rele_timer, LOW);
        delay(200);
        lcd.clear();
        lcd.setCursor(1, 0);
        lcd.print("TEMPO ESGOTADO");
        lcd.setCursor(5, 1);
        lcd.print("By: Jr");
      }
    }
    //botao aumenta temperatura
    aumenta = digitalRead(pino_aumenta);
    if (aumenta == 0)
    {
      temp_max++;
    }
    while (digitalRead(pino_aumenta) == 0)
    {
      delay(10);
    }

    //botao diminui temperatura
    diminui = digitalRead(pino_diminui);
    if (diminui == 0)
    {
      temp_max--;
    }
    while (digitalRead(pino_diminui) == 0)
    {
      delay(10);
    }
    lcd.setCursor(0, 0);
    lcd.print(temperatura);
    lcd.setCursor(2, 0);
    lcd.print("C");
    lcd.setCursor(4, 0);
    lcd.print("MIN");
    lcd.setCursor(8, 0);
    lcd.print(temp_max);
    lcd.setCursor(10, 0);
    lcd.print("C");
    if (temp_min >= temperatura)
{
   digitalWrite(rele_temp, LOW);
}
else if (temp_max <= temperatura)
{
   digitalWrite(rele_temp, HIGH);
}
    unsigned long currentMillis = millis();
    //Timer para ler o valor da temperatura
    if (currentMillis - previousMillis >= interval)
    {
      temperatura = sensors.getTempCByIndex(0);
      previousMillis = currentMillis;
    }
  }
}