Télécommande universelle avec arduino. 2 – Une appli android

Introduction

Suite au précédent billet, où j’expliquais comment j’avais mis en place un petit serveur web sur un arduino, j’écris ce billet dans lequel je vais montrer une application android que j’ai faite pour contrôler le serveur web.

Une image de télécommande

Je voulais que l’interface de l’application ressemble à une télécommande, parce que c’est plus sympa. J’ai donc trouvé une image de télécommande que j’ai un peu modifiée :
image telecommande
(oui, c’est moche)
Il faut ensuite faire en sorte que les différents boutons de l’image soient cliquables dans l’application android. Pour cela, j’ai d’abord créé une classe « Bouton » :

public class Bouton {
	private Float xMin;
	private Float xMax;
	private Float yMin;
	private Float yMax;
	private int idCommande;

	public Bouton(int idCommande, Float xMin, Float xMax, Float yMin, Float yMax) {
		this.xMin = xMin;
		this.xMax = xMax;
		this.yMin = yMin;
		this.yMax = yMax;
		this.idCommande = idCommande;
	}

	public int getIdCommande() {
		return idCommande;
	}

	public void setIdCommande(int idCommande) {
		this.idCommande = idCommande;
	}
	public Float getxMin() {
		return xMin;
	}
	public void setxMin(Float xMin) {
		this.xMin = xMin;
	}
	public Float getxMax() {
		return xMax;
	}
	public void setxMax(Float xMax) {
		this.xMax = xMax;
	}
	public Float getyMin() {
		return yMin;
	}
	public void setyMin(Float yMin) {
		this.yMin = yMin;
	}
	public Float getyMax() {
		return yMax;
	}
	public void setyMax(Float yMax) {
		this.yMax = yMax;
	}

}

Cette classe contient donc les coordonnées d’un bouton, et la commande que ce bouton envoie.
Il faut ensuite faire une fonction qui construit une liste de boutons :

	/**
	 * Creation de la liste des boutons en fonction des coordonnées
	 */
	private void createButtonsList() {

		Bouton bouton0 = new Bouton(0, 219f, 263f, 99f, 137f);
		boutons.add(bouton0);

		Bouton bouton1 = new Bouton(1, 126f, 183f, 157f, 189f);
		boutons.add(bouton1);
		Bouton bouton2 = new Bouton(2, 215f, 273f, 157f, 189f);
		boutons.add(bouton2);
		Bouton bouton3 = new Bouton(3, 300f, 359f, 157f, 189f);
		boutons.add(bouton3);
		Bouton bouton4 = new Bouton(4, 126f, 183f, 210f, 241f);
		boutons.add(bouton4);
		Bouton bouton5 = new Bouton(5, 215f, 273f, 210f, 241f);
		boutons.add(bouton5);
		Bouton bouton6 = new Bouton(6, 300f, 359f, 210f, 241f);
		boutons.add(bouton6);

		Bouton bouton7 = new Bouton(7, 115f, 155f, 265f, 296f);
		boutons.add(bouton7);
		Bouton bouton8 = new Bouton(8, 329f, 370f, 265f, 296f);
		boutons.add(bouton8);

		Bouton bouton9 = new Bouton(9, 191f, 294f, 294f, 334f);
		boutons.add(bouton9);
		Bouton bouton10 = new Bouton(10, 133f, 186f, 316f, 391f);
		boutons.add(bouton10);
		Bouton bouton11 = new Bouton(11, 299f, 350f, 316f, 391f);
		boutons.add(bouton11);
		Bouton bouton12 = new Bouton(12, 191f, 294f, 374f, 413f);
		boutons.add(bouton12);

		Bouton bouton13 = new Bouton(13, 134f, 180f, 421f, 456f);
		boutons.add(bouton13);
		Bouton bouton14 = new Bouton(14, 302f, 347f, 421f, 456f);
		boutons.add(bouton14);

		Bouton bouton15 = new Bouton(15, 151f, 189f, 481f, 530f);
		boutons.add(bouton15);
		Bouton bouton16 = new Bouton(16, 221f, 259f, 481f, 530f);
		boutons.add(bouton16);
		Bouton bouton17 = new Bouton(17, 293f, 331f, 481f, 530f);
		boutons.add(bouton17);

		Bouton bouton18 = new Bouton(18, 151f, 189f, 552f, 601f);
		boutons.add(bouton18);
		Bouton bouton19 = new Bouton(19, 221f, 259f, 552f, 601f);
		boutons.add(bouton19);
		Bouton bouton20 = new Bouton(20, 293f, 331f, 552f, 601f);
		boutons.add(bouton20);

		Bouton bouton21 = new Bouton(21, 151f, 189f, 622f, 670f);
		boutons.add(bouton21);
		Bouton bouton22 = new Bouton(22, 221f, 259f, 622f, 670f);
		boutons.add(bouton22);
		Bouton bouton23 = new Bouton(23, 293f, 331f, 622f, 670f);
		boutons.add(bouton23);

		Bouton bouton24 = new Bouton(24, 151f, 189f, 694f, 743f);
		boutons.add(bouton24);
		Bouton bouton25 = new Bouton(25, 221f, 259f, 694f, 743f);
		boutons.add(bouton25);
		Bouton bouton26 = new Bouton(26, 293f, 331f, 694f, 743f);
		boutons.add(bouton26);

	}

