/******************************************************************************************
Nome: Wictória Silva Passos
Disciplina: Microcontroladores e Microprocessados
Professor: Prof. Paulo
Instituição: FATEC Santo André - Mecatronica Industrial
Data: 27/11/2023
Descrição do programa: Fazer os leds acender e apagar sequencialmente, com
um intervalo definido como velocidade, a partir do acionamento do botao,
utilizando a linguagem C++ e o ESP32.
Versão: 1.0 - 27/11/2023
******************************************************************************************/
// Definir os apelidos no programa
#define led_1 12
#define led_2 14
#define led_3 27
#define led_4 26
#define btn_verde 23
#define btn_azul 34
#define btn_vermelho 32
// Criação das variáveis globais
int velocidade = 100;
unsigned int est_ant_btn_azul, est_ant_btn_verde, estado_atual_btn_azul, estado_atual_btn_verde;
unsigned long timestamp_ultimo_acionamento_azul,timestamp_ultimo_acionamento_verde,timestamp_ultimo_acionamento_verm ;
unsigned long TEMPO_DEBOUNCE = 100; //ms
//Função ISR chamada quando há geração da interrupção
void IRAM_ATTR funcao_ISR()
{
if(millis() - timestamp_ultimo_acionamento_verm >= TEMPO_DEBOUNCE){ //Ocorreu uma solicitação para mudança de evento
timestamp_ultimo_acionamento_verm = millis(); //atualiza a variável
Serial.println("INTERRUPÇÃO ACIONADA!");
digitalWrite(led_1,LOW); // apaga o led
digitalWrite(led_2,LOW);
digitalWrite(led_3,LOW);
digitalWrite(led_4,LOW);
delay(50); //o delay necessário para processar interrupção
}
}
void setup() {
Serial.begin(115200);
// Inicialização dos pinos no ESP32
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(led_4, OUTPUT);
pinMode(btn_verde, INPUT);
pinMode(btn_azul, INPUT);
pinMode(btn_vermelho, INPUT);
attachInterrupt(btn_vermelho,funcao_ISR,FALLING); //A interrupção é chamada quando ocorre uma mudança de estado do botão de nível baixo para alto
est_ant_btn_azul = digitalRead(btn_azul);
est_ant_btn_verde = digitalRead(btn_verde);
}
// Execução programa principal
void loop(){
estado_atual_btn_azul = digitalRead(btn_azul);
estado_atual_btn_verde = digitalRead(btn_verde);
if(est_ant_btn_azul =! estado_atual_btn_azul){ // btn_verde acionado, quero alterar a velocidade dos leds
if(millis() - timestamp_ultimo_acionamento_azul >= TEMPO_DEBOUNCE){
est_ant_btn_azul = estado_atual_btn_azul;
timestamp_ultimo_acionamento_azul = millis();
if(velocidade >= 1000){
velocidade = 1000;
Serial.println("VELOCIDADE MÍNIMA ATINGIDA!");
}else{
velocidade = velocidade + 100; //aumenta a velocidade de execução dos leds
}
//número de repetições feitas
sequencial_leds(10);
}
}
else if(est_ant_btn_verde =! estado_atual_btn_verde){
if(millis() - timestamp_ultimo_acionamento_verde >= TEMPO_DEBOUNCE){
est_ant_btn_verde = estado_atual_btn_verde;
timestamp_ultimo_acionamento_verde = millis();
if(velocidade <= 100){
velocidade = 100;
Serial.println("VELOCIDADE MÁXIMA ATINGIDA!");
}else{
velocidade = velocidade - 100; //aumenta a velocidade de execução dos leds
}
//número de repetições feitas
sequencial_leds(10);
}
}
else{
est_ant_btn_azul = estado_atual_btn_azul; //atualiza a variável se nada for feito.
est_ant_btn_verde = estado_atual_btn_verde; //atualiza a variável se nada for feito.
}
}
/******************************************************************************************
função: void sequencial_leds (int velocidade)
Descrição: Faz os leds acenderem e apagarem sequencialmente, uma vez, com um delay variável em mili segundos, e parar se o botão
vermelho for pressionado.
Parametros de entrada: int repetir (void) //repetição de vezes
Parametros de saida: Nenhum (void)
******************************************************************************************/
void sequencial_leds(int repetir){ //sequencial dos leds da direita para a esquerda com função de teste do botão vermelho
for(int i = 0; i < repetir; i++){
Serial.println(velocidade);
digitalWrite(led_1, HIGH);
//teste_btn_vermelho();
delay(velocidade); //continua a sequencia de velocidade se nada for feito
digitalWrite(led_1,LOW);
digitalWrite(led_2, HIGH);
//teste_btn_vermelho();
delay(velocidade); //continua a sequencia de velocidade se nada for feito
digitalWrite(led_2,LOW);
digitalWrite(led_3, HIGH);
//teste_btn_vermelho();
delay(velocidade); //continua a sequencia de velocidade se nada for feito
digitalWrite(led_3,LOW);
digitalWrite(led_4, HIGH);
//teste_btn_vermelho();
delay(velocidade); //continua a sequencia de velocidade se nada for feito
digitalWrite(led_4,LOW);
}
}