void setup() { // setup só é executado uma única vez (ao ligar o micro)
#define LED 10 // Led vermelho
#define LED 5 // Led azul
#define BOTAO 2 // Botão
Serial.begin(115200); // inicia comunicação serial (BITS por segundos mandado para o micro)
Serial.println("Olá, Mundo! ");
pinMode(LED, OUTPUT); // define o pino 10 como saída
pinMode(LED, OUTPUT); // define o pino 5 como saída
pinMode(BOTAO, INPUT_PULLUP); // define o pino como 1 (lógica invertida)
}
//Loop utilizando o delay (problemas no acionamento do botão)
/*void loop() {
static int i, j; // static mantém o último valor da váriavel guardado (conta de 0 até 255)
bool bot; //especifica o estado do botão (acionado ou não)
delay (200);
digitalWrite(10, HIGH); // acende o led vermelho
digitalWrite(5, LOW); // mantém o led azul apagado
delay (200);
digitalWrite(10, LOW); // apaga o led vermelho
digitalWrite(5, HIGH); // acende o led azul
i++;
Serial.print("Número de ciclos ");
Serial.println(i);
bot = digitalRead(BOTAO); // leitura do pino digital do botão
if (!bot) { // if (!bot) -> é igual a: low/false/0/!1)
j++;
Serial.print("Botão ");
Serial.println(j);
}
}
*/
/*
Soluções para melhorar o problema do acionamento do botão:
1- Tirar o delay
2- Interrupção (mais recomendado)
3- Utilizar as funções temporárias millis () e micros ()
*/
//Loop profissional (problema do delay no acionamento do botão resolvido)
void loop() {
//Atenção para o static nas variáveis abaixo.
//Eles indicam que a função reterá o valor dela entre duas chamadas!
static int i; //variável para contar o número de ciclos
static int j; //variável para contar o número de apertos de botão
static bool estado; //especifica o estado do LED
static long ti = 0; // váriavel para contar o tempo (tempo inicial)
long tf = millis(); // váriavel para contar o tempo (tempo final)
//static unsigned long repique = millis(); //evita repiques nos apertos do botao
//Resolução 1:
/*static bool bot;
bot = digitalRead(BOTAO);
if (!bot) {
j++;
Serial.print("Botão ");
Serial.println(j);
}
*/
//Resolução 2 (com pulse):
/*if (pulseIn(4,LOW) > 100) j++;
*/
//Resolução 3 (com detector de borda):
static bool bot = digitalRead(BOTAO);
static unsigned long repique = 0;
if (bot && !digitalRead(BOTAO) && ((millis () - repique) > 500)) {
j++;
repique = millis();
}
if (tf - ti >= 500) { //caso tenha se passado 500ms, muda o estado do LED
digitalWrite(10, estado);
digitalWrite(5, !estado);
estado = !estado;
ti = millis(); //ajusta ti para recomeçar uma nova contagem!
i++;
Serial.print("Numero de ciclos ");
Serial.println(i);
Serial.print("Botão ");
Serial.println(j);
}
//Resolução utilizando interrupção:
//(No outro projeto)
}