Automação Residencial

Pomodoro com Display LCD I2C

Eletrogate 6 de setembro de 2022

Introdução

Quantas vezes você já começou os estudos ou aquela atividade que exige concentração e, em pouco tempo, se distraiu com o celular, aquele meme no feed das suas redes sociais ou, até mesmo, com aquela notificação do whatsapp!? Pensando nisso, traremos, neste post, a solução de seus problemas. No projeto de hoje, iremos desenvolver um dispositivo que trabalha com o método de estudos chamado pomodoro. O método Pomodoro é um método de gerenciamento de tempo que consiste na utilização de um cronômetro para dividir o trabalho/atividade em períodos de 25 minutos, separados por intervalos de 10 minutos. Em nosso dispositivo, iremos fazer a contagem do tempo da sua atividade de foco (25 minutos) e, após finalizar a primeira, uma nova, para o tempo do intervalo (10 minutos). Para isso, vamos utilizar o Arduino Nano, o Display LCD, um Buzzer e um Led.


Requisitos

Para realizar o projeto, é necessário que instalemos as seguintes bibliotecas: 


Diagrama

Abaixo, o diagrama do projeto

As conexões ficaram da seguinte forma

  • SDA do Display: pino A4
  • SCL do Display: pino A5
  • Positivo do Buzzer: Pino 4
  • Anodo do Led: pino 5

Nosso circuito ficará assim:

Blog-Eletrogate-Circuito

Circuito Dispositivo Pomodoro

Para deixar o nosso pomodoro mais carismático, é possível fazer uma impressão 3D para disponibilizar os componentes:

Blog-Eletrogate-Protótipo-3D

Protótipo impressão 3D – Dispositivo pomodoro

A impressão ficará dessa forma e você pode encontrar esse modelo clicando aqui:

Blog-Eletrogate-Impressão-3D

Impressão 3D – Dispositivo Pomodoro


Programação

O código para a programação se encontra disponível aqui:

#include <Wire.h> // Biblioteca Wire responsável por conter funções de comunicação entre dispositivos através do protocolo I2C.
#include <LiquidCrystal_I2C.h>//Biblioteca I2C
LiquidCrystal_I2C lcd(0x38,16,2);  // Criando um LCD de 16x2 no endereço 0x38

/*Definição de Pinos*/
#define led_Verde 5 // Pino do led
#define buzzer 4 // Pino do buzzer

/*Criando as variáveis*/
int pomodoro_estudo = 25; //Tempo de estudo
int pomodoro_descanso = 10; //Tempo de descanso
signed short minutos, segundos, tipos, periodo =0;//Variáveis para a contagem do tempo
char tela[16];//Definindo a variável para conter os caracteres de tempo
int tempo = 200;// Variável para definir a velocidade da música
int divisor = 0, duracaoNota = 0;


int musica[] = {
  // Super Mario Bros theme
  // site da partitura - https://musescore.com/user/2123/scores/2145
  // Koji Kondo
  //Existem dois valores por nota, o primeiro é a altura da nota e o segundo é a sua duração. Ex: 659,8
  
  659,8, 659,8, 0,8, 659,8, 0,8, 523,8, 659,8, 
  784,4, 0,4, 392,8, 0,4, 
  523,-4, 392,8, 0,4, 330,-4, 
  440,4, 494,4, 466,8, 440,4,
  392,-8, 659,-8, 784,-8, 880,4, 698,8, 784,8,
  0,8, 659,4,523,8, 587,8, 494,-4,
  523,-4, 392,8, 0,4, 330,-4, 
  440,4, 494,4, 466,8, 440,4,
  392,-8, 659,-8, 784,-8, 880,4, 698,8, 784,8,
  0,8, 659,4,523,8, 587,8, 494,-4,
};

int notas = sizeof(musica) / sizeof(musica[0]) / 2; // Fornecemos o número de byte, cada valor int é composto por 2 bytes (16 bits)
int notaInteira = (60000 * 4) / tempo;// Calcula o valor da nota.


void setup() {
 //Iniciamos o Display LCD
 lcd.init();
 lcd.backlight();
 //Declarando os pinos usados como Saída
 pinMode(led_Verde, OUTPUT);
 pinMode(buzzer, OUTPUT);

}

