Mudanças entre as edições de "MCO018703 2018 1 AULA11"
(62 revisões intermediárias por 2 usuários não estão sendo mostradas) | |||
Linha 6: | Linha 6: | ||
Prof. Douglas A. | Prof. Douglas A. | ||
− | + | =Display LCD 16x2= | |
− | A | + | A shield LCD 16x2 com keypad (teclado) pode ser utilizada para selecionar uma opção em um menu, digitar uma senha ou até mesmo controlar os passos de um robô. As aplicações são as mais diversas. Na Figura abaixo vemos a Shield LCD 16x2 com 5 botões customizáveis. |
+ | |||
+ | [[imagem:Fig030_MCO18703.png|450px|center]] | ||
+ | |||
+ | Possui um display LCD 16x2 com backlight azul, e 5 botões, além de um botão de reset do Arduino. O ajuste do contraste é feito pelo parafuso do trimpot. Além disso, a placa possui furos para soldagem de barras de pinos, para, por exemplo, colocar um sensor de temperatura. | ||
+ | |||
+ | Esta shield utiliza alguns pinos diferentes dos que usamos normalmente nos projetos para ligar um LCD. Nesta shield teremos que usar a seguinte sequência ao inicializar a biblioteca LiquidCrystal: | ||
+ | <pre> | ||
+ | LiquidCrystal lcd(8,9,4,5,6,7); // RS,E,D4,D5,D6,D7 | ||
+ | </pre> | ||
+ | |||
+ | A tabela abaixo mostra a relação entre os pinos do Arduino e os sinais do display: | ||
+ | |||
+ | <center> | ||
+ | {| class="wikitable" | ||
+ | ! style="text-align: center; background-color:#1E90FF;" | Pino | ||
+ | ! style="text-align: center; background-color:#1E90FF;" | Sinal do Display | ||
+ | |- | ||
+ | | style="text-align: center;" | 4 | ||
+ | | style="text-align: center;" | DB4 | ||
+ | |- | ||
+ | | style="text-align: center;" | 5 | ||
+ | | style="text-align: center;" | DB5 | ||
+ | |- | ||
+ | | style="text-align: center;" | 6 | ||
+ | | style="text-align: center;" | DB6 | ||
+ | |- | ||
+ | | style="text-align: center;" | 7 | ||
+ | | style="text-align: center;" | DB7 | ||
+ | |- | ||
+ | | style="text-align: center;" | 8 | ||
+ | | style="text-align: center;" | RS | ||
+ | |- | ||
+ | | style="text-align: center;" | 9 | ||
+ | | style="text-align: center;" | Enable | ||
+ | |} | ||
+ | </center> | ||
+ | |||
+ | Os botões da shield usam uma única porta analógica, A0. A Figura abaixo mostra uma associação de resistores para determinar qual botão foi pressionado: | ||
+ | |||
+ | [[imagem:Fig031_MCO18703.png|400px|center]] | ||
+ | |||
+ | ;Nota: Não podemos utilizar essas portas descritas para outras funções enquanto estivermos utilizando essa shield. O pino 10 também é utilizado pela placa para uma função específica, no caso o backlight, e não deve ser utilizado nos programas. | ||
+ | |||
+ | Para o programa de teste abaixo, é necessário o uso da biblioteca LiquidCrystal, e para determinar qual botão foi pressionado, faremos a leitura da porta analógica A0: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <LiquidCrystal.h> | ||
+ | |||
+ | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | lcd.begin(16, 2); | ||
+ | lcd.setCursor(0,0); | ||
+ | lcd.print("Bem vindo!"); | ||
+ | lcd.setCursor(0,1); | ||
+ | lcd.print("Tecle: "); | ||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | int botao; | ||
+ | botao = analogRead (0); //Leitura do valor da porta analógica A0 | ||
+ | lcd.setCursor(8,1); | ||
+ | if (botao < 100) { | ||
+ | lcd.print ("Direita "); | ||
+ | } | ||
+ | else if (botao < 200) { | ||
+ | lcd.print ("Cima "); | ||
+ | } | ||
+ | else if (botao < 400){ | ||
+ | lcd.print ("Baixo "); | ||
+ | } | ||
+ | else if (botao < 600){ | ||
+ | lcd.print ("Esquerda"); | ||
+ | } | ||
+ | else if (botao < 800){ | ||
+ | lcd.print ("Select "); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Desafio== | ||
+ | |||
+ | Tente incluir uma animação no display! | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | //Rolagem para a esquerda | ||
+ | for (int posicao = 0; posicao < 3; posicao++) | ||
+ | { | ||
+ | lcd.scrollDisplayLeft(); | ||
+ | delay(300); | ||
+ | } | ||
+ | |||
+ | //Rolagem para a direita | ||
+ | for (int posicao = 0; posicao < 6; posicao++) | ||
+ | { | ||
+ | lcd.scrollDisplayRight(); | ||
+ | delay(300); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | =Sensor LM35= | ||
+ | |||
+ | O Sensor de Temperatura LM35 é um sensor de precisão, que apresenta uma saída de tensão linear relativa à temperatura em que ele se encontrar no momento em que for alimentado por uma tensão de 4-20Vdc e GND, tendo em sua saída um sinal de 10mV para cada Grau Celsius de temperatura, sendo assim, apresenta uma boa vantagem com relação aos demais sensores de temperatura. | ||
+ | |||
+ | [[imagem:Fig032_MCO18703.png|200px|center]] | ||
+ | |||
+ | O LM35 não necessita de qualquer calibração externa, valores temperatura com variações de 0,25ºC ou até mesmo 0,75ºC dentro da faixa de temperatura de –55ºC à 150ºC. Este sensor tem saída com baixa impedância, tensão linear e calibração inerente precisa, fazendo com que o interfaceamento de leitura seja especificamente simples e o custo do sistema como um todo seja significantemente baixo. | ||
+ | |||
+ | Consumo: este sensor drena apenas 60μA, sendo assim seu auto-aquecimento é de aproximadamente 0.1ºC ao ar livre. | ||
+ | |||
+ | <center> | ||
+ | {| class="wikitable" | ||
+ | ! colspan="2" style="font-weight:bold;background-color:#1E90FF;" | Dados técnicos: | ||
+ | |- | ||
+ | | Descrição do fabricante | ||
+ | | LM35 | ||
+ | |- | ||
+ | | Tensão de Alimentação | ||
+ | | 4 - 30VDC | ||
+ | |- | ||
+ | | Escala de medição | ||
+ | | ºC - (Celsius) | ||
+ | |- | ||
+ | | Fator de escala | ||
+ | | 10mV / ºC | ||
+ | |- | ||
+ | | Range de resposta | ||
+ | | -55ºC à 150ºC | ||
+ | |- | ||
+ | | Precisão | ||
+ | | 0,5ºC | ||
+ | |- | ||
+ | | Consumo de corrente máximo | ||
+ | | 60uA | ||
+ | |- | ||
+ | | Datasheet | ||
+ | | [http://www.alldatasheet.com/datasheet-pdf/pdf/517588/TI1/LM35.html LM-35] | ||
+ | |} | ||
+ | </center> | ||
+ | |||
+ | ;Exemplo: O código abaixo faz a média de 8 leituras e depois envia pela serial juntamente maior valor e menor valor lido: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | // Pino analogico para ligacao do LM35 | ||
+ | int pin = 0; | ||
+ | |||
+ | // Variaveis que armazenam a temperatura em Celsius e Fahrenheit | ||
+ | int tempc = 0,tempf=0; | ||
+ | |||
+ | // Array para precisão na medição | ||
+ | int samples[8]; | ||
+ | |||
+ | // Variáveis que guardam a temperatura máxima e mínima | ||
+ | int maxtemp = -100,mintemp = 100; | ||
+ | |||
+ | int i; | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | Serial.begin(9600); // Inicializa comunicação serial | ||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | // Loop que faz a leitura da temperatura 8 vezes | ||
+ | for(i = 0;i<=7;i++) | ||
+ | { | ||
+ | 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ção | ||
+ | tempc = tempc/8.0; | ||
+ | |||
+ | //Converte a temperatura em Fahrenheit e armazena na variável tempf | ||
+ | tempf = (tempc * 9)/ 5 + 32; | ||
+ | |||
+ | //Armazena a temperatura máxima na variável maxtemp | ||
+ | if(tempc > maxtemp) {maxtemp = tempc;} | ||
+ | |||
+ | //Armazena a temperatura minima na variavel mintemp | ||
+ | if(tempc < mintemp) {mintemp = tempc;} | ||
+ | |||
+ | |||
+ | //As linhas abaixo escrevem o valor da temperatura na saída serial | ||
+ | Serial.print(tempc,DEC); | ||
+ | Serial.print(" Celsius, "); | ||
+ | Serial.print(tempf,DEC); | ||
+ | Serial.print(" fahrenheit -> "); | ||
+ | Serial.print(maxtemp,DEC); | ||
+ | Serial.print(" Max, "); | ||
+ | Serial.print(mintemp,DEC); | ||
+ | Serial.println(" Min"); | ||
+ | |||
+ | delay(100); | ||
+ | |||
+ | tempc=0; | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | =Display de 7 segmentos= | ||
+ | |||
+ | O display de 7 segmentos, possui 7 segmentos que podem ser agrupados de modo a formar números e letras. | ||
+ | |||
+ | |||
+ | |||
+ | [[Imagem:7-segments_Indicator.gif|center]] | ||
+ | |||
+ | |||
+ | |||
+ | Para mostrar o número 1, basta ativar os segmentos b e c. Para mostrar o número 3, os segmentos a, b, c, d e g. | ||
+ | |||
+ | A ligação ao Arduino pode utilizar os pinos de 2 a 9, mais o GND, na seguinte sequencia: | ||
+ | |||
+ | <center> | ||
+ | {| class="wikitable" | ||
+ | ! style="text-align: center; font-weight:bold;background-color:#1E90FF;" | Pino | ||
+ | Arduíno | ||
+ | ! style="text-align: center; font-weight:bold;background-color:#1E90FF;" | Segmento | ||
+ | Display | ||
+ | |- | ||
+ | | style="text-align: center;" | 2 | ||
+ | | style="text-align: center;" | a | ||
+ | |- | ||
+ | | style="text-align: center;" | 3 | ||
+ | | style="text-align: center;" | b | ||
+ | |- | ||
+ | | style="text-align: center;" | 4 | ||
+ | | style="text-align: center;" | c | ||
+ | |- | ||
+ | | style="text-align: center;" | 5 | ||
+ | | style="text-align: center;" | d | ||
+ | |- | ||
+ | | style="text-align: center;" | 6 | ||
+ | | style="text-align: center;" | e | ||
+ | |- | ||
+ | | style="text-align: center;" | 7 | ||
+ | | style="text-align: center;" | f | ||
+ | |- | ||
+ | | style="text-align: center;" | 8 | ||
+ | | style="text-align: center;" | g | ||
+ | |- | ||
+ | | style="text-align: center;" | 9 | ||
+ | | style="text-align: center;" | h | ||
+ | |- | ||
+ | | style="text-align: center;" | GND | ||
+ | | style="text-align: center;" | Central | ||
+ | |} | ||
+ | </center> | ||
+ | |||
+ | |||
+ | Um ponto importante é a utilização dos resistores de 220 ohms para cada pino. Caso opte por utilizar apenas um resistor conectado a VCC, deve-se levar em consideração que luminosidade dos leds pode ficar diferente para os algarismos com mais ou menos leds acessos. Lembre-se que é necessário limitar a corrente, evitando queimar o componente. | ||
+ | |||
+ | |||
+ | [[Imagem:fig89_DIG222802.png|center|300px]] | ||
+ | |||
+ | |||
+ | Abaixo pode-se ver como ficaria as ligações '''considerando catodo comum, ou seja, se você está trabalhando com display anodo comum, você deverá ligar em VCC (5V): | ||
+ | |||
+ | [[Imagem:Fig033_MCO018703.png|center|500px]] | ||
+ | |||
+ | Abaixo segue o código fonte do contador hexadecimal crescente: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | // Programa : Contador crescente 0 a F | ||
+ | // Modificacoes e comentarios : Arduino e Cia | ||
+ | // Baseado no programa: | ||
+ | // Arduino 7 segment display example software | ||
+ | // http://www.hacktronics.com/Tutorials/arduino-and-7-segment-led.html | ||
+ | // License: http://www.opensource.org/licenses/mit-license.php (Go crazy) | ||
+ | // Define a ordem de ligação dos segmentos, dos digitos 0 a F | ||
+ | // Este padrão é para display de catodo comum | ||
+ | // Para display de anodo comum, modifique os valores de 0 para 1 e | ||
+ | // de 1 para 0 | ||
+ | // 1 = LED ligado, 0 = LED desligado, nessa ordem : | ||
+ | // Arduino pinos: 2,3,4,5,6,7,8 | ||
+ | |||
+ | byte seven_seg_digits[16][7] = { { 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 | ||
+ | { 1,1,1,0,1,1,1 }, // = Digito A | ||
+ | { 0,0,1,1,1,1,1 }, // = Digito B | ||
+ | { 1,0,0,1,1,1,0 }, // = Digito C | ||
+ | { 0,1,1,1,1,0,1 }, // = Digito D | ||
+ | { 1,0,0,1,1,1,1 }, // = Digito E | ||
+ | { 1,0,0,0,1,1,1 } // = Digito F | ||
+ | }; | ||
+ | |||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | pinMode(2, OUTPUT); //Pino 2 do Arduino ligado ao segmento A | ||
+ | pinMode(3, OUTPUT); //Pino 3 do Arduino ligado ao segmento B | ||
+ | pinMode(4, OUTPUT); //Pino 4 do Arduino ligado ao segmento C | ||
+ | pinMode(5, OUTPUT); //Pino 5 do Arduino ligado ao segmento D | ||
+ | pinMode(6, OUTPUT); //Pino 6 do Arduino ligado ao segmento E | ||
+ | pinMode(7, OUTPUT); //Pino 7 do Arduino ligado ao segmento F | ||
+ | pinMode(8, OUTPUT); //Pino 8 do Arduino ligado ao segmento G | ||
+ | pinMode(9, OUTPUT); //Pino 9 do Arduino ligado ao segmento PONTO | ||
+ | writePonto(0); // Inicia com o ponto desligado | ||
+ | } | ||
+ | |||
+ | void writePonto(byte dot) //Funcao que aciona o ponto no display | ||
+ | { | ||
+ | digitalWrite(9, dot); | ||
+ | } | ||
+ | |||
+ | void sevenSegWrite(byte digit) //Funcao que aciona o display | ||
+ | { | ||
+ | byte pin = 2; | ||
+ | |||
+ | //Percorre o array ligando os segmentos correspondentes ao digito | ||
+ | for (byte segCount = 0; segCount < 7; ++segCount) | ||
+ | { | ||
+ | digitalWrite(pin, seven_seg_digits[digit][segCount]); // Catado comum: digitalWrite(pin, !seven_seg_digits[digit][segCount]); | ||
+ | ++pin; | ||
+ | } | ||
+ | writePonto(1); //Liga o ponto | ||
+ | delay(100); //Aguarda 100 milisegundos | ||
+ | writePonto(0); //Desliga o ponto | ||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | //Contador de 0 a 15, ligando os segmentos correspondentes | ||
+ | //0 a 9 = liga os segmentos correspondentes aos numeros | ||
+ | //10 a 15 = Forma as letras A,B,C,D,E,F | ||
+ | for (byte count = 0; count < 16; count++) | ||
+ | { | ||
+ | delay(500); | ||
+ | sevenSegWrite(count); | ||
+ | } | ||
+ | delay(4000); | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Desafio== | ||
+ | |||
+ | [1] Fazer uma animação com o display. | ||
+ | |||
+ | =Sensor LDR= | ||
+ | |||
+ | Um LDR (Resistor Dependente da Luz) é um tipo especial de resistor que apresenta uma mudança em sua característica de resistência elétrica quando submetido à ação da luz. Também chamados de fotorresistores, apresentam um valor de resistência elevada em um ambiente escuro, e quando expostos à luz, têm a condutividade aumentada. Ou seja, oferecem baixa resistência elétrica quando iluminados. | ||
+ | |||
+ | |||
+ | [[Imagem:Fig034_MCO018703.png|center|200px]] | ||
+ | |||
+ | |||
+ | Os LDRs são fabricados com materiais de alta resistência, como por exemplo o Sulfeto de Cádmio (CdS) ou o Sulfeto de Chumbo (PbS). Esses materiais possuem poucos elétrons livres quando colocados em ambiente escuro, e liberam elétrons quando há incidência de luz sobre eles, aumentando sua condutividade. Chamamos a esse efeito de Fotocondutividade. | ||
+ | |||
+ | Quando cessa a incidência de luz sobre o componente, os elétrons retornam à camada de valência e a resistência do material volta a aumentar. | ||
+ | |||
+ | No geral, os LDRs possuem resistências entre 1 MΩ e 10 MΩ no quando em ambiente escuro, e resistências que podem chegar a menos de 100 Ω quando iluminados. | ||
+ | |||
+ | Alguns LDRs são projetados para responder em luz infravermelha (como os de Sulfto de Chumbo - PbS) ou ainda em luz ultravioleta. Abaixo é mostrado o circuito básico do divisor de tensão para ser lido pelo pino A0 do Arduíno. | ||
+ | |||
+ | |||
+ | [[Imagem:Fig035_MCO018703.png|center|200px]] | ||
+ | |||
+ | |||
+ | Utilize um resistor de 10k em série com o LDR (também de 10k). | ||
+ | |||
+ | ;Esquemático: | ||
+ | |||
+ | |||
+ | [[image:Fig050_MCO18703.jpg|400px|center]] | ||
+ | |||
+ | |||
+ | ;Código fonte: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | const int sensor=A0,led=7; | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | Serial.begin(9600); | ||
+ | pinMode(led, OUTPUT); | ||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | int valor=analogRead(sensor); | ||
+ | Serial.println(valor); | ||
+ | if (valor < 200) | ||
+ | digitalWrite(led, HIGH); | ||
+ | else | ||
+ | digitalWrite(led, LOW); | ||
+ | delay(250); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
=Referências= | =Referências= | ||
Linha 15: | Linha 418: | ||
[1] https://www.arduinoecia.com.br/2013/08/arduino-shield-lcd-16x2-com-keypad.html | [1] https://www.arduinoecia.com.br/2013/08/arduino-shield-lcd-16x2-com-keypad.html | ||
− | [2] | + | [2] display-7-segmentos.html |
+ | |||
+ | [3] www.bosontreinamentos.com.br | ||
+ | |||
+ | [4] [https://wiki.sj.ifsc.edu.br/images/8/83/AP1_MCO18703_2017-2.pdf Avaliação 2017-2] | ||
Edição atual tal como às 16h47min de 9 de outubro de 2018
Apresentação
O objetivo das próximas aulas é o de exercitar a capacidade de vocês trabalharem em equipe na resolução de problemas utilizando o Arduíno. Vamos propor alguns experimentos para vocês "melhorarem" e executarem em sala de aula. Abaixo, apresento algumas tecnologias disponíveis em nosso almoxarifada para que vocês pesquisem e utilizem nas soluções dos problemas. Caso uma equipe conseguir terminar o seu trabalho numa aula, poderá executar testar outra tecnologia.
Prof. Douglas A.
Display LCD 16x2
A shield LCD 16x2 com keypad (teclado) pode ser utilizada para selecionar uma opção em um menu, digitar uma senha ou até mesmo controlar os passos de um robô. As aplicações são as mais diversas. Na Figura abaixo vemos a Shield LCD 16x2 com 5 botões customizáveis.
Possui um display LCD 16x2 com backlight azul, e 5 botões, além de um botão de reset do Arduino. O ajuste do contraste é feito pelo parafuso do trimpot. Além disso, a placa possui furos para soldagem de barras de pinos, para, por exemplo, colocar um sensor de temperatura.
Esta shield utiliza alguns pinos diferentes dos que usamos normalmente nos projetos para ligar um LCD. Nesta shield teremos que usar a seguinte sequência ao inicializar a biblioteca LiquidCrystal:
LiquidCrystal lcd(8,9,4,5,6,7); // RS,E,D4,D5,D6,D7
A tabela abaixo mostra a relação entre os pinos do Arduino e os sinais do display:
Pino | Sinal do Display |
---|---|
4 | DB4 |
5 | DB5 |
6 | DB6 |
7 | DB7 |
8 | RS |
9 | Enable |
Os botões da shield usam uma única porta analógica, A0. A Figura abaixo mostra uma associação de resistores para determinar qual botão foi pressionado:
- Nota
- Não podemos utilizar essas portas descritas para outras funções enquanto estivermos utilizando essa shield. O pino 10 também é utilizado pela placa para uma função específica, no caso o backlight, e não deve ser utilizado nos programas.
Para o programa de teste abaixo, é necessário o uso da biblioteca LiquidCrystal, e para determinar qual botão foi pressionado, faremos a leitura da porta analógica A0:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("Bem vindo!");
lcd.setCursor(0,1);
lcd.print("Tecle: ");
}
void loop()
{
int botao;
botao = analogRead (0); //Leitura do valor da porta analógica A0
lcd.setCursor(8,1);
if (botao < 100) {
lcd.print ("Direita ");
}
else if (botao < 200) {
lcd.print ("Cima ");
}
else if (botao < 400){
lcd.print ("Baixo ");
}
else if (botao < 600){
lcd.print ("Esquerda");
}
else if (botao < 800){
lcd.print ("Select ");
}
}
Desafio
Tente incluir uma animação no display!
//Rolagem para a esquerda
for (int posicao = 0; posicao < 3; posicao++)
{
lcd.scrollDisplayLeft();
delay(300);
}
//Rolagem para a direita
for (int posicao = 0; posicao < 6; posicao++)
{
lcd.scrollDisplayRight();
delay(300);
}
Sensor LM35
O Sensor de Temperatura LM35 é um sensor de precisão, que apresenta uma saída de tensão linear relativa à temperatura em que ele se encontrar no momento em que for alimentado por uma tensão de 4-20Vdc e GND, tendo em sua saída um sinal de 10mV para cada Grau Celsius de temperatura, sendo assim, apresenta uma boa vantagem com relação aos demais sensores de temperatura.
O LM35 não necessita de qualquer calibração externa, valores temperatura com variações de 0,25ºC ou até mesmo 0,75ºC dentro da faixa de temperatura de –55ºC à 150ºC. Este sensor tem saída com baixa impedância, tensão linear e calibração inerente precisa, fazendo com que o interfaceamento de leitura seja especificamente simples e o custo do sistema como um todo seja significantemente baixo.
Consumo: este sensor drena apenas 60μA, sendo assim seu auto-aquecimento é de aproximadamente 0.1ºC ao ar livre.
Dados técnicos: | |
---|---|
Descrição do fabricante | LM35 |
Tensão de Alimentação | 4 - 30VDC |
Escala de medição | ºC - (Celsius) |
Fator de escala | 10mV / ºC |
Range de resposta | -55ºC à 150ºC |
Precisão | 0,5ºC |
Consumo de corrente máximo | 60uA |
Datasheet | LM-35 |
- Exemplo
- O código abaixo faz a média de 8 leituras e depois envia pela serial juntamente maior valor e menor valor lido:
// Pino analogico para ligacao do LM35
int pin = 0;
// Variaveis que armazenam a temperatura em Celsius e Fahrenheit
int tempc = 0,tempf=0;
// Array para precisão na medição
int samples[8];
// Variáveis que guardam a temperatura máxima e mínima
int maxtemp = -100,mintemp = 100;
int i;
void setup()
{
Serial.begin(9600); // Inicializa comunicação serial
}
void loop()
{
// Loop que faz a leitura da temperatura 8 vezes
for(i = 0;i<=7;i++)
{
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ção
tempc = tempc/8.0;
//Converte a temperatura em Fahrenheit e armazena na variável tempf
tempf = (tempc * 9)/ 5 + 32;
//Armazena a temperatura máxima na variável maxtemp
if(tempc > maxtemp) {maxtemp = tempc;}
//Armazena a temperatura minima na variavel mintemp
if(tempc < mintemp) {mintemp = tempc;}
//As linhas abaixo escrevem o valor da temperatura na saída serial
Serial.print(tempc,DEC);
Serial.print(" Celsius, ");
Serial.print(tempf,DEC);
Serial.print(" fahrenheit -> ");
Serial.print(maxtemp,DEC);
Serial.print(" Max, ");
Serial.print(mintemp,DEC);
Serial.println(" Min");
delay(100);
tempc=0;
}
Display de 7 segmentos
O display de 7 segmentos, possui 7 segmentos que podem ser agrupados de modo a formar números e letras.
Para mostrar o número 1, basta ativar os segmentos b e c. Para mostrar o número 3, os segmentos a, b, c, d e g.
A ligação ao Arduino pode utilizar os pinos de 2 a 9, mais o GND, na seguinte sequencia:
Pino
Arduíno |
Segmento
Display |
---|---|
2 | a |
3 | b |
4 | c |
5 | d |
6 | e |
7 | f |
8 | g |
9 | h |
GND | Central |
Um ponto importante é a utilização dos resistores de 220 ohms para cada pino. Caso opte por utilizar apenas um resistor conectado a VCC, deve-se levar em consideração que luminosidade dos leds pode ficar diferente para os algarismos com mais ou menos leds acessos. Lembre-se que é necessário limitar a corrente, evitando queimar o componente.
Abaixo pode-se ver como ficaria as ligações considerando catodo comum, ou seja, se você está trabalhando com display anodo comum, você deverá ligar em VCC (5V):
Abaixo segue o código fonte do contador hexadecimal crescente:
// Programa : Contador crescente 0 a F
// Modificacoes e comentarios : Arduino e Cia
// Baseado no programa:
// Arduino 7 segment display example software
// http://www.hacktronics.com/Tutorials/arduino-and-7-segment-led.html
// License: http://www.opensource.org/licenses/mit-license.php (Go crazy)
// Define a ordem de ligação dos segmentos, dos digitos 0 a F
// Este padrão é para display de catodo comum
// Para display de anodo comum, modifique os valores de 0 para 1 e
// de 1 para 0
// 1 = LED ligado, 0 = LED desligado, nessa ordem :
// Arduino pinos: 2,3,4,5,6,7,8
byte seven_seg_digits[16][7] = { { 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
{ 1,1,1,0,1,1,1 }, // = Digito A
{ 0,0,1,1,1,1,1 }, // = Digito B
{ 1,0,0,1,1,1,0 }, // = Digito C
{ 0,1,1,1,1,0,1 }, // = Digito D
{ 1,0,0,1,1,1,1 }, // = Digito E
{ 1,0,0,0,1,1,1 } // = Digito F
};
void setup()
{
pinMode(2, OUTPUT); //Pino 2 do Arduino ligado ao segmento A
pinMode(3, OUTPUT); //Pino 3 do Arduino ligado ao segmento B
pinMode(4, OUTPUT); //Pino 4 do Arduino ligado ao segmento C
pinMode(5, OUTPUT); //Pino 5 do Arduino ligado ao segmento D
pinMode(6, OUTPUT); //Pino 6 do Arduino ligado ao segmento E
pinMode(7, OUTPUT); //Pino 7 do Arduino ligado ao segmento F
pinMode(8, OUTPUT); //Pino 8 do Arduino ligado ao segmento G
pinMode(9, OUTPUT); //Pino 9 do Arduino ligado ao segmento PONTO
writePonto(0); // Inicia com o ponto desligado
}
void writePonto(byte dot) //Funcao que aciona o ponto no display
{
digitalWrite(9, dot);
}
void sevenSegWrite(byte digit) //Funcao que aciona o display
{
byte pin = 2;
//Percorre o array ligando os segmentos correspondentes ao digito
for (byte segCount = 0; segCount < 7; ++segCount)
{
digitalWrite(pin, seven_seg_digits[digit][segCount]); // Catado comum: digitalWrite(pin, !seven_seg_digits[digit][segCount]);
++pin;
}
writePonto(1); //Liga o ponto
delay(100); //Aguarda 100 milisegundos
writePonto(0); //Desliga o ponto
}
void loop()
{
//Contador de 0 a 15, ligando os segmentos correspondentes
//0 a 9 = liga os segmentos correspondentes aos numeros
//10 a 15 = Forma as letras A,B,C,D,E,F
for (byte count = 0; count < 16; count++)
{
delay(500);
sevenSegWrite(count);
}
delay(4000);
}
Desafio
[1] Fazer uma animação com o display.
Sensor LDR
Um LDR (Resistor Dependente da Luz) é um tipo especial de resistor que apresenta uma mudança em sua característica de resistência elétrica quando submetido à ação da luz. Também chamados de fotorresistores, apresentam um valor de resistência elevada em um ambiente escuro, e quando expostos à luz, têm a condutividade aumentada. Ou seja, oferecem baixa resistência elétrica quando iluminados.
Os LDRs são fabricados com materiais de alta resistência, como por exemplo o Sulfeto de Cádmio (CdS) ou o Sulfeto de Chumbo (PbS). Esses materiais possuem poucos elétrons livres quando colocados em ambiente escuro, e liberam elétrons quando há incidência de luz sobre eles, aumentando sua condutividade. Chamamos a esse efeito de Fotocondutividade.
Quando cessa a incidência de luz sobre o componente, os elétrons retornam à camada de valência e a resistência do material volta a aumentar.
No geral, os LDRs possuem resistências entre 1 MΩ e 10 MΩ no quando em ambiente escuro, e resistências que podem chegar a menos de 100 Ω quando iluminados.
Alguns LDRs são projetados para responder em luz infravermelha (como os de Sulfto de Chumbo - PbS) ou ainda em luz ultravioleta. Abaixo é mostrado o circuito básico do divisor de tensão para ser lido pelo pino A0 do Arduíno.
Utilize um resistor de 10k em série com o LDR (também de 10k).
- Esquemático
- Código fonte
const int sensor=A0,led=7;
void setup()
{
Serial.begin(9600);
pinMode(led, OUTPUT);
}
void loop()
{
int valor=analogRead(sensor);
Serial.println(valor);
if (valor < 200)
digitalWrite(led, HIGH);
else
digitalWrite(led, LOW);
delay(250);
}
Referências
[1] https://www.arduinoecia.com.br/2013/08/arduino-shield-lcd-16x2-com-keypad.html
[2] display-7-segmentos.html
[3] www.bosontreinamentos.com.br
[4] Avaliação 2017-2