Supervision de la serre (Web et Android)

Mon père a construit une serre il y a peu, et je me suis dit que ce serait intéressant d’analyser quelques données et pourquoi pas ensuite les exploiter ensuite afin de gérer l’ouverture automatique de celle-ci.

C’était aussi l’occasion de trouver une utilisation à mon Akeru (Arduino made in SnootLab qui utilise le réseau Sigfox) qui dormait depuis un moment.

Superviser ? Oui, mais quoi ?

Dans une serre, il y a deux choses importantes, la température et l’humidité. J’ai fouillé dans mon bazar et j’ai trouvé tout un tas de capteurs. Voilà ce que j’ai retenu :

  • Une sonde DS1820 étanche pour mesurer la température extérieure.
  • Une sonde DHT22 pour mesurer la température intérieure et l’humidité.
  • Un capteur RGB / Proximité / Lumière qui servira pour savoir s’il fait jour ou non et aussi pour déclencher l’affichage des valeurs en passant la main devant.
  • Une matrice de LED gérée par un MAX7219.
  • Et donc un Akeru (Arduino équipé d’un modem Sigfox).

La mise en place

Le câblage et l’utilisation de ce matériel est suffisamment simple, j’ai donc fait des programmes individuels afin de tester chaque capteur puis j’ai tout mis dans un sketch afin de récupérer toutes les données…. et ce fut un échec, pas assez de mémoire disponible sur l’atmega.

J’ai donc fait quelques tests et cherché comment réduire la taille de mon sketch. En premiers lieux j’ai mis toutes les chaînes constantes qui sont dans me « Serial.print » en progmem grâce à la fonction F mais ce n’était pas suffisant.

Je me suis alors penché sur les librairies. Par exemple pour la DHT22 j’utilisais la librairie de chez Adafruits qui est très bien mais qui occupe beaucoup de mémoire. 

Après avoir testé toutes les librairies pour les DHT j’ai choisi la TroykaDHT qui prend deux fois moins de place. J’ai fait de même pour la librairie du capteur RGB/Lumière (la Sparkfun est bien plus gourmande que celle d’Adafruit) et pour la gestion de la matrice de LED (je voulais utiliser la MD_Parola qui s’ajoute à la librairie MAX72XX pour proposer des fonctions de scrolling et d’autres dont je n’avais pas besoin j’ai donc codé le scrolling directement dans mon sketch).

Ces changements m’ont permis de diviser par 2 la taille de mon programme, il n’occupe donc que 60% de la mémoire ce qui me permettra d’ajouter des fonctionnalités plus tard comme un capteur de pluie, l’ouverture via un moteur …

Lecture des données

Le modem envoie des données sur le réseau Sigfox (un réseau bas débit disponible partout en France et dans beaucoup d’autres pays) qui les renvoie via un « callback » sur un serveur maison où je les stocke dans une base de données. J’ai ensuite fait une petite interface en utilisant chartJS afin de les visualiser.

Et sur ANDROID ?

Eh bien j’ai fait très simple; en utilisant l’objet « WebView » du SDK Android on peut encapsuler un site web dans une application.

package eu.rouanetnet.serreleminade;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;


public class MainActivity extends AppCompatActivity {

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

WebView myWebView = (WebView) findViewById(R.id.web1);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
myWebView.loadUrl("https://rouanetnet.eu/tempMazamet/");
}
}

Attention à ne pas oublier d’ajouter cette ligne dans le manifest sans quoi votre application n’accèdera pas a internet et vous ne verrez rien dans votre appli.

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

Vous trouverez bientôt le code sur mon github.

Développer sur Méga Drive : Part 2

Comme précisé dans le dernier articles nous allons parlé ici de Debug et de JoyPad.

Debug

