Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Super.D

[Snippset] Android + Arduino + Ethernet shield (socket)

Mensagens Recomendadas

Super.D

Boas ppl,

Como eu tive alguma dificuldade em fazer este "pequeno" projecto que é uma base para a minha PAP (Projecto de Aptidão Profissional) do curso de Técnico de Electrónica, Automação e Computadores vou colocar um pequeno snippset para quem anda à procura de algo semelhante e não encontrou como fazer (tal como eu xP), por isso eu coloquei mãos à massa e fui tentando com alguns conhecimentos básicos/intermediários de JAVA network.

Código do Arduino:

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress serverIP(192,168,1,105);

int serverPort = 8888;
int led_port = 5;

String readString;

EthernetServer server(serverPort);

void setup()
{
 Serial.begin(9600);
 Ethernet.begin(mac, serverIP);
 server.begin();
 Serial.print("Server online.");

 pinMode(led_port, OUTPUT);
}

void loop()
{
 EthernetClient client = server.available();
 if (client) {

 while (client.connected()) {
if (client.available()) {

  char c = client.read();

  if (readString.length() < 30) {
   readString.concat(c);
  }

  Serial.print("Command: ");
  Serial.println(readString);

  if (readString == "led1") {
   digitalWrite(led_port, HIGH);
   Serial.println("Led status: 1 (ON)");
   resetString();
  }

  if (readString == "led0") {
   digitalWrite(led_port, LOW);
   Serial.println("Led status: 0 (OFF)");
   resetString();
  }

  }
 }
delay(1);
 client.stop();
 }
 }

 void resetString() {
  readString = "";
 }
 

Programação em Java:

(OBS.: Desculpem os publics, pensei no inicio separar em classes mas preferi assim xD)

package com.example.newcasaautomatizada;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.*;
import java.net.*;

public class MainActivity extends Activity {

 public String ip = "192.168.1.105";
 public int porta = 8888;

 public DataOutputStream toServer = null;
 public DataInputStream fromServer = null;
 public Socket socket = null;

 Boolean connected = false;

 Button btnConectar, btnLigarled, btnDesligarled;
 TextView textlog, fromArd;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   btnConectar = (Button) findViewById(R.id.btn_conectar);
   btnLigarled = (Button) findViewById(R.id.btn_ligarled);
   btnDesligarled = (Button) findViewById(R.id.btn_desligarled);
   textlog = (TextView) findViewById(R.id.textlog);

   changeConnectionStatus(false);
   outputText("OK!");

   btnConectar.setonclickListener(buttonConnectonclickListener);
   btnLigarled.setonclickListener(buttonLigarLed);
   btnDesligarled.setonclickListener(buttonDesligarLed);

 } //fim onCreate


 Button.onclickListener buttonDesligarLed = new Button.onclickListener() {
   public void onclick(View arg0) {
     sendToServer("led0");
 }};

 Button.onclickListener buttonLigarLed = new Button.onclickListener() {
   public void onclick(View arg0) {
     sendToServer("led1");
 }};

 Button.onclickListener buttonConnectonclickListener = new Button.onclickListener() {
   public void onclick(View arg0) {

     if (!connected) {
       try {
         socket = new Socket(ip, porta); // Ip do arduino/ethernet
         toServer = new DataOutputStream(socket.getOutputStream());
         fromServer = new DataInputStream(socket.getInputStream());
         outputText("Ligado ao Ethernet!");

         changeConnectionStatus(true);

       } catch (UnknownHostException e) {
         outputText(e.getMessage());
         changeConnectionStatus(false);
       } catch (IOException e) {
         outputText(e.getMessage());
         changeConnectionStatus(false);
       }
     } else {
       outputText("Desligado do Ethernet!");
       closeAll();
       outputText("Desligado!");
       changeConnectionStatus(false);
    }
 }};

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
   getMenuInflater().inflate(R.menu.main, menu);
   return true;
 } //fim onCreateOptionsMenu

 public void changeConnectionStatus(Boolean isConnected) {
   this.connected = isConnected;

   btnLigarled.setEnabled(isConnected);
   btnDesligarled.setEnabled(isConnected);

   if (isConnected) {
     btnConectar.setText("Desligar");
   }
   else {
     btnConectar.setText("Ligar");
   }
 }//fim changeConnectionStatus

 public void outputText(String msg) {
   textlog.setText(msg);
 } //fim outputText

 public void sendToServer(String msg) {
   if (connected) {
     try {
        toServer.writeBytes(msg);
       toServer.flush();
     } catch(IOException e) {
       outputText(e.getMessage());
     }
   }
 } //fim sendToServer

 public void closeAll() {
   try {
     toServer.close();
     fromServer.close();
     socket.close();

   } catch (IOException e) {
     outputText(e.getMessage());
   }
 } // fim closeAll
}
 

