o ( } u µ ] v }

126
1

Transcript of o ( } u µ ] v }

Page 1: o ( } u µ ] v }

1

Page 2: o ( } u µ ] v }

plataforma arduino

• microcontrolador Atmel

• programação usando Wiring (subconjunto de processing, baseado em C/C++)

• open-source: evolução da plataforma através de contribuições dos usuários

2

Page 3: o ( } u µ ] v }

Plataforma eletrônica Arduino

• O Arduino não é um microcontrolador e sim uma plataforma eletrônica que possui uma série de dispositivos eletrônicos agregados a um microcontrolador em uma placa de circuito integrado.

• A placa foi adaptada para conectar-se facilmente com outros dispositivos, pois possui a descrição bem detalhada de suas portas de entrada e saída bem como o acesso facilitado para sua comunicação com outros dispositivos e até mesmo a placas de expansão que também são confeccionadas para adaptar-se à placa principal.

3

Page 4: o ( } u µ ] v }

Plataforma eletrônica Arduino• Embora o Arduino seja uma plataforma que pode ser desenvolvida

com base em qualquer microcontrolador, o modelo mais utilizado nas versões comerciais é o ATMEL.

4

Page 5: o ( } u µ ] v }

Desenvolvido por: Massimo Banzi, David Cuartielles, Tom Igoe, Gianluca Martino e David Mellis, na Itália, em 2005.

Site oficial: www.arduino.cc

5

Page 6: o ( } u µ ] v }

Arduino é Open Source!• Todo o hardware é aberto e os projetos estão disponíveis;• O software de programação também é livre e está disponível para download gratuitamente;• Quem quiser, pode comprar os componentes e montar a sua placa!

6

Page 7: o ( } u µ ] v }

7

Page 8: o ( } u µ ] v }

8

Page 9: o ( } u µ ] v }

9

Page 10: o ( } u µ ] v }

plataforma arduino - hardware

Duemilanovemini

lilypad

boarduino

paperduino megapro

10

Page 11: o ( } u µ ] v }

11

Page 12: o ( } u µ ] v }

12

Page 13: o ( } u µ ] v }

plataforma arduino - hardware

• Os microchips utilizados nas placas Arduino são: ATMEGA8, ATMEGA168, ATMEGA328, ATMEGA1280 e ATMEGA2560. Cada qual possui peculiaridades, como disposição dos pinos, mas a programação é a mesma e vale para qualquer um deles.

• No Arduino ainda é utilizado um cristal ressonador de 16 MHz como gerador do sinal de "clock" externo dos microcontroladores. Isto possibilita que o microcontrolador execute cerca de 16 milhões de instruções por segundo.

13

Page 14: o ( } u µ ] v }

14

Page 15: o ( } u µ ] v }

Alguns conceitos básicos sobre as características destes microcontroladores são:• Portas de I/O são as portas de entrada e saída de dados, analógicos

ou digitais, e que servem para comunicar externamente o microcontrolador e hardware.

• A memória flash delimita o tamanho máximo do programa que será executado pelo Arduino. O bootloader do Arduino ainda utiliza uma pequena parcela desta memória.

15

Page 16: o ( } u µ ] v }

Alguns conceitos básicos sobre as características destes microcontroladores são:• A memória EEPROM é uma memória utilizada para armazenar dados,

os quais só serão excluídos quando o programa sobrescrevê-los.• A memória SRAM é uma memória utilizada para armazenar dados

temporários.• Canais A/D são canais que convertem dados analógicos em digitais.

No ATMEGA a conversão A/D tem precisão de 10 bits.• UART é um periférico responsável pela comunicação serial entre o

microcontrolador e o mundo externo, como por exemplo a comunicação serial entre Arduino e PC.

16

Page 17: o ( } u µ ] v }

plataforma arduino - instalação

• driver windows: FTDI Serial USBlinux: não precisa instalar nada :-)

• software é só descompactar e executar

17

Page 18: o ( } u µ ] v }

18

Page 19: o ( } u µ ] v }

Instalação da IDE no WindowsApos baixar os arquivos necessários do Windows pelo site, extraia-os para o local desejado e execute o programa do Arduino, localizado na raiz da pasta principal. Em seguida: Conecte o Arduino ao computador usando o cabo USB. A luz com nome PWR

(Power) deve acender, indicando que a placa esta ligada. Deve-se ser solicitado que um novo driver seja instalado. Para isso, recuse que o

Windows procure os drivers automaticamente na internet e, na seleçãao manual, peca para que sejam procurados os drivers na pasta do Arduino que extraistes no primeiro passo.

Caso não seja acionada a deteção automática de driver, vá ao Painel de Controle, abra o Gerenciador de Dispositivos e procure por drivers desatualizados. Selecione a atualização manual do driver e indique a pasta mencionada no passo anterior.

Após isso, a instalação deve estar concluída.

19

Page 20: o ( } u µ ] v }

O IDE do Arduino e bastante simples.

Foi projetado para ser uma interface

amigavel a

pessoas que nunca tiveram contato

com desenvolvimento de software, e

portanto e bastante intuitiva. Foi

desenvolvido em Java e possui

recursos simples de realce de

palavras-chave e uma base com

diversos códigos prontos para servir

como exemplo.

20

Page 21: o ( } u µ ] v }

plataforma arduino - instalação

• Selecionando a placa e a porta serial

21

Page 22: o ( } u µ ] v }

menu Boards

22

Page 23: o ( } u µ ] v }

23

Page 24: o ( } u µ ] v }

plataforma arduino – ambiente

área de código

área de status

parar execução

novo

abrir

salvar

exibir serial

24

Page 25: o ( } u µ ] v }

25

Page 26: o ( } u µ ] v }

plataforma arduino – estrutura do sketch

26

Page 27: o ( } u µ ] v }

Sketches

• Softwares escritos usando Arduino são chamados de Sketches. Estes Sketches são escritos no editor de texto da IDE do Arduino e são salvos com a extensão de arquivo .ino.