C’est un peu la base quand on développe de pouvoir debugger son programme afin de savoir ce qu’il se passe et pouvoir résoudre d’éventuels problèmes. Le SDK fournis tout le nécessaire pour débugger en alliance avec Gens KMod (menu CPU->Debug). Il y a différents items dans le menue permetant de voir pas mal de choses (registres des cpu, video, son, …). Nous allons utiliser la méthode la plus simple, les messages; elle permet simplement d’envoyer des messages dans une console un peu comme si vous utilisiez des « printf ». Pour cela c’est très simple il suffit d’utiliser la fonction KDebug_Alert qui prend en paramètre un string et le tour est joué (ne pas oublier le #include <kdebug.h> pour inclure les entêtes de debug).

 

#include <genesis.h>
 #include <kdebug.h>
 
 int main()
 {
 
        VDP_drawText("GENESIS HELLO !", 1, 1);
        KDebug_Alert("debug genesis hello");
 
        while(1)
        {
                VDP_waitVSync();
        }
        return (0);
 }

 

Une fois la rom chargée, en allant dans CPU->Debug->Messages nous voyons notre magnifique message de debug apparaître, facile mais très utile.

debug_1

 

JoyPad

Passons maintenant aux contrôles. Le JoyPad de base avait 3 boutons (A B C), un bouton start et une croix directionnelle puis il y a eu ensuite une version avec 6 boutons et d’autres type de contrôleurs (souris, clavier, pistolet…) qui sont aussi géré par le SDK. La capture des événements se fait pas un callback que l’on défini dans le main avec la fonction JOY_setEventHandler(nom_de_la_fonction_de_callback).  Cette fonction prend trois paramètres (u16 joy, u16 changed, u16 state) :

  • joy étant le joypad utilisé (JOY_1, JOY_2, …)
  • changed définie si un bouton a été pressé
  • state définie si un bouton à été relâché

 

Petit code pour mieux comprendre ….

 

#include <genesis.h>
 #include <kdebug.h>
 
 
 void handleJoyEvent(u16 joy, u16 changed, u16 state)
 {
    KDebug_Alert("joy callback");
    if (joy == JOY_1)
    {
        if (state & BUTTON_UP)
        {
            KDebug_Alert("up press");
        }
        else if (changed & BUTTON_UP)
        {
            KDebug_Alert("up rel");
        }
    }
 }
 
 
 int main()
 {
 
 
        JOY_setEventHandler(handleJoyEvent);
 
 
        VDP_drawText("GENESIS HELLO !", 1, 1);
        KDebug_Alert("debug genesis hello");
 
        while(1)
        {
                VDP_waitVSync();
        }
        return (0);
 }

 

Le résultat

 

debug_2

Fin de cette deuxième partie…. Dans la suite nous parlerons de l’affichage.

 

Développer sur Méga Drive : Part 1

Ceux qui me connaissent savent que j’apprécie les jeux vidéo, surtout les « vieux » jeux, et plus précisément les jeux et les consoles de la marque SEGA et je suis tombé il y a peu sur un SDK (Software Development Kit) permettant de développer facilement (en C) des applications pour la Mega Drive.

Je ne pouvais donc pas passer à côté sans jouer avec et j’en profite pour écrire quelques articles sur le sujet.

Présentation

La Mega Drive (Genesis aux US), est une console 16bits de SEGA sortie fin 1988 au japon, pour connaître son histoire je vous invite à lire sa page sur wikipedia.

Elle possède un CPU principal Motorola 68000 (7.6Mhz) et un coprocesseur Z80 (3.58Mhz)  très souvent utilisé pour gérer la partie son et qui permet aussi une rétrocompatibilité totale avec les jeux Master System le tout agrémenté de 64Ko de RAM (dont 32 accessibles par le Z80).

Au niveau vidéo, le VDP (Video Display Processor) permet d’afficher avec des résolutions de 320×224 et 256×224 (ou 320×240 et 256×240 pour les versions PAL), nous reviendrons en détail sur la partie vidéo plus tard.

Prérequis

  • Le SDK, récupérer les sources sur ce dépot git et les compiler.
  • Un éditeur de texte, Vim est parfait pour ça.
  • Gens KMod qui est une version de l’émulateur modifié avec pas mal d’options de debug (fonctionne très bien sous linux avec Wine).

On se lance dans le premier programme

Comme tout le monde nous allons faire un petit « Hello Wolrd » que nous enrichirons au fur et à mesure de notre apprentissage.

#include <genesis.h>

int main()
 {

       VDP_drawText("GENESIS HELLO !", 1, 1);

       while(1)
        {
                VDP_waitVSync();
        }
        return (0);
 }

Petite analyse du code :

  • L’inclusion du début permet de charger les entêtes des librairies fournies par le SDK.
  • VDP_drawText sert a afficher du texte suivant les coordonnées X et Y données ensuite.
  • Le while sert juste a avoir une boucle qui tourne dans laquelle nous pouvons faire plusieurs choses (lire les informations du joypad, mettre à jour des variable, modifier l’affichage …) et surtout on y met dedans le VDP_waitVSync qui permet de caler la boucle sur le rafraîchissement de l’affichage de la console 50Hz en PAL et 60Hz en NTSC.

Plus qu’a compiler notre programme avec le Makefile fournis dans le SDK pour simplifier les choses :

make -f /opt/gendev/sgdk/mkfiles/makefile.gen 

La compilation nous crée deux répertoires à la racine du projet. Le premier est nommé src dans lequel on retrouve deux fichiers :

rom_head.c qui contient les métadonnées concernant la rom (Copyright, Nom, Zone…).

sega.s qui lui comprends le code nécessaire au boot du programme sur la console.

Dans le dossier out nous trouvons les fichiers objets (.o) et les binaires résultants de la compilation. Celui qui nous intéresse est le fichier rom.bin qui est la rom de notre programme.

Il ne reste plus qu’à l’ouvrir dans un émulateur pour voir le résultat.

Dans la prochaines partie nous verrons comment récupérer les information d’un joypad et comment débugger simplement ses programmes.

 

Un peu de détente sous hypnose …

Aujourd’hui je vais vous parler d’un masque connecté d’hypnose qui se nomme Hypnos et qui est développé par une société française appelée DreaminzZz. Ils nous promettent donc de faire des séance d’hypnose à domicile…

Pour commencer on déballe.

 

boite

 

La boite est très simple avec sur le dessus un dessin du masque et un petit liseré bleu blanc rouge pour nous rappeler que c’est Français. Sur le dos nous avons un petit descriptif et quelques informations techniques et légales.

 

boitearr

 

A l’intérieur une pochette pour transporter son masque, le masque, un « mini » manuel et un câble de charge USB.

 

 

Petit tour du propriétaire.

Sur le dessus du masque on remarque une fermeture éclair, derrière se cache le « cœur » d’hypnos (Un PIC 32, un chipset bluetooth LE PIC, quelques capteurs, une batterie de 320mah, 7 leds RGB et un Vibreur). Le connecteur de charge n’est pas un standard, j’aurai apprécié un USB-C mais ils ont opté pour un connecteur aimanté… certains verront cela comme un point fort d’autre un point faible, chacun son avis.

Il y a dans le masque trois boutons qui sont indiqués discrètement sur le décor à l’avant, marche/arrêt et choix du mode autonome.

Sur la partie arrière nous distinguons juste trois leds devant chaque oeil et le bandeau permettant de maintenir le masque en place avec un système anti dérapant.

Concrètement, c’est quoi ?                                                                                                                    

 L’application contient un store avec différentes catégories (relaxation, douleur, détente,…) qui permettent à l’utilisateur de choisir son type de séance.

 

 

Pour mon premier essai j’ai été attiré par un voyage spatial (j’avais déjà écouté le teaser sur PC,et j’avoue j’étais bien sceptique sur les possible sensations promises…). Je m’allonge donc sur le canapé, enfile mon masque et me laisse guider par l’histoire de Guillaume Gautier qui explique comment se détendre et comment rythmer sa respiration. Il se présente comme coéquipier de cette mission Apollo Z qui va nous emmener sur la lune… Et là je l’avoue, c’est la claque. Le son, la voix, les effet lumineux et les vibrations m’ont littéralement emporté.

 

 

Depuis ce premier test j’ai fait plusieurs séances de différentes natures et j’accroche plus ou moins suivant les sujets, mais dans l’ensemble c’est plutôt concluant; je l’ai même utilisé pour faire passer un mal de tête avec succès. Voyant les effets positif qu’il avait sur moi, ma femme l’a testé et je pense qu’il va bientôt falloir en acheter un second …

Avantages :

  • Confortable
  • Joli
  • Facile à utiliser
  • Support ultra réactif

Inconvénients :

  • Uniquement un câble USB pour la charge, pas de transfo fourni
  • Store encore léger mais le produit est tout nouveau il devrait donc se remplir rapidement

Smart speaking with tooth

Bien le bonjour …. longtemps que j’ai pas mis les pieds ici moi … le temps passe pourtant on à jamais le temps ….. enfin quand j’ai quelque chose à partager je reviens pas ici.

J’ai du faire quelques tests afin de faire communiquer un smartphone avec un arduino le tout sans fil et pour pas cher du tout.

J’ai pensé à trois solutions :

  1. Wifi : Cher et consommateur on oublie
  2. NFC : Peu consommateur et moyen cher, mais le smartphone en question ne possédait pas de NFC…
  3. Bluetooth : C’était la solution à mon problème, peu gourmand en énergie, pas cher et en plus simple d’utilisation.

Matériel nécessaire :

  • Un arduino
  • Un module bluetooth JY-MCU (http://goo.gl/u3ErZT)
  • Deux résistances pour faire un pont diviseur pour le RX, genre 10K et 20K ou 1K et 2.2K
  • des fils

Câblage :

BluetoothHookupWeb

On voit bien sur l’image le pont diviseur et que le serial du module Bluetooth est connecté au serial de l’arduino. Pour plus de souplesse vous pouvez utiliser d’autres pin de l’arduino avec la librairie SoftSerial, ça facilitera le débug, j’utilise les pin 4 (RX) et 2 (TX) dans mon code.


Software arduino :

Rien de sorcier ici, on parle en série avec le module bluetooth donc on regarde juste si l’on reçoit bien la commande envoyée par le smartphone “blink”, cette commande activera le clignotement de la led présente sur l’arduino.

Le code est sur Github : https://github.com/tmator/Smart-speaking-with-tooth

Coté Smartphone ???

Point important je n’ai jamais développé sur smartphone, ou alors simplement un HelloWorld avec le SDK android pour faire le curieux …. je me suis alors demandé de quelle manière j’allais développé l’application mobile.

Après une longue réflexion (environ 30 secondes) je me suis tourné vers phonegap/cordova; je ne suis habituellement pas fan de ce genre de solution, je préfère les applications natives mais comme mes collègues bossent la dessus je n’ai pas trop cherché à me compliquer la vie. Donc j’ai installé phonegap et crée une application avec le plugin https://github.com/don/BluetoothSerial qui permet d’envoyer facilement des messages via bluetooth, seul défaut que je trouve à cette librairie c’est qu’il faut avoir appairé les deux devices en passant par les paramètres du smartphone.

Forcément ce n’est pas optimal, mais pour faire une application avec un bouton qui fait clignoter une led c’est largement suffisant. L’avantage de phonegap c’est que en théorie votre application est compilable sur différentes plate-formes (mais à l’usage on s’aperçoit vite que l’on doit quand même faire du code spécifique …).

Screenshot_2015-01-15-18-09-35

Le code est sur Github : https://github.com/tmator/Smart-speaking-with-tooth

Donc rien de spécial, dans le index.html un bouton “blink” sur lequel j’ai mis une action onTouch dans le fichier js; cette action appelle la fonction blink qui envoi la commande “blink” via bluetooth.

IMG_20150115_181024

Et voila de quoi bien commencer 🙂