Jump to content
Super.D

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

Recommended Posts

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>
 
  • Vote 1

Share this post


Link to post
Share on other 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;
}
}

Edited by bioshock
  • Vote 1

Share this post


Link to post
Share on other 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>
 
  • Vote 1

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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() {

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.