• Este editor tem características de cortar/colar e para buscar/substituir texto.

• A área de mensagem dá feedback ao salvar e exportar arquivos e também exibe informações de erros ao compilar Sketches.

• O canto direito inferior da janela exibe a placa atual e a porta serial. Os botões da barra de ferramentas permitem que você verifique, carregue, crie, abra e salve Sketches ou abra o monitor serial.

27

Page 28: o ( } u µ ] v }

Sketches

Nota: • Nas versões do IDE antes de 1.0 os Sketches são salvos com a

extensão .pde. • É possível abrir esses arquivos com a versão 1.0, mas você será

solicitado a salvar o Sketch com a extensão .ino.

28

Page 29: o ( } u µ ] v }

plataforma arduino – linguagem

• linguagem baseada em C (mas bem mais fácil)

• comandos básicos

• pinMode() – define um pino com entrada ou saída

• digitalWrite() – liga ou desliga uma saída digital

• delay() – “espera” um determinado tempo

29

Page 30: o ( } u µ ] v }

Portas digitais e analógicas Na prática ligamos componentes em portas digitais e analógicas e através do código Arduino, manipulamos as portas:

–pinMode(<porta>, <modo>): configura uma porta digital para ser lida ou para enviarmos dados;

–digitalWrite(<porta>, 0 ou 1): envia 0 ou 1 para porta digital

–digitalRead(<porta>): retorna um 0 ou 1 lido da porta

–analogRead(<porta>): retorna de 0 a 1023 com o valor da porta analógica

–analogWrite(<porta>, <valor>): escreve em uma porta PWM um valor de 0 a 255

30

Page 31: o ( } u µ ] v }

plataforma arduino – linguagem

• Exemplos

• pinMode(num_do_pino, OUTPUT);

• digitalWrite(num_do_pino, valor); valor é LOW ou HIGH (0 ou 1, 0V ou 5V)

• delay(milisegundos);

31

Page 32: o ( } u µ ] v }

plataforma arduino – linguagem

• constantes

LOW | HIGH – indica nível baixo (0V) e alto (5V) nos pinos

INPUT | OUTPUT – define se um pino vai ser pino de entrada ou de saída

32

Page 33: o ( } u µ ] v }

33

Page 34: o ( } u µ ] v }

34

Page 35: o ( } u µ ] v }

Questões – Arduino 11. O que é o Arduino?2. Descreve o hardware utilizado em uma placa arduino.3. Fale sobre a placa arduino mega.4. Quais são os pinos de energia da placa arduno?5. Fale sobre a programação do arduno.6. Quais são os tipos de arduino disponível?7. Defina open-source.8. Explique os comandos:

• Digital:• pinMode()• digitalRead()• digitalWrite()• Analógico:• delay()• anologWrite()

9. O que são os Shields para arduino?

35

Page 36: o ( } u µ ] v }

Na Linguagem C, letras maiúsculas, minúsculas e conjuntos

de palavras fazem a diferença. Ou seja, se você for escrever

algo como, por exemplo, “ledPin”, não será a mesma coisa

que “LedPin”.

O programa precisa identificar qual é o fim de uma linha de

programação para poder seguir rodando o programa, para

isso, é necessário ao final de cada linha onde possa ser

identificado um comando, o uso de ; (ponto e vírgula).

36

Page 37: o ( } u µ ] v }

prática

• fazer o programa hello arduino, que pisca um led

• use o pino 13 de saída digital, a placa já possuium led ligado a ele :-)

37

Page 38: o ( } u µ ] v }

FerramentasPlacaArduino Duemilanove

38

Page 39: o ( } u µ ] v }

SELECIONAR PORTA

ERRO

COM1 COM2

39

Page 40: o ( } u µ ] v }

int led = 13;

void setup() { pinMode(led, OUTPUT);

}

void loop() {

digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000);

}

40

Page 41: o ( } u µ ] v }

CLICARCARREGAR

41

Page 42: o ( } u µ ] v }

Matriz de contatos (Protoboard)

42

Page 43: o ( } u µ ] v }

LED (Light Emitting Diode)

• LED’s são dispositivos eletrônicos que emitem luz pela passagem de uma pequena corrente elétrica. Por isso, é necessário conectar um resistor ao LED para evitar sobrecorrente. Um LED só permite passagem de luz em um sentido. Portanto, é necessário identificar os pólos para conectar o LED corretamente dentro do circuito eletrônico.

43

Page 44: o ( } u µ ] v }

01 - LED PiscanteNeste projeto, você aprenderá a criar um circuito simples usando um LED e um resistor e o fará

piscar.

O que você vai precisar:

01 placa Arduino

02 cabos jumpers

01 resistor 220 Ω

01 LED

44

Page 45: o ( } u µ ] v }

01 - LED PiscanteMontagem

45

Page 46: o ( } u µ ] v }

01 LED PiscanteProgramação

int led = 10; // define a porta em que o LED está conectado

void setup(){

pinMode (led, OUTPUT); // define o LED como atuador}

void loop(){

digitalWrite (led, HIGH); // liga o LEDdelay (1000); // espera por 1000 milisegundosdigitalWrite (led, LOW); // desliga o LEDdelay (1000); // espera por 1000 milisegundos

}

46

Page 47: o ( } u µ ] v }

Alterando o código1 – Altere o intervalo de ligar e desligar o LED para um valor definido por você. 2 – Altere o valor do delay para 50 milisegundos. O LED estará desligando e acendendo?

47

Page 48: o ( } u µ ] v }

EXERCÍCIO:

Faça um circuito onde três LEDs acendam em sequência, com um atraso de um segundo entre eles, e depois apaguem igualmente em sequência.

48

Page 49: o ( } u µ ] v }

int led1 = 10; int led2 = 11;int led3 = 12;

void setup(){

pinMode (led1, OUTPUT); // define o LED como atuadorpinMode (led2, OUTPUT);pinMode (led3, OUTPUT);

}

