Professional Documents
Culture Documents
Exemplo de um Programa
// Exemplo de programa em C
// Isto uma linha de comentrio
void main()
{
int a; // declara a varivel "a"
a = 3 + 2; // soma 3 com 2
}
Variveis
Uma varivel uma possio de memria que pode
ser identificada atravs de um nome.
Podem ter seu contedo alterado por um comando
de atribuio.
Aps a atribuio mudam de valor.
int a,b, SomaGeral;
a = 3; // a recebe o valor 3
b = a * 2; // b recebe o dobro do valor de a
c = a + b + 2; // c recebe 11
Tipos de Variveis
Todas as variveis em C tem um tipo;
Cada tipo define os valores que a varivel pode
armazenar;
Cada tipo ocupa uma certa quantidade de
nemria.
Tipo Valores Vlidos
char letras e smbolos: 'a', 'b', 'H', '^', '*','1','0'
int de -32767 at 32767 (apenas nmeros inteiros)
float de -3.4 x 1038 at +3.4 x 10+38com at 6 dgitos de preciso
double de -1.7 x 10308 at +1.7 x 10+308com at 10 dgitos de preciso
Declarao de Variveis
Todas as variveis tem que ser
declaradas antes de serem usadas;
No h uma inicializao implcita na declarao
// Exemplo de programa em C
Constantes
Constantes so identificadores que no podem ter seus valores
alterados durante a execuo do programa.
Exemplos
Strings
Uma String uma sequncia de caracteres entre
aspas duplas: "exemplo de uma string em C".
A funo printf
A funo printf exibe um ou mais dados na tela. Para tanto ele deve
receber pelo menos dois parmetros, separados por vrgula:
um string de formato que define, atravs de caracteres
especiais, os tipos dos dados a serem impressos e suas
posies na linha de impresso;
Por exemplo:
printf("%s","teste");
Por exemplo:
Exerccio
Experimente colocar um '\n' entre os %s na string de formato.
O exemplo
printf("A aluna %s ficou
doente","Maria");
geraria
A aluna Maria ficou doente
como resultado.
Contador = 10;
printf("Valor da Varivel: %d\n", Contador); // No momento da
execuo sinal %d vai
// ser substitudo pelo
valor da
// varivel Contador
NroDeFilhos = 3;
printf("Maria tem %d filhos", NroDeFilhos); // o inteiro
pode ficar no meio da string
getch(); // espera que o usurio pressione uma tecla
}
Isto sempre acontece quando se manda imprimir um float da forma como foi
feito no exemplo acima. Isto acontece pois o padro da funo printf
completar o nmero com zeros direita, at que fique com seis casas
decimais.
Por exemplo: %6.3f especifica que se quer imprimir um float com 3 casas
decimais e com um tamanho total de 6 caracteres no total.
#include <stdio.h>
#include <conio.h>
void main()
{
float NotaDaP1, NotaDaP2;
float Media;
Por exemplo:
#include <stdio.h>
#include <conio.h>
void main()
{
float Numero;
Numero = -2.5;
clrscr();
printf("1234567890\n");
printf("%7f\n", Numero);
printf("%7.0f\n", Numero);
printf("%7.3f\n", Numero);
printf("%8.3f\n", Numero);
printf("%9.3f\n", Numero);
printf("\n");
printf("%8.4f\n", Numero);
printf("%8.1f\n", Numero);
printf("%6.12f\n", Numero);
getch();
}
// Resultados
1234567890
-2.500000
-2
-2.500
-2.500
-2.500
-2.5000
-2.5
-2.500000000000
void main()
{
char Nome[30]; // declara uma string que poder armazenar at 29
caracteres !!
clsrscr();
strcpy(Nome, "Jose da Silva"); // atribui "Jose da Silva" para a
varivel Nome
printf("O funcionrio %s foi tranferido", Nome); // no lugar de %s
aparecer o
// contedo da
varivel Nome
getch();
}
Operadores Aritmticos
- sinal de menos (unrio) Maior
precedncia
(avaliado
antes)
*,/ multiplicao e diviso
% mdulo (reto da diviso)
+,- soma e subtrao Menor
precedncia
(avaliado
depois)
ou invs de
printf(" %d", QuantidadeDeBananas);
Sub-Total R$ 146.20
Imposto (5%) R$ 7.31
Total R$ 153.51
Tutorial de Programao Arduno Lio 1
Com o aumento da popularidade do Arduino, cada vez mais evidente que este o
microcontrolador mais utilizados em termos acadmicos, por amadores e pequenas
empresas. Muitos dos produtos electrnicos de diferentes empresas de produo,
esto a entrar num ramo de produo de diferentes "shields" produzindo variaes
muito especificas para uma dada tarefa. O site Arduno oferece recursos livres e
tutoriais, bem como uma referncia de linguagem para ajudar a entender o cdigo
e sintaxe.
O que um Arduino?
uma placa de controlo de entrada de dados (IN), por exemplo sensores, e sada de
dados (OUT), por exemplo atuadores, com o caso de motores e leds.
Possui ainda um regulador de tenso de 5 V, um boto de reset, um conector de
alimentao, pinos conectores, LEDs e uma entrada de ligao USB. Quando ligado
atravs de USB o Arduino no necessita alimentao externa.
EM termos de alimentao external esta pode variar entre 7 a 12 V.
O Arduino tem um conjunto de pinos de entrada e sada.
Hardware
Para comear necessrio uma placa Arduno, sensores e atuadores. Uma vez que
o Arduno pode ser ligado por USB a um computador, basta, utilizar o software
Arduno IDE de modo a poder criar cdigos de carrega-los diretamente na placa .
5- No software , seleccione "Ferramentas" -> "Porta Serial" -> COM # (note que, se
voc tem vrias portas , voc ter que ir ao Gestor de Dispositivos para ver qual
porta COM atribuda sua placa.
Inicializao
Primeiro de tudo importante explicar que a linguagem Arduino sensvel a
maisculas: uma letra maiscula no o mesmo que uma letra minscula.
O cdigo a seguir representa o mnimo para que um programa possa ser compilado:
O "void setup ()" normalmente usado para inicializar variveis , modos de pinos ,
definio a velocidade de transmisso serial, etc. O software s vai a uma seco
de cada vez.
O "void loop ()" a parte do cdigo em que se faz um loop, ou seja, cria-se um ciclo
de repetio para que as instrues dentro do mesmo sejam repetidas.
Quase todas as linhas de cdigo precisa de um ponto e vrgula ';' para ser
finalizada. Para escrever comentrios numa nica linha de cdigo ,coloque duas
barras invertidas , seguidas pelo texto:
/ / comentrios so ignorados durante a compilao de seu programa
/ * Este um comentrio
de vrias linhas* /
Se por exemplo se quiser colocar um cdigo dentro de um "void loop ()", o cdigo
escrito dentro de chavetas {}:
void loop () {
ESCREVER AQUI O Cdigo
}
Comunicao srie
A placa Arduino pode comunicar com vrias velocidades de transmisso. A
transmisso uma medida em quantas vezes o hardware pode enviar informao a
cada segundo. Para definir a velocidade de transmisso, use o seguinte cdigo:
void setup () {
Serial.begin (9600);
http://youtu.be/QSK81QQLI34
A qual define o pino 13 como um pino de sada . O oposto , seria INPUT, faria com
que o pino l-se um sinal de 5V em vez de emiti-lo.
A linha digitalWrite (pin , HIGH) ; coloca um pino especifico elevado para a 5V. Neste
caso, escolheu o pino 13, pois o LED est ligado ao pino 13 . Substituindo alto com
LOW , o pino definido para 0V.
delay ( 1000) ;
O linha delay ( 1000) ; faz com que o programa espere 1000 milissegundos antes de
continuar (onde 1000 apenas um exemplo conveniente para chegar com um 1
segundo de atraso ) . Note-se que , durante um intervalo , o microcontrolador
espera simplesmente e no executa quaisquer linhas de cdigo adicionais.
Componentes de um cdigo
Vamos considerar que um cdigo no Arduino constitudo por 5 elementos
principais:
--- void setup(), como foi visto na lio 2, este normalmente usado para inicializar
variveis, modos de pinos, definio a velocidade de transmisso serial, etc...
--- void loop(), mais uma vez, como visto na lio 2, aqui a parte do cdigo em
que se faz um loop, ou seja, cria-se um ciclo de repetio para que as instrues
dentro do mesmo sejam repetidas.
Bibliotecas
Quando se cria um cdigo/programa usando uma linguagem de programao, neste
caso C/C++, existe a possibilidade de usar um conjunto de funes pr-criadas por
outros programadores que j resolvem determinados problemas, ou seja, no
necessrio inventar a roda se ela j foi inventada, poupando imenso trabalho.
A esse conjunto de funes damos o nome de bibliotecas, do ingls, library.
Na prtica, para se utilizar uma biblioteca basta inclui-la no incio do cdigo, por
exemplo, para usar a biblioteca servo deve ter uma linha no incio do cdigo escrita
com o formato apresentado na imagem direita:
Variveis
Uma varivel uma forma de dar um nome e guardar um valor para usar ao longo
do programa, como por exemplo, dados de um sensor ou um valor intermedirio de
um clculo.
Aps serem declaradas ou iniciadas, podem ser usadas de forma a atribuir, alterar
ou utilizar um valor. Para atribuir ou alterar um valor de uma varivel utiliza-se o
operador "=", dizendo ao programa para atribuir o que estiver do lado direito do
sinal de igual, dentro da varivel que deve ficar do lado esquerdo do sinal de igual.
variavel1 = 7; // atribuir varivel o valor 7
variavel2 = analogRead(2); // atribuir a voltagem lida de uma porta analgica 2 do
arduino
Existem diversos tipos de variveis, umas onde apenas se podem guardar nmeros
e outras onde pode ser guardado qualquer tipo de carater, seja ele um nmero,
uma letra ou um smbolo.
char - consegue guardar letras, nmeros e smbolos: 'a', 'b', 'H', '^', '*','1','0'.
char var4 = 'A';
sting - consegue guardar conjuntos de letras, nmeros e smbolos: 'a', 'b', 'H', '^',
'*','1','0' (por exemplo, uma frase).
char var5[20] = "Escola de Robtica!!";
NOTA: no caso da string esta um conjunto de carateres por isso inicia-se com
sendo do tipo "char" mas no nome da varivel, entre parntesis rectos coloca-se o
nmero de carateres que sero colocados no seu interior, essa informao
colocada dentro de aspas duplas.
Funes
As funes so usadas para criar pequenos pedaos de cdigos separados do
programa principal. No caso do arduino estas so colocadas fora do void loop().
Na imagem direita podemos ver como se cria uma funo e como utilizada no
void loop().
A funo em questo soma dois valores e depois devolve o resultado ao programa
principal.
void setup()
O "void setup ()" normalmente usado para inicializar variveis , modos de pinos ,
definio a velocidade de transmisso serial, etc. Por exemplo se utilizar-mos um
servo-motor e queremos atribuir-lhe uma posio de inicializao (em que posio o
servo deve estar situado antes do inicio das operaes) podemos utilizar o exemplo
de cdigo apresentado direita.
void loop()
O "void loop ()" a parte do cdigo em que se faz um loop, ou seja, cria-se um ciclo
de repetio para que as instrues dentro do mesmo sejam repetidas.
-> modo: Define como se vai movimentar o rob, podendo variar entre 1 e 4, em
que 1 andar em frente, 2 andar para trs, 3 virar a direita, 4 virar a esquerda.
-> tempo: Define o tempo em que a tarefa ir ser realizada. (se colocado a zero ir
fazer a tarefa at que uma condio seja satisfeita, por exemplo, andar para a
frente at encontrar um obstculo)
Exemplos:
ultrassom()
Exemplos:
Andar para a frente caso a distncia do objeto for maior que 30 centmetros. Caso
seja menor o rob pra.
rodar()
Por exemplo se o rob est num canto decide para que lado deve virar, escolhendo
sempre o lado que no tem obstculo.
Exemplos:
Andar para a frente caso a distncia do objeto for maior que 30 centmetros. Caso
seja menor o rob verifica para que lado deve virar para evitar o objeto.
seguir()
Se voc est usando o Arduino pela primeira vez, no deixe de ver nossos tutoriais
de como configurar o Arduino para Windows ou Mac.
Introduo
Computador
Programa de Computador
Linguagem de Programao
Ns seres humanos precisamos converter as nossas idias para uma forma que
os computadores consigam processar, ou seja, a linguagem de mquina. Os
computadores de hoje (ainda) no conseguem entender a linguagem natural que
ns usamos no dia a dia, ento precisamos de um outro "idioma" especial para
instruir o computador a fazer as tarefas que desejamos. Esse "idioma" uma
linguagem de programao, e na verdade existem muitas delas.
Algoritmo (Programa)
void setup() {
pinMode(led, OUTPUT);
void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
Varivel
int led;
Nesse caso estamos declarando uma varivel do tipo int chamada led . Em
seguida ns falaremos mais sobre o tipo de dado de uma varivel.
Tipo de Dado
O tipo de dado de uma varivel significa, como o prprio nome diz, o tipo de
informao que se pode armazenar naquela varivel. Em muitas linguagens de
programao, como C++, obrigatrio definir o tipo de dado no momento da
declarao da varivel, como vimos na declarao da varivel led acima. No caso
dos mdulos Arduino que usam processador ATmega, os tipos mais comuns de
dados que utilizamos so:
char : um caractere
Para conhecer todos os tipos de dado suportados pelo Arduino, veja a seo "Data
Types" nessa pgina.
Atribuio
Atribuir um valor a uma varivel significa armazenar o valor nela para usar
posteriormente. O comando de atribuio em C++ o = . Para atriburmos o
valor 13 varivel led que criamos acima, fazemos assim:
led = 13;
O objetivo dessa linha de cdigo dizer que o pino 13 do Arduino ser utilizado
para acender o LED, e armazenar essa informao para usar depois ao longo do
programa.
Operador
Operadores aritmticos:
o + : adio ("mais")
o - : subtrao ("menos")
o * : multiplicao ("vezes")
Operadores lgicos:
o || : disjuno ("ou")
o ! : negao ("no")
Operadores de atribuio:
Uma funo , em linhas gerais, uma sequncia de comandos que pode ser
reutilizada vrias vezes ao longo de um programa. Para criar uma funo e dizer o
que ela faz, ns precisamos fazer uma declarao de funo. Veja como uma
funo declarada no nosso programa de exemplo:
void setup() {
pinMode(led, OUTPUT);
Aqui estamos declarando uma funo com o nome setup() . O que ela faz
executar os comandos de uma outra funo pinMode() . A ao de executar os
comandos de funo previamente declarada denominada chamada de funo.
Ns no precisamos declarar a funo pinMode() porque ela j declarada
automaticamente no caso do Arduino.
Chamada de Funo
Chamar uma funo significa executar os comandos que foram definidos na sua
declarao. Uma vez declarada, uma funo pode ser chamada vrias vezes no
mesmo programa para que seus comandos sejam executados novamente. Para
chamarmos a nossa funo setup() , por exemplo, ns usaramos o seguinte
comando:
setup();
Valor de Retorno
A palavra chave que vem antes do nome da funo na declarao define o tipo
do valor de retorno da funo. Toda vez que uma funo chamada, ela
executada e devolve ou retorna um determinado valor - esse o valor de retorno,
ou simplesmente retorno da funo. O valor de retorno precisa ter um tipo, que
pode ser qualquer um dos tipos de dados citados anteriormente. No caso da nossa
funo setup() , o tipo de retorno void , o que significa que a funo no retorna
nada.
Para exemplificar, vamos criar uma funo que retorna alguma coisa, por exemplo
um nmero inteiro. Para retornar um valor, ns utilizamos o comando return :
int f() {
return 1;
Quando chamada, a funo f() acima retorna sempre o valor 1 . Voc pode usar
o valor de retorno de uma funo para atribu-lo a uma varivel. Por exemplo:
x = f();
Parmetros
Um outro recurso importante de uma funo so os parmetros. Eles servem para
enviar algum dado para a funo quando ela chamada. Vamos criar por exemplo
uma funo que soma dois nmeros:
return a + b;
Aqui acabamos definir uma funo chamada soma() , que aceita dois nmeros
inteiros como parmetros. Ns precisamos dar um nome para esses parmetros, e
nesse caso escolhemos a e b . Esses parmetros funcionam como varivel que
voc pode usar dentro da funo. Sempre que chamarmos a funo soma() ,
precisamos fornecer esses dois nmeros. O comando return a +
b; simplesmente retorna a funo com a soma dos dois nmeros. Vamos ento
somar 2 + 3 e atribuir o resultado para uma varivel x :
x = soma(2, 3);
/*
*/
/*
*/
/*
Declarao da funo setup()
Esta funo chamada apenas uma vez, quando o Arduino ligado ou rei
niciado.
*/
void setup() {
/*
*/
void loop() {
Estruturas de Controle
While
O while uma estrutura que executa um conjunto de comandos repetidas vezes
enquanto uma determinada condio for verdadeira. While em ingls quer dizer
"enquanto", e pronuncia-se "ui-ou". Ele segue o seguinte formato:
while(condio) {
...
Vamos ento fazer uma modificao no nosso programa para exemplificar melhor
como o while funciona. O nosso objetivo agora fazer o LED piscar trs vezes,
depois esperar cinco segundos, piscar mais trs vezes e assim por diante. Ns
vamos mudar o contedo da funo loop() para o seguinte:
int i = 0;
Primeiro ns declaramos uma varivel i . Essa varivel vai contar quantas vezes o
LED j piscou desde o incio do programa ou desde a ltima pausa de cinco
segundos. Ns vamos inicializar essa varivel com zero porque no incio da
funo loop() o LED ainda no piscou nenhuma vez sob essas condies.
Aps esses passos, chegamos ao final da funo loop() , e como j sabemos, ela
chamada novamente pelo sistema do Arduino. Isso reinicia o ciclo, executando
os passos acima indefinidamente.
int i;
A primeira modificao que fizemos foi declarar a varivel i sem inicializ-la com
o valor 0 . Ns podemos fazer isso porque o comando for far isso para a gente.
Ele segue o seguinte formato:
...
Podemos ento verificar que o for nada mais do que um while acrescido de
um comando de inicializao e um comando de finalizao. Para o nosso
programa de teste, esses comandos so, respectivamente:
If
O if uma das estruturas mais bsicas de programao em geral. If significa "se"
em ingls, e exatamente isso que ele faz: ele verifica uma expresso e,
apenas se ela for verdadeira, executa um conjunto de comandos. Em linguagem
natural, ele executa uma lgica do tipo: "se isso for verdadeiro, ento faa aquilo"
Para ilustrar, vamos modificar o nosso programa de exemplo para que ele faa a
mesma coisa que fizemos com o while e o for acima, porm vamos fazer isso
usando um if , que segue o seguinte formato:
if(condio) {
...
}
A lgica muito simples: sempre que a condio vor verdadeira, os comandos
entre { e } so executados, caso contrrio o programa prossegue sem execut-
los. Vamos ver ento como fica a funo loop() :
int i = 0;
void loop() {
if(i == 3) {
If-Else
O if-else, tambm conhecido como if-then-else, pode ser visto como uma
extenso do comando if . Else em ingls significa "caso contrrio", e ele faz
exatamente o que o nome diz: "se isso for verdadeiro, ento faa aquilo, caso
contrrio, faa outra coisa". Ele segue o seguinte formato:
if(condio) {
...
} else {
...
Para exemplificar, vamos usar o programa do for que mostramos acima, mas
vamos dessa vez fazer o LED acender e apagar quatro vezes antes de dar uma
pausa de cinco segundos. Depois vamos fazer com que na terceira de cada uma
dessas quatro "piscadas", o LED acenda por um perodo mais curto. Dentro da
funo loop() , teremos o seguinte:
int i;
if(i == 2) {
} else {
}
delay(5000); // Espera 5 segundos para piscar o LED de
novo
Aqui o que fazemos , toda vez que vamos acender o LED, verificar se a terceira
vez que isso acontece, por meio do comando if com a condio i == 2 . Se essa
expresso for verdadeira, isso quer dizer que j acendemos o LED duas vezes e
estamos prestes a acend-lo pela terceira vez; nesse caso mudamos o tempo que
o LED fica acaso para um valor menor, de 0,2 segundo (uma reduo de 0,8
segundo) e o tempo que ele fica apagado para um valor maior, de 1,8 segundos
(aumento de 0,8 segundo).
Mas e se essa no for a terceira vez que o LED est sendo acionado? a que
entra o else : se a condio do if for verdadeira, o bloco de comandos
entre { e } logo aps o if executado, caso contrrio, o bloco
entre { e } aps o else executado. Isso quer dizer que para a primeira,
segunda e quarta "piscadas" ser usado o tempo padro de um segundo.
Bibliotecas
#include <LiquidCrystal.h>
lcd.begin(16, 2);
Feitos esses passos, j podemos escrever texto no LCD. Fazemos isso usando o
mtodo print() do objeto lcd , sempre que precisarmos ao longo do programa:
lcd.print("Oi!");
Concluso
Programao em C
Displays de LED de 7
segmentos
Por
Henrique Puhlmann
06/10/2014
Figur
a 1: Display de 7 segmentos com detalhes internos e
simulao de operao
Note que os segmentos so identificados por letras de "a" a
"g" e o ponto decimal como "dp". A organizao interna
dos displays de 7 segmentos pode ser na forma de catodo
comum, ou anodo comum, conforme ilustrado na Figura 1.
Essa arquitetura facilita o projeto dos circuitos de
acionamento desses displays. Os detalhes desses circuitos
sero mostrados mais adiante. Para formar um dgito
necessrio acender os segmentos correspondentes. Veja as
sequncias listadas a seguir para a formao dos nmeros e
caracteres mais comuns:
0 (Zero) - a, b, c, d, e, f
1 (Um) - b, c
2 (dois) - a, b, d, e, g
3 (trs) - a, b, c, d, g
4 (quatro) - b, c, f, g
5 (cinco) - a, c, d, f, g
6 (seis) - a, c, d, e, f, g
7 (sete) - a, b, c
8 (oito) - a, b, c, d, e, f, g (todos)
9 (nove) - a, b, c, f, g
A (maisculo) - a, b, c, e, f, g
B (minsculo) - c, d, e, f, g
C (maisculo) - a, d, e, f
D (minsculo) - b, c, d, e, g
E (maisculo) - a, d, e, f, g
F (maisculo) - a, e, f, g
Se voc observar a simulao de operao de um display de 7
segmentos, como mostrado na Figura 1, poder perceber
que as letras formadas nesse tipo de display deixam muito a
desejar. Para melhorar isso, foram criados os displays de 16
segmentos ou alfanumricos, que j permitem representar de
forma razoavelmente boa todas as letras do alfabeto.
Os displays alfanumricos sero apresentados
resumidamente no final.
Displays alfanumricos
Referncias
[1] Datasheet do componente TI ULN2003
Material necessrio:
1 Arduino
1 Display de Led de 7 Segmentos Catodo ou Anodo Comum (1 dgito)*
1 Resistor de 220 ohms (vermelho, vermelho, marrom)ou 330 ohms (laranja, laranja, marrom)*
1 Protoboard*
Jumper cable
Os displays de led de sete segmentos so bastante comuns e muitos utilizados para exibir,
principalmente, informaes numricas
Pino 3 (Gnd, se catodo comum ou Vcc se anodo comum) do display ligado ao resistor de 220
ohms;
Resistor de 220 ohms ligado ao Gnd (se catodo comum) ou Vcc (se anodo comum) do Arduino;
Passo 3: Programa 1
int SEG_A = 2;
int SEG_B = 3;
int SEG_C = 4;
int SEG_D = 5;
int SEG_E = 6;
int SEG_F = 7;
int SEG_G = 8;
int PONTO = 9;
int ATRASO = 150;
void setup() {
for (int pino = SEG_A; pino <= SEG_G; pino++) {
pinMode(pino, OUTPUT);
}
}
void loop() {
for (int pino = SEG_A; pino < SEG_G; pino++) {
digitalWrite(pino, HIGH);
if (pino > SEG_A)
digitalWrite(pino - 1, LOW);
else
digitalWrite(SEG_F, LOW);
delay(ATRASO);
}
}
Passo 4: Programa 2
// Declarao da matriz para uso em displays com catodo comum, para utilizar em
displays com anodo comum basta inverter o valor dos bytes.
byte digitos[10][7] = {
{ 1,1,1,1,1,1,0 }, // = 0
{ 0,1,1,0,0,0,0 }, // = 1
{ 1,1,0,1,1,0,1 }, // = 2
{ 1,1,1,1,0,0,1 }, // = 3
{ 0,1,1,0,0,1,1 }, // = 4
{ 1,0,1,1,0,1,1 }, // = 5
{ 1,0,1,1,1,1,1 }, // = 6
{ 1,1,1,0,0,0,0 }, // = 7
{ 1,1,1,1,1,1,1 }, // = 8
{ 1,1,1,0,0,1,1 } // = 9
};
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pontoDecimal(false);
}
void pontoDecimal(boolean ponto) {
digitalWrite(9, ponto);
}
void escrever(int digito) {
int pino = 2;
for (int segmento = 0; segmento < 7; segmento++) {
digitalWrite(pino, digitos[digito][segmento]);
pino++;
}
pontoDecimal(false);
}
void limpar() {
byte pino = 2;
for (int segmento = 0; segmento < 7; segmento++) {
digitalWrite(pino, LOW);
pino++;
}
}
void loop() {
for (int cont = 9; cont >= 0; cont--) {
escrever(cont);
boolean ponto = true;
for (int i = 0; i < 4; i++) {
delay(250);
pontoDecimal(ponto);
ponto = !ponto;
}
}
limpar();
delay(1000);
}
Passo 5: Uso de displays com mltiplos dgitos
Voc j deve ter observado que quando precisamos utilizar displays de leds que apresentam mais
do que um dgito, os portas disponveis no Arduino no sero suficientes ou mesmo que
sejam suficientes, no permitiro colocar novas funcionalidades ao seu projeto como, por
exemplo, um sensor
de temperatura ou um mdulo de relgio em tempo real (RTC).
Desta maneira, para otimizar o uso das portas do Arduino devemos utilizar um driver para displays
de led sendo, o mais popular, o Maxim 7219 ou 7221, cuja pinagem pode ser observada a seguir.
Passo 7: Programa 3
// Este sketch exibe o nmero 1234 em um display de led de 7 segmentos com 4 dgitos
// Utilizar a biblioteca LedControl
#include "LedControl.h"
/*
* Criar um LedControl (lc).
* O pino 11 do Arduino deve ser conectado ao pino DATA IN do primeiro MAX7219/21
* O pino 10 do Arduino deve ser conectado ao pino CLK do primeiro MAX7219/21
* O pino 9 do Arduino deve ser conectado ao pino LOAD (/CS) do primeiro MAX7219/21
Passo 8: Programa 4
/*
* Este sketch exibe os nmeros inteiros entre -999 e 999 em um display de led de
* 7 segmentos com 4 dgitos
*/
// Utilizar a biblioteca LedControl
#include "LedControl.h"
/*
* Criar um LedControl (lc).
* O pino 11 do Arduino deve ser conectado ao pino DATA IN do primeiro MAX7219/21
* O pino 10 do Arduino deve ser conectado ao pino CLK do primeiro MAX7219/21
* O pino 9 do Arduino deve ser conectado ao pino LOAD (/CS) do primeiro MAX7219/21
* O quarto parmetro indica que h apenas um MAX7219/21 conectado ao Arduino
*/
LedControl lc = LedControl(11, 10, 9, 1);
int i = -999;
void setup()
{ // Retira o MAX7219/21 do modo de economia de energia
lc.shutdown(0, false);
// Define a intensidade do brilho dos leds
lc.setIntensity(0, 2);
lc.clearDisplay(0);
}
void loop()
{ exibirInteiro(i++);
}
void exibirInteiro(int valor)
{
int unidade;
int dezena;
int centena;
boolean negativo = false;
if(valor < -999 || valor > 999)
return;
if(valor < 0)
{
negativo = true;
valor = valor * (-1);
}
unidade = valor % 10;
valor = valor / 10;
dezena = valor % 10;
valor =valor / 10;
centena = valor;
if (negativo)
{ // Imprime o sinal de negativo no display que est mais a esquerda
lc.setChar(0, 1, '-', false);
}
else
{ // Imprime um espao no lugar do sinal de negativo
lc.setChar(0, 1 , ' ', false);
}
// Exibo o nmero dgito a dgito
lc.setDigit(0, 2, (byte)centena, false);
lc.setDigit(0, 3, (byte)dezena, false);
lc.setDigit(0, 4, (byte)unidade, false);
delay(100);
}
Introduo
Computador
Programa de Computador
Linguagem de Programao
Ns seres humanos precisamos converter as nossas idias para uma forma que
os computadores consigam processar, ou seja, a linguagem de mquina. Os
computadores de hoje (ainda) no conseguem entender a linguagem natural que
ns usamos no dia a dia, ento precisamos de um outro "idioma" especial para
instruir o computador a fazer as tarefas que desejamos. Esse "idioma" uma
linguagem de programao, e na verdade existem muitas delas.
Algoritmo (Programa)
void setup() {
pinMode(led, OUTPUT);
void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
Varivel
int led;
Nesse caso estamos declarando uma varivel do tipo int chamada led . Em
seguida ns falaremos mais sobre o tipo de dado de uma varivel.
Tipo de Dado
O tipo de dado de uma varivel significa, como o prprio nome diz, o tipo de
informao que se pode armazenar naquela varivel. Em muitas linguagens de
programao, como C++, obrigatrio definir o tipo de dado no momento da
declarao da varivel, como vimos na declarao da varivel led acima. No caso
dos mdulos Arduino que usam processador ATmega, os tipos mais comuns de
dados que utilizamos so:
char : um caractere
Para conhecer todos os tipos de dado suportados pelo Arduino, veja a seo "Data
Types" nessa pgina.
Atribuio
Atribuir um valor a uma varivel significa armazenar o valor nela para usar
posteriormente. O comando de atribuio em C++ o = . Para atriburmos o
valor 13 varivel led que criamos acima, fazemos assim:
led = 13;
O objetivo dessa linha de cdigo dizer que o pino 13 do Arduino ser utilizado
para acender o LED, e armazenar essa informao para usar depois ao longo do
programa.
Operador
x = 2 + 3;
Operadores aritmticos:
o + : adio ("mais")
o - : subtrao ("menos")
o * : multiplicao ("vezes")
Operadores lgicos:
o || : disjuno ("ou")
o ! : negao ("no")
Operadores de atribuio:
Funo
Uma funo , em linhas gerais, uma sequncia de comandos que pode ser
reutilizada vrias vezes ao longo de um programa. Para criar uma funo e dizer o
que ela faz, ns precisamos fazer uma declarao de funo. Veja como uma
funo declarada no nosso programa de exemplo:
void setup() {
pinMode(led, OUTPUT);
Aqui estamos declarando uma funo com o nome setup() . O que ela faz
executar os comandos de uma outra funo pinMode() . A ao de executar os
comandos de funo previamente declarada denominada chamada de funo.
Ns no precisamos declarar a funo pinMode() porque ela j declarada
automaticamente no caso do Arduino.
Chamada de Funo
Chamar uma funo significa executar os comandos que foram definidos na sua
declarao. Uma vez declarada, uma funo pode ser chamada vrias vezes no
mesmo programa para que seus comandos sejam executados novamente. Para
chamarmos a nossa funo setup() , por exemplo, ns usaramos o seguinte
comando:
setup();
Valor de Retorno
A palavra chave que vem antes do nome da funo na declarao define o tipo
do valor de retorno da funo. Toda vez que uma funo chamada, ela
executada e devolve ou retorna um determinado valor - esse o valor de retorno,
ou simplesmente retorno da funo. O valor de retorno precisa ter um tipo, que
pode ser qualquer um dos tipos de dados citados anteriormente. No caso da nossa
funo setup() , o tipo de retorno void , o que significa que a funo no retorna
nada.
Para exemplificar, vamos criar uma funo que retorna alguma coisa, por exemplo
um nmero inteiro. Para retornar um valor, ns utilizamos o comando return :
int f() {
return 1;
Quando chamada, a funo f() acima retorna sempre o valor 1 . Voc pode usar
o valor de retorno de uma funo para atribu-lo a uma varivel. Por exemplo:
x = f();
Parmetros
Um outro recurso importante de uma funo so os parmetros. Eles servem para
enviar algum dado para a funo quando ela chamada. Vamos criar por exemplo
uma funo que soma dois nmeros:
return a + b;
Aqui acabamos definir uma funo chamada soma() , que aceita dois nmeros
inteiros como parmetros. Ns precisamos dar um nome para esses parmetros, e
nesse caso escolhemos a e b . Esses parmetros funcionam como varivel que
voc pode usar dentro da funo. Sempre que chamarmos a funo soma() ,
precisamos fornecer esses dois nmeros. O comando return a +
b; simplesmente retorna a funo com a soma dos dois nmeros. Vamos ento
somar 2 + 3 e atribuir o resultado para uma varivel x :
x = soma(2, 3);
Comentrios
Um comentrio um trecho de texto no seu programa que serve apenas para
explicar (documentar) o cdigo, sem executar nenhum tipo de comando no
programa. Muitas vezes, os comentrios so usados tambm para desabilitar
comandos no cdigo. Nesse caso, dizemos que o cdigo foi comentado.
/*
*/
/*
*/
/*
*/
void setup() {
/*
*/
void loop() {
Estruturas de Controle
While
O while uma estrutura que executa um conjunto de comandos repetidas vezes
enquanto uma determinada condio for verdadeira. While em ingls quer dizer
"enquanto", e pronuncia-se "ui-ou". Ele segue o seguinte formato:
while(condio) {
...
Vamos ento fazer uma modificao no nosso programa para exemplificar melhor
como o while funciona. O nosso objetivo agora fazer o LED piscar trs vezes,
depois esperar cinco segundos, piscar mais trs vezes e assim por diante. Ns
vamos mudar o contedo da funo loop() para o seguinte:
int i = 0;
while(i < 3) {
digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do
LED, acendendo-o
Primeiro ns declaramos uma varivel i . Essa varivel vai contar quantas vezes o
LED j piscou desde o incio do programa ou desde a ltima pausa de cinco
segundos. Ns vamos inicializar essa varivel com zero porque no incio da
funo loop() o LED ainda no piscou nenhuma vez sob essas condies.
Aps esses passos, chegamos ao final da funo loop() , e como j sabemos, ela
chamada novamente pelo sistema do Arduino. Isso reinicia o ciclo, executando
os passos acima indefinidamente.
For
Agora que ns j aprendemos o comando while, fica muito fcil aprender o
comando for, pois ele quase a mesma coisa. Vamos modificar o contedo da
funo loop() como fizemos acima, porm usando o for no lugar do while :
// Varivel para contar o nmero de vezes que o LED piscou
int i;
A primeira modificao que fizemos foi declarar a varivel i sem inicializ-la com
o valor 0 . Ns podemos fazer isso porque o comando for far isso para a gente.
Ele segue o seguinte formato:
...
Podemos ento verificar que o for nada mais do que um while acrescido de
um comando de inicializao e um comando de finalizao. Para o nosso
programa de teste, esses comandos so, respectivamente:
If
O if uma das estruturas mais bsicas de programao em geral. If significa "se"
em ingls, e exatamente isso que ele faz: ele verifica uma expresso e,
apenas se ela for verdadeira, executa um conjunto de comandos. Em linguagem
natural, ele executa uma lgica do tipo: "se isso for verdadeiro, ento faa aquilo"
Para ilustrar, vamos modificar o nosso programa de exemplo para que ele faa a
mesma coisa que fizemos com o while e o for acima, porm vamos fazer isso
usando um if , que segue o seguinte formato:
if(condio) {
...
int i = 0;
void loop() {
if(i == 3) {
If-Else
O if-else, tambm conhecido como if-then-else, pode ser visto como uma
extenso do comando if . Else em ingls significa "caso contrrio", e ele faz
exatamente o que o nome diz: "se isso for verdadeiro, ento faa aquilo, caso
contrrio, faa outra coisa". Ele segue o seguinte formato:
if(condio) {
...
} else {
...
Para exemplificar, vamos usar o programa do for que mostramos acima, mas
vamos dessa vez fazer o LED acender e apagar quatro vezes antes de dar uma
pausa de cinco segundos. Depois vamos fazer com que na terceira de cada uma
dessas quatro "piscadas", o LED acenda por um perodo mais curto. Dentro da
funo loop() , teremos o seguinte:
int i;
if(i == 2) {
} else {
Aqui o que fazemos , toda vez que vamos acender o LED, verificar se a terceira
vez que isso acontece, por meio do comando if com a condio i == 2 . Se essa
expresso for verdadeira, isso quer dizer que j acendemos o LED duas vezes e
estamos prestes a acend-lo pela terceira vez; nesse caso mudamos o tempo que
o LED fica acaso para um valor menor, de 0,2 segundo (uma reduo de 0,8
segundo) e o tempo que ele fica apagado para um valor maior, de 1,8 segundos
(aumento de 0,8 segundo).
Mas e se essa no for a terceira vez que o LED est sendo acionado? a que
entra o else : se a condio do if for verdadeira, o bloco de comandos
entre { e } logo aps o if executado, caso contrrio, o bloco
entre { e } aps o else executado. Isso quer dizer que para a primeira,
segunda e quarta "piscadas" ser usado o tempo padro de um segundo.
Bibliotecas
#include <LiquidCrystal.h>
lcd.begin(16, 2);
Feitos esses passos, j podemos escrever texto no LCD. Fazemos isso usando o
mtodo print() do objeto lcd , sempre que precisarmos ao longo do programa:
lcd.print("Oi!");
Concluso