quinta-feira, 26 de dezembro de 2013

Arduino + Sensor Ultra-sônico US-020 + LCD

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.

http://playground.arduino.cc/Code/NewPing


Requisitos de Hardware e Software

 

Hardware

 _  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);
 
 
  //MONITOR DISPLAY LCD:
  //Impressao no LCD
  lcd.clear();
  lcd.print("Distancia atual:");
  lcd.setCursor(5, 1);
  lcd.print(distancia);
  lcd.setCursor(9, 1);
  lcd.print("cm");
  delay(70);
 
  //___________________________________________________________________________________________ 
 
  //CONDIÇÕES:
 
  if(distancia < 0)
  {
  lcd.clear();
  lcd.print("Distancia atual:");
  lcd.setCursor(3, 1);
  lcd.print("Loading...");
  delay(100);
  }
 
  if((distancia < 0) && (distancia > 350))
  {
  systemOff();
  }
  
  
  //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);

        
  }
 
   if ((distancia > 5) && (distancia <= 10)) 
  {
    analogWrite(pinoRed, 80);
    analogWrite(pinoGreen, 255);
    analogWrite(pinoBlue,  150);
        
  }
 
     if ((distancia > 10) && (distancia <= 15)) 
  {
    analogWrite(pinoRed, 150);
    analogWrite(pinoGreen, 255);
    analogWrite(pinoBlue,  80);
        
  }
 
 
     if ((distancia > 10) && (distancia <= 15)) 
  {
    analogWrite(pinoRed, 255);
    analogWrite(pinoGreen, 255);
    analogWrite(pinoBlue,  0);
        
  }
 
 
  if ((distancia > 15) && (distancia <= 20)) 
  {
    analogWrite(pinoRed, 255);
    analogWrite(pinoGreen, 150);
    analogWrite(pinoBlue,  80);
        
  }
 
  if ((distancia > 20) && (distancia <= 25)) 
  {
    analogWrite(pinoRed, 255);
    analogWrite(pinoGreen, 80);
    analogWrite(pinoBlue,  150);
        
  }
 
  if ((distancia > 25)) 
  {
    analogWrite(pinoRed, 255);
    analogWrite(pinoGreen, 0);
    analogWrite(pinoBlue,  255);
        
  }


   //delays para o buzzer em função da distancia
   digitalWrite(buzzer, HIGH);
   delay(200);
 
 
   digitalWrite(buzzer, LOW);
   delay(distancia*7);


}

  //___________________________________________________________________________________________
 
 //metodo que desliga o led
void systemOff()
{
  digitalWrite(pinoRed, 255);
  digitalWrite(pinoGreen, 255);
  digitalWrite(pinoBlue, 255);
  digitalWrite(buzzer, LOW);
}

  //___________________________________________________________________________________________
 

 