J’ai récupéré les coordonnées en « cliquant » sur l’image et en affichant les coordonnées du point cliqué.
Il faut ensuite récupérer le bouton cliqué, quand un utilisateur appuie sur l’écran. Voici la fonction utilisée pour cela :

	private Bouton findBouton(Float x, Float y) {
		for (Bouton btn : boutons) {
			if (x > btn.getxMin() && x < btn.getxMax() && y > btn.getyMin() && y < btn.getyMax()) {
				return btn;
			}
		}

		return null;
	}

Où les paramètres x et y sont les coordonnées du « clic » de l’utilisateur. Quand on a récupéré le bon bouton, on peut alors envoyer une requête post vers le serveur :

	private void post(int command) {
		private HttpClient httpclient = new DefaultHttpClient();
		private HttpPost httppost = new HttpPost("http://192.168.1.20/ws");;
		try {
			List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
			nameValuePairs.add(new BasicNameValuePair("device", "1")));
			nameValuePairs.add(new BasicNameValuePair("command", String.valueOf(command)));
			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
			HttpResponse response = httpclient.execute(httppost);
			HttpEntity entity = response.getEntity();
			InputStream is = entity.getContent();
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
			Toast.makeText(getApplicationContext(), "Erreur lors de la connexion au serveur. Vérifier l'url", Toast.LENGTH_LONG).show();
		} catch (Exception e) {
			e.printStackTrace();
			Toast.makeText(getApplicationContext(), "Erreur inattendue", Toast.LENGTH_LONG).show();
		}

	}

Et voilà, on a tout ce qu’il faut pour commander le serveur depuis un client android.
J’ai fait une application un peu plus complète qui permet :

  • De régler l’url à utiliser
  • D’ajouter plusieurs télécommandes
  • De sélectionner une télécommande
  • D’envoyer des commandes au serveur

Voici le projet : lien, sous la forme d’un projet eclipse (c’est ma première application android, donc elle n’est pas forcément codée de façon optimale).
Après quelques tests, il s’avère que l’application est bien réactive, que la réception et le traitement d’une commande par le serveur se font très rapidement. Même avec des appuis répétés sur la télécommande, on ne ressent pas de lag. Reste à voir ce que ça donnera avec l’émetteur infrarouge (pas pour tout de suite, je déménage bientôt, et je n’aurai peut-être pas le temps de continuer le projet pour le moment).

Conclusion

La deuxième étape du projet de télécommande universelle est maintenant achevée. Il me reste :

  • A faire un circuit capable de décoder des signaux infrarouges
  • A faire un circuit capable de reproduire les signaux infrarouges décodés
Vus : 3014
Publié par mael : 17