void loop(){

digitalWrite (led1, HIGH); delay (1000); digitalWrite (led2, HIGH); delay (1000); digitalWrite (led3, HIGH); delay (1000); digitalWrite (led1, LOW); delay (1000);digitalWrite (led2, LOW); delay (1000);digitalWrite (led3, LOW); delay (1000);

}49

Page 50: o ( } u µ ] v }

Usando um LED vermelho, um amarelo e um verde, crie um semáforo de trânsito ou seja, o LED verde deve ficarligado por um determinado intervalo de tempo, seguido pelo amarelo, depois o vermelho, voltando para o verde.

50

Page 51: o ( } u µ ] v }

int ledDelay = 10000; int vermelho = 10;int amarelo = 9;int verde = 8;void setup(){

pinMode (vermelho, OUTPUT);pinMode (amarelo, OUTPUT);pinMode (verde, OUTPUT);

}

void loop(){

digitalWrite (vermelho, HIGH); delay (ledDelay);digitalWrite (verde, HIGH); digitalWrite (vermelho, LOW);digitalWrite (amarelo, LOW);delay (ledDelay); digitalWrite (amarelo, HIGH); digitalWrite (verde, HIGH; delay (2000); digitalWrite(verde,LOW);digitalWrite(amarelo, HIGH);delay(500);digitalWrite (amarelo, LOW);delay(200);

}

51

Page 52: o ( } u µ ] v }

Comunicação Serial

• Se quisermos, por exemplo, controlar algum componente do Arduino através do computador? E para isso que servem as portas de comunicação serial. Utilizando a comunicação USB (Universal Serial Bus) que usamos normalmente para fazer o upload de dados do Arduino, podemos enviar sinais e comandos para alterar o seu estado.

•Antes de mais nada, precisamos iniciar a comunicação informando a velocidade da transferência de dados. Depois, poderemos enviar e receber dados do Arduino e visualizá-los através do monitor serial:

52

Page 53: o ( } u µ ] v }

Comunicação Serial• Serial.begin(velocidade)Esta função diz ao Arduino que iremos iniciar a interface serial, utilizando o parâmetrovelocidade como taxa de transferência. Por padrão, normalmente utiliza-se 9600 como taxa.• Serial.print(”Mensagem”)Exibe uma mensagem no monitor serial. Podemos informar qual a leitura que um sensor está recebendo do ambiente, por exemplo, ou apenas informar alguma mensagem qualquer.• Serial.available()Retorna o número de bytes sendo lidos pela porta serial. No caso de não haver nenhuma valor, retorna zero. Utilizamos esta função para o Arduinosaber quando enviamos ou recebemos algum dado - um botão que pressionamos, por exemplo.• Serial.read()Esta função lê os dados que digitamos pelo teclado e os envia ao Arduino. E nosso principal meio de comunicação!

53

Page 54: o ( } u µ ] v }

void setup(){Serial.begin(9600);

}

int i = 0;void loop()

{Serial.print("Olaaaa - ");Serial.println(i);i++;delay(1000);

}

Comunicação Serial

54

Page 55: o ( } u µ ] v }

Prática• Desenvolver um programa para apagar e acender um LED usando um

comando no teclado. • Para isso, verificamos se há alguma informação a ser lida, ou seja, se

algum comando foi enviado do computador ao Arduino. Se sim, guardamos esta informação e a processamos de acordo com o que queremos. Em nosso caso, vamos acender o led no pino 13 caso enviarmos o caractere ‘L’ ao Arduino.

55

Page 56: o ( } u µ ] v }

const int led=13;void setup() {

pinMode(led,OUTPUT);Serial.begin(9600);

}void loop() {

if(Serial.available()){int liga = Serial.read();if(liga == 'L'){

digitalWrite(led, HIGH);delay(2000);

}else{

digitalWrite(led, LOW);delay(2000);

}}

} 56

Page 57: o ( } u µ ] v }

Prática

• Acender e apagar três leds ligados nas portas: 10 (led vermelho), 9 (led amarelo) e 8(led verde). Utilizar o monitor serial.

57

Page 58: o ( } u µ ] v }

int vermelho = 10;

int amarelo = 9;

int verde = 8;

char led;

void setup()

{

pinMode(vermelho,OUTPUT);

pinMode(verde,OUTPUT);

pinMode(amarelo,OUTPUT);

Serial.begin(9600);

}

void loop(){if(Serial.available()){led = Serial.read();

if(led =='V'){digitalWrite(vermelho,HIGH);

}else{if(led==‘D'){digitalWrite(verde,HIGH);

}else if(led==‘M'){digitalWrite(amarelo,HIGH);

}}

if(led =='v'){digitalWrite(vermelho,LOW);

}else{if(led=='d'){digitalWrite(verde,LOW);

}else if(led=='m'){digitalWrite(amarelo,LOW);

}}

}}

58

Page 59: o ( } u µ ] v }

const int BOT = 12; void setup()

{ pinMode (BOT , INPUT ); Serial.begin(9600);

} void loop()

{ int Leitura = digitalRead(BOT); Serial.print("Estado do Botão = "); Serial.println(Leitura,DEC); delay(150);

}

EXERCÍCIO:

Faca um circuito onde utilize um botão, esse botão deverá ser monitorado pela comunicação serial.

59

Page 60: o ( } u µ ] v }

Neste projeto, o brilho de um LED irá variar de acordo com uma onda senoidal, a partir do controle de uma porta de saída de pulso modulado (PWM).

O que você vai precisar01 Arduino01 placa protoboard01 LED01 resistor de 220 Ω02 cabos jumpers

02 - Um LED pulsante

60

Page 61: o ( } u µ ] v }

int ledPin = 10;float sinVal;int ledVal;

void setup(){pinMode (ledPin, OUTPUT);

}void loop()

