Projeto de Efeitos Sequenciais com 10 LEDs no Arduino Controlados por Push Button
Projeto de Efeitos Sequenciais com 10 LEDs no Arduino Controlados por Push Button
Introdução
Neste artigo, vamos desenvolver um projeto utilizando um Arduino para controlar 10 LEDs que exibem diferentes efeitos sequenciais, alterados por meio de um push button. Os LEDs serão conectados nas portas digitais 4 a 13, e o botão será conectado à porta digital 2. Este projeto é uma ótima introdução à programação de microcontroladores, manipulação de entradas e saídas digitais, e criação de efeitos visuais interativos.
Materiais Necessários
Arduino (Uno, Nano ou similar)
10 LEDs (qualquer cor)
10 resistores (220Ω a 330Ω)
1 push button
1 resistor de pull-down (10kΩ)
Protoboard e jumpers
Montagem do Circuito
LEDs: Conecte os LEDs nas portas 4 a 13 do Arduino, cada um com um resistor em série para limitar a corrente.
Push Button: Conecte um terminal do botão ao pino digital 2 e o outro ao +5V. Use um resistor de 10kΩ como pull-down entre o pino 2 e o GND para evitar flutuações.
Programação no Arduino
O código abaixo implementa três efeitos diferentes de sequência de LEDs, alternados pelo push button:
Código Completo
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // cria um array para os pinos digitais dos LEDsbyte butPin = 2;byte control = 0;int ledDelay;int direction;int currentLED;int ledDir;int ledEsq;int l;int h;void setup() {for (int x=0; x<10; x++) { // define todos os pinos dos LEDs como saídapinMode(ledPin[x], OUTPUT);}pinMode(butPin, INPUT_PULLUP);Serial.begin(9600);}void loop() {// muda de efeitoif(!digitalRead(butPin)) {while (!digitalRead(butPin)) {} // espera soltar o botãodelay(10); // reduz efeito bouncingcontrol++;if(control>10) control = 1;Serial.println(control);}//cria repetições dos efeitosif (control==1) efeito1();if (control==2) efeito2();if (control==3) efeito3();if (control==4) efeito4();if (control==5) efeito5();if (control==6) efeito6();if (control==7) efeito7();if (control==8) efeito8();if (control==9) efeito9();if (control==10) efeito10();}void efeito1() {// EFEITO 1 - vai e voltacurrentLED = 0;direction = 1;for(int i = 0; i < 72; i++) { // efeito 1: vai e voltadigitalWrite(ledPin[currentLED], HIGH); // acende o LED atualcurrentLED += direction; // incrementa de acordo com o valor de directiondelay(100);for (int x=0; x<10; x++) { // apaga todos os LEDsdigitalWrite(ledPin[x], LOW);}// altera a direção se tivermos atingido o fimif (currentLED == 9) {direction = -1;}if (currentLED == 0) {direction = 1;}if(!digitalRead(butPin)) break; // interrompe o ciclo}}void efeito2() {// EFEITO 2 - girandocurrentLED = 0;direction = 1;for(int i = 0; i < 150; i++){ // efeito 2: girandodigitalWrite(ledPin[currentLED], HIGH); // acende o LED atualif (currentLED>0){digitalWrite(ledPin[currentLED-1], LOW);} // acende o LED atualcurrentLED += direction; // incrementa de acordo com o valor de directiondelay(35);if (currentLED == 10) {digitalWrite(ledPin[currentLED-1], LOW);currentLED = 0;}if(!digitalRead(butPin)) break; // interrompe o ciclo}}void efeito3() {// EFEITO 3 - pares e ímparescurrentLED = 0;direction = 1;for(int i = 0; i < 84; i++){ // efeito 3: pares e ímparesif (direction==1) {if ( currentLED % 2 == 0 ) {digitalWrite(ledPin[currentLED], HIGH); // acende o LED atualcurrentLED += direction; // incrementa de acordo com o valor de direction}else {digitalWrite(ledPin[currentLED], LOW); // apaga o LED atualcurrentLED += direction; // incrementa de acordo com o valor de direction}delay (65);}if (direction==-1){if ( currentLED % 2 == 0 ) {digitalWrite(ledPin[currentLED], LOW); // acende o LED atualcurrentLED += direction; // incrementa de acordo com o valor de direction}else {digitalWrite(ledPin[currentLED], HIGH); // apaga o LED atualcurrentLED += direction; // incrementa de acordo com o valor de direction}delay (65);}// altera a direção se tivermos atingido o fimif (currentLED == 10) {direction = -1;}if (currentLED == -1) {direction = 1;}if(!digitalRead(butPin)) break; // interrompe o ciclo}}void efeito4() {//EFEITO 4 - pares e ímpares 2for(int i = 0; i < 17; i++){ // efeito 4: pares e ímparesif(!digitalRead(butPin)) break; // interrompe o ciclofor (int x=0; x<10; x++) { // ACENDE OS LEDs PARESif ( x % 2 == 0 ) {digitalWrite(ledPin[x], HIGH); // ACENDE o LED atual}}if(!digitalRead(butPin)) break; // interrompe o ciclofor (int x=0; x<10; x++) { // APAGA OS LEDs IMPARESif ( x % 2 != 0 ) {digitalWrite(ledPin[x], LOW); // apaga o LED atual}}if(!digitalRead(butPin)) break; // interrompe o ciclodelay(200);for (int x=0; x<10; x++) { // APAGA OS LEDs PARESif ( x % 2 == 0 ) {digitalWrite(ledPin[x], LOW); // apaga o LED par atual}digitalWrite(ledPin[x], LOW); // apaga o LED par atual}if(!digitalRead(butPin)) break; // interrompe o ciclofor (int x=0; x<10; x++) { // acende OS LEDs IMPARESif ( x % 2 != 0 ) {digitalWrite(ledPin[x], HIGH); // apaga o LED atual}if(!digitalRead(butPin)) break; // interrompe o ciclo}if(!digitalRead(butPin)) break; // interrompe o ciclodelay(200);}for (int x=0; x<10; x++) { // APAGA OS LEDs IMPARESif ( x % 2 != 0 ) {digitalWrite(ledPin[x], LOW); // apaga o LED atual}if(!digitalRead(butPin)) break; // interrompe o ciclo}delay(100);}void efeito5() {//EFEITO 5 - VU MetercurrentLED = 0;direction = 1;for(int i = 0; i < 82; i++){ // efeito 5: Vu Meterif (direction==1) {digitalWrite(ledPin[currentLED], HIGH); // acende o LED atualcurrentLED += direction; // incrementa de acordo com o valor de directiondelay(35);}if (direction==-1){digitalWrite(ledPin[currentLED], LOW); // acende o LED atualcurrentLED += direction; // incrementa de acordo com o valor de directiondelay(35);}if(!digitalRead(butPin)) break; // interrompe o ciclodelay (200);// altera a direção se tivermos atingido o fimif (currentLED == 10) {direction = -1; currentLED=9;}if (currentLED == -1) {direction = 1; currentLED=0;}}}void efeito6() {// EFEITO 6 - Giroflexfor(int i = 0; i < 30; i++){digitalWrite(ledPin[0], HIGH);digitalWrite(ledPin[5], HIGH);delay(50);digitalWrite(ledPin[0], LOW);digitalWrite(ledPin[5], LOW);digitalWrite(ledPin[1], HIGH);digitalWrite(ledPin[6], HIGH);delay(50);digitalWrite(ledPin[1], LOW);digitalWrite(ledPin[6], LOW);digitalWrite(ledPin[2], HIGH);digitalWrite(ledPin[7], HIGH);delay(50);digitalWrite(ledPin[2], LOW);digitalWrite(ledPin[7], LOW);digitalWrite(ledPin[3], HIGH);digitalWrite(ledPin[8], HIGH);delay(50);digitalWrite(ledPin[3], LOW);digitalWrite(ledPin[8], LOW);digitalWrite(ledPin[4], HIGH);digitalWrite(ledPin[9], HIGH);delay(50);digitalWrite(ledPin[4], LOW);digitalWrite(ledPin[9], LOW);if(!digitalRead(butPin)) break; // interrompe o ciclo}}void efeito7() {// EFEITO 7for(int i = 0; i < 12; i++){for (int x=0; x<10; x++) { // acente todos os LEDsdigitalWrite(ledPin[x], HIGH);}if(!digitalRead(butPin)) break; // interrompe o ciclodelay(150);for (int x=0; x<10; x++) { // APAGA OS LEDs PARESif ( x % 2 == 0 ) {digitalWrite(ledPin[x], LOW); // apaga o LED par atual}}if(!digitalRead(butPin)) break; // interrompe o ciclodelay(350);for (int x=0; x<10; x++) { // ACENDE OS LEDs PARESif ( x % 2 == 0 ) {digitalWrite(ledPin[x], HIGH); // ACENDE o LED atual}}if(!digitalRead(butPin)) break; // interrompe o ciclodelay(150);for (int x=0; x<10; x++) { // APAGA OS LEDs IMPARESif ( x % 2 != 0 ) {digitalWrite(ledPin[x], LOW); // apaga o LED atual}}if(!digitalRead(butPin)) break; // interrompe o ciclodelay(350);for (int x=0; x<10; x++) { // APAGA OS PARESif ( x % 2 == 0 ) {digitalWrite(ledPin[x], LOW); // apaga o LED atual}}if(!digitalRead(butPin)) break; // interrompe o ciclodelay(150);}}void efeito8() {// EFEITO 8 - Começa nos cantosledDir = 0;ledEsq = 9;for(int i = 0; i < 4; i++){for(int i = 0; i < 5; i++){digitalWrite(ledPin[ledDir], HIGH); // acende o LED atualledDir = ledDir +1;if(!digitalRead(butPin)) break; // interrompe o ciclodelay(182);digitalWrite(ledPin[ledEsq], HIGH); // acende o LED atualledEsq = ledEsq -1;if(!digitalRead(butPin)) break; // interrompe o ciclodelay(182);}if(!digitalRead(butPin)) break; // interrompe o cicloledDir = 0;ledEsq = 9;for(int i = 0; i < 5; i++){digitalWrite(ledPin[ledDir], LOW); // apaga o LED atualledDir = ledDir +1;if(!digitalRead(butPin)) break; // interrompe o ciclodelay(182);digitalWrite(ledPin[ledEsq], LOW); // apaga o LED atualledEsq = ledEsq -1;if(!digitalRead(butPin)) break; // interrompe o ciclodelay(182);}if(!digitalRead(butPin)) break; // interrompe o ciclo}}void efeito9() {// EFEITO 9 - zig e zagfor(int i = 0; i < 7; i++){l = 1; // apagah = 0; // acendefor(int i = 0; i < 10; i++){digitalWrite(ledPin[l], LOW); // apaga o LED atuall = l - 1;digitalWrite(ledPin[h], HIGH); // acende o LED atualh = h + 2;if(!digitalRead(butPin)) break; // interrompe o ciclodelay(90);digitalWrite(ledPin[l], LOW); // apaga o LED atuall = l + 2;digitalWrite(ledPin[h], HIGH); // acende o LED atualh = h - 1;if(!digitalRead(butPin)) break; // interrompe o ciclodelay(90);}}}void efeito10() {// EFEITO 10 - três em trêsfor(int i = 0; i < 7; i++){l = 7; // apagah = 0; // acendefor(int i = 0; i < 10; i++){digitalWrite(ledPin[l], LOW); // apaga o LED atuall = l + 1;if (l>9) {l = 0;}digitalWrite(ledPin[h], HIGH); // acende o LED atualh = h + 1;if(!digitalRead(butPin)) break; // interrompe o ciclodelay(103);}if(!digitalRead(butPin)) break; // interrompe o ciclol = 7;for(int i = 0; i < 3; i++){digitalWrite(ledPin[l], LOW); // apaga o LED atuall = l + 1;if(!digitalRead(butPin)) break; // interrompe o ciclodelay(103);}if(!digitalRead(butPin)) break; // interrompe o ciclo}}
Funcionamento do Projeto
Botão: Ao pressionar o botão, o sistema alterna entre três efeitos diferentes.
Efeitos:
Efeito 1: Acende os LEDs em sequência, um por vez.
Efeito 2: Acende os LEDs em sequência e depois retorna.
Efeito 3: Pisca os LEDs em grupos alternados (pares e ímpares).
Importância do Projeto
Este projeto é fundamental para quem está aprendendo Arduino e eletrônica porque:
✅ Introduz conceitos básicos de I/O digital (entrada com botão e saída com LEDs).
✅ Ensina a trabalhar com arrays e estruturas de repetição para controle de múltiplos LEDs.
✅ Aplica técnicas de debounce para evitar leituras falsas do botão.
✅ Estimula a criatividade na criação de diferentes padrões de iluminação.
✅ Prepara para projetos mais complexos, como matrizes de LEDs, displays e automação.
Conclusão
Este projeto de efeitos sequenciais com LEDs e push button é uma ótima maneira de praticar programação e eletrônica com Arduino. Ele pode ser expandido adicionando mais efeitos, sensores ou até mesmo um display para mostrar o modo atual.
Comentários
Postar um comentário