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!




Olá, no arduino, estou recebendo a mensagem:
ResponderExcluirexit status 1
expected '}' at end of input
Já conferi e não está faltando nenhum '}'. Onde deve estar o erro??