void loop() {
  //Print no Display o tempo percorrido
  lcd.setCursor(0,0);
  lcd.print("Tempo decorrido: ");
  lcd.setCursor(1,1);
  sprintf(tela, "%.2d min %.2d seg", minutos, segundos);
  lcd.print(tela);
  //Espera um segundo para adicionar +1 na variável segundos
  delay(1000);
  segundos++;

  //Se os segundos for igual a 60, seta a variável segundos para 0 e acrescenta +1 na variável mintuos
  if(segundos == 60){
    segundos =0;
    minutos++;
  }
  
  //Se os minutos for igual a 25 e o período for igual a 0
  if(minutos == pomodoro_estudo && periodo == 0){
    minutos = 0; //A variável minutos seta para 0
    periodo = 1; // A variável periodo recebe 1 para informar que estamos na contagem descanso
    digitalWrite(led_Verde, HIGH);//Liga o led verde

    delay(1000);

    //Toca a musica do mário
    for (int notaAtual = 0; notaAtual < notas * 2; notaAtual = notaAtual + 2) {

    // Calcula a duração de cada nota
    divisor = musica[notaAtual + 1];
    if (divisor > 0) {
      // Nota normal, lida sem nenhuma interferência
      duracaoNota = (notaInteira) / divisor;
    } else if (divisor < 0) {
      //Durações negativas representa notas pontilhadas. 
      duracaoNota = (notaInteira) / abs(divisor);
      duracaoNota *= 1.5; // Aumenta a duração da nota pela metade
    }

    // Cada nota é tocada apenas 90% do seu tempo, os outros 10% é para pausas
    tone(buzzer, musica[notaAtual], duracaoNota * 0.9);

    // Espera a duração específica da nota acabar para tocar a próxima
    delay(duracaoNota);
    noTone(buzzer);
    }

  //se minutos for igual ao tempo do intervalo de descanso e o período igual a 1 
  }else if(minutos == pomodoro_descanso && periodo == 1){
    minutos =0; //A variável minutos seta para 0
    periodo = 0;  //A variável periodo recebe 0 para informar que estamos na contagem descanso
    digitalWrite(led_Verde, LOW); //Desliga o led verde
    delay(1000);
  }
}

Na primeira parte do código, incluímos as bibliotecas, definimos a entrada do buzzer e do led e declaramos todas as variáveis.

Blog-Eletrogate-Programação-Parte1

Após definirmos as portas, iremos criar uma função do tipo inteiro para definir as notas musicais da música Theme Mario, que irá tocar sempre que terminar o tempo de estudos. Além disso, definimos como fazer as leituras dessas notas e sua duração e calcular seu valor.

Blog-Eletrogate-Programação-Parte2

No setup, iniciamos o LCD e configuramos o modo das portas como saída.

Blog-Eletrogate-Programação-Parte3

No void Loop, printamos o tempo percorrido a cada segundo.

Blog-Eletrogate-Programação-Parte4

Quando a variável segundos atinge o valor 60, acrescentamos 1 à variável minutos e setamos a variável segundos. 

Em nosso código, existem dois períodos. O período de estudo, que recebe o valor 0, e o período de descanso, que recebe o valor 1. Quando o tempo decorrido atinge o tempo de estudo e o período tem valor 0, setamos a variável de minutos e a variável período recebe o valor 1. Além disso, ligamos o led verde e chamamos a função dentro do for para tocar a música do Mário. Aqui, é possível ver o código da música completa e ver, com detalhes, como funciona o código.

Blog-Eletrogate-Programação-Parte5

A última parte é quanto o tempo for igual ao intervalo de descanso e o período igual a 1. As variáveis minutos e período recebem o valor 0 e, após, desligamos o LED verde.

Blog-Eletrogate-Programação-Parte6


Resultado

Tendo feito todos os passos, basta carregar o código para o Arduino e, imediatamente, terá o resultado no Display LCD, como mostrado no vídeo abaixo:

 

 


Sobre o Autor


Lívia Gonçalves
Livia-Goncalves-01
@liviagoncalves_dev

Estudante de Engenharia da Computação e Instrutora de tecnologia e programação.


Eletrogate

6 de setembro de 2022

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!