void scrollRight()
{
 
digitalWrite(buzzer, LOW);
 
lcd.clear();
lcd.print("Sensor");
lcd.setCursor(0, 1);
lcd.print("Ultrasonico");
delay(1500);

lcd.clear();
lcd.setCursor(0,1);
lcd.print("Thiago Huno");
delay(1200);

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.

Espero ter ajudado!





 



 






sexta-feira, 13 de dezembro de 2013

Arduino + App Android Java controlando Umidificador + LCD e Bluetooth (Recurso de Voz)

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.

 Ligações do LCD
Está esquema pode ser visto também no site oficial do arduino
http://arduino.cc/en/Tutorial/LiquidCrystal





No primeiro esquema com LCD temos um potenciometro para controlar o contraste do texto exibido.


Feito a montagem, podemos abrir a IDE do arduino e copiar o seguinte código


Obs: Não conecte ainda os pinos TX e RX do Bluetooth no TX e RX do arduino, antes precisamos carregar o código






#include <idDHT11.h>
#include <avr/wdt.h>
#include <LiquidCrystal.h>

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(){

      Serial.print("%");
      Serial.print(DHT11.getHumidity(), 2);
      Serial.print("%      ");
      Serial.print("C");
      Serial.print(DHT11.getCelsius(), 2);
      Serial.println("C");
     
      lcd.print(DHT11.getCelsius(), 1);
      lcd.print("oC ");
 
      lcd.print(DHT11.getHumidity(), 1);
      lcd.print("% H20");
 
}



Ligações


Sensor DHT11

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:  Pino 8 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

Ligamos um 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.

 ----------------------------------------------------------------------------------------------------------------------------------






                                               ANDROID

 


 Agora vamos ver a etapa de conexão com o Android.

 _ Abra o eclipse e crie um novo Projeto Android.
 _ Vamos agora editar o AndroidManifest.xml.

Observação: Retire os "-" das tags.

Adicione as seguintes permissões.
Abaixo das tags   <-uses-sdk-> </-uses-sdk->



    <-uses-permission android:name="android.permission.BLUETOOTH_ADMIN"-/>
    <-uses-permission android:name="android.permission.BLUETOOTH"->


</-uses-permission->


 Agora vamos criar o Layout.

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"- >

    <-ListView
        android:id="@+id/lista"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"- >
    <-/ListView->

<-/RelativeLayout->



Agora vamos criar 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.



import java.io.IOException;
import java.util.ArrayList;
import java.util.Set;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MenuUmidificador extends Activity {
   
    //Variaveis da Conexao Bluetooth--------------
     private BluetoothAdapter mBluetoothAdapter = null;
    private BluetoothSocket btSocket = null;
   
   
    //Componentes
    ListView lista;
    ArrayList<String> id = new ArrayList<String>();
    ArrayList<String> nameId = new ArrayList<String>();
   
    //intent
    Intent intentControleUmidificador;

   
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       
        try{
            //checa o bluetooth
                CheckBt();
       

            }catch (Exception e) {
                // TODO: handle exception
            }
        

       
       
       
        super.onCreate(savedInstanceState);
         setContentView(R.layout.menu_umidificador);
               
       

         intentControleUmidificador= new Intent(this, ControleUmidificador.class);
        
        

           
        
        
        
         try{
                BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
                Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();

                for(BluetoothDevice bt : pairedDevices){
                   
                   id.add(bt.getAddress());
                   nameId.add(bt.getName() +"   "+ bt.getAddress());
                }
                //setListAdapter(new ArrayAdapter<String>(this, R.layout.list, s));
               
                }catch (Exception e) {
                    id.add(e.toString());
                    nameId.add(e.toString());
                }
               
             
                lista= (ListView)findViewById(R.id.lista);
               

                try{
                    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, nameId);
                        lista.setAdapter(arrayAdapter);
               
                }catch (Exception e) {
                    // TODO: handle exception
                }
               
               
              //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) {
                      
                        VariaveisGlobal.enderecoBluetoothCliente = lista.getItemAtPosition(position).toString();
                      
                       VariaveisGlobal.enderecoBluetoothCliente =  VariaveisGlobal.enderecoBluetoothCliente.substring( VariaveisGlobal.enderecoBluetoothCliente.indexOf("   ")+3,  VariaveisGlobal.enderecoBluetoothCliente.length());
                      
                       startActivity(intentControleUmidificador);
                       
                   }
                 });
                        
                        
                   }catch (Exception e) {
                    // TODO: handle exception
                   }


    }
   
   
   
   
       
    //checa se o BT esta ligado

    private void CheckBt() {
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
       

        if (!mBluetoothAdapter.isEnabled()) {
                Toast.makeText(getApplicationContext(), "Bluetooth Desativado !",
                                Toast.LENGTH_SHORT).show();
                mBluetoothAdapter.enable();
               
        }

        if (mBluetoothAdapter == null) {
                Toast.makeText(getApplicationContext(),
                                "Bluetooth null !", Toast.LENGTH_SHORT)
                                .show();
              
        }
    
}
   
   
   
    //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" ->
   

    <-TextView
        android:id="@+id/texttemperatura"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView1"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="60dp"
        android:layout_toRightOf="@+id/imageView2"
        android:textAppearance="?android:attr/textAppearanceLarge"- />
   
   
    <-TextView
        android:id="@+id/textumidade"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/botaoautomatico"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="100dp"
        android:layout_toRightOf="@+id/imageView2"
        android:textAppearance="?android:attr/textAppearanceLarge" -/>

    <-Button
        android:id="@+id/botaoligar"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_marginBottom="23dp"
        android:textSize="14dp"
        android:text="Ligar"- />

    <-ImageView
        android:id="@+id/imageView1"
        android:layout_width="184dp"
        android:layout_height="100dp"
        android:layout_above="@+id/imageView2"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/termometro"-/>

    <-ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/botaodesligar"
        android:layout_alignParentLeft="true"
        android:src="@drawable/umidade"-/>

    <-Button
        android:id="@+id/botaodesligar"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignBaseline="@+id/botaoligar"
        android:layout_alignBottom="@+id/botaoligar"
        android:layout_centerHorizontal="true"
        android:textSize="14dp"
        android:text="Desligar" -/>

    <-Button
        android:id="@+id/botaoautomatico"
        android:layout_width="110dp"
        android:layout_height="50dp"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/imageView2"
        android:textSize="14dp"
        android:text="Automatico" -/>

    <-TextView
        android:id="@+id/TextView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:textAppearance="?android:attr/textAppearanceLarge" -/>

    <-Button
        android:id="@+id/botaovoz"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="Desativar Voz"
        android:textSize="14dp" -/>