XML do android:

<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"
android:baselineAligned="false"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:scrollbars="vertical"
tools:context=".MainActivity" >

<Button
	android:id="@+id/btn_conectar"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:text="@string/btn_conectar" />

<Button
	android:id="@+id/btn_ligarled"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_alignLeft="@+id/btn_conectar"
	android:layout_alignRight="@+id/btn_conectar"
	android:layout_below="@+id/btn_conectar"
	android:text="@string/btn_ligarled" />

<Button
	android:id="@+id/btn_desligarled"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_alignLeft="@+id/btn_ligarled"
	android:layout_alignRight="@+id/btn_ligarled"
	android:layout_below="@+id/btn_ligarled"
	android:text="@string/btn_desligarled" />

<TextView
	android:id="@+id/textlog"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_alignLeft="@+id/btn_desligarled"
	android:layout_below="@+id/btn_desligarled"
	android:layout_marginTop="21dp"
	android:text="@string/textlog" />

</RelativeLayout>
 
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Evita criar métodos do evento onclickListener para todos os botões. Uma maneira mais simples é implementares esse evento na actividade.

public class MainActivity extends Activity implements onclickListener {
  button_X.setonclickListener(this);
}

@override
public void onclick(View v){
switch(v.getId()){
	 case R.id.button_x: break;
	 case R.id.button_y: break;
}
}

Editado por bioshock
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Super.D
Em 12/4/2013 às 17:11, Moreno.oliveira disse:

Cara.... eu procurei tanto isso =) ... Obrigado.!

De nada! Boa sorte com o seu projecto!

Esse snipset apenas envia do android para o arduíno re-fiz o snipset todo e consegui fazer a comunicação dos dois...

#include <SPI.h>
#include <Ethernet.h>

char *fromArduino;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress serverIP(192,168,1,250);
int serverPort = 80;
int led_port = 3;

EthernetServer server(serverPort);

void setup()
{
 Serial.begin(9600);
 Ethernet.begin(mac, serverIP);
 server.begin();
 Serial.print("Server online.");

 pinMode(led_port, OUTPUT);
}

void loop()
{
 EthernetClient client = server.available();
 if (client) {

 while (client.connected()) {
if (client.available()) {


 char c = client.read();

  Serial.print("Command: ");
  Serial.println(c);

  if (c == '1') {
   digitalWrite(led_port, HIGH);
   Serial.println("Led status: 1 (ON)");
   client.println("Led status: 1 (ON)"); //aqui envia do arduino para o android
  }

  if (c == '0') {
   digitalWrite(led_port, LOW);
   Serial.println("Led status: 0 (OFF)");
   client.println("Led status: 0 (OFF)"); //aqui envia do arduino para o android
  }

  if (!client.connected()) {
   client.stop();
  }
 }
  }
 delay(1);
 client.stop();
 }
}
 

Android:

package esap.pap.casaautomatizada;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.*;
import java.net.*;

public class MainActivity extends Activity {

private static final String IP = "192.168.1.250";
private static final int Port = 80;

private String msgToSever;
private String msgFromServer;

private DataOutputStream toServer = null;
private BufferedReader fromServer = null;
public Socket socket = null;

Boolean connected = false;

Button btnConectar, btnLigarled, btnDesligarled;
TextView textlog;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btnConectar = (Button) findViewById(R.id.btn_conectar);
textlog = (TextView) findViewById(R.id.txt_from_server);
btnLigarled = (Button) findViewById(R.id.btn_ligarled);
btnDesligarled = (Button) findViewById(R.id.btn_desligarled);

changeConnectionStatus(false);

btnConectar.setonclickListener(buttonConnectonclickListener);
btnLigarled.setonclickListener(buttonLigarLed);
btnDesligarled.setonclickListener(buttonDesligarLed);
}

