Neste artigo abordaremos um exemplo de utilização do Sensor US-020 com arduino.
O que é o Sensor US-020?
Esse sensor é um sensor ultra-sônico, capaz de medir a distancia de um objeto que esteja em sua frente. O mesmo principio é usado na natureza pelos morcegos e os golfinhos para localizar alimento e/ou obstaculo. Conforme pode ser visto na imagem.
Basicamente é emitido um som em determinada frequência (trigger) que quando alcança o objeto retorna um eco (echo) ao emissor no caso o morcego (natureza) ou sensor (US-020), é através desse eco possível calcular a distancia do alvo.
Em Robótica é usado em robôs e projetos de automação com PICs.
No caso para arduino e PICs temos 2 tipos de Sensores mais mais usados, o US-020 e o HC-SR04
Ambos tem a mesma função medir a distancia de objetos.
Ligação
No Primeiro Pino Vcc ligamos o 5 volts.
No Segundo Pino Trigger ligamos em um dos pinos Digital do arduino (Onde é emitido o sinal)
No Terceiro Pino Echo ligamos em outro pino Digital do arduino (Onde recebe o sinal chamado eco)
No Quarto Pino GND ligamos o terra ou ground do arduino.
Diferença entre US-020 e HC-SR04
Apesar de ambos sensores serem bem parecido em questão de aparência e forma de trabalho, existe uma diferença entre eles que é no quesito precisão.
Segundo minha experiência com ambos os sensores pode perceber uma precisão maior quando trabalhamos com o US-020, porém isso depende de como trabalhamos com o código arduino, só foi possivel perceber essa diferença quando usamos a biblioteca newPing do site oficial do arduino.
_ Arduino Uno, Mega, Duemilanove ou outro compativel. _ Sensor Ultra-Sônico US-020 ou HC-SR04. _ Buzzer 5 volts. _ Led RGB de 4 pinos. _ 2 Resistores de 100 ohms (ou conforme a necessidade do seu LED).
Software _ IDE do Arduino instalada.
Montagem
Irei separar a motagem em 2 diagramas para facilitar a visualização
Montagem do circuito
pino 7 echo do US-020 pino 8 trigger do US-020 vcc do sensor no 5 volts do microcontrolador. GRD no ground do microcontrolador Buzzer no pino digital 2 e ground Led R(Red) no pino 3 G(Green) no pino 5 B(Blue) no pino 6 e o quarto pino no 5 volts do atmega
montagem ilustrativa do display LCD Observação: Está montagem do LCD é apenas ilustrativa. pode ser encontrada no seguinte endereço. http://arduino.cc/en/Tutorial/LiquidCrystal
Para os fios azuis usados nos pinos digitais do arduino usamos os seguintes pinos para o nosso projeto RS = Pino 13 E = Pino 12 D4 = Pino 11 D5 = Pino 10 D6 = Pino 9 D7 = Pino 4
A parte de Ligação terminamos.
Programação
Abra o IDE do arduino e copie o seguinte código //Projeto adaptado do Projeto feito por Adriano Teixeira //*Desenvolvido por Thiago Huno, 19/12/2013 //O código é aberto, mas ao usar, por favor citem. */
//inclui a classe LCD #include
//Instacia e seta os pinos LiquidCrystal lcd (4, 9, 10, 11, 12, 13);
//Pinos do Sensor Ultrasonico (US-020) int pinoGatilho = 8; int pinoEco = 7;
int pinoRed = 3; // pino Red do led RGB. int pinoGreen = 5; // pino Green do led RGB. int pinoBlue = 6; // pino Blue do led RGB. int val = 0; // Valor do HIGH. (Obs para este led os valores são inverso 0 =100% e 255= 0%)
int buzzer = 2; //pino do buzzer int distancia; //Criando uma variável de distância.
void setup() { //Inicia a Serial Serial.begin(9600); //Incia o lcd com 16 campos e 2 linhas lcd.begin(16, 2);
//Pinos do Sensor Ultrasonico (Entrada e Saida) pinMode(pinoGatilho,OUTPUT); pinMode(pinoEco,INPUT);
//Pinos do Leds como saida pinMode(pinoRed, OUTPUT); pinMode(pinoGreen, OUTPUT); pinMode(pinoBlue, OUTPUT);
//Pino do buzzer como saida pinMode(buzzer, OUTPUT);
//Aqui imprime o texto inicial scrollRight();
}
void loop() {
//Inicia a leitura do Sensor digitalWrite(pinoGatilho,HIGH); delayMicroseconds(11); digitalWrite(pinoGatilho,LOW);
//Captura a Distancia distancia = pulseIn(pinoEco, HIGH);
//Calculando a distância em centímetros, sendo que... // ...velocidade do som = 340 m/s ou 29 us/cm. distancia = distancia/29/2;
//MONITOR SERIAL: //Distância no monitor serial. Serial.print(distancia); Serial.print(" cm"); Serial.println(); //Tempo de atualização da amostragem de distância no LCD ou no monitor serial do programa do Arduino. delay(70);
//verifica a condicao de distancia para variar a frequencia do buzzer //e as cores do led if ((distancia > 0) && (distancia <= 5)) { analogWrite(pinoRed, 0); analogWrite(pinoGreen, 255); analogWrite(pinoBlue, 255);
for (int x = 0; x < 16; x++) { //Rola o display 16 vezes para a direita lcd.scrollDisplayRight(); delay(300); } } faça o upload para o arduino e teste.
Irei explicar sobre o Projeto Arduino controlando Umidificador.
Primeiramente vamos a lista de requisitos.
Requisitos de Software
_ IDE arduino.
_ Eclipse com Android SDK Manager Configurado para Desenvolvimento.
_ Java JDK a partir da versão 6
Requisitos de Hardware
_ Arduino Uno, Duemilenove ou Mega
_ Bluetooth Shield
_ Relé +-5 volts
_ 1 Transitor PNP ou NPN _1 Smartphone ou Tablet
Android
_ 1 Adaptador 110v/220v
_ 1 Umidificador (No meu caso usei um da FreeWay).
_ 1 Sensor DHT11 ou DHT22
_ Alguns resistores para o DHT11 e o dispay_LCD
_ 1 Potenciômetro (resistor variável)
(Usei resitor de 100 ohms para o DHT11 e +-400 ohms para o LCD).
Segue abaixo o esquema do Projeto :
Estará em 2 imagem para visualizar de forma clara, pois há muitas ligações.
int pinoSensorUmidade = 2; //pino Digital para o Sensor de Umidade int idDHT1numeroLinha = 0; //DEFAULF do Sensor int pinoTransistorUmidificador = 8;//pino que controlará o Transistor
//declaração do Sensor padrão void dht11_wrapper();
//Inicia a Biblioteca com o numero dos pino de interface LiquidCrystal lcd(12, 11, 6, 5, 4, 3);
// Instacia a Biblioteca do Sensor idDHT11 DHT11(pinoSensorUmidade,idDHT1numeroLinha,dht11_wrapper);
// String onde é guardada as msgs recebidas char c= ' '; void setup() {
//Seta o pino do Transistor como saida pinMode(pinoTransistorUmidificador, OUTPUT);
//Inicia a Serial Serial.begin(9600);
// Seta o número de colunas e linhas para o LCD lcd.begin(16, 2);
}
//padrão da biblioteca do DHT11 void dht11_wrapper() {
DHT11.isrCallback(); }
void loop() {
//metodo default da biblioteca DHT11 para iniciar a leitura do Sensor DHT11.acquire();
//Seta o Cursor para a linha 0 e coluns 1 lcd.setCursor(0, 1);
while (DHT11.acquiring()); int resultado = DHT11.getStatus();
switch (resultado) { case IDDHTLIB_OK: //Serial.println("OK"); break; case IDDHTLIB_ERROR_CHECKSUM: Serial.println("Error\n\r\tChecksum error"); break; case IDDHTLIB_ERROR_TIMEOUT: Serial.println("Error\n\r\tTime out error 1"); break; case IDDHTLIB_ERROR_ACQUIRING: Serial.println("Error\n\r\tAcquiring"); break; case IDDHTLIB_ERROR_DELTA: Serial.println("Error\n\r\tDelta time to small"); break; case IDDHTLIB_ERROR_NOTSTARTED: Serial.println("Error\n\r\tNot started"); break; default: Serial.println("Unknown error"); break; } //Chama o Metodo que imprime o conteudo de Umidade e Temperatura do Sensor imprimir();
// Verifica se a Umidade está abaixo de 55 // e é maior que 0 (normalmente qd ocorre algum erro com o Sensor é impresso -2.00) if(DHT11.getHumidity() < 55 && DHT11.getHumidity() > 0){ //Se sim liga o pino 8 e consequentemente o Umidificador digitalWrite(pinoTransistorUmidificador, HIGH); //Se a umidade estiver maior que 63, ele seta como desligado }else if((float)DHT11.getHumidity() > 63){
digitalWrite(pinoTransistorUmidificador, LOW);
//Se houver algum problema com a leitura do Sensor // o pino é desligado também }else if((float)DHT11.getHumidity() < 0){
digitalWrite(pinoTransistorUmidificador, LOW); }
//Aguarda algum valor na Serial (Conexão bluetooth) if (Serial.available() > 0){
//Se receber grava na variavel c c = Serial.read();
//Se o valor for 0 desliga o Umidificador while(c =='0'){ imprimir(); //envia pro lcd o status do Umidificador lcd.print("Desligado Manual");
//continua a verificação caso receba outro status sai do laço if (Serial.available() > 0){
c = Serial.read();
digitalWrite(pinoTransistorUmidificador, LOW); }
}
//Se o valor for 1 liga o Umidificador while(c =='1'){
imprimir(); lcd.print("Ligado Manual");
//continua a verificação caso receba outro status sai do laço if (Serial.available() > 0){
imprimir(); lcd.print("Ligado Manual");
c = Serial.read();
digitalWrite(pinoTransistorUmidificador, HIGH);
} }
//limpa o status da variavel de controle c c= ' '; } //espera 15 segundos delay(15000);
}
// metodo qie imprime na Serial (bluetooth) e para o //LCD o estado do Sensor void imprimir(){
pino 1: (da esquerda para direita) é o VCC "5volts" ligado no arduino. pino 2: Sinal é ligado no pino 2 do arduino pino 4: Ground. Deve conectar um resistor de 100 ohms no pino 2 / pino 4.
Transistor
Base: Pino8 do arduino Coletor e Emissor: No ground do Arduino. Dependendo do modelo do Transistor terá que conectar um resistor entre o Pino e a base.
Relé:
Circuito de Ativação
Ligamosum dos pinos no 5 volts do arduino. E o outro na saida do Transistor (Poderá ser coletor ou emissor, vai depender do transitor usado PNP ou NPN).
Circuito de Saida ou Alta Tensão
Ambos ligados em uma das fases de Tensão 110 volts / 220 volts
Carregue o código e conecte o pino TX no RX do Bluetooth no arduino e vice-versa.
Já temos nosso Umidificador automatizado e funcionando.
Crie um novo xml dentro da pasta layout dentro do diretório res com o nome menu_umidificador.xml.
Adicione o seguinte codigo <-RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"- >
Agora vamoscriar a activity responsavel em controlar este layout. Vamos em SRC e criamos uma Activity no pacote que você criou com o nome de MenuUmidificador.java.
//Seta o Evento da Lista lista.setClickable(true);
try{
lista.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
//metodo de conexão public boolean connect() { try{ //pega o adress do bluetooth para iniciar a pariedade
//cancela a busca apos armazenar no BluetoothDevice mBluetoothAdapter.cancelDiscovery(); try { //requisita a conexão btSocket.connect();
} catch (IOException e) { try { //fecha o socket caso ocorra algum erro btSocket.close(); return false; } catch (IOException e2) { Log.d("TAG", "Unable to end the connection"); return false; }
}
return true;
}catch (Exception e) { return false; }
}
}
Aqui no MenUmidificador vamos exibir a lista de todos os dispositivos bluetooth que é possivel parear com o Android
Agora criamos o XML e Activity que irá exibir os dados recebidos do Arduino. umidificador.xml <?-xml version="1.0" encoding="utf-8"-?> <-RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" ->
//endereco de conexao BT a ser pareado do arduino private static String address = ""; //meu id do android private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
//inputStream para armazenar as entradas private InputStream inStream = null;
//Thread do Android Handler handler = new Handler();
//delimitador fr Bits a serem enviados byte delimiter = 10;
boolean stopWorker = false;
//ponteiro para leitura do Buffer int readBufferPosition = 0;
//Buffer de Bits byte[] readBuffer = new byte[1024];
//boolean para conexão boolean conetado =false;
//Hadler do android Handler h;
final int RECIEVE_MESSAGE = 1; // Status para o Handler private StringBuilder sb = new StringBuilder();
try{ //checa o bluetooth CheckBt(); //inicia a paridade BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); Log.e("Teste", device.toString());
botaoautomatico.setOnClickListener(new OnClickListener() { public void onClick(View v) { botaoautomatico.setEnabled(false);
//chama o metodo que é responsavel pela sintetização writeData("2");
mConnectedThread = new ConnectedThread(btSocket); mConnectedThread.start();
} });
//recebe a mensagem h = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case RECIEVE_MESSAGE: //se receber a mensagem byte[] readBuf = (byte[]) msg.obj; String strIncom = new String(readBuf, 0, msg.arg1); // Cria uma String para o Array de Bytes sb.append(strIncom); // append a String (adiciona) int endOfLineIndex = sb.indexOf("\r\n"); // define o final da linha
if (endOfLineIndex > 0) { // Se a linha acabar, String sbprint = sb.substring(0, endOfLineIndex); // extrai para String sb.delete(0, sb.length()); // limpa o StringBuilder
//Atualiza o text se receber a String com 20 caracteres if(sbprint.length() ==20){
//Se não tiver os 20 esperado trata os erros e imprime E após a String if(!textumidade.getText().toString().contains("E")){ textumidade.setText(textumidade.getText()+" E"); } //Se não tiver os 20 esperado trata os erros e imprime E após a String if(!texttemperatura.getText().toString().contains("E")){ texttemperatura.setText(texttemperatura.getText()+" E"); } }
try{
//Se a booleana que controla a Voz estiver Verdadeira if(boolVozLigada ==true){
//e o TTS não for nulo if (tts!=null) {
//É falado o texto com os dados temperatura e Umidade recebidos do arduino String text = sbprint.substring(sbprint.indexOf("C")+1, sbprint.lastIndexOf("C") -3)+ "graus celsius e "+sbprint.substring(sbprint.indexOf("%")+1, sbprint.lastIndexOf("%") -3)+" % de umidade";
//Se a String texto não for nula executa o evento if (text!=null) {
if (!tts.isSpeaking()) { tts.speak(text, TextToSpeech.QUEUE_FLUSH, null); } } } }
//metodo de conexão public boolean connect() { try{ Log.d(TAG, address); //pega o adress do bluetooth para iniciar a pariedade BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
Log.d(TAG, "Connecting to ... " + device);
//cancela a busca apos armazenar no BluetoothDevice mBluetoothAdapter.cancelDiscovery(); try { //envia para o Socket a ID do dispositivo local btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); //requisita a conexão btSocket.connect();
Log.d(TAG, "Conexão Realizada!.");
//chama o metodo que inicia a transferencia dos dados beginListenForData();
} catch (IOException e) { try { //fecha o socket caso ocorra algum erro btSocket.close(); return false; } catch (IOException e2) { Log.d(TAG, "Unable to end the connection"); return false; }
}
mConnectedThread = new ConnectedThread(btSocket); mConnectedThread.start(); return true;
}catch (Exception e) { return false; }
}
//metodo para escreve no BT private void writeData(String data) { try { outStream = btSocket.getOutputStream(); } catch (IOException e) { Log.d(TAG, "Bug BEFORE Sending stuff", e); }
//Thread de controle dos dados de controloe recebidos do arduino private class ConnectedThread extends Thread { private final InputStream mmInStream; private final OutputStream mmOutStream;