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!

Um comentário:

  1. Olá, no arduino, estou recebendo a mensagem:
    exit status 1
    expected '}' at end of input

    Já conferi e não está faltando nenhum '}'. Onde deve estar o erro??

    ResponderExcluir