</-RelativeLayout->



As imagens









Agora vamos a Activity que irá controlar este layout na pasta src com o nome de ControleUmidificador.java.



import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;
import java.util.UUID;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.os.Handler;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class ControleUmidificador extends Activity implements OnInitListener {
   
   
   
    private ConnectedThread mConnectedThread;
   
     //Tag para o log d do android
    private static final String TAG = "Thiago";
   
     //Variaveis da Conexao Bluetooth--------------
     private BluetoothAdapter mBluetoothAdapter = null;
    private BluetoothSocket btSocket = null;
    private OutputStream outStream = null;
   
    //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();
   
   
    TextView textumidade;
    TextView texttemperatura;
    Button botaoligar;
    Button botaodesligar;
    Button botaoautomatico;
    Button botaovoz;
   
   
    //boolean para controlar a Voz
    boolean boolVozLigada = true;
   
   
   
    // Variavel do TTS
    private TextToSpeech tts;
   
   

   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         setContentView(R.layout.umidificador);
       
         //Instacia o TTS
         tts = new TextToSpeech(this, this);
       
       
       
           
         texttemperatura = (TextView) findViewById(R.id.texttemperatura);
         textumidade = (TextView) findViewById(R.id.textumidade);
         botaoligar = (Button) findViewById(R.id.botaoligar);
         botaodesligar = (Button) findViewById(R.id.botaodesligar);
         botaoautomatico = (Button) findViewById(R.id.botaoautomatico);
         botaovoz = (Button) findViewById(R.id.botaovoz);
        
        
         botaovoz.setText("Desativar Voz");
        
        
         botaoautomatico.setEnabled(false);
       
       
       
         address = VariaveisGlobal.enderecoBluetoothCliente;
       
       
            try{
                //checa o bluetooth
                CheckBt();
                //inicia a paridade
                BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
                Log.e("Teste", device.toString());
       
                }catch (Exception e) {
                    // TODO: handle exception
                }
   
   
       
           try{
                  //conecta o bluetooth
               conetado = connect();
              
            
            }catch(Exception ex){
                 
            }
          
          
          
            botaoligar.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    botaoautomatico.setEnabled(true);
                   
                    //chama o metodo que é responsavel pela sintetização
                    writeData("1");
                   
                    //Chama Tread após envio que recebe os dados do arduino
                    mConnectedThread = new ConnectedThread(btSocket);
                    mConnectedThread.start();
                   
                   
                }
            });
           
           

            botaodesligar.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    botaoautomatico.setEnabled(true);
                   
                    //chama o metodo que é responsavel pela sintetização
                    writeData("0");
                   
                    //Chama Tread após envio que recebe os dados do arduino
                    mConnectedThread = new ConnectedThread(btSocket);
                    mConnectedThread.start();
                   
                   
                }
            });
           
           

            botaovoz.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                   
                    //Desativa a Voz falada no Android
                    if(botaovoz.getText().toString().equalsIgnoreCase("Desativar Voz")){
                   
                        boolVozLigada = false;
                        botaovoz.setText("Ativar Voz");
                   

                    //Ativa a Voz falada no Android   
                    }else if(botaovoz.getText().toString().equalsIgnoreCase("Ativar Voz")){
                       
                        boolVozLigada =  true;
                        botaovoz.setText("Desativar Voz");
                    }
                   
                   
               
                }
            });
           
           
            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){
                            
                           
                             try{
                                     textumidade.setText(sbprint.substring(sbprint.indexOf("%")+1, sbprint.lastIndexOf("%"))+" %");                 
                                     texttemperatura.setText(sbprint.substring(sbprint.indexOf("C")+1, sbprint.lastIndexOf("C"))+" ºC");
                                
                           
                             }catch (Exception e) {
                                   
                                 //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);
                                            }
                                        }
                                    }
                                  }
                                 
                              }catch (Exception e) {
                                // TODO: handle exception
                              }
                           
                           
                           
                         }
                    
                     }

                     break;
                 }
             };
         };
    }
      
   
   
      
    //checa se o BT esta ligado
    private void CheckBt() {
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
       

        if (!mBluetoothAdapter.isEnabled()) {
                Toast.makeText(getApplicationContext(), "Bluetooth Desativado !",
                                Toast.LENGTH_SHORT).show();
                mBluetoothAdapter.enable();
        }

        if (mBluetoothAdapter == null) {
                Toast.makeText(getApplicationContext(),
                                "Bluetooth null !", Toast.LENGTH_SHORT)
                                .show();
        }
}
      
    //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);
    }




    try {
       
            String message = data;
            byte[] msgBuffer = message.getBytes();
            outStream.write(msgBuffer);
    } catch (IOException e) {
            Log.d(TAG, "Bug while sending stuff", e);
    }
}