{for (int x=0; x<180; x++){

sinVal = (sin(x*(3.1415/180))); // convertegrausa radianos e obtém o valor do seno

ledVal = int(sinVal*255);analogWrite (ledPin, ledVal); // define a saída PWMdelay(25);

}}

61

Page 62: o ( } u µ ] v }

1. Usando um LED vermelho, um amarelo e um verde, crie um semáforo de trânsito ou seja, o LED verde deve ficar ligado por um determinado intervalo de tempo, seguidopelo amarelo, depois o vermelho, voltando para o verde.

3. Crie um LED inteligente: ou seja, utilizando um sensor de luminosidade, faca-o ligarse o ambiente estiver escuro demais.

4. Projete o protótipo de uma fechadura com senha - ou seja, a porta so abre se a senhadigitada for correta. Para facilitar, utilize um LED vermelho para representar a portafechada e um LED verde para representar que a senha digitada foi aceita.

5. Melhore seu protótipo adicionando um atuador sonoro, que avisa caso a senha estejaerrada, caso ela esteja certa e denuncie caso alguém erre a senha mais de três vezes.Utilize sons diferentes para cada caso.

6. Utilizando um potenciômetro, crie um ajustador de volume para um buzzer. Emoutras palavras, aumenta ou diminua a intensidade do som do buzzer através dopotenciômetro.

62

Page 63: o ( } u µ ] v }

O que você vai precisar saber:

• Sinais de comparação== (semelhante a)!= (diferente de)< (menor que)> (maior que)<= (menor ou igual a)>= (maior ou igual a)

63

Page 64: o ( } u µ ] v }

03 Projeto com led e button

• Liga e desliga um LED conectado ao pino digital 13 quando pressionado um botão conectado ao pino 2.

• O Circuito:LED conectado ao pino 13 e ao terrabotão conectado ao pino 2 desde 5Vresistor de 10K conectado ao pino 2 desde o terra

64

Page 65: o ( } u µ ] v }

//BUTTON_LED

// constantes não são alteradas

// São usadas aqui para definir os números dos pinos:

const int buttonPin = 2;

const int ledPin = 13;

int buttonState = 0;

void setup()

{

pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT);

}

void loop()

{

// faz a leitura do valor do botão

buttonState = digitalRead(buttonPin);

if (buttonState == LOW) { // liga o LED

digitalWrite(ledPin, HIGH);

}

else { // desliga o LED

digitalWrite(ledPin, LOW);

}

}

65

Page 66: o ( } u µ ] v }

Acender e Apagar um LED utilizando apenas um botão

• Componentes:• Um led ligado no pino 13 e um botão ligado no pino 7

66

Page 67: o ( } u µ ] v }

const int led = 13;const int button = 7;int val = 0;int old_val =0 ;int state = 0;//botão NFvoid setup(){pinMode(led,OUTPUT);pinMode(button, INPUT);

}

void loop(){val = digitalRead(button);

if((val == LOW) && (old_val == HIGH)){

state = 1 - state;}

old_val = val;if(state == 1)

{digitalWrite(led,HIGH);

}else{

digitalWrite(led,LOW);}

}

67

Page 68: o ( } u µ ] v }

04 Leitura de um sinal analógico no computador

• Neste projeto, você deve construir um circuito que possibilite a leitura de um valor analógico (0 a 1023) fornecido por um potenciômetro, enviando-o através de uma comunicação serial no computador. A comunicação serial no computador é vista em uma tela à parte, que pode ser acessada pelo atalho Ctrl+Shift+M (Serial monitor).

O que você vai precisar:01 placa Arduino03 cabos jumpers01 potenciômetro

68

Page 69: o ( } u µ ] v }

void setup(){Serial.begin (9600);}void loop(){int sensorValue = analogRead (A0);Serial.println (sensorValue, DEC);delay (1000);}

• A linha intsensorValue = analogRead(A0); porta analógica 0 na variável sensorValue.

• Ao girar o potenciômetro, o novo valor do sinal analógico

69

Page 70: o ( } u µ ] v }

70

Page 71: o ( } u µ ] v }

Alterando a montagem

• Substitua o potenciômetro por um LDR (Light Dependent Resistor) e efetue medidas da luminosidade ambiente.

• A montagem deve ficar com o seguinte aspecto: LDR (Light Dependent Resistence)

Dispositivo eletrônico que apresenta como uma resistência variável, cujo valor depende da luzincidente. É necessário conectá-lo a um resistor para que possa atuar como sensor analógico.

71

Page 72: o ( } u µ ] v }

LDR• O LDR é um resistor sensível à luz que varia sua resistência conforme

é alterada a intensidade luminosa que incide sobre ele. À medida que a intensidade luminosa aumenta (o ambiente fica mais claro) a sua resistência diminui para algumas dezenas de Ohms, e quando a intensidade luminosa diminui (o ambiente fica mais escuro) a sua resistência aumenta para alguns mega Ohms.

• Através dessa característica pode-se utilizar esse sensor para detectar a luminosidade do ambiente, para tomar uma decisão como, por exemplo, ligar uma lâmpada, como ocorre nas fotocélulas.

• Ele é um sensor de baixo custo e está presente em muitos circuitos eletrônicos que necessitam monitorar a luz ambiente. O seu uso é bem simples, onde através de um circuito divisor resistivo a variação de resistência é convertida em tensão e usada pelo circuito de controle.

72

Page 73: o ( } u µ ] v }

LDR• Para fazer a leitura da variação de luminosidade, ou seja, a variação

de resistência do LDR, é necessário montar um divisor de tensão, conforme o esquema abaixo:

73

Page 74: o ( } u µ ] v }

LDR• Através do circuito apresentado pode-se calcular o valor da tensão de

saída para uma determinada resistência do LDR, através da seguinte fórmula:

• Por exemplo, em uma ambiente quase escuro o LDR apresenta resistência de aproximadamente 500 KOhm, e o valor de tensão de saída será:

74

Page 75: o ( } u µ ] v }

LDR• E em uma ambiente claro a resistência do LDR cai para