Button.onclickListener buttonDesligarLed = new Button.onclickListener() {
public void onclick(View arg0) {
sendToServer("0");
try {
msgFromServer = fromServer.readLine();
outputText("Recebido: " + msgFromServer);//print the answer
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//recieving the answer

}};

Button.onclickListener buttonLigarLed = new Button.onclickListener() {
public void onclick(View arg0) {
sendToServer("1");
try {
msgFromServer = fromServer.readLine();
outputText("Recebido: " + msgFromServer);//print the answer
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//recieving the answer

}};

Button.onclickListener buttonConnectonclickListener = new Button.onclickListener() {
public void onclick(View arg0) {

if (!connected) {
try {
socket = new Socket(IP, Port); // Ip do arduino/ethernet
toServer = new DataOutputStream(socket.getOutputStream());
fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
outputText("Ligado ao Ethernet!");

changeConnectionStatus(true);

} catch (UnknownHostException e) {
outputText(e.getMessage());
changeConnectionStatus(false);
} catch (IOException e) {
outputText(e.getMessage());
changeConnectionStatus(false);
}
} else {

outputText("Desligado do Ethernet!");
closeAll();
outputText("Desligado!");
changeConnectionStatus(false);
}

}};


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

public void changeConnectionStatus(Boolean isConnected) {
this.connected = isConnected;

btnLigarled.setEnabled(isConnected);
btnDesligarled.setEnabled(isConnected);

if (isConnected) {
btnConectar.setText("Desligar");
}
else {
btnConectar.setText("Ligar");
}
}//fim changeConnectionStatus

public void outputText(String msg) {
textlog.setText(msg);
} //fim outputText

public void sendToServer(String msg) {
if (connected) {
try {

toServer.writeBytes(msg);

} catch(IOException e) {
outputText(e.getMessage());
}
}
} //fim sendToServer

public void closeAll() {
try {
toServer.close();
fromServer.close();
socket.close();

} catch (IOException e) {
outputText(e.getMessage());
}
}

}

XML:
 
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
android:scrollbars="vertical" >"

<Button
	android:id="@+id/btn_conectar"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_alignParentLeft="true"
	android:layout_alignParentRight="true"
	android:text="@string/button_conectar" />

<Button
	android:id="@+id/btn_ligarled"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_alignLeft="@+id/btn_conectar"
	android:layout_alignRight="@+id/btn_conectar"
	android:layout_below="@+id/btn_conectar"
	android:text="@string/ligar_led" />

<TextView
	android:id="@+id/txt_from_server"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_alignLeft="@+id/btn_desligarled"
	android:layout_alignRight="@+id/btn_desligarled"
	android:layout_below="@+id/btn_ligarled"
	android:layout_marginTop="60dp"
	android:text="@string/txt_from_server" />

<Button
	android:id="@+id/btn_desligarled"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_alignLeft="@+id/btn_ligarled"
	android:layout_alignRight="@+id/btn_ligarled"
	android:layout_below="@+id/btn_ligarled"
	android:text="@string/desligar_led" />

</RelativeLayout>
 
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brauliobr

Estou seguindo o código atualizado do Super.D, porém ao executar o programa no simulador android, ele apresenta o seguinte erro ao clica em LIGAR.

socket failed: EACCES (Permission denied)

Alguém sabe solucinar? Pelo que entendi tenho que dar alguma permissão? Mas onde e como?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brauliobr

consegui resolver o problema da permissão editando o arquivo AndroidManifest.xml e adicionando o codigo.

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

Porém quando executo o programa e clico em LIGAR, ele aparece esse erro e fecha o programa.

unfortunately, nome_do_app has stopped

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Super.D

Boa noite

Depende da versão em que estás a rodar a aplicação no simulador. Para já só testei no meu telemóvel e do meu colega 2.3.+, no do meu professor 4.2.+ e no meu tablet 4.4.2 também dá esse erro. Penso que é as APIs do Android SDK vistos que tinha apenas alguns que não eram estes citados excepto a versão do meu huawei, hoje instalei e amanhã vou tentar fazer de modo a que dê do 2.3.3 ao 4.4.2!

Cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brauliobr

Ola Super.D. Realmente estou fazendo testes na 4.4.2 e na 4.2.1. As duas da problema.

Se conseguir uma solução para rodar nessas versões, tendo em vista que os celulares já usam elas, me informe.

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brauliobr

Super.D ja tentei de tudo. na versao 2.2 funciona, mas 4.0 pra cima nada.

Nao sei como arrumar, vi outras pessoas com o mesmo problema mas até agora nada de solução.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Daniel Souza

Olá estou tendo rodar o codigo mas está dando erro, será que poderia me ajuda Super.D

btnConectar.setonclickListener(buttonConnectonclickListener);

btnLigarled.setonclickListener(buttonLigarLed);

btnDesligarled.setonclickListener(buttonDesligarLed);

}

Button.onclickListener buttonDesligarLed = new Button.onclickListener() {

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.