@Override

//encerra a conexao apos o envio dos dados
//(Não é necessario) mais é padrao do Android
protected void onDestroy() {
super.onDestroy();

        try {
                btSocket.close();
        } catch (IOException e) {
        }

       
        try{
            if (tts!=null) {
                tts.stop();
                tts.shutdown();
            }
            super.onDestroy();
       
           
        }catch (Exception e) {
            // TODO: handle exception
        }
}

   

//inicia a transferencia dos dados
public void beginListenForData()   {
     try {
                    inStream = btSocket.getInputStream();
            } catch (IOException e) {
            }
    
    Thread workerThread = new Thread(new Runnable()
    {
        public void run()
        {               
           while(!Thread.currentThread().isInterrupted() && !stopWorker)
           {
                try
                {
                    int bytesAvailable = inStream.available();                       
                    if(bytesAvailable > 0)
                    {
                        byte[] packetBytes = new byte[bytesAvailable];
                        inStream.read(packetBytes);
                        for(int i=0;i<bytesAvailable;i++)
                        {
                            byte b = packetBytes[i];
                            if(b == delimiter)
                            {
                                byte[] encodedBytes = new byte[readBufferPosition];
                                System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
                                final String data = new String(encodedBytes, "US-ASCII");
                                readBufferPosition = 0;
                                handler.post(new Runnable()
                                {
                                    public void run()
                                    {

                                          
                                    }
                                });
                            }
                            else
                            {
                                readBuffer[readBufferPosition++] = b;
                            }
                        }
                    }
                }
                catch (IOException ex)
                {
                    stopWorker = true;
                }
           }
        }
    });

 }

//Thread de controle dos dados de controloe recebidos do arduino
private class ConnectedThread extends Thread {
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket socket) {
        InputStream tmpIn = null;
        OutputStream tmpOut = null;


        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) { }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }

    public void run() {
        byte[] buffer = new byte[256]; 
        int bytes;

      
        while (true) {
            try {

                bytes = mmInStream.read(buffer);   
                h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();       
          
            } catch (IOException e) {
                break;
            }
        }
    }


    public void write(String message) {
        Log.d(TAG, "...Data to send: " + message + "...");
        byte[] msgBuffer = message.getBytes();
        try {
            mmOutStream.write(msgBuffer);
        } catch (IOException e) {
            Log.d(TAG, "...Error data send: " + e.getMessage() + "...");    
          }
    }
}


@Override
public void onInit(int status) {
    if (status==TextToSpeech.SUCCESS) {
        tts.setLanguage(Locale.getDefault());
    } else {
        tts = null;
        Toast.makeText(this, "Failed to initialize TTS engine.", Toast.LENGTH_SHORT).show();
    }
   
}   
      
}





Crie a classe que receberá os dados de ID do arduino chamada VariaveisGlobal.java

Assim evitamos a necessidades de passar parametros via Result.


import android.app.Application;

public class VariaveisGlobal extends Application {
   
    public static String enderecoBluetoothCliente ="";

}






Para finalizar, vamos mapear no AndroidManifest a Activity restante, ControleUmidificador.

  Coloque o seguinte código  abaixo da tag  </-activity->

         <-activity android:name=".ControleUmidificador"->
       </-activity->



Pronto! Gere o APK e Instale no dispositivo, certifique que sua conexão bluetooth esteja ligada antes de executá-lá.


                                                       Vídeo de Demonstração



                                                 Vídeo com o Recuso de Voz do Arduino




Espero ter ajudado, até mais.

Abraço!