aproximadamente 300 Ohm. Assim, a tensão de saída será:

• Nota-se através dos cálculos que a tensão de saída do conversor aumenta quando a intensidade luminosa aumenta e diminui quando ambiente vai ficando escuro.

75

Page 76: o ( } u µ ] v }

int sensorPin = 0;int val;

void setup() {Serial.begin(9600);

}

void loop() {val = analogRead(sensorPin);Serial.println(val);delay(1000);

}

76

Page 77: o ( } u µ ] v }

O sketch a seguir fará com que a lâmpada acenda quando estiver escuro, e apague quando estiver claro:

int rele = 8;

int sensorpin = A0;

int val;

void setup()

{

Serial.begin(9600);

pinMode(rele,OUTPUT);

}

void loop() {

val = analogRead(sensorpin);

Serial.println(val);

if(val<400)

{

digitalWrite(rele,HIGH);

}

else

{

digitalWrite(rele,LOW);

}

delay(500);

} 77

Page 78: o ( } u µ ] v }

78

Page 79: o ( } u µ ] v }

Alterando a frequência com que o LED pisca

• Componentes: 1 Potênciometro, 1 LED

• Este projeto é muito simples e tratará da utilização do potenciômetro, que é um componente que possui resistência elétrica ajustável.

• A frequência com que o LED pisca vai dependerdiretamente do ajuste do potenciômetro.

79

Page 80: o ( } u µ ] v }

80

Page 81: o ( } u µ ] v }

int potPin = A0;int ledPin = 11;int val = 0;

void setup() {

pinMode(ledPin, OUTPUT);}

void loop() {

val = analogRead(potPin);digitalWrite(ledPin, HIGH);delay(val);digitalWrite(ledPin, LOW);delay(val);

}

81

Page 82: o ( } u µ ] v }

Pisca Piscacomando if

int ledPin = 11;

int delayPeriod = 100;

void setup()

{

pinMode(ledPin,OUTPUT);

}

void loop()

{

digitalWrite(ledPin, HIGH);

delay(delayPeriod);

digitalWrite(ledPin, LOW);

delay(delayPeriod);

delayPeriod = delayPeriod + 100;

if(delayPeriod > 3000)

{

delayPeriod = 100;

}

}82

Page 83: o ( } u µ ] v }

Pisca Piscacomando for

int ledPin = 11;

int delayPeriod = 100;

void setup()

{

pinMode(ledPin,OUTPUT);

}

void loop()

{

for(int i=0; i<20; i++)

{

digitalWrite(ledPin, HIGH);

delay(delayPeriod);

digitalWrite(ledPin, LOW);

delay(delayPeriod);

}

delay(3000);

}

83

Page 84: o ( } u µ ] v }

SOS em código Morse usando Arrays

int ledPin = 11;

int durac[]={200, 200, 200, 500, 500, 500, 200, 200, 200};

void setup()

{

pinMode(ledPin,OUTPUT);

}

void loop()

{

for(int i=0; i<9; i++)

{

flash(durac[i]);

}

delay(1000);

}

void flash(int delayPeriod)

{

digitalWrite(ledPin, HIGH);

delay(delayPeriod);

digitalWrite(ledPin, LOW);

delay(delayPeriod);

} 84

Page 85: o ( } u µ ] v }

Operadores booleanos

Estes operadores podem ser usados dentro da condição em uma sentença if.• && (“e” lógico)Verdadeiro apenas se os dois operandos forem verdadeiros, ou seja, a primeira condição e a segunda forem verdadeiras. Exemplo:if (digitalRead(2) == 1 && digitalRead(3) == 1) { // ler dois interruptores}• é verdadeiro apenas se os dois interruptores estiverem fechados.

85

Page 86: o ( } u µ ] v }

|| (“ou” lógico)• Verdadeiro se algum dos operandos for verdadeiro, ou seja, se a

primeira ou a segunda condição for verdadeira. Exemplo:if (x > 0 || y > 0) {// ...}

• é verdadeiro apenas se x ou y forem maiores que 0.! (negação)• Verdadeiro apenas se o operando for falso. Exemplo:

if (!x) {// ...}

• é verdadeiro apenas se x for falso (ou seja, se x for igual a 0).

86

Page 87: o ( } u µ ] v }

Exercício:

• Para evitar acidentes no ambiente de trabalho, uma regra de segurança em vários equipamentos industriais é obrigar que um usuário aperte dois botões, um com cada mão, para acionar uma máquina. É o caso da máquina de corte usada em fábricas de papel.

• O LED somente acende se os dois botões do circuito estiverem pressionados.

• Faça mais uma programação para que você possa acender o LED do pino 13 pressionando ou o botão 1 ou o botão 2 (reed switch). Ao deixar de pressionar, o LED se apaga.

87

Page 88: o ( } u µ ] v }

const int but2 = 2;

const int but3 = 3;

const int ledPin = 13;

void setup() {

pinMode(ledPin, OUTPUT);

pinMode(but2, INPUT);

pinMode(but3, INPUT);

}

void loop(){

if (digitalRead(but2) == 1 && digitalRead(but3) == 1)

{

digitalWrite(ledPin, HIGH);

}

else {

digitalWrite(ledPin, LOW);

}

}

88

Page 89: o ( } u µ ] v }

Reed Switch• É um interruptor elétrico ativado por um campo magnético, por

exemplo com um ímã. Quando os contatos estão abertos se fechamna presença de um campo magnético. Quando estão fechados seabrem.

• É comumente usado em sensores de portas e janelas de alarmes anti-roubo. O ímã vai preso à porta e o reed switch ao batente.

89

Page 90: o ( } u µ ] v }

LED RGB

• O led RGB é um tipo de led, com quatro terminais, capaz de emitir diversos tipos de cores diferentes. Suas cores básicas são vermelho, verde e azul.

• Desta forma é possível formar milhares de cores ajustando de maneira individual cada cor.

