Tutorial: Acionamento de Lâmpada via Internet com Android Mini PC e Arduino

 

Olá Garagistas! Dando sequência aos tutoriais com o Android Mini PC, hoje faremos um projeto de automação via web com o Android Mini PC e o Arduino. Iremos controlar o acionamento de uma lâmpada utilizando um aplicativo Android que irá ler um arquivo .txt que foi gerado por um servidor PHP, onde o mesmo recebe ações de botões de uma página e altera o arquivo .txt, com isso a lâmpada é acionada, via comando serial enviado pelo Android Mini PC ao Arduino.

FLUXOGRAMA DA COMUNICAÇÃO

- Página PHP:

- Aplicativo ANDROID:

- Arduino UNO:

- Lista de Materiais:

1x Android Mini PC

1x Arduino Uno

1x Módulo Relé

1x Lâmpada 127V com bocal e tomada

1x Protoboard

Alguns Jumpers

CUIDADO: Evite manusear o Módulo Rele enquanto o mesmo estiver conectado à rede elétrica e remova qualquer tipo de objeto condutivo ou inflamável de perto. Você pode causar um acidente.

 

- Aplicativos Android:

phpandroid.apk

PAW Server

 

- Páginas HTML:

ldg.zip

 

- Lista de Softwares:

Projeto do aplicativo Android

Eclipse + Ferramentas Para Desenvolvimento Android

Java JDK

 

OBS:  -Para a instalação e configuração do Servidor PHP (PAW Server) acesse este Tutorial.

          -Para a montagem do circuito, siga os passos de montagem deste Tutorial.

 

1. O PAW Server

Após a configuração do PAW Server e a instalação do Plugin como foi feito neste Tutorial. Copie e cole a pasta ldg para seu Android Mini PC e coloque-a dentro do diretório paw/html/:

Exemplo: paw/html/ldg/"arquivos da página"

2. O Aplicativo

 

O aplicativo foi desenvolvido usando o Eclipse ADT, que é um Eclipse com o plugin Android Development Tools (Ferramentas de Desenvolvimento Android).

 

Abaixo, esta o código do aplicativo onde você pode ver uma breve explicação de seu funcionamento. Ele foi feito em linguagem java, lembrando que esse não é todo o projeto (o projeto pode ser baixado no inicio do tutorial):

package com.example.phpandroid;


/*Aplicativo criado pelo LDG
para controlar seu Arduino via
Android Mini PC*/


///+++Bibliotecas+++
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

import android.hardware.usb.UsbManager;

import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.view.View;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
import jp.ksksue.driver.serial.FTDriver;
///=========================


public class MainActivity extends Activity
{
//+++DECLARAÇÃO DE VARIÁVEIS UTILIZADAS NO PROGRAMA+++
public TextView txtDir;
public TextView txtLer;
public TextView txtArq;
public String lerlinha;
public String wbuf;
public String nomeArq = "ldg.txt"; //Informa o arquivo que será lido
public Boolean serial;
//====================================================


///+++PERMISSÃO PARA ACESSAR SERIAL+++
FTDriver mSerial;
public static final String ACTION_USB_PERMISSION = "jp.ksksue.tutorial.USB_PERMISSION";
///===================================


///+++CRIADO AUTOMATICAMENTE PELO ADT+++
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
///=====================================


///+++CHAMA FUNÇÃO PARA CICLO DE LEITURA DO ARQUIVO+++
cicloleitura();
//====================================================


///+++DIRETÓRIO, ARQUIVO QUE ESTÁ SENDO LIDO E O QUE LEU NO ARQUIVO+++
txtDir = (TextView) findViewById(R.id.dir);
txtLer = (TextView) findViewById(R.id.edtLer);
txtArq = (TextView) findViewById(R.id.textView1);
///====================================================================


///++++RECEBE AS STRING PARA ESCREVER NA TELA++++
txtArq.append(nomeArq);
txtDir.append(GetRoot());
///==============================================


///+++INICIANDO SERIAL+++
mSerial = new FTDriver((UsbManager) getSystemService(Context.USB_SERVICE));
PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
mSerial.setPermissionIntent(permissionIntent);
///=======================

///+++BOTÃO LIGADO/DESLIGADO+++
final ToggleButton bToggle = (ToggleButton) findViewById(R.id.toggleButton1); // Cria uma varíavel para controle do botão
bToggle.setOnClickListener(new View.OnClickListener() // Monitora o botão Ligado/Desligado
{
public void onClick(View v)
{
boolean botao; // Cria uma variável boleana
botao = bToggle.isChecked(); // Quando o botão for clicado guarda o estado dele na variável botao
if(botao == true) // Se o botão estiver no estado "Ligado"
{
serial = mSerial.begin(FTDriver.BAUD9600); //Tenta iniciar e guarda resultado na variável serial
if(serial != false) //Se o arduino não tiver conectado, retornará falso
{

Toast.makeText(MainActivity.this, "Arduino Não Conectado", Toast.LENGTH_SHORT).show(); //Exibe mensagem "Arduino Não Conectado"
bToggle.setChecked(false);
}
else //Caso o arduino esteja conectado, retornará verdadeiro
{
Toast.makeText(MainActivity.this, "Serial Ativada", Toast.LENGTH_SHORT).show(); //Exibe mensagem "Serial Inicializada"
}
}

else // Se o botão estiver no estado "Desligado"
{
mSerial.end(); //Encerra serial
Toast.makeText(MainActivity.this, "Serial Desativada", Toast.LENGTH_SHORT).show(); //Exibe mensagem "Serial Finalizada"
}
}
});
}

