Uma das melhores formas de começar a aprender programação e eletrônica com o Arduino é utilizando LEDs. Neste tutorial, veremos como controlar os LEDs e como ativar várias funções com um botão de pressão. Isto é um bom resumo do que pode ser encontrado num robô: o cérebro (placa Arduino), os sensores (o botão) e as saídas (LEDs), que também poderiam ser motores, por exemplo.
Material
- Computador
- Arduino UNO
- Cabo USB para ligar o Arduino ao computador
- 3 LEDs
- Breadboard
- Cabos Dupont M/M
- Botão de pressão
- 4 Resistências
Objetivo
Vamos definir várias funções que farão com que os LEDs se iluminem de diferentes maneiras, dependendo das ações no botão de pressão. Este é o princípio (simplificado) da programação robótica: realizar uma ação de acordo com as informações provenientes de sensores.
Esquema de ligação
O botão é ligado ao pino 8, o LED 1 ao pino 9, o LED 2 ao pino 10 e o LED 3 ao pino 11. Note a presença de resistências para evitar danificar os componentes. Conforme os componentes utilizados, as resistências podem ser desnecessárias. Verifique as especificações técnicas dos seus componentes.
Código
A função utilizada para controlar um díodo é digitalWrite(), sendo HIGH e LOW os parâmetros para ligar e desligar.
digitalWrite(led1Pin,HIGH); delay(30); digitalWrite(led1Pin,LOW); delay(30);
Também se pode modular o brilho do LED usando a função analogWrite().
int brightness = 0; int fadeAmount = 5; for (brightness=0;brightness<=255;brightness+=fadeAmount){ analogWrite(led1Pin, brightness); delay(30); }
Essas funções básicas são utilizadas nos exemplos Blink e Fade da IDE do Arduino. Com elas, podemos criar várias funções para controlar os LEDs de diferentes formas conforme o modo selecionado.
Para ler o estado de um botão, a função utilizada é normalmente digitalRead(). Aqui, queremos que o botão possa ativar várias funções. Para isso, contaremos quantas vezes o botão é pressionado. Utilizamos desse modo a função pulseIn(), que mede o comprimento de um pulso.
unsigned long buttonState = 0; int funcState=0; void buttonPressed() { buttonState = pulseIn(btnPin,HIGH,1000000); if (buttonState > 50){ funcState += 1; Serial.print("Button state n: "); Serial.println(funcState); } funcState=funcState%NBSTATE; }
A variável funcState contém o modo selecionado. Em seguida, podemos definir esses modos e associar as funções correspondentes. Utilizamos a palavra-chave enum, que permite criar facilmente uma lista de inteiros, e switch..case, que permite executar um código de acordo com uma variável.
enum fcnMode { OFF, LED1, LED2, LED3, FADE1, ALL, BLINK, NBSTATE }; // OFF = 0 and NBSTATE=7 switch(funcState){ case OFF: break; case LED1: digitalWrite(led1Pin,HIGH); break; case LED2: digitalWrite(led2Pin,HIGH); break; case LED3: digitalWrite(led3Pin,HIGH); break; case FADE1: fade1(); break; case ALL: digitalWrite(led1Pin,HIGH); digitalWrite(led2Pin,HIGH); digitalWrite(led3Pin,HIGH); break; case BLINK: blinkLed1(); blinkLed2(); blinkLed3(); break; }
Código completo
Aqui está o código completo, que pode ser adaptado ao seu projeto.
// Pin assignement
const int btnPin = 8;
const int led1Pin = 9;
const int led2Pin = 10;
const int led3Pin = 11;
enum fcnMode {
OFF,
LED1,
LED2,
LED3,
FADE1,
ALL,
BLINK,
NBSTATE
}; // OFF = 0 and NBSTATE=7
int ledState1 = LOW, ledState2 = LOW, ledState3 = LOW; // ledState used to set the LED
unsigned long buttonState = 0;
int funcState = 0;
unsigned long currentMillis1, currentMillis2, currentMillis3; // will store current time
unsigned long previousMillis1, previousMillis2, previousMillis3; // will store last time LED was updated
const long interval1 = 100; // interval at which to blink (milliseconds)
const long interval2 = 300;
const long interval3 = 500;
/******************************************************************\
PRIVATE FUNCTION: setup
PARAMETERS:
~ void
RETURN:
~ void
DESCRIPTIONS:
Initiate inputs/outputs
\******************************************************************/
void setup() {
Serial.begin(9600); // initialize serial port
pinMode(btnPin, INPUT_PULLUP);
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(led3Pin, OUTPUT);
}
/******************************************************************\
PRIVATE FUNCTION: loop
PARAMETERS:
~ void
RETURN:
~ void
DESCRIPTIONS:
Main Function of the code
\******************************************************************/
void loop() {
buttonPressed();
setMode();
}
/******************************************************************
SUBFUNCTIONS
\******************************************************************/
void buttonPressed() {
buttonState = pulseIn(btnPin, HIGH, 1000000);
if (buttonState > 50) {
funcState += 1;
Serial.print("Button state n: ");
Serial.println(funcState);
}
funcState = funcState % NBSTATE;
}
void setMode() {
// All Off
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, LOW);
Serial.print("Function : ");
Serial.println(funcState);
switch (funcState) {
case OFF:
break;
case LED1:
digitalWrite(led1Pin, HIGH);
break;
case LED2:
digitalWrite(led2Pin, HIGH);
break;
case LED3:
digitalWrite(led3Pin, HIGH);
break;
case FADE1:
fade1();
break;
case ALL:
digitalWrite(led1Pin, HIGH);
digitalWrite(led2Pin, HIGH);
digitalWrite(led3Pin, HIGH);
break;
case BLINK:
blinkLed1();
blinkLed2();
blinkLed3();
break;
}
}
void fade1() {
int brightness = 0;
int fadeAmount = 5;
for (brightness = 0; brightness <= 255; brightness += fadeAmount) {
analogWrite(led1Pin, brightness);
delay(30);
}
for (brightness = 255; brightness >= 0; brightness -= fadeAmount) {
analogWrite(led1Pin, brightness);
delay(30);
}
}
void blinkLed1() {
currentMillis1 = millis();
if (currentMillis1 - previousMillis1 >= interval1) {
// save the last time you blinked the LED
previousMillis1 = currentMillis1;
// if the LED is off turn it on and vice-versa:
if (ledState1 == LOW) {
ledState1 = HIGH;
} else {
ledState1 = LOW;
}
// set the LED with the ledState of the variable:
digitalWrite(led1Pin, ledState1);
}
}
void blinkLed2() {
currentMillis2 = millis();
if (currentMillis2 - previousMillis2 >= interval2) {
// save the last time you blinked the LED
previousMillis2 = currentMillis2;
// if the LED is off turn it on and vice-versa:
if (ledState2 == LOW) {
ledState2 = HIGH;
} else {
ledState2 = LOW;
}
// set the LED with the ledState of the variable:
digitalWrite(led2Pin, ledState2);
}
}
void blinkLed3() {
currentMillis3 = millis();
if (currentMillis3 - previousMillis3 >= interval3) {
// save the last time you blinked the LED
previousMillis3 = currentMillis3;
// if the LED is off turn it on and vice-versa:
if (ledState3 == LOW) {
ledState3 = HIGH;
} else {
ledState3 = LOW;
}
// set the LED with the ledState of the variable:
digitalWrite(led3Pin, ledState3);
}
}
Escreva um comentário abaixo para compartilhar as suas realizações ou nos deixar o seu feedback. Também fique à vontade para nos contactar caso tenha dúvidas.
Aplicação
- Criar um semáforo em miniatura
Source
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