• Os três LED´s estão unidos por um negativo ou cátodo.

90

Page 91: o ( } u µ ] v }

91

Page 92: o ( } u µ ] v }

92

Page 93: o ( } u µ ] v }

93

Page 94: o ( } u µ ] v }

LED RGB

Os fios deverão ser conectados da seguinte forma no arduino:• fio azul no pino digital 8 do arduino;• fio verde no pino digital 9 do arduino;• fio vermelho no pino digital 10 do arduino;• e fio preto GND.

94

Page 95: o ( } u µ ] v }

const int ledAzul = 8; //pino digital 8.

const int ledVerde = 9; //pino digital 9.

const int ledVermelho = 10; // pino digital 10.

void setup() {

pinMode(ledAzul,OUTPUT);

pinMode(ledVerde,OUTPUT);

pinMode(ledVermelho,OUTPUT);

}

void loop() {

digitalWrite(ledAzul,HIGH);

delay(500);

digitalWrite(ledAzul,LOW);

digitalWrite(ledVerde,HIGH);

delay(500);

digitalWrite(ledVerde,LOW);

digitalWrite(ledVermelho,HIGH);

delay(500);

digitalWrite(ledVermelho,LOW);

//Misturando as cores do led para obter cores diferentes.

digitalWrite(ledAzul,HIGH);

digitalWrite(ledVerde,HIGH);

digitalWrite(ledVermelho,HIGH);

delay(1500);

digitalWrite(ledAzul,HIGH);

digitalWrite(ledVerde,HIGH);

digitalWrite(ledVermelho,LOW);

delay(1500);

digitalWrite(ledAzul,LOW);

digitalWrite(ledVerde,HIGH);

digitalWrite(ledVermelho,HIGH);

delay(1500);

digitalWrite(ledAzul,HIGH);

digitalWrite(ledVerde,LOW);

digitalWrite(ledVermelho,HIGH);

delay(1500);

} 95

Page 96: o ( } u µ ] v }

int redPin = 10; int greenPin = 9; int bluePin = 8; int potPin = A0; int tempo = 0;

void setup() {

Serial.begin(9600); pinMode(redPin, OUTPUT);pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT);

}

void loop () {

tempo = analogRead(potPin); analogWrite(redPin, random(10, 255)); analogWrite(greenPin, random(10, 255)); analogWrite(bluePin, random(10, 255));tempo = map(tempo, 0, 1023, 50, 3000 ); delay(random(50, 500));Serial.print(tempo); Serial.println(" milisegundos"); delay(tempo);

}

96

Page 97: o ( } u µ ] v }

const int vermelho = 10;

const int verde = 9;

const int azul = 8;

int cor = 0;

void setup() {

Serial.begin(9600);

pinMode(vermelho, OUTPUT);

pinMode(verde, OUTPUT);

pinMode(azul, OUTPUT);

}

void loop() {

analogWrite(vermelho, cor);

analogWrite(verde, cor);

analogWrite(azul, cor);

delay (400);

cor = cor + 10; // incrementar a intensidade da cor

if (cor > 255) {

cor = 0;

delay(10);

}

}

97

Page 98: o ( } u µ ] v }

const int azul = 8;

const int verde = 9;

const int vermelho = 10;

String cor;

void setup()

{

Serial.begin(9600);

pinMode(azul, OUTPUT);

pinMode(verde, OUTPUT);

pinMode(vermelho, OUTPUT);

}

//Funções responsáveis por executar o brilho selecionado

void vermelhoFuncao(){

digitalWrite(azul, LOW);

digitalWrite(verde, LOW);

digitalWrite(vermelho, HIGH);

}

void brancoFuncao(){

digitalWrite(azul, HIGH);

digitalWrite(verde, HIGH);

digitalWrite(vermelho, HIGH);

}

void loop()

{

if(Serial.available()){

cor = Serial.readString();

Serial.println(cor);

}

if(cor == "Vermelho"){

vermelhoFuncao();

}

if(cor == "Azul"){

azulFuncao();

}

if(cor == "Verde"){

verdeFuncao();

}

if(cor == "Amarelo"){

amareloFuncao();

}

if(cor == "Roxo"){

roxoFuncao();

}

if(cor == "Branco"){

brancoFuncao();

}

}

void azulFuncao(){

digitalWrite(azul, HIGH);

digitalWrite(verde, LOW);

digitalWrite(vermelho, LOW);

}

void verdeFuncao(){

digitalWrite(azul, LOW);

digitalWrite(verde, HIGH);

digitalWrite(vermelho, LOW);

}

void amareloFuncao(){

analogWrite(azul, 0);

analogWrite(verde, 50);

analogWrite(vermelho, 255);

}

void roxoFuncao(){

analogWrite(azul, 207);

analogWrite(verde, 0);

analogWrite(vermelho, 255);

} 98

Page 99: o ( } u µ ] v }

LM35

99

Page 100: o ( } u µ ] v }

Arduino+LM35

• O sensor LM35 é um sensor de precisão, fabricado pela NationalSemiconductor, que apresenta uma saída de tensão linear proporcional à temperatura a que se encontra, no nosso caso esta tensão varia entre 0V e 5V, pois o sensor é alimentado com 5V.

• O LM35 não necessita de qualquer calibração externa ou “trimming” para fornecer os dados com exactidão, porém para ser lido pelo Arduino necessita de conversão, pois o Arduino lê apenas valores inteiros entre 0 e 1023. Assim sabendo que este sensor tem uma resolução de 10mV por cada 1ºC poderemos deduzir uma expressão para a temperatura em função do valor lido.

100

Page 101: o ( } u µ ] v }

Arduino+LM35

• O sensor será alimentado pelo Arduino que fornece 5V, como as entradas analógicas têm uma resolução de 10 bits, ou seja, 2^10 = 1024 e cada grau corresponde a 10 mV então a expressão da temperatura em função do valor lido na entrada analógica do Arduino será:

temperatura = (valorlido * (5/1023))*100

temperatura = 0,0048875855*valorlido

101

Page 102: o ( } u µ ] v }

Arduino+LM35

• Todos os condutores quando sujeitos a corrente elétrica dissipam energia, sob várias formas, entre elas sob a forma de calor, assim para que seja fiável e as suas leituras sejam tão próximas do real quanto possível é necessário que a energia dissipada na forma de calor seja também a mais baixa possível.

• Este foi um dos pontos que tivemos em consideração na escolha do sensor de temperatura a utilizar. A escolha recaiu então no LM35, entre outros aspectos pelo seu baixo auto-aquecimento, pois este sensor apenas dissipa 60uA sob a forma de calor, ou seja, o aumento de temperatura que sofre devido à energia dissipada é de apenas 0.1ºC.

102

Page 103: o ( } u µ ] v }

Arduino+LM35

103

Page 104: o ( } u µ ] v }

104

Page 105: o ( } u µ ] v }

const int LM35 = A0;int Temperatura = 0;

void setup() {

pinMode(LM35,INPUT);Serial.begin(9600);

}

void loop() {

Temperatura = analogRead(LM35);Temperatura = (5 * Temperatura * 100)/1023;Serial.print("Temperatura = ");Serial.println(Temperatura,DEC);delay(150);

}105

Page 106: o ( } u µ ] v }

ExercícioDesenvolver um programa que quando a temperatura medida pelosensor LM35, for maior que 30°C acenda um led (vermelho – pino 9), equando for menor igual a 30°C acenda outro led (verde – pino 10).

EM DUPLA

106

Page 107: o ( } u µ ] v }

const int LM35 = A0;int Temperatura = 0;int verdepin = 10;Int vermpin = 9;void setup() {

pinMode(LM35,INPUT);pinMode(verdepin,OUTPUT);pinMode(vermpin,OUTPUT);Serial.begin(9600);

}void loop() {

Temperatura = analogRead(LM35);Temperatura = (5 * Temperatura * 100)/1023;Serial.print("Temperatura = ");Serial.println(Temperatura,DEC);delay(150);

if(Temperatura>30){

digitalWrite(vermpin,HIGH);digitalWrite(verdepin,LOW);

}else{digitalWrite(verdepin,HIGH);digitalWrite(vermpin,LOW);

}delay(500);

}

107

Page 108: o ( } u µ ] v }

108

Page 109: o ( } u µ ] v }

int pin = 0; int tempc = 0,tempf=0; int samples[8]; // Array para precisão na

mediçãoint maxtemp = -100,mintemp = 100; int i;void setup(){

Serial.begin(9600); pinMode(13, OUTPUT); // (led verde)pinMode(12, OUTPUT); // (led vermelho)pinMode(11, OUTPUT); // (led amarelo)

}void loop(){

for(i = 0;i<=7;i++){ //Loop que faz a leitura da temperatura 8 vezes

samples[i] = ( 5.0 * analogRead(pin) * 100.0) / 1024.0;

//A cada leitura, incrementa o valor da variavel tempc

tempc = tempc + samples[i]; delay(100);

}//Divide a variavel tempc por 8, para obter

precisão na mediçãotempc = tempc/8.0;

//Converte a temp em Fahrenheit e armazena na variável tempf

tempf = (tempc * 9)/ 5 + 32;

if(tempc > maxtemp) {maxtemp = tempc;}

if(tempc < mintemp) {mintemp = tempc;}

if(tempc < 25)

{

digitalWrite(13, HIGH);

digitalWrite(12, LOW);

digitalWrite(11, LOW);

}

if(tempc > 28)

{

digitalWrite(12, HIGH);

digitalWrite(13, LOW);

digitalWrite(11, LOW);

}

if((tempc > 25) && (tempc < 28))

{

digitalWrite(11, HIGH);

digitalWrite(12, LOW);

digitalWrite(13, LOW);

}

//As linhas abaixo enviam para o monitor serial a temperatura em

//Celsius e Fahrenheit,

//e também as temperaturas máxima e mínima registradas

Serial.print(tempc,DEC);

Serial.print(" Cels., ");

Serial.print(tempf,DEC);

Serial.print(" Fahr. -> ");

Serial.print(" Min : ");

Serial.print(mintemp,DEC);

Serial.print(" Max: ");

Serial.println(maxtemp,DEC);

tempc = 0;

delay(1000); //Aguarda 1 segundo e reinicia o processo

}

109

Page 110: o ( } u µ ] v }

Exercício Proposto

Desenvolver um programa que quando a temperatura medida pelo sensor LM35 (pino A0), for maior que 20°C acenda um led (vermelho –pino 9), e quando for menor igual a 20°C acenda outro led (verde –pino 10). O circuito terá um LDR ligado no pino A1, quando a medição no LDR for maior que 400 e a temperatura for superior a 25°C, acenderá um LED (amarelo – pino 8), iniciando uma contagem de 1000 ms. Após decorrido esse tempo acionará um relê (pino 7), ligado nele um ventilador.

110

Page 111: o ( } u µ ] v }

111

Page 112: o ( } u µ ] v }

const int LM35 = A0;const int ldr = A1;int Temperatura = 0;int verdepin = 10;int vermpin = 9;int sensorPin = 1;int ledam = 8;int rele = 7;

int val;

void setup() {

pinMode(LM35,INPUT);pinMode(verdepin,OUTPUT);pinMode(vermpin,OUTPUT);pinMode(rele, OUTPUT);pinMode(ledam, OUTPUT); Serial.begin(9600);

}

void loop()

{

Temperatura = analogRead(LM35);

Temperatura = (5 * Temperatura * 100)/1023;

Serial.print("Temperatura = ");

Serial.println(Temperatura,DEC);

delay(150);

if(Temperatura>20)

{

digitalWrite(vermpin,HIGH);

digitalWrite(verdepin,LOW);

}

else

{

digitalWrite(verdepin,HIGH);

digitalWrite(vermpin,LOW);

}

delay(500);

val = analogRead(sensorPin);

Serial.print("LDR = ");

Serial.println(val);

if(val>400 && Temperatura > 21){

digitalWrite(ledam,HIGH);delay(1000);digitalWrite(rele,HIGH);

}else{

digitalWrite(rele,LOW);digitalWrite(ledam,LOW);

}

}

112

Page 113: o ( } u µ ] v }

Temporizadores

113

Page 114: o ( } u µ ] v }

Temporizadores

Delay()

O comando Delay(ms) interrompe o programa para o período de tempo (em milissegundos) especificado como (ms). Existem 1.000 milissegundos em um segundo.)

ms: o número de milissegundos para fazer uma pausa (unsigned long)

114

Page 115: o ( } u µ ] v }

Temporizadores

Exemplo:

int ledPin = 13; // LED conectado ao pino 13

void setup() { pinMode(ledPin, OUTPUT); // determina como saida digital o pino 13

}

void loop() { digitalWrite(ledPin, HIGH); // liga o LED delay(1000); // espera 1 segundodigitalWrite(ledPin, LOW); // desliga o LED delay(1000); // espera 1 segundo

}

115

Page 116: o ( } u µ ] v }

Temporizadores

• Embora seja fácil criar um LED piscando com a função delay(), o uso de delay() em um sketch tem desvantagens significativas.

Durante o tempo que delay está esperando, nenhuma outra leitura de sensores, cálculos matemáticos, manipulação de pino é executada. Em outras palavras, durante a execução do comando delay() o Arduino praticamente deixa de operar.

116

Page 117: o ( } u µ ] v }

TemporizadoresMillis()

Uma alternativa ao uso da função delay() é a função millis().

Essa função retorna o número de milissegundos desde que a placa Arduino começou a funcionar o programa atual.

unsigned long time = 0; // declarar a variável associada ao millis() como unsigned long

void loop() { time = millis(); // passa para a variável time o tempo em milisegundos desde

// que o Arduino começou a funcionar. }

Como a função millis() retorna o tempo que passou desde que o sketch atual iniciou a sua operação, podemos passar esse valor à variáveis e fazer comparações. Assim conseguimos determinar quanto tempo passou desde que um evento iniciou e terminou.

117

Page 118: o ( } u µ ] v }

Temporizadores

Por exemplo:

A variável "a" recebe o valor de millis() no início de um evento. A variável "b" recebe o valor de millis() no final do evento. Suponto que "a" recebeu o valor 4500 ms e "b" recebeu o valor 6500 ms, podemos calcular o tempo decorrido durante o evento.

a = millis() // supondo 4500 msb = millis() // supondo agora 6500 ms

c = b - a // a variável c receberá a diferença entre "a" e "b", ou seja, 2 segundos (2000 ms)

118

Page 119: o ( } u µ ] v }

Exemplo

• Temporizador que aciona um LED após 1 segundo do acionamento do botão e desliga após 2 segundos.

119

Page 120: o ( } u µ ] v }

int buttonPin = 2;int ledPin = 13;unsigned long tempo = 0; // variável para receber valores do millis()int temporizador = 0; // variável para indicar quando o temporizador está operandoint buttonState = 0;

void setup() {pinMode(ledPin, OUTPUT);pinMode(buttonPin, INPUT);

}

void loop(){

buttonState = digitalRead(buttonPin); // lê o estado do botão

if (buttonState == HIGH && temporizador == 0) { // se botão acionado

temporizador = 1; // inicia o temporizadortempo = millis(); // passa à variável o valor de millis()

}

if (millis() - tempo >= 1000 && temporizador == 1){ // após 1 segundo e temporizador ligado

digitalWrite(ledPin, HIGH); }

if (millis() - tempo >= 2000 && temporizador == 1){ // após 2 seg. e temporizador desligado

digitalWrite(ledPin, LOW); temporizador = 0; // desliga o temporizador

}

}

120

Page 121: o ( } u µ ] v }

unsigned long tempo = 0; // variável para tratar valores do millis()int temporizador = 0; // variável de status

void setup() {pinMode(13, OUTPUT); // inicializa o pino

13 como saída.}

void loop() {

if (temporizador == 0) { // se temporizador em 0

digitalWrite(13, HIGH); // liga o LEDtemporizador = 1; // muda o status

do temporizador para 1tempo = millis(); // passa o valor de

millis() para a variável tempo}

if (millis() - tempo >= 1000 && temporizador == 1){ // se tempo maior que 1 seg. e

// temporizador em 1 digitalWrite(13, LOW); // apaga o LEDtemporizador = 2; // muda o status do

temporizador para 2}

if (millis() - tempo >= 2000 && temporizador == 2){ // se tempo maior que 1seg. e

// temporizador em 2

temporizador = 0; // muda o status do temporizador para 0

//para poder reiniciar a operação}

}

121

Page 122: o ( } u µ ] v }

Exercícios

1) Na função delay(1500), o que representa o valor 1500?

2) A função millis() retorna o valor do tempo que passou desde que o Arduino foi iniciado, ou seja, representa um relógio interno do Arduino. Essa afirmativa é certa ou errada?

3) No programa abaixo, faça um círculo na variável de menor valor.

X = millis()Y = millis()

4) Crie um programa utilizando a função delay() que faça acender um LED, esperar 2 segundos e então apagar o LED.

5) Faça o mesmo programa do exercício 1 só que em vez de utilizar delay(), utilize a função millis().

122

Page 123: o ( } u µ ] v }

Observe como é fácil gravar as sequência das cores dos resistores:

PRETOMARROMVERMELHOLARANJAAMARELOVERDEAZULVIOLETACINZABRANCO

Se a coisa tá Preta, Marrom ou Vermelha, LAVA VC até ficar Branco.

123

Page 124: o ( } u µ ] v }

124

Page 125: o ( } u µ ] v }

125

Page 126: o ( } u µ ] v }

126