Dedicatória
Dedico este trabalho a todos os meus familiares, colaboradores e principalmente aos meus
alunos que são a razão principal pela qual trabalho ensinando esta profissão maravilhosa.
Muito obrigado a todos e vamos seguindo em frente.
Bibliografia
Todo o texto contido neste curso é de minha inteira autoria e responsabilidade. Algumas fotos e
códigos foram retirados da internet porém todos estes modificados por nós da Burgoseletronica
Ltda para adequar-se ao curso. Segue abaixo alguns sites interessantes para quem quer obter
códigos, apender mais coisas, comprar acessórios e até simular o funcionamento de Arduino:
www.arduino.cc
www.labdegaragem.com.br
www.oarduino.com
http://123d.circuits.io
www.comofazerascoisas.com.br
http://alexmartins.net
www.modkit.com
http://arduinobymyself.blogspot.com.br
http://www.arduinoecia.com.br
ÍNDICE
www.burgoseletronica.net
http://loja.burgoseletronica.net
www.lojaburgoseletronica.com.br
Iniciaremos aqui o volume 2 de nosso curso sobre Arduino. No volume anterior fizemos várias
experiências usando leds em diversas combinações. Neste volume ensinaremos a usar além
dos leds, outros periféricos que também podem ser controlados por Arduino como motores,
displays, etc. As técnicas de utilização e programação do arduino você tem no volume 1 desta
obra. Neste volume daremos continuidade à utilização do mesmo através de novas
experiências e códigos.
Lista de materiais
Procedimento
// Experiência nº 21 ‐ Produzindo som com Arduino
int buzzer = 10; // Pino do buzzer
void setup() {
pinMode(buzzer, OUTPUT); // Pino do buzzer como saída
}
void loop() {
tone(buzzer, 2000); // Buzzer apita numa frequência de 2000 Hz ou 2 kHz
delay(500); // Espera de 500 ms ou 0,5 s
noTone(buzzer); // Buzzer silencia
delay(500); // Espera de 500 ms ou 0,5 s
}
Ao transferir o código para o programa do Arduino (IDE) podemos ouvir um som agudo
produzido pelo buzzer a intervalos de meio segundo conforme definido no código. Fica
parecendo som destes despertadores de baixo custo fabricados na China. Também parece
com o som “beep” emitido por um forno micro-ondas quando termina o tempo de preparo.
Mudando o valor contido na linha de comando tone(buzzer, 2000); podemos alterar a frequência
do som produzido pelo buzzer, deixando-o mais agudo ou grave. Experimente colocar outros
valores, assim como o valor do delay e por consequência o tempo de intervalo entre os “beeps”
emitidos pelo buzzer.
Observação - Buzzer é um pequeno alto falante de cristal que emite um som pela vibração dos
cristais, diferente dos falantes comuns que emitem som pelo movimento de um cone
impulsionado por uma bobina móvel dentro do campo magnético de um imã.
Lista de materiais
Procedimento
// Experiência nº 22 ‐ Carga e descarga de capacitor
int buzzer = 12; // Pino do buzzer
int led = 11; // Pino do led
int capacitor = 1; // Pino analógico onde está ligado o capacitor (no caso A1)
int tensaocap = 0; /* Tensão inicial do capacitor. A tensão aplicada nas entradas analógicas do
Arduino é dividida em 1024 passos, ou seja, vão de 0 a 1023 */
void setup() {
pinMode(buzzer, OUTPUT); // Buzzer como saída
pinMode(led, OUTPUT); // Led como saída
}
void loop() {
tensaocap = analogRead(capacitor); // Tensão lida no capacitor entre 0 e 1023
if(tensaocap < 100) { // Se a tensão armazenada no capacitor for menor que 100
noTone(buzzer); // Buzzer fica mudo
digitalWrite(led, HIGH); // O led acende
}
if(tensaocap >= 100) { //Se a tensão armazenada no capacitor for igual ou maior que 100
tone(buzzer, tensaocap); // Buzzer emite som cuja frequência depende da carga do capacitor
digitalWrite(led, LOW); // O led apaga
delay(10); // Atraso de 10 ms para recomeçar o ciclo
}
}
Lista de materiais
Procedimento
// Experiência nº 23A ‐ Sirene de polícia
#define tempo 10 // Tempo entre os tons
int frequencia = 0; // Frequência inicial
int buzzer = 12; // Pino do buzzer
void setup()
{
pinMode(buzzer, OUTPUT); //Pino do buzzer como saída
}
void loop()
{
for (frequencia = 150; frequencia < 1800; frequencia += 1) // Aumenta a frequência do som
{
tone(buzzer, frequencia, tempo);
delay(1);
}
for (frequencia = 1800; frequencia > 150; frequencia ‐= 1) // Diminui a frequência do som
{
tone(buzzer, frequencia, tempo);
delay(1);
}
}
// Experiência 23 B ‐ Marcha imperial
int ledPin = 13; // Led ligado no pino 13 (opcional) para acompanhar a música
int speakerPin = 12; // Buzzer ligado no pino 11
#define c 261
#define d 294 // Frequências envolvidas na música
#define e 329
#define f 349
/* Código continua na próxima página*/
#define g 391
#define gS 415
#define a 440
#define aS 455
#define b 466
#define cH 523
#define cSH 554 // Frequências envolvidas na música
#define dH 587 // Fonte: http://home.mit.bme.hu/~bako/tonecalc/tonecalc.htm
#define dSH 622
#define eH 659
#define fH 698
#define fSH 740
#define gH 784
#define gSH 830
#define aH 880
void setup()
{
pinMode(ledPin, OUTPUT); // Pino do led como saída
pinMode(speakerPin, OUTPUT); // Pino do buzzer como saída
}
void loop()
{
march();
}
void beep (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds)
{
digitalWrite(ledPin, HIGH); // Acende o led de visualização da música
int x;
long delayAmount = (long)(1000000/frequencyInHertz);
long loopTime = (long)((timeInMilliseconds*1000)/(delayAmount*2));
for (x=0;x<loopTime;x++)
{
digitalWrite(speakerPin,HIGH);
delayMicroseconds(delayAmount);
digitalWrite(speakerPin,LOW);
delayMicroseconds(delayAmount);
}
digitalWrite(ledPin, LOW); // Apaga novamente o led
delay(20); // pequeno atraso de 20 ms para separar os tons da música
}
/* Código continua na próxima página*/
void march()
{
// Partitura da música no site a seguir:
//http://www.musicnotes.com/sheetmusic/mtd.asp?ppn=MN0016254
// Esta é apenas uma tradução da partitura para frequências / tempo em ms
//Tempo de 500 ms para um quarto de nota
beep(speakerPin, a, 500);
beep(speakerPin, a, 500);
beep(speakerPin, a, 500);
beep(speakerPin, f, 350);
beep(speakerPin, cH, 150);
beep(speakerPin, a, 500);
beep(speakerPin, f, 350);
beep(speakerPin, cH, 150);
beep(speakerPin, a, 1000);
beep(speakerPin, eH, 500);
beep(speakerPin, eH, 500);
beep(speakerPin, eH, 500);
beep(speakerPin, fH, 350);
beep(speakerPin, cH, 150);
beep(speakerPin, gS, 500);
beep(speakerPin, f, 350);
beep(speakerPin, cH, 150);
beep(speakerPin, a, 1000);
beep(speakerPin, aH, 500);
beep(speakerPin, a, 350);
beep(speakerPin, a, 150);
beep(speakerPin, aH, 500);
beep(speakerPin, gSH, 250);
beep(speakerPin, gH, 250);
beep(speakerPin, fSH, 125);
beep(speakerPin, fH, 125);
beep(speakerPin, fSH, 250);
delay(250);
beep(speakerPin, aS, 250);
beep(speakerPin, dSH, 500);
beep(speakerPin, dH, 250);
beep(speakerPin, cSH, 250);
/* Código continua na próxima página*/
beep(speakerPin, cH, 125);
beep(speakerPin, b, 125);
beep(speakerPin, cH, 250);
delay(250);
beep(speakerPin, f, 125);
beep(speakerPin, gS, 500);
beep(speakerPin, f, 375);
beep(speakerPin, a, 125);
beep(speakerPin, cH, 500);
beep(speakerPin, a, 375);
beep(speakerPin, cH, 125);
beep(speakerPin, eH, 1000);
beep(speakerPin, aH, 500);
beep(speakerPin, a, 350);
beep(speakerPin, a, 150);
beep(speakerPin, aH, 500);
beep(speakerPin, gSH, 250);
beep(speakerPin, gH, 250);
beep(speakerPin, fSH, 125);
beep(speakerPin, fH, 125);
beep(speakerPin, fSH, 250);
delay(250);
beep(speakerPin, aS, 250);
beep(speakerPin, dSH, 500);
beep(speakerPin, dH, 250);
beep(speakerPin, cSH, 250);
beep(speakerPin, cH, 125);
beep(speakerPin, b, 125);
beep(speakerPin, cH, 250);
delay(250);
beep(speakerPin, f, 250);
beep(speakerPin, gS, 500);
beep(speakerPin, f, 375);
beep(speakerPin, cH, 125);
beep(speakerPin, a, 500);
beep(speakerPin, f, 375);
beep(speakerPin, c, 125);
beep(speakerPin, a, 1000);
}
/* Fim do código*/
Este projeto curioso foi extraído do excelente site http://labdegaragem.com. Para o Arduino
tocar o hino dos quatro principais clubes de futebol do estado de SP, necessitaremos de um
arquivo chamado “pitches.h” que está dentro da pasta dos códigos que acompanham o curso.
Tal arquivo também pode ser baixado do site citado linhas acima. Antes de usar os códigos das
músicas dos clubes no programa do Arduino siga o procedimento para ativar o arquivo
“pitches.h”: Abra o programa do Arduino e no menu selecione: Sketch > Adicionar arquivo.
Procure a pasta do seu PC onde está o arquivo “pitches.h” e abra-o. Veja abaixo:
//Experiência 23C ‐ Hino do São Paulo F.C.
#include "pitches.h"
#define NO_SOUND 0
int melodia[] = { // Notas que devem ser tocadas ordenadamente;
NOTE_D4,NOTE_E4,NOTE_FS4,NOTE_E4,NOTE_D4,NOTE_B3,NOTE_A3,
NOTE_A3,NOTE_A3,NOTE_D4,NOTE_D4,NOTE_E4,NOTE_E4,NOTE_B3,NOTE_B3,NOTE_D4,NOTE_C
S4,
NO_SOUND,NOTE_CS4,NOTE_D4,NOTE_E4,NOTE_D4,NOTE_CS4,NOTE_D4,NOTE_CS4,NOTE_B3,
NO_SOUND,NOTE_B3,NOTE_CS4,NOTE_D4,NOTE_CS4,NOTE_E4,NOTE_D4,NOTE_B3,NOTE_A3,//G
3
NO_SOUND,NOTE_A3,NOTE_B3,NOTE_CS4,NOTE_B3,NOTE_CS4,NOTE_D4,NOTE_E4,NOTE_E4,NO
TE_D4,
NOTE_E4,NOTE_D4,NOTE_E4,NOTE_FS4,NOTE_GS4,NOTE_E4,NOTE_A4,NOTE_A4,
NO_SOUND,NO_SOUND,NOTE_A4,NOTE_G4,NOTE_FS4,NOTE_E4,NOTE_A4,NOTE_E4,NOTE_A4,
NOTE_E4,NOTE_A3,NOTE_B3,NOTE_CS4,NOTE_B3,NOTE_B3,NOTE_A3,//teste
NO_SOUND,NOTE_FS4,NOTE_G4,NOTE_FS4,NOTE_E4,NOTE_A4,NOTE_E4,NOTE_A4,NOTE_E4,
NOTE_A4,NOTE_A4
};
// Duração das Notas: Colcheia:8; Semínima: 4; Mínima:2; Semibreve:1
int tempoNotas[] = {
3,8,8,8,8,8,2,
3,8,3,8,8,8,8,8,4,4,
4,3,8,8,8,8,8,2,4,
4,3,8,8,8,8,8,2,4,
4,3,8,8,8,8,8,2,3,8,
8,8,3,8,8,8,2,3,
8,4,4,4,4,4,4,4,4,
4,8,8,4,4,8,2,
8,4,4,4,2,2,4,4,4,
2,2
};
const int compasso = 1450; // Altera o compasso da música
void setup() { // Nada para configurar aqui
}
void loop(){
for (int Nota = 0; Nota < 80; Nota++) { //o número 80 indica quantas notas tem a nossa matriz.
int tempo = compasso/tempoNotas[Nota]; //Tempo = compasso dividido pela indicação da matriz
//tempoNotas.
tone(12, melodia[Nota],tempo); //Toca a nota indicada pela matriz melodia durante o tempo.
// Para distinguir as notas adicionamos um tempo entre elas (tempo da nota + 20%).
delay(tempo*1.2);
}
}
// Experiência 23D ‐ Hino da S.E. Palmeiras
#include "pitches.h"
#define NO_SOUND 0
int melodia[] = { // Notas que devem ser tocadas ordenadamente;
NOTE_G3, NOTE_G3, NOTE_G3,NOTE_A3,NOTE_B3,NOTE_C4,NOTE_D4,NOTE_C4,NOTE_E4,
NOTE_E4,NOTE_D4,NOTE_B3,NOTE_D4,NOTE_A3,NOTE_G3,NOTE_A3,NOTE_G3,NOTE_B3,NOTE_
A3,
NOTE_A3,NOTE_A3,NOTE_A3,NOTE_A3,NOTE_B3,NOTE_D4,NOTE_CS4,NOTE_D4,NOTE_E4,NOTE_
G4,NOTE_F4,
NO_SOUND,NOTE_F4,NOTE_E4,NOTE_G4,NOTE_F4,NOTE_D4,NOTE_B3,NOTE_A3,NOTE_G3,NOTE
_E4,NOTE_E4,
NO_SOUND,NOTE_G4,NOTE_G4,NOTE_G4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_C4,NOTE_E4,NOTE
_D4,
NOTE_D4,NOTE_G4,NOTE_G4,NOTE_G4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_G4,NOTE_E4,NOTE_D
4,
NO_SOUND,NOTE_A3,NOTE_B3,NOTE_C4,NOTE_B3,NOTE_C4,NOTE_D4,NOTE_C4,NOTE_D4,
NOTE_E4,NOTE_DS4,NOTE_E4,NOTE_F4,NOTE_G4,NOTE_GS4,NOTE_A4,NOTE_A3,
NOTE_E4,NOTE_E4,NOTE_C4
};
// Duração das Notas: Colcheia:8; Semínima: 4; Mínima:2; Semibreve:1
int tempoNotas[] = {
8,8,4,8,8,4,8,8,4,
2,8,8,4,8,8,4,8,8,4,
2,8,8,4,8,8,4,8,8,4,4,
4,8,8,4,8,8,4,8,8,4,4,
4,8,8,4,8,8,4,8,8,4,
2,8,8,4,8,8,4,8,8,2,
4,8,8,4,8,8,4,8,8,
4,8,8,4,8,8,4,4,
4,4,2
};
const int compasso = 1500; // Altera o compasso da música
void setup() { // Nada para configurar aqui
}
void loop(){
for (int Nota = 0; Nota < 81; Nota++) { //o número 81 indica quantas notas tem a nossa matriz.
int tempo = compasso/tempoNotas[Nota]; //Tempo = compasso dividido pela indicação da
//matriz tempoNotas.
tone(12, melodia[Nota],tempo); //Toca a nota indicada pela matriz melodia durante o tempo.
// Para distinguir as notas adicionamos um tempo entre elas (tempo da nota + 20%).
delay(tempo*1.2);
}
}
// Experiência 23E ‐ Hino do S.C. Corinthians P.
#include "pitches.h"
#define NO_SOUND 0
int melodia[] = { // Notas que devem ser tocadas ordenadamente;
NO_SOUND, NOTE_C5,NOTE_B4,NOTE_G4,NOTE_E4,NOTE_E4,
NO_SOUND,NOTE_B3,NOTE_E4,NOTE_F4,NOTE_G4,NOTE_B4,NOTE_A4,NOTE_G4,NOTE_F4,NOTE
_F4,
NO_SOUND,NOTE_A4,NOTE_F4,NOTE_E4,NOTE_DS4,NOTE_DS4,
NO_SOUND,NOTE_DS4,NOTE_DS4,NOTE_E4,NOTE_F4,NOTE_A4,NOTE_G4,NOTE_F4,NOTE_B4,
NO_SOUND,NOTE_B4,NOTE_A4,NOTE_GS4,NOTE_A4,NOTE_A4,
NO_SOUND,NOTE_A4,NOTE_A4,NOTE_B4,NOTE_C5,NOTE_E5,NOTE_C5,NOTE_A4,NOTE_G4,
NO_SOUND,NOTE_E5,NOTE_B4,NOTE_G4,NOTE_F4,NOTE_F4,
NO_SOUND,NOTE_A4,NOTE_B4,NOTE_C5,NOTE_B4,NOTE_A4,NOTE_G4,NOTE_F4,NOTE_E4,
NO_SOUND,NOTE_B3,NOTE_CS4,
NOTE_DS4,NOTE_E4,NOTE_F4,NOTE_G4,NOTE_A4,NOTE_F4,NOTE_C5,NOTE_C5,NOTE_B4,NOTE_
A4,NOTE_G4,NOTE_A4,
NOTE_B4,NOTE_B3,NOTE_CS4,
NOTE_DS4,NOTE_E4,NOTE_F4,NOTE_G4,NOTE_A4,NOTE_F4,NOTE_C5,NOTE_C5,NOTE_B4,NOTE_
A4,NOTE_G4,NOTE_A4,
NOTE_B4,NOTE_B4,
NO_SOUND,NOTE_B4,NOTE_A4,NOTE_GS4,NOTE_A4,NOTE_A4,
NO_SOUND,NOTE_A4,NOTE_G4,NOTE_F4,NOTE_G4,NOTE_G4,
NO_SOUND,NOTE_E5,NOTE_B4,NOTE_G4,NOTE_F4,
NO_SOUND,NOTE_F4,NOTE_G4,NOTE_A4,NOTE_B4,NOTE_A4,NOTE_G4,NOTE_F4,NOTE_E4
};
int tempoNotas[] = { // Duração das Notas: Colcheia:8; Semínima: 4; Mínima:2; Semibreve:1
4,4,4,4,2,2,
8,8,8,8,8,8,8,8,2,2,
4,4,4,4,2,2,
8,8,8,8,8,8,8,8,1,
4,4,4,4,2,2,
8,8,8,8,8,8,8,8,1,
4,4,4,4,2,2,
8,8,8,8,8,8,8,8,1,
4,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,
4,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,
2,2,
4,4,4,4,2,2,
4,4,4,4,2,2,
4,4,4,4,1,
8,8,8,8,4,8,8,2,2
} ; /*Código continua na próxima página*/
const int compasso = 1500; // Altera o compasso da música
void setup() { // Nada para configurar aqui
}
void loop() {
for (int Nota = 0; Nota < 119; Nota++) { //o número 119 indica quantas notas tem a nossa matriz.
int tempo = compasso/tempoNotas[Nota]; //tempo = compasso dividido pela indicação da
//matriz tempoNotas.
tone(12, melodia[Nota],tempo); //Toca a nota indicada pela matriz melodia durante o tempo.
// Para distinguir as notas adicionamos um tempo entre as elas (tempo da nota + 20%).
delay(tempo*1.2);
}
}
// Experiência 23F ‐ Hino do Santos F.C.
#include "pitches.h"
#define NO_SOUND 0
int melodia[] = { // Notas que devem ser tocadas ordenadamente;
NO_SOUND,NOTE_E4,
NOTE_A4,NOTE_B4,NOTE_C5,NOTE_E5,NOTE_D5,NOTE_B4,NOTE_GS4,NOTE_E4,
NOTE_B4,NOTE_A4,NOTE_A4,
NOTE_D5,NOTE_E5,NOTE_F5,NOTE_A5,NOTE_G5,NOTE_E5,NOTE_CS5,NOTE_A3,
NOTE_E5,NOTE_D5,NOTE_G5,NOTE_F5,
NOTE_G5,NOTE_F5,NOTE_D5,NOTE_B4,NOTE_G5,NOTE_D5,NOTE_G5,NOTE_F5,
NOTE_F5,NOTE_E5,NO_SOUND,NOTE_C5,NOTE_A4,
NOTE_B4,NOTE_B4,NOTE_DS5,NOTE_FS5,NOTE_A5,NOTE_C6,NOTE_B5,NOTE_A5,
NOTE_A5,NOTE_GS5,NO_SOUND,
NOTE_G5,NOTE_A5,NOTE_B5,NOTE_G5,NOTE_F5,NOTE_E5,
NOTE_F5,NOTE_E5,NOTE_E5,NOTE_B4,NOTE_C5,NOTE_D5,NOTE_E5,
NOTE_D5,NOTE_CS5,NOTE_D5,NOTE_F5,NOTE_A5,NOTE_D5,
NOTE_C5,NOTE_B4,NOTE_C5,NOTE_E5,NOTE_D5,
NOTE_B5,NOTE_GS5,NOTE_F5,NOTE_E5,NOTE_C6,NOTE_B5,NOTE_A5
};
/* Código continua na próxima página*/
// Duração das Notas: Colcheia:8; Semínima: 4; Mínima:2; Semibreve:1
int tempoNotas[] = {
8,8,
8,8,8,8,8,8,8,8,
8,2,8,
8,8,8,8,8,8,8,8,
8,3,4,8,
8,8,8,8,8,8,8,8,
8,3,8,4,8,
8,8,8,8,8,8,8,8,
8,2,2,
8,8,8,8,8,1,
8,4,3,8,8,8,1,
8,8,8,8,3,8,
8,8,8,8,2,
8,8,8,8,4,4,2
};
const int compasso = 1500; // Altera o compasso da música
void setup() { // Nada para configurar aqui
}
void loop(){
for (int Nota = 0; Nota < 80; Nota++) { //o número 80 indica quantas notas tem a nossa matriz.
int tempo = compasso/tempoNotas[Nota]; //Tempo = compasso dividido pela indicação da
//matriz tempoNotas.
tone(12, melodia[Nota],tempo); //Toca a nota indicada pela matriz melodia durante o tempo.
// Para distinguir as notas adicionamos um tempo entre elas (tempo da nota + 20%).
delay(tempo*1.2);
}
}
E assim vimos que com um circuito bem simples com Arduino e buzzer podemos tocar
praticamente qualquer música ou melodia basta ter o código dela para copiar no programa.
Conforme visto você pode encontrar na internet diversos códigos de Arduino para diversas
canções bastando apenas coloca-lo no programa e gravá-lo no software. As demais músicas
eu deixo por conta da criatividade para cada um produzir o código ou procurar na internet.
Display de leds
Lista de materiais
Procedimento
// Experiência nº 24 ‐ Contador de 0 a 9 com display de leds
byte display_sete_digitos[10][7] = { // 10 Dígitos a serem formados/7 segmentos do display
// Aqui temos uma relação entre os segmentos do display e o nível lógico para formar dígitos
// Segmentos a,b,c,d,e,f,g
{ 1,1,1,1,1,1,0 }, // = Digito 0
{ 0,1,1,0,0,0,0 }, // = Digito 1
{ 1,1,0,1,1,0,1 }, // = Digito 2
{ 1,1,1,1,0,0,1 }, // = Digito 3
{ 0,1,1,0,0,1,1 }, // = Digito 4
{ 1,0,1,1,0,1,1 }, // = Digito 5
{ 1,0,1,1,1,1,1 }, // = Digito 6
{ 1,1,1,0,0,0,0 }, // = Digito 7
{ 1,1,1,1,1,1,1 }, // = Digito 8
{ 1,1,1,0,0,1,1 }, // = Digito 9
};
/* Código continua na página seguinte*/
void setup()
{
pinMode(2, OUTPUT); // Pino 2 ligado ao segmento a
pinMode(3, OUTPUT); // Pino 3 ligado ao segmento b
pinMode(4, OUTPUT); // Pino 4 ligado ao segmento c
pinMode(5, OUTPUT); // Pino 5 ligado ao segmento d
pinMode(6, OUTPUT); // Pino 6 ligado ao segmento e
pinMode(7, OUTPUT); // Pino 7 ligado ao segmento f
pinMode(8, OUTPUT); // Pino 8 ligado ao segmento g
}
void displayWrite(byte digito) // Aciona o display
{
byte pino = 2; // Primeiro pino usado para o display
for (byte contagem = 0; contagem < 7; ++contagem) // Liga e desliga os leds formando os dígitos
{
digitalWrite(pino, display_sete_digitos[digito][contagem]); // Forma os dígitos
++pino; // Passa ao pino seguinte do Arduino
}
}
void loop()
{
for (byte numero = 0; numero < 10; numero++) // Conta os números em sequência
{
delay(500); // Intervalo de 0,5 segundos entre um dígito mostrado e o próximo
displayWrite(numero); // Mostra o número no display
}
}
Ao carregar o código para o programa do Arduino podemos observar como o display vai contar
de 0 a 9 continuamente até que a alimentação seja desligada. A velocidade da contagem pode
ser alterada na penúltima linha de comando delay(500); Aí ele está configurado para contar
numa velocidade de 0,50 segundos ou 500 ms. Alterando este valor podemos fazer o contador
andar mais rápido ou devagar. Colocando por exemplo 1000 fazemos o circuito contar de 1 em
1 segundo.
Lista de materiais
Procedimento
// Experiência nº 25 ‐ Contador de 0 a 19 com display de leds
byte display_sete_digitos[10][7] = { // 10 Dígitos a serem formados/7 segmentos do display
// Segmentos a,b,c,d,e,f,g
{ 1,1,1,1,1,1,0 }, // = Digito 0
{ 0,1,1,0,0,0,0 }, // = Digito 1
{ 1,1,0,1,1,0,1 }, // = Digito 2
{ 1,1,1,1,0,0,1 }, // = Digito 3
{ 0,1,1,0,0,1,1 }, // = Digito 4
{ 1,0,1,1,0,1,1 }, // = Digito 5
{ 1,0,1,1,1,1,1 }, // = Digito 6
{ 1,1,1,0,0,0,0 }, // = Digito 7
{ 1,1,1,1,1,1,1 }, // = Digito 8
{ 1,1,1,0,0,1,1 }, // = Digito 9
};
void setup()
{
pinMode(2, OUTPUT); // Pino 2 ligado ao segmento a
pinMode(3, OUTPUT); // Pino 3 ligado ao segmento b
pinMode(4, OUTPUT); // Pino 4 ligado ao segmento c
pinMode(5, OUTPUT); // Pino 5 ligado ao segmento d
pinMode(6, OUTPUT); // Pino 6 ligado ao segmento e
pinMode(7, OUTPUT); // Pino 7 ligado ao segmento f
pinMode(8, OUTPUT); // Pino 8 ligado ao segmento g
pinMode(9, OUTPUT); // Pino ligado ao ponto da dezena
writePonto(0); // Começa com o ponto da dezena apagado
}
void writePonto(byte ponto)
{
digitalWrite(9, ponto); // Aciona o ponto da dezena
}
void displayWrite(byte digito) // Aciona o display
{
byte pino = 2; // Primeiro pino usado para o display
for (byte contagem = 0; contagem < 7; ++contagem) // Liga e desliga os leds formando os dígitos
{
digitalWrite(pino, display_sete_digitos[digito][contagem]); // Forma os dígitos
++pino; // Passa ao pino seguinte do Arduino
}
}
/*Código continua na próxima página*/
/*Continuação do código*/
void loop()
{
for (byte numero = 0; numero < 10; numero++) // Conta os números de 0 a 9
{
delay(1000); // Intervalo de 1 segundo entre um dígito mostrado e o próximo
displayWrite(numero); // Mostra o número no display
writePonto(0); // Mantém o ponto desligado para contar as unidades
}
for (byte numero = 0; numero < 10; numero++) // Conta os números de 10 a 19
{
delay(1000); // Intervalo de 1 segundo entre um dígito mostrado e o próximo
displayWrite(numero); // Mostra o número no display
writePonto(1); // Mantém o ponto aceso para servir como dezena
}
}
Agora copie o código para o programa do Arduino e observe como o contador vai de 0 a 9 e
após o 9 acende o ponto que neste caso está representando o dígito “1” das dezenas. Após a
contagem com o ponto da dezena, o ciclo se repete. A velocidade de contagem para este
circuito é de 1 segundo podendo ser alterada facilmente no comando “delay”. Note que este
circuito é semelhante ao anterior, porém agora acrescentamos o segmento do ponto no display
e modificamos um pouco o código para que este ponto funcione. H´diversas experiências com
Arduino usando displays tanto com led quanto lcd e ao longo deste curso vamos mostrando os
mais comuns.
Lista de materiais
Procedimento
Monte o circuito como indicado na pagina seguinte e cole o código no programa do Arduino:
// Experiência nº 26 ‐ Contador crescente e decrescente
byte display_sete_digitos[10][7] = { // 10 Dígitos a serem formados/7 segmentos do display
// Segmentos a,b,c,d,e,f,g
{ 1,1,1,1,1,1,0 }, // = Digito 0
{ 0,1,1,0,0,0,0 }, // = Digito 1
{ 1,1,0,1,1,0,1 }, // = Digito 2
{ 1,1,1,1,0,0,1 }, // = Digito 3
{ 0,1,1,0,0,1,1 }, // = Digito 4
{ 1,0,1,1,0,1,1 }, // = Digito 5
{ 1,0,1,1,1,1,1 }, // = Digito 6
{ 1,1,1,0,0,0,0 }, // = Digito 7
{ 1,1,1,1,1,1,1 }, // = Digito 8
{ 1,1,1,0,0,1,1 }, // = Digito 9
};
/*código continua na página seguinte*/
void setup()
{
pinMode(2, OUTPUT); // Pino 2 ligado ao segmento a
pinMode(3, OUTPUT); // Pino 3 ligado ao segmento b
pinMode(4, OUTPUT); // Pino 4 ligado ao segmento c
pinMode(5, OUTPUT); // Pino 5 ligado ao segmento d
pinMode(6, OUTPUT); // Pino 6 ligado ao segmento e
pinMode(7, OUTPUT); // Pino 7 ligado ao segmento f
pinMode(8, OUTPUT); // Pino 8 ligado ao segmento g
}
void displayWrite(byte digito) // Aciona o display
{
byte pino = 2; // Primeiro pino usado para o display
for (byte contagem = 0; contagem < 7; ++contagem) // Liga e desliga os leds formando os dígitos
{
digitalWrite(pino, display_sete_digitos[digito][contagem]); // Forma os dígitos
++pino; // Passa ao pino seguinte do Arduino
}
}
void loop()
{
for (byte numero = 0; numero < 10; numero++) // Contagem crescente
{
delay(500); // Intervalo de 0,5 segundos entre um dígito mostrado e o próximo
displayWrite(numero); // Mostra o número no display
}
delay(1000); // Espera 1 segundo para iniciar a contagem decrescente
for (byte numero = 10; numero >0; numero‐‐) // Contagem decrescente
{
delay(500); // Intervalo de 0,5 segundos entre um dígito mostrado e o próximo
displayWrite(numero); // Mostra o número no display
}
delay(1000); // Espera 1 segundo para iniciar a contagem crescente
}
Lista de materiais
Procedimento
// Experiência nº 27 ‐ Semáforo com leds e display de leds
byte display_sete_digitos[10][7] = { // 10 Dígitos a serem formados/7 segmentos do display
// Aqui temos uma relação entre os segmentos do display e o nível lógico para formar dígitos
// Segmentos a,b,c,d,e,f,g
{ 1,1,1,1,1,1,0 }, // = Digito 0
{ 0,1,1,0,0,0,0 }, // = Digito 1
{ 1,1,0,1,1,0,1 }, // = Digito 2
{ 1,1,1,1,0,0,1 }, // = Digito 3
{ 0,1,1,0,0,1,1 }, // = Digito 4
{ 1,0,1,1,0,1,1 }, // = Digito 5
{ 1,0,1,1,1,1,1 }, // = Digito 6
{ 1,1,1,0,0,0,0 }, // = Digito 7
{ 1,1,1,1,1,1,1 }, // = Digito 8
{ 1,1,1,0,0,1,1 }, // = Digito 9
};
void setup()
{
pinMode(2, OUTPUT); // Pino 2 ligado ao segmento a
pinMode(3, OUTPUT); // Pino 3 ligado ao segmento b
pinMode(4, OUTPUT); // Pino 4 ligado ao segmento c
pinMode(5, OUTPUT); // Pino 5 ligado ao segmento d
pinMode(6, OUTPUT); // Pino 6 ligado ao segmento e
pinMode(7, OUTPUT); // Pino 7 ligado ao segmento f
pinMode(8, OUTPUT); // Pino 8 ligado ao segmento g
pinMode(10, OUTPUT); // Pino 10 ligado ao led vermelho
pinMode(11, OUTPUT); // Pino 11 ligado ao led amarelo
pinMode(12, OUTPUT); // Pino 12 ligado ao led verde
}
void displayWrite(byte digito) // Aciona o display
{
byte pino = 2; // Primeiro pino usado para o display
for (byte contagem = 0; contagem < 7; ++contagem) // Liga e desliga os leds formando os dígitos
{
digitalWrite(pino, display_sete_digitos[digito][contagem]); // Forma os dígitos
++pino; // Passa ao pino seguinte do Arduino
}
}
/*código continua na próxima página*/
void loop()
{
digitalWrite(10, HIGH); // Acende o led vermelho
digitalWrite(11, LOW); // Apaga o led amarelo
digitalWrite(12, LOW); // Apaga o led verde
for (byte numero = 10; numero > 0; numero‐‐) // contagem decrescente começando do 9
{
delay(1000); // Intervalo de 1 segundo entre um dígito mostrado e o próximo
displayWrite(numero); // Mostra o número no display
}
digitalWrite(10, LOW); // Apaga o led vermelho
digitalWrite(11, LOW); // Apaga o led amarelo
digitalWrite(12, HIGH); // Acende o led verde
for (byte numero = 10; numero > 0; numero‐‐) // contagem decrescente começando do 9
{
delay(1000); // Intervalo de 1 segundo entre um dígito mostrado e o próximo
displayWrite(numero); // Mostra o número no display
}
digitalWrite(10, LOW); // Apaga o led vermelho
digitalWrite(11, HIGH); // Acende o led amarelo
digitalWrite(12, LOW); // Apaga o led verde
for (byte numero = 4; numero > 0; numero‐‐) // contagem decrescente começando do 3
{
delay(1000); // Intervalo de 1 segundo entre um dígito mostrado e o próximo
displayWrite(numero); // Mostra o número no display
}
}
Lista de materiais
Procedimento
// Experiência nº 28 – Contador binário‐decimal
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT); // Define os pinos de saída para os segmentos do display e leds
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
}
void loop() {
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 0); digitalWrite(9, 0);
digitalWrite(10, 0); digitalWrite(11, 0); digitalWrite(12, 0);
delay(5000); // Mostra o decimal “0” no display e o binário 0000 nos leds, espera 5 segs
digitalWrite(2, 0); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0); digitalWrite(9, 0);
digitalWrite(10, 0); digitalWrite(11, 0); digitalWrite(12, 1);
delay(5000); // Mostra o decimal “1” no display e o binário 0001 nos leds, espera 5 segs
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 0); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 0); digitalWrite(8, 1); digitalWrite(9, 0);
digitalWrite(10, 0); digitalWrite(11, 1); digitalWrite(12, 0);
delay(5000); // Mostra o decimal “2” no display e o binário 0010 nos leds, espera 5 segs
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 1); digitalWrite(9, 0);
digitalWrite(10, 0); digitalWrite(11, 1); digitalWrite(12, 1);
delay(5000); // Mostra o decimal “3” no display e o binário 0011 nos leds, espera 5 segs
digitalWrite(2, 0); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1); digitalWrite(9, 0);
digitalWrite(10, 1); digitalWrite(11, 0); digitalWrite(12, 0);
delay(5000); // Mostra o decimal “4” no display e o binário 0100 nos leds, espera 5 segs
digitalWrite(2, 1); digitalWrite(3, 0); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1); digitalWrite(9, 0);
digitalWrite(10, 1); digitalWrite(11, 0); digitalWrite(12, 1);
delay(5000); // Mostra o decimal “5” no display e o binário 0101 nos leds, espera 5 segs
/* Código continua na página seguinte*/
digitalWrite(2, 0); digitalWrite(3, 0); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 1); digitalWrite(9, 0);
digitalWrite(10, 1); digitalWrite(11, 1); digitalWrite(12, 0);
delay(5000); // Mostra o decimal “6” no display e o binário 0110 nos leds, espera 5 segs
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0); digitalWrite(9, 0);
digitalWrite(10, 1); digitalWrite(11, 1); digitalWrite(12, 1);
delay(5000); // Mostra o decimal “7” no display e o binário 0111 nos leds, espera 5 segs
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 1); digitalWrite(9, 1);
digitalWrite(10, 0); digitalWrite(11, 0); digitalWrite(12, 0);
delay(5000); // Mostra o decimal “8” no display e o binário 1000 nos leds, espera 5 segs
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1); digitalWrite(9, 1);
digitalWrite(10, 0); digitalWrite(11, 0); digitalWrite(12, 1);
delay(5000); // Mostra o decimal “9” no display e o binário 1001 nos leds, espera 5 segs
}
2 - Função void loop() - Aqui ao invés de usarmos as palavras HIGH (alto) ou LOW (baixo)
usamos os números 1 para nível alto e 0 para nível baixo.
Fizemos estas duas últimas mudança devido ao fato deste código ser relativamente extenso e
assim ficar mais fácil de representa-lo dentro do retângulo e não haver necessidade de tanto
espaço (folhas) para esta experiência.
Lista de materiais
Procedimento
// Experiência nº 29 – Minuteria com dois leds e display
int botao = 10; // Pino do botão
int estadobotao = 0; // Estado inicial do botão
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT); // Define os pinos dos leds e display como saídas
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(botao, INPUT_PULLUP); // Pino do botão como entrada
}
void loop() {
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 0); digitalWrite(11, 0);
digitalWrite(12, 0); // Mostra o número “0” no display
estadobotao = digitalRead(botao);
if(estadobotao == LOW) { // Se o botão estiver pressionado (nível baixo no pino);
ledvermelho(); // Vai para a função contador led vermelho
}
if(estadobotao == LOW) { // Se o botão estiver pressionado (nível baixo no pino);
ledverde(); // Vai para a função contador led verde
}
}
void ledvermelho() {
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1); digitalWrite(12, 1);
digitalWrite(11, 1); // Mostra o 9 no display e aguarda 1 segundo
delay(1000);
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 1);
delay(1000); // Mostra o 8 no display e aguarda 1 segundo
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0);
delay(1000); // Mostra o 7 no display e aguarda 1 segundo
digitalWrite(2, 1); digitalWrite(3, 0); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 1);
delay(1000); // Mostra o 6 no display e aguarda 1 segundo
/*código continua na próxima página*/
digitalWrite(2, 1); digitalWrite(3, 0); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1);
delay(1000); // Mostra o 5 no display e aguarda 1 segundo
digitalWrite(2, 0); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1);
delay(1000); // Mostra o 4 no display e aguarda 1 segundo
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 1);
delay(1000); // Mostra o 3 no display e aguarda 1 segundo
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 0); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 0); digitalWrite(8, 1);
delay(1000); // Mostra o 2 no display e aguarda 1 segundo
digitalWrite(2, 0); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0);
delay(1000); // Mostra o 1 no display e aguarda 1 segundo
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 0); digitalWrite(12, 1);
digitalWrite(11, 0); // Mostra o 1 no display e aguarda 1 segundo
delay(1000);
}
void ledverde() {
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1);
delay(1000); // Mostra o 9 no display e aguarda 1 segundo
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 1);
delay(1000); // Mostra o 8 no display e aguarda 1 segundo
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0);
delay(1000); // Mostra o 7 no display e aguarda 1 segundo
digitalWrite(2, 1); digitalWrite(3, 0); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 1);
delay(1000); // Mostra o 6 no display e aguarda 1 segundo
digitalWrite(2, 1); digitalWrite(3, 0); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1);
delay(1000); // Mostra o 5 no display e aguarda 1 segundo
digitalWrite(2, 0); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1);
delay(1000); // Mostra o 4 no display e aguarda 1 segundo
/*código continua na próxima página*/
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 1);
delay(1000); // Mostra o 3 no display e aguarda 1 segundo
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 0); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 0); digitalWrite(8, 1);
delay(1000); // Mostra o 2 no display e aguarda 1 segundo
digitalWrite(2, 0); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0);
delay(1000); // Mostra o 1 no display e aguarda 1 segundo
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 0); // Mostra o 0 no display
}
Ao copiar o código para o programa do Arduino veremos que o display vai mostrar
permanentemente o número zero e os dois leds permanecerão apagados. Ao apertar o botão
os dois leds acendem e inicia a contagem de 9 até 0. Quando chega ao zero, o led vermelho
apaga e inicia uma nova contagem de 9 ao 0. Quando chega novamente ao zero o led verde
apaga e a contagem pára até que pressionemos novamente o botão o ciclo se repita. Este
circuito funciona como as minuterias usadas em corredores de prédio, porém esta nossa temos
um contador com display de leds. Em nosso caso a contagem é feita em intervalos de 1
segundo.
Lista de materiais
Procedimento
Monte o circuito como indicado na página seguinte usando o Arduino e a protoboard. Neste
circuito o led de saída foi substituído pelo display que indicará H para nível alto e L para nível
baixo e como já vimos ele pode funcionar como qualquer porta lógica.
// Experiência nº 30 – Portas lógicas com display de leds
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT); // Define dos pinos 2 ao 8 saídas para o display
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(10, INPUT_PULLUP); // Entrada para um dos botões com a função “pull up”
pinMode(11, INPUT_PULLUP); // Entrada para o outro botão com a função “pull up”
}
void loop() {
boolean estadobotao1 = digitalRead(10); // Lê o botão ligado ao pino 10
boolean estadobotao2 = digitalRead(11); // Lê o botão ligado ao pino 11
boolean estadosaida; // Define a saída para o display
estadosaida = (estadobotao1 & estadobotao2); // porta E (AND)
// !(estadobotao1 & estadobotao2); // porta NE (NAND)
// (estadobotao1 | estadobotao2); // porta OU (OR)
// !(estadobotao1 | estadobotao2); // porta NOU (NOR)
// (estadobotao1 ^ estadobotao2); // porta OU exclusiva (XOR)
// !(estadobotao1 ^ estadobotao2); // porta NOU exclusiva (XNOR)
if(estadosaida == 1) { // Se a saída for 1 ou nível alto
high(); // Vai para a função “high”
}else{ // Senão
low(); // Vai para a função “low”
}
}
void high() {
digitalWrite(2, 0); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 1);
} // Mostra a letra H de HIGH ou nível alto no display
void low() {
digitalWrite(2, 0); digitalWrite(3, 0); digitalWrite(4, 0); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 0);
} // Mostra a letra L de LOW ou nível baixo no display
Ao carregar o código para o Arduino observamos que aparece uma letra H de HIGH (nível alto
no display. Como a porta E que é a primeira configuração necessita que os dois pinos dos
botões estejam em nível alto para a saída indicar nível alto. Sem apertar os botões os pinos
ficam em nível alto devido aos resistores de “pull up” internos. Ao apertarmos qualquer tecla ou
as duas a saída fica baixa (L). Para este circuito funcionar em cada uma das portas lógicas
basta alterar uma linha de comando como podemos ver no próprio código.
Lista de materiais
Procedimento
// Experiência nº 31 – Rodar números no display com potenciômetro
void setup()
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT); // Define os pinos de 2 ao 8 para o display
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(A1, INPUT); // Define o pino A1 como entrada (analógica)
}
void loop() {
int valorpot = 0; // Valor inicial do potenciômetro
valorpot = analogRead(A1); // Lê o pino do potenciômetro e define o valor
if(valorpot <= 102) {zero();}
if(valorpot == 103 & valorpot <= 204) {um();}
if(valorpot == 205 & valorpot <= 306) {dois();}
if(valorpot == 307 & valorpot <= 408) {tres();} // Define os intervalos de valores do
if(valorpot == 409 & valorpot <= 510) {quatro();} // potenciômetro para acionar as funções
if(valorpot == 511 & valorpot <= 612) {cinco();}
if(valorpot == 613 & valorpot <= 714) {seis();}
if(valorpot == 715 & valorpot <= 816) {sete();}
if(valorpot == 817 & valorpot <= 918) {oito();}
if(valorpot == 919 & valorpot <= 1023) {nove();}
}
void zero() {
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 0);
} // Mostra o dígito “0” no display
void um() {
digitalWrite(2, 0); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0);
} // Mostra o dígito “1” no display
void dois() {
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 0); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 0); digitalWrite(8, 1);
} // Mostra o dígito “2” no display
/* Código continua na página seguinte*/
void tres() {
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 1);
} // Mostra o dígito “3” no display
void quatro() {
digitalWrite(2, 0); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1);
} // Mostra o dígito “4” no display
void cinco() {
digitalWrite(2, 1); digitalWrite(3, 0); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1);
} // Mostra o dígito “5” no display
void seis() {
digitalWrite(2, 1); digitalWrite(3, 0); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 1);
} // Mostra o dígito “6” no display
void sete() {
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 0);
digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0);
} // Mostra o dígito “7” no display
void oito() {
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 1); digitalWrite(7, 1); digitalWrite(8, 1);
} // Mostra o dígito “8” no display
void nove() {
digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 1); digitalWrite(5, 1);
digitalWrite(6, 0); digitalWrite(7, 1); digitalWrite(8, 1);
} // Mostra o dígito “9” no display
Ao carregarmos o código para o programa do Arduino veremos que a princípio o display não
vai acender, mas ao girar o eixo do potenciômetro ele mostra um dígito que vai aumentando à
medida que vamos girando o potenciômetro para uma das extremidades e diminuindo quando
giramos o eixo para o outro lado. Como já vimos o potenciômetro tem sua rotação dividida em
1024 pontos (0 a 1023) para o Arduino e dependendo do ponto que estiver ele vai mostrar um
dos dez algarismos entre 0 e 9 no display. Cada digito a ser mostrado usa uma base de
aproximadamente 102 pontos do potenciômetro. Como são dez dígitos a serem mostrados
basta dividir o total de pontos do potenciômetro pelos dez dígitos resultando em cerca de 102
(na verdade 102,4) pontos para cada dígito.
Em nossas próximas experiências usaremos um display de cristal líquido (LCD) que pode
formar caracteres em 16 colunas e 2 linhas. Desta forma ele é chamado de 16 x 2 e possui 32
elementos formados por vários pontos pretos que se alinham para formar os caracteres de
acordo com as instruções recebidas. Nosso display possui 16 terminais que podem ser
organizados de duas formas diferentes conforme visto abaixo:
Como observamos ele possui 14 pinos contados da direita para a esquerda mais os dois pinos
do led que ilumina o “backlight”. Estes são chamados de +L e –L e podem ficar à direita ou à
esquerda dos demais pinos. Mas não se preocupe que esta pinagem vem marcada no próprio
display. A função dos pinos do display estão indicadas a seguir:
Lista de materiais
Procedimento
// Experiência nº 32 – Testando o display LCD
#include <LiquidCrystal.h> // Biblioteca do Arduino para o display
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Inicializa a biblioteca com os pinos usados
void setup() {
lcd.begin(16, 2); // Número de colunas e linhas do display
lcd.setCursor(0, 0); // Coloca o cursor na coluna 0 e linha 0
lcd.print("Bem‐vindos a"); // Escreve a mensagem na primeira linha (linha 0)
lcd.setCursor(0, 1); // Coloca o cursor na coluna 0 e linha 1
lcd.print("Burgoseletronica"); // Escreve a mensagem na segunda linha (linha 1)
}
void loop() {
lcd.setCursor(13, 0); // Coloca o cursor na coluna 13 e linha 0
// (Obs: no display a segunda linha é linha 1 porque a contagem começa no 0)
lcd.print(millis()/1000); // Escreve a quantidade de segundos desde que o display foi
// ligado ou resetado
}
Lista de materiais
Procedimento
// Experiência nº 33 – Operando o display LCD em 4 ou 8 bits
#include <LiquidCrystal.h> // Biblioteca do Arduino para o display
LiquidCrystal lcd(11, 10, 9, 8, 7, 6, 5, 4, 3, 2); // Habilita a opção 8 bits
// LiquidCrystal lcd(11, 10, 5, 4, 3, 2); // Habilita a opção 4 bits
void setup() {
lcd.begin(16, 2); // Número de colunas e linhas do display
lcd.setCursor(0, 0); // Coloca o cursor na coluna 0 e linha 0
lcd.print("Display em"); // Escreve a mensagem na primeira linha (linha 0)
lcd.setCursor(0, 1); // Coloca o cursor na coluna 0 e linha 1
lcd.print("4 ou 8 bits"); // Escreve a mensagem na segunda linha (linha 1)
}
void loop() {
lcd.setCursor(13, 0); // Coloca o cursor na coluna 13 e linha 0
// (Obs: no display a segunda linha é linha 1 porque a contagem começa no 0)
lcd.print(millis()/1000); // Escreve a quantidade de segundos desde que o display foi
// ligado ou resetado
}
LiquidCrystal lcd(11, 10, 9, 8, 7, 6, 5, 4, 3, 2); // Habilita a opção 8 bits
// LiquidCrystal lcd(11, 10, 5, 4, 3, 2); // Habilita a opção 4 bits
No modo que está o display funcionará em 8 bits porque todos os pinos de dados dele estão
habilitados. Para a opção 4 bits basta colocar as duas barras “//” na linha de cima e retirar
estas mesmas barras da linha de baixo. Assim habilitamos apenas os 4 últimos pinos de
dados. Observe como praticamente não há diferença visual entre os dois modos de operação.
Como se trata de um display para mostrar apenas caracteres não compensa operá-lo em 8 bits
porque serão necessários mais pinos do Arduino, pinos estes que poderiam ser usados para a
ligação de outros periféricos. Especialmente para o Arduino UNO de nosso curso que possui
poucos pinos para a ligação de componentes externos.
Lista de materiais
Procedimento
// Experiência nº 34 – Mensagem no display LCD
#include <LiquidCrystal.h> // Biblioteca do Arduino para o display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Ordem dos pinos em nosso circuito proposto
void setup() {
lcd.begin(16, 2); // Número de colunas e linhas do display
}
void loop() {
lcd.clear(); // Limpa o display
lcd.print("Ola querido aluno(a)"); // Imprime a mensagem destacada no display
delay(2000); // Aguarda 2 segs
for (int i = 0; i < 4; i++) { // Rola o texto 4 colunas para a esquerda
lcd.scrollDisplayLeft(); // Comando para rolar o texto à esquerda
delay(500); } // Velocidade de rolagem (1 coluna a cada 0,5 segs)
lcd.setCursor(4,1); // Coloca o cursor na coluna 4 linha 1 do display.
lcd.print("Beleza????"); // Imprime a mensagem destacada no display
delay(2000); // Aguarda 2 segs
lcd.clear(); // Limpa o display
lcd.print("Gostou do curso"); // Imprime a mensagem destacada no display
lcd.setCursor(0,1); // Coloca o cursor na coluna 0 linha 1 do display.
lcd.print("de Arduino?"); // Imprime a mensagem destacada no display
delay(4000); // Aguarda 4 segs
lcd.clear(); // Limpa o display
lcd.print("Que legal!!!!"); // Imprime a mensagem destacada no display
delay(2000); // Aguarda 2 segs
lcd.clear(); // Limpa o display
lcd.setCursor(0,1); // Coloca o cursor na coluna 0 linha 1 do display.
lcd.print("Temos outros cursos em"); // Imprime a mensagem destacada no display
delay(1000); // Aguarda 1 seg
for (int i = 0; i < 7; i++) { // Rola o texto 7 colunas para a esquerda
lcd.scrollDisplayLeft(); // Comando para rolar o texto à esquerda
delay(500); } // Velocidade de rolagem (1 coluna a cada 0,5 segs)
delay(1000); // Aguarda 1 seg
lcd.clear(); // Limpa o display
lcd.print("http//loja.burgoseletronica.net"); // Imprime a mensagem destacada no display
delay(1000); // Aguarda 1 seg
for (int i = 0; i < 15; i++) { // Rola o texto 15 colunas para a esquerda
lcd.scrollDisplayLeft(); // Comando para rolar o texto à esquerda
delay(500); } // Velocidade de rolagem (1 coluna a cada 0,5 segs)
delay(2000); // Aguarda 2 segs
}
Você pode substituir a mensagem destacada por qualquer outra mensagem neste código.
Lista de materiais
Procedimento
// Experiência nº 35 – LED RGB com display LCD
#include <LiquidCrystal.h> // Biblioteca do Arduino para o display
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Ordem dos pinos em nosso circuito proposto
int temp = 9; // Variável para contagem de tempo no display (começa em 9 segundos)
void setup() {
lcd.begin(16, 2); // Número de colunas e linhas do display
pinMode(10, OUTPUT); // Saída para o led vermelho
pinMode(11, OUTPUT); // Saída para o led verde
pinMode(12, OUTPUT); // Saída para o led azul
}
void loop()
{
if(temp == 0) { //Se a contagem chegar ao dígito 1 (equivale aqui ao 0 (0 a 9 = dez dígitos))
temp = 9; // Volta ao dígito 9
leds(); // Função de controle dos leds
}
lcd.setCursor(0, 0); // Cursor na primeira linha e primeira coluna
lcd.print("Iniciar em"); // Escreve na primeira linha
lcd.setCursor(2, 1); // Cursor na segunda linha e terceira coluna
lcd.print("segundos"); // Escreve na segunda linha
lcd.setCursor(0, 1); // Cursor na segunda linha e primeira coluna
lcd.print(temp‐‐); //Escreve contagem regressiva de 9 a 0
delay(1000); //Aguarda 1 segundo
}
void leds() { // Inicia função de controle dos leds
lcd.clear(); // Limpa o display
lcd.setCursor(0, 0); // Cursor na primeira linha e primeira coluna
lcd.print("BRANCO"); // Escreve na primeira linha
lcd.setCursor(0, 1); // Cursor na segunda linha e primeira coluna
lcd.print("WHITE"); // Escreve na segunda linha
digitalWrite(10, 1); digitalWrite(11, 1); digitalWrite(12, 1); // Acende o led branco
delay(2000); // Aguarda 2 segundos
for(int i = 0; i < 16; i++) { // Rola o texto 16 colunas para a direita
lcd.scrollDisplayRight(); // Função rolar para a direita
delay(200); } // Velocidade de rolagem (1 coluna a cada 0,2 segundos)
for(int i = 16; i > 0; i‐‐) { // Rola o texto 16 colunas para a esquerda
lcd.scrollDisplayLeft(); // Função rolar para a esquerda
delay(200); } // Velocidade de rolagem (1 coluna a cada 0,2 segundos)
lcd.clear(); // Apaga o display
//Daqui para frente todas as cores do led terão as mesmas funções mudando apenas o texto a ser
// exibido pelo display LCD. Continua na página seguinte.
lcd.setCursor(0, 0);
lcd.print("VERDE");
lcd.setCursor(0, 1);
lcd.print("GREEN");
digitalWrite(10, 0); digitalWrite(11, 1); digitalWrite(12, 0); // Acende o led verde
delay(2000);
for(int i = 0; i < 16; i++) {
lcd.scrollDisplayRight();
delay(200); }
for(int i = 16; i > 0; i‐‐) {
lcd.scrollDisplayLeft();
delay(200); }
lcd.clear();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("AZUL");
lcd.setCursor(0, 1);
lcd.print("BLUE");
digitalWrite(10, 0); digitalWrite(11, 0); digitalWrite(12, 1); // Acende o led azul
delay(2000);
for(int i = 0; i < 16; i++) {
lcd.scrollDisplayRight();
delay(200); }
for(int i = 16; i > 0; i‐‐) {
lcd.scrollDisplayLeft();
delay(200); }
lcd.clear();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("AMARELO");
lcd.setCursor(0, 1);
lcd.print("YELLOW");
digitalWrite(10, 1); digitalWrite(11, 1); digitalWrite(12, 0); // Acende o led amarelo
delay(2000);
for(int i = 0; i < 16; i++) {
lcd.scrollDisplayRight();
delay(200); }
for(int i = 16; i > 0; i‐‐) {
lcd.scrollDisplayLeft();
delay(200); }
lcd.clear();
// Código continua na página seguinte
lcd.setCursor(0, 0);
lcd.print("ROXO");
lcd.setCursor(0, 1);
lcd.print("PURPLE");
digitalWrite(10, 1); digitalWrite(11, 0); digitalWrite(12, 1); // Acende o led roxo
delay(2000);
for(int i = 0; i < 16; i++) {
lcd.scrollDisplayRight();
delay(200); }
for(int i = 16; i > 0; i‐‐) {
lcd.scrollDisplayLeft();
delay(200); }
lcd.clear();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CIANO");
lcd.setCursor(0, 1);
lcd.print("CYAN");
digitalWrite(10, 0); digitalWrite(11, 1); digitalWrite(12, 1); // Acende o led ciano
delay(2000);
for(int i = 0; i < 16; i++) {
lcd.scrollDisplayRight();
delay(200); }
for(int i = 16; i > 0; i‐‐) {
lcd.scrollDisplayLeft();
delay(200); }
lcd.clear();
apagaled(); // Vai para a função de apagar os leds
delay(1000); // Espera 1 segundo e recomeça o ciclo
}
void apagaled() { // Executa a função de apagar os leds
digitalWrite(10, 0); digitalWrite(11, 0); digitalWrite(12, 0); // Apaga os três leds
}
Ao transferir o código para o programa do Arduino observamos que vai aparecer uma
contagem regressiva de 9 a 0 e após isso o led tricolor vai acender na cor branca e ao mesmo
tempo aparece as palavras “BRANCO” e “WHITE”. Tais palavras vão rolar para a direita e para
a esquerda, enquanto isso o led permanece aceso na cor branca. Após o movimento do texto,
o led acende verde indicando ‘VERDE” e “GREEN” no display. O texto rola e depois acende o
vermelho. E assim por diante passando pelas cores branco, verde, vermelho, azul, amarelo,
roxo e ciano. Depois o display e o led apagam e o ciclo recomeça. É um experimento bem
divertido que testa o funcionamento tanto do display quanto do led tricolor RGB.
Lista de materiais
Procedimento
// Experiência nº 36 – Relógio com hora e data
#include <LiquidCrystal.h> // Biblioteca do Arduino para o display
LiquidCrystal lcd(9, 8, 6, 5, 4, 3); // Ordem dos pinos em nosso circuito proposto
int segundo,minuto, hora, dia, mes, ano; // Variáveis de data e horário
unsigned long UtlTime; // Variável de tempo
void setup()
{
UtlTime=0;
minuto=0;
hora=0;
dia=0;
mes=0;
ano=0;
Serial.begin(9600); // Inicio da comunicação serial com o monitor do Arduino
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print(" Data e hora ");
lcd.setCursor(0,1);
lcd.print(" com Arduino");
delay (2000);
lcd.clear(); // Ajuste dos minutos
lcd.setCursor(0,0);
lcd.print("Minuto: ");
Serial.print("\nEntre Minuto:"); // Escreve mensagem no monitor do Arduino
while(minuto==0) {
if (Serial.available() > 0) {
minuto= Serial.parseInt(); }
}
lcd.print(minuto);
delay(1000);
lcd.clear(); // Ajuste das horas
lcd.setCursor(0,0);
lcd.print("Hora: ");
Serial.print("\nEntre Hora:"); // Escreve mensagem no monitor do Arduino
while(hora==0) {
if (Serial.available() > 0) {
hora= Serial.parseInt(); }
}
lcd.print(hora);
delay(1000); // Código continua na página seguinte
lcd.clear(); // Ajuste do dia
lcd.setCursor(0,0);
lcd.print("Dia: ");
Serial.print("\nEntre Dia:"); // Escreve mensagem no monitor do Arduino
while(dia==0) {
if (Serial.available() > 0) {
dia= Serial.parseInt();
}
}
lcd.print(dia);
delay(1000);
lcd.clear(); // Ajuste do mês
lcd.setCursor(0,0);
lcd.print("Mes: ");
Serial.print("\nEntre Mes:"); // Escreve mensagem no monitor do Arduino
while(mes==0) {
if (Serial.available() > 0) {
mes= Serial.parseInt();
}
}
lcd.print(mes);
delay(1000);
lcd.clear(); // Ajuste do ano
lcd.setCursor(0,0);
lcd.print("Ano: ");
Serial.print("\nEntre ano:"); // Escreve mensagem no monitor do Arduino
while(ano==0) {
if (Serial.available() > 0) {
ano= Serial.parseInt();
}
}
lcd.print(ano);
delay(1000);
lcd.clear();
}
void loop()
{
if(millis()‐UtlTime<0) {
UtlTime=millis();
} else {
segundo=int((millis()‐UtlTime)/1000); // Define a contagem de segundo em segundo
}
// Código continua na próxima página
if(segundo>59) { // Depois de 59 segundos
segundo=0; // Zera os segundos
minuto++; // Avança um minuto
UtlTime=millis();
if(minuto>59) { // Depois de 59 minutos
hora++; // Avança uma hora
minuto=0; // Zera os minutos
if(hora>23) { // Depois de 23 horas
dia++; // Avança um dia
hora=0; // Zera as horas
if(mes==1||mes==3||mes==5||mes==7||mes==8||mes==10||mes==12) {
if(dia>31) { // Depois de 31 dias em alguns meses
dia=1; // Volta para o dia 1º
mes++; // Avança um mês
if(mes>12) { // Depois de 12 meses
ano++; // Avança um ano
mes=1; } // Volta para o 1º mês
}
}
else if(mes==2) { // No mês dois
if(ano%400==0) { // No ano bissexto
if(dia>29) { // Depois de 29 dias
dia=1; // Volta para o dia 1º
mes++; } // Avança um mês
}
else if((ano%4==0)&&(ano%100!=0)) { // No ano bissexto
if(dia>29) { // Depois de 29 dias
dia=1; // Volta para o dia 1º
mes++; } // Avança um mês
}
else { // Nos anos não bissextos
if(dia>28) { // Depois de 28 dias
dia=1; // Volta para o dia 1º
mes++; } // Avança um mês
}
}
else { // Nos meses de 30 dias
if(dia>30) { // Depois de 30 dias
dia=1; // Volta para o dia 1º
mes++; } // Avança um mês
}
}
}
}
// Código continua na próxima página
Serial.print(dia); // Escreve no monitor do Arduino
Serial.print("/");
Serial.print(mes);
Serial.print("/");
Serial.print(ano);
Serial.println();
lcd.setCursor(0,0); // Escreve no display LCD
lcd.print("Data ");
lcd.print(dia);
lcd.print("/");
lcd.print(mes);
lcd.print("/");
lcd.print(ano);
Serial.print(hora);
Serial.print(":");
Serial.print(minuto);
Serial.print(":");
Serial.print(segundo);
Serial.print("\n");
Serial.println();
lcd.setCursor(0,1);
lcd.print("Hora ");
lcd.print(hora);
lcd.print(":");
lcd.print(minuto);
lcd.print(":");
lcd.print(segundo);
}
Após carregar o código para o Arduino, vai aparecer no display a mensagem “minuto”, então
você abre o monitor no programa do Arduino como já ensinado em outra parte do curso (botão
com o símbolo de uma lupa localizado na parte superior à direita no programa do Arduino. Tal
botão se chama “monitor serial”. Ao abrir o monitor ele vai exibir a palavra “minuto”, daí é só
digitar os minutos do horário atual e teclar Enter. Logo em seguida aparece a palavra “hora”.
Só teclar a hora atual e dar Enter, depois vai aparecer a palavra “dia”, só colocar o dia, a
palavra “mês”, só colocar o mês e por último a palavra “ano” e só colocar o ano. Colocadas
estas 5 informações o relógio funciona mesmo que fechemos o programa do Arduino.
Lembrando que o relógio usa como base de contagem 24 horas. Porém há uma pequena falha
neste relógio que quando chega no 59 segundos ao invés de contar 00 segundos, ele mostra
09 segundos no display, depois 19, 29, 39 até o 10 segundos mas serve bem para ver o
princípio de funcionamento de um relógio digital.
Lista de materiais
Procedimento
// Experiência nº 37 – Caracteres customizados no display LCD
#include <LiquidCrystal.h> // Biblioteca do Arduino para o display
LiquidCrystal lcd(12, 11, 6, 5, 4, 3); // Ordem dos pinos em nosso circuito proposto
byte coracao[8] = { // Forma o caractere do coraçãozinho
B00000,
B01010,
B11111,
B11111,
B11111,
B01110,
B00100,
B00000
};
byte feliz[8] = { // Forma o caractere da carinha feliz
B00000,
B11011,
B01010,
B00000,
B10101,
B10001,
B01110,
B00000
};
byte serio[8] = { // Forma o caractere da carinha séria
B00000,
B11011,
B01010,
B00000,
B00100,
B00000,
B11111,
B00000
};
byte triste[8] = { // Forma o caractere da carinha triste
B00000,
B01010,
B11011,
B00000,
B00100,
B00000,
B11111,
B10001
}; // Código continua na próxima página
byte bravo[8] = { // Forma o caractere da carinha brava
B10001,
B01010,
B01010,
B00000,
B00100,
B00000,
B11111,
B00000
};
void setup() {
lcd.begin(16, 2); // Número de colunas e linhas do display
lcd.createChar(0, coracao); // Criando e armazenando os caracteres novos
lcd.createChar(1, feliz);
lcd.createChar(2, serio);
lcd.createChar(3, triste);
lcd.createChar(4, bravo);
}
void loop() {
lcd.setCursor(0,0); // Coloca o cursor na primeira coluna e primeira linha
lcd.print("Ola. Como esta seu humor hoje?"); // Escreve a mensagem no display
delay(2000); // Espera 2 segundos
for(int x = 0; x < 14; x++) { // Rola o texto 14 colunas para a esquerda
lcd.scrollDisplayLeft(); // Função de rolagem do texto à esquerda
delay(300); // Velocidade de rolagem (1 coluna a cada 0,3 segundos)
}
delay(2000); // Espera 2 segundos
lcd.clear(); // Limpa o display
delay(1000); // Espera 1 segundo
lcd.setCursor(0,0); // Coloca o cursor na primeira coluna e primeira linha
lcd.print("Romantico (a)"); // Escreve a mensagem no display
for(int c = 0; c < 5; c++) { // Faz o coraçãozinho piscar 5 vezes no display
lcd.setCursor(8,1); // Coloca o cursor na nona coluna e segunda linha
lcd.write(byte(0)); // Escreve o caractere do coraçãozinho no display
delay(300); // Espera 0,3 segundos
lcd.setCursor(8,1); // Coloca o cursor na nona coluna e segunda linha
lcd.print(" "); // Não escreve nada (quando o coraçãozinho some)
delay(300); // Espera 0,3 segundos
}
// Código continua na próxima página
delay(1000); // Espera 1 segundo
lcd.clear(); // Limpa o display
delay(1000); // Espera 1 segundo
lcd.setCursor(0,0); // Coloca o cursor na primeira coluna e primeira linha
lcd.print("Feliz"); // Escreve a mensagem no display
lcd.setCursor(8,1); // Coloca o cursor na nona coluna e segunda linha
lcd.write(byte(1)); // Escreve a carinha feliz no display
delay(4000); // Espera 4 segundos
lcd.clear(); // Limpa o display
delay(1000); // Espera 1 segundo
lcd.setCursor(0,0); // Coloca o cursor na primeira coluna e primeira linha
lcd.print("Serio"); // Escreve a mensagem no display
lcd.setCursor(8,1); // Coloca o cursor na nona coluna e segunda linha
lcd.write(byte(2)); // Escreve a carinha séria no display
delay(4000); // Espera 4 segundos
lcd.clear(); // Limpa o display
delay(1000); // Espera 1 segundo
lcd.setCursor(0,0); // Coloca o cursor na primeira coluna e primeira linha
lcd.print("Triste"); // Escreve a mensagem no display
lcd.setCursor(8,1); // Coloca o cursor na nona coluna e segunda linha
lcd.write(byte(3)); // Escreve a carinha triste no display
delay(4000); // Espera 4 segundos
lcd.clear(); // Limpa o display
delay(1000); // Espera 1 segundo
lcd.setCursor(0,0); // Coloca o cursor na primeira coluna e primeira linha
lcd.print("Bravo"); // Escreve a mensagem no display
lcd.setCursor(8,1); // Coloca o cursor na nona coluna e segunda linha
lcd.write(byte(4)); // Escreve a carinha brava no display
delay(4000); // Espera 4 segundos
lcd.clear(); // Limpa o display
delay(2000); // Espera 2 segundos e todo o loop recomeça
}
Lista de materiais
Procedimento
// Experiência nº 38 – Botões liga‐desliga e o display LCD
#include <LiquidCrystal.h> // Biblioteca do Arduino para o display
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Ordem dos pinos em nosso circuito proposto
void setup() {
pinMode(8, INPUT_PULLUP); // Pino de entrada do botão 1
pinMode(9, INPUT_PULLUP); // Pino de entrada do botão 2
pinMode(12, OUTPUT); // Pino de saída para o led
lcd.begin(16, 2); // Inicia o display de 16 colunas e 2 linhas
lcd.setCursor(0, 0); // Posiciona o cursor na primeira coluna e primeira linha
lcd.print("Iniciando . . ."); // Mostra a mensagem no display
lcd.setCursor(0, 1); // Posiciona o cursor na primeira coluna e segunda linha
lcd.print("Aguarde"); // Mostra a mensagem no display
delay(3000); // Espera 3 segundos
lcd.clear(); // Limpa o display
lcd.setCursor(0, 0); // Posiciona o cursor na primeira coluna e primeira linha
lcd.print("Aperte o botao 1"); // Mostra a mensagem no display
lcd.setCursor(0, 1); // Posiciona o cursor na primeira coluna e segunda linha
lcd.print("para ligar"); // Mostra a mensagem no display
delay(2000); // Espera 2 segundos
lcd.setCursor(0, 0); // Posiciona o cursor na primeira coluna e primeira linha
lcd.print("Aperte o botao 2"); // Mostra a mensagem no display
lcd.setCursor(0, 1); // Posiciona o cursor na primeira coluna e segunda linha
lcd.print("para desligar"); // Mostra a mensagem no display
}
void loop() {
int botao1 = digitalRead(8); // Lê o botão 1 no pino 8
int botao2 = digitalRead(9); // Lê o botão 2 no pino 9
if(botao1 == 0) { // Se o botão 1 está em nível baixo (pressionado)
lcd.clear(); // Limpa o display
lcd.setCursor(2, 0); // Posiciona o cursor na terceira coluna e primeira linha
lcd.print("Led ligado!"); // Mostra a mensagem no display
digitalWrite(12, 1); // Acende o led no pino 12
delay(50); } // Espera 50 milisegundos
if(botao2 == 0) { // Se o botão 2 está em nível baixo (pressionado)
lcd.clear(); // Limpa o display
lcd.setCursor(2, 0); // Posiciona o cursor na primeira coluna e primeira linha
lcd.print("Led desligado!"); // Mostra a mensagem no display
digitalWrite(12, 0); // Apaga o led no pino 12
delay(50); } // Espera 50 milisegundos
}
Este circuito embora muito simples pode servir de base a muitos outros mais sofisticados.
Usamos dois botões para controlar um led (poderia ser um relê) e mostramos no display.
Lista de materiais
Procedimento
// Experiência nº 39A – Controle de velocidade do motor DC com potenciômetro
void setup() {
pinMode(A0, INPUT); // Pino de entrada analógica para o potenciômetro
pinMode(11, OUTPUT); // Pino de saída para o controle do motor (“driver”)
}
void loop() {
int valorpot = analogRead(A0); // Leitura do pino do potenciômetro
int velocidade = map(valorpot, 0, 1023, 0, 255); // Valor do potenciômetro para 0 a 255
analogWrite(11, velocidade); // Controla o motor com a tensão PWM
}
Lista de materiais
Procedimento
// Experiência nº 39B – Controle de velocidade do motor DC com teclas
int velocidade = 0; // Variável de ajuste de velocidade
void setup() {
pinMode(8, INPUT_PULLUP); // Entrada de uma das teclas (a de aumento de rotação)
pinMode(9, INPUT_PULLUP); // Entrada de uma das teclas (a de redução de rotação)
pinMode(11, OUTPUT); // Saída para controle do motor (“driver”)
analogWrite(11, 0); // Condição inicial do pino de controle do motor
}
void loop() {
int acelera = digitalRead(8); // Leitura da tecla de aceleração
int freia = digitalRead(9); // Leitura da tecla de desaceleração
if(acelera == 0) { // Se a tecla de aceleração está em nível baixo (pressionada)
velocidade++; // aumenta a velocidade do motor
}
if(freia == 0) { // Se a tecla de desaceleração está em nível baixo (pressionada)
velocidade = velocidade‐1; // diminui a velocidade do motor
}
delay(50); // Espera 50 milissegundos
analogWrite(11, velocidade); // Controla o motor com a tensão PWM
}
No caso desta experiência temos duas teclas. Se pressionarmos uma delas o motor vai girar
cada vez mais rápido (até o limite) e no caso da outra tecla o motor vai girar cada vez mais
devagar até parar por completo.
Lista de materiais
Procedimento
// Experiência nº 40 – Sentido de rotação do motor DC com duas teclas
void setup() {
pinMode(3, INPUT_PULLUP); // Entrada para uma das teclas
pinMode(4, INPUT_PULLUP); // Entrada para a outra tecla
pinMode(11, OUTPUT); // Saída para a base de um dos transistores NPN (TIP41)
pinMode(10, OUTPUT); // Saída para a base de um dos transistores PNP (TIP42)
pinMode(7, OUTPUT); // Saída para a base do outro transistor NPN (TIP41)
pinMode(6, OUTPUT); // Saída para a base do outro transistor PNP (TIP42)
}
void loop() {
int sentido1 = digitalRead(3); // Leitura do estado de uma das teclas
int sentido2 = digitalRead(4); // Leitura do estado da outra tecla
if(sentido1 == 0) { // Se uma das teclas está pressionada (nível baixo)
digitalWrite(11, 1); // Pino 11 em nível alto liga um dos transistores NPN (Q1)
digitalWrite(6, 0); // Pino 6 em nível baixo liga um dos transistores PNP (Q4)
digitalWrite(10, 1); // Pino 10 em nível alto desliga o outro transistor PNP (Q2)
digitalWrite(7, 0); // Pino 7 em nível baixo desliga o outro transistor NPN (Q3)
}
if(sentido2 == 0) { // Se a outra tecla está pressionada (nível baixo)
digitalWrite(11, 0); // Pino 11 em nível baixo desliga um dos transistores NPN (Q1)
digitalWrite(6, 1); // Pino 6 em nível alto desliga um dos transistores PNP (Q4)
digitalWrite(10, 0); // Pino 10 em nível baixo liga o outro transistor PNP (Q2)
digitalWrite(7, 1); // Pino 7 em nível alto liga o outro transistor NPN (Q3)
}
}
Como podemos ver de acordo com o código ao apertar uma tecla os transistores Q1 e Q4
conduzem fazendo a corrente fluir pelo motor em um determinado sentido e o motor gira numa
certa direção. Ao apertar a outra tecla, conduzem Q2 e Q3 fazendo a corrente passar no outro
sentido pelo motor fazendo-o girar em sentido contrário. Então temos uma ponte de quatro
transistores para controlar o sentido que o motor vai girar. Se for usar este circuito para alguma
aplicação não se esqueça de colocar um dissipador de calor nos transistores junto com um
pouco de pasta térmica porque eles esquentam se ficarem por longo tempo ligados.
Chegamos ao final de mais um curso esperando que ele possa ser muito proveitoso e dê
uma boa base para fazer e usar projetos com Arduino. Este livro acompanha o DVD com
vídeo aula onde você verá o funcionamento de todas as experiências apresentadas aqui
além de mais alguns detalhes acerca do Arduino. Qualquer dúvida, crítica ou sugestão
você pode os e-mails: Lburgos23@terra.com.br e Lburgos@terra.com.br. Nossas lojas
estão abaixo (nossa e de nossos parceiros comerciais):
http://loja.burgoseletronica.net
www.lojaburgoseletronica.com.br
www.esquemafacil.com.br
www.livrotec.com.br