///=================================================

///+++CICLO PARA LEITURA DO ARQUIVO+++
public void cicloleitura()
{
runOnUiThread(new Runnable()
{
public void run()
{
LerArquivo(); //Quando a Thread é Executada chama a função
Thread timer = new Thread()
{
public void run()
{
try
{
sleep(500);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
finally
{
cicloleitura();
}
}
};
timer.start();
}
});
}
///================================


///+++FUNÇÃO PARA LEITURA ARQUIVO+++
public void LerArquivo()
{
File arq;
try
{
txtLer.setText("");
arq = new File(Environment.getExternalStorageDirectory(), nomeArq);
BufferedReader br = new BufferedReader(new FileReader(arq));
lerlinha = br.readLine(); //Lê a primeira linha do arquivo
wbuf = lerlinha; //Armazena o que foi lido ("l" ou "d")
txtLer.append(lerlinha); //Mostra na tela do aplicativo o que foi lido no arquivo
mSerial.write(wbuf.getBytes()); //Envia o valor de wbuf para a serial
}
catch (Exception e)
{
}
}
///==================================


///+++EXIBE DIRETÓRIO DO ARQUIVO DA APLICAÇÃO+++
public String GetRoot()
{
File root = android.os.Environment.getExternalStorageDirectory();
return root.toString();
}
///=============================================


///+++CRIADO AUTOMATICAMENTE PELO ADT+++
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
///======================================

///+++INICIA SERIAL QUANDO O APP EH EXECUTADO+++
public void onStart(){
super.onStart();
serial = mSerial.begin(FTDriver.BAUD9600);
}
///============================================


///+++PERMITE QUE O APLICATIVO CONTINUE EXECUTANDO MESMO QUANDO MINIMIZADO++++
public void onPause()
{
super.onPause();
LerArquivo();
}
///============================================================


///+++ ENCERRA SERIAL QUANDO O APP EH FECHADO+++
public void onDestroy()
{
String wbuf = "d"; // Armazena d(Desliga) na variável wbuf de escrita
mSerial.write(wbuf.getBytes()); // Envia o valor de wbuf para a serial
mSerial.end(); //Encerra serial
super.onDestroy();
}
///=============================================


}

3. O Sketch do Arduino

 

/* Sketch para programar o arduino e

ler a serial, onde os comandos são enviados

pelo aplicativo android lablampada.apk

*/

 

char leitura;      // Cria um variável char "leitura"

#define rele 8     // Define o valor 8 à variável rele

 

void setup()

{

Serial.begin(9600);     //Inicializa comunicação Serial

pinMode(rele, OUTPUT);   //Seta o pino pelo valor no "#define rele" como saída

digitalWrite(rele, LOW);   //Mantém rele desligado assim que iniciar o programa

}

void loop()

{

while (Serial.available() > 0) //Verifica se há conexão com a serial

{

leitura = Serial.read(); //Lê o dado vindo da Serial e armazena na variável leitura

if (leitura == 'l')  //Se a variável leitura for igual a 'l'(Botão "Ligado" no App)

{

digitalWrite(rele, HIGH);

}

else if (leitura == 'd') //Senão verifica se é igual a 'd' (Botão "Desligado" no App)

{

digitalWrite(rele, LOW);

}

}

}

4. A Montagem

A montagem é a mesma que foi utilizada neste Tutorial.

5. A Execução do Aplicativo

5.1) Execute e Inicie o Servidor com o PAW Server, conforme a figura abaixo.

 

5.2)Execute o aplicativo no seu Android Mini PC e clique no botão "Ativar Serial" para iniciar a comunicação serial do seu Android Mini PC com o Arduino, conforme a figura abaixo:

5.3) Abra seu browser e acesse a página php que foi colocada na sua pasta dentro do servidor php:

Seu.ip.gerado.pelo.paw:server/nome_do_arquivo.php

No nosso exemplo: 192.168.0.107:8080/ldg/lampada.php

5.4) A página conforme a figura abaixo será aberta, e ao acessar a página lampada.php, ela irá criar um arquivo .txt na memória interna do seu Android Mini PC, no nosso exemplo o arquivo é o ldg.txt que será atualizado a cada ação dos botões no nosso WebSever:

5.5) Ao clicar no botão "Ligar", a página l.php(figura abaixo) irá abrir e escrever no arquivo ldg.txt a letra "l"

5.6) Como o nosso aplicativo Android ficará lendo esse arquivo constantemente, ele enviará "l" pela serial.

5.7) O Arduino irá receber a letra "l",  e com isso ligará a lâmpada 

5.8) Quando o botão "Desligar" for clicado, a página d.php(figura abaixo) irá abrir e escrever no arquivo ldg.txt a letra "d"

5.6) Como o nosso aplicativo Android ficará lendo esse arquivo constantemente, ele enviará "d" pela serial.

5.7) O Arduino irá receber a letra "d",  e com isso desligará a lâmpada

Para Alterar o arquivo a ser lido:

1) Será necessário o nome do arquivo na linha "public String nomeArq = "ldg.txt";" que está contida dentro do projeto do nosso aplicativo.

2) Será necessário trocar os arquivos .php nos arquivo do seu servidor PHP alterando o nome do arquivo "ldg.txt" para outro de sua preferência.

Então é isso pessoal, esperamos que tenham gostado desse tutorial, até a próxima!

Referências:

http://pt.wikibooks.org/wiki/Aplicativos_em_PHP/Trabalhando_em_PHP_...

http://escoladeandroid.blogspot.com.br/2012/02/android-trabalhando-...

http://imasters.com.br/artigo/20205/java/how-to-implementando-threa...

http://www.devmedia.com.br/blocos-try-catch/7339

http://desenhosmaiquel.blogspot.com.br/2009/11/desenhos-antigos.html

Exibições: 34817

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Filipe Pereira em 8 agosto 2015 às 9:16

Boas.

Sou novato neste mundo de arduino, tenho um arduino uno e um mega, consegui realizar este protejo, só que agora queria acrescentar um dispositivo nrf24l01+ para accionar o rele sem fio..

Alguém tem um exemplo do código para isso funcionar.

Abraços

Comentário de Caio em 8 maio 2014 às 16:55
Arduíno usa uma conexão serial para receba os comando de  página php.
No windows e no linux a página funciona normal.
]No windows - COM
No Linux - tty USB
Arquivo Para abrir conexão php
<?php
 
//$port = fopen("/dev/ttyUSB0", "w"); #### porta no linux ####
//$port = fopen("COM1" , "w");  // Porta do windows
$port = fopen("com.hoho.android.usbserial.driver.CdcAcmSerialDriver(usbDevice, connection)", "w"); #### porta no Android ####
No software serial Monitor instalado no android funciona a comunicação.
Problema 
Queria saber como faço para minha pagina usar a serial no android.
Andrei pesquisando ele usa esse comando.
com.hoho.android.usbserial.driver.CdcAcmSerialDriver(usbDevice, connection) - e aparte final e aleatório se tirar usb e coloca novamente e outro número. 
O que quero saber e como minha página usa a porta serial que esta conectada nele.
Tem esse site que é da google que explica parte de libraries.
Mais acho que isso e para quem for desenvolver para arquivo java.
Como não entendo muito então não sei.
Tem até um exemplo de código para arduino.

1. Download usb-serial-for-android-v010.jar

2. Copy the jar to your Android project's libs/ directory. (See Android's FAQ for help).

3. Copy device_filter.xml to your project's res/xml/ directory. --  esse arquivo informa acho que se conseguir aplicar sempre vai ser esse número.

 <!-- 0x2341 / Arduino -->


<usb-device vendor-id="9025"/>

4. Configure your AndroidManifest.xml to notify your app when a device is attached (see Android USB Host documentation for help).

<activity
android:name="..."
...>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</activity>

5. Use it! Example code snippet:

// Get UsbManager from Android.
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

// Find the first available driver.
UsbSerialDriver driver = UsbSerialProber.acquire(manager);

if (driver != null) {
driver.open();
try {
driver.setBaudRate(115200);

byte buffer[] = new byte[16];
int numBytesRead = driver.read(buffer, 1000);
Log.d(TAG, "Read " + numBytesRead + " bytes.");
} catch (IOException e) {
// Deal with error.
} finally {
driver.close();
}
}

For a more complete example, see the UsbSerialExamples code in git, which is a simple application for reading and showing serial data.

simple Arduino application is also available which can be used for testing.

Tenho Mini pc cx-919 II tentei colocar o lubunto mais sem sucesso.

Alguém tem alguma sugestão.

 

Comentário de Henrique Nogueira em 8 janeiro 2014 às 12:09

Rômulo Péricles Furtado, como vc fez a conexão USB do GT P5100 ao Arduino?

Comentário de Tiago Struck em 22 outubro 2013 às 10:21

Lembrando que esse miniPC roda processador Allwinner A10... e é bem facil fazer rodar uma distro linux nele.

Comentário de Rômulo Péricles Furtado em 22 outubro 2013 às 9:12

Caros "garagistas",

Rodou no GT P5100, mas com pequenas modificações no projeto, por exemplo:

Utilizei o AndroPHP, pois o paw, não instalou e foi mto trabalhoso para inserir as páginas de controle da "lampada".

Daqui pra adiante... "O CÉU É O LIMITE"

Comentário de DAVID FERRO em 4 junho 2013 às 15:40

valeu lab deg .

Comentário de Laboratório de Garagem em 3 junho 2013 às 15:11

Olá DAVID FERRO,

O intuito do projeto era controlar o Arduino com o Android Mini PC. Você pode acionar uma lâmpada via comandos recebidos por um Ethernet Shield, mas você deve fazer outra programação para o seu Arduino.

Comentário de DAVID FERRO em 3 junho 2013 às 12:06

eu tenho o arduino uno e o ethernet shild , eu consigo fazer esse projeto sem o mini pc ?

Comentário de Tiago Struck em 31 maio 2013 às 1:39

E se usar algum comando assim no PHP:

$port = fopen("/dev/ttyUSB0", "w");

Onde /dev/ttyUSB0 é onde o arduino esta conectado no android.

Para saber a porta serial que ele esta usando basta usar um app disponivel aqui: https://code.google.com/p/android-serialport-api/

Se eu tivesse um android disponivel aqui faria esse teste.

Se quiserem testar e reportar.

Abraços

Comentário de Felipe Brito em 13 maio 2013 às 11:49

Olá Tiago Struck, fiz a atualização de firmware e passou a reconhecer.

Tenho mais de uma versão de miniPc e o curioso é que só consegui fazer em um deles, vou agora procurar saber o porque do outro não funcionar.


Agradeço muito a ajuda. Assim que avançar  com os estudos, publico algo para a comunidade.

Valeu

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço