Afficheur de prévisions météo

Afficheur de prévisions météo

Cette semaine, on vous propose un petit bricolage pour afficher la tendance météo. C'est l'occasion d'illustrer le fait qu'on peut utiliser le système de jobs du Yocto-I2C pour autre chose que lire des capteurs.





Le principe

L'idée est de graver quelques icônes sur des plaques de verre acrylique et les éclairer sur le côté pour illuminer les icônes. On a déjà utilisé ce principe il y a quelques années, mais cette fois on va utiliser plusieurs plaques que l'on éclairera séparément. Comme source de lumière, on a choisi une matrice de LED vendue par Adafruit pilotable par I2C, on a choisi ce modèle pour sa densité.

Les pièces maîtresses de notre petit bricolage
Les pièces maîtresses de notre petit bricolage


Pour faire fonctionner notre afficheur, l suffira que faire en sorte que les bords des plaques transparentes soient alignés avec les lignes de LED et d'allumer les LED par lignes. Plus les bords des plaques sont près des LED, mieux c'est.

L'électronique

La partie électronique est constituée de la matrice de LED et d'un Yocto-I2C pour la contrôler. Le Yocto-I2C est contrôlé par un YoctoHub-Ethernet, mais on aurait très bien pour choisir le tout nouveau YoctoHub-Wireless-n. Pour rester aussi compact que possible, le Yocto-I2C est directement vissé sur le YoctoHub-Ethernet et la connexion est assurée par des connecteurs Board2Board-127.

Un YoctoHub-Ethernet et un Yocto-I2C
Un YoctoHub-Ethernet et un Yocto-I2C


Réalisation

La matrice de LED est fixée sur un plaque de verre acrylique fixée YoctoHub-Ethernet à l'aide d'entretoises filetées. Toute l'électronique tient dans une petite boîte en bois fabriquée pour l'occasion.

L'électronique
L'électronique


Les plaques de verre acryliques sont maintenue ensemble avec du ruban adhésif en aluminium qui a l'avantage de réfléchir la lumière qui essaye de s'échappe par les bords de plaques. Entre chaque plaque il y a un petit cadre en carton noir qui a deux fonctions: il sert d'entretoise pour aligner les plaques avec les LED et il masque les arrêtes des plaques qui on tendance à s'illuminer.


Assemblage des couches   C'est fini
Construction du bloc optique


Pour faciliter la construction, les plaques sont percées dans les quatre coins. Lors de la construction, il suffit d'enfiler des cure-dents dans ces trous pour être sûr que les plaques restent parfaitement alignées.

C'est fini
C'est fini


Programmation

Le code qui gère tout ça est écrit en PHP. C'est un script qui peut être placé sur un serveur quelconque. Il est appelé grâce à l'API Callback du YoctoHub-Ethernet. Ce script fait une requête sur OpenWeatherMap, pour connaitre le temps prévu sur les prochaines 18 heures, et illumine les plaques correspondantes.

Et c'est la que se trouve la subtilité de ce bricolage: les séquences I2C nécessaires pour initialiser puis piloter la matrice de LED sont plutôt lourdes: de l'ordre du millier de bytes. Plutôt que de les transférer depuis le script PHP, on les a pré-calculées sous forme de Jobs stockés dans le Yocto-I2C, et le PHP n'a plus qu'à lancer le job correspondant aux conditions météo qu'il a pré-calculées.

Du coup, le code PHP qui sert a géré notre afficheur est assez court :

require 'yocto_api.php';
require 'yocto_i2cport.php';
$key = "**Put your openWeatherAPI key here**";

//Cartigny, Switzerland.
$latitude= 46.17;
$longitude= 6.02;

$stats = ["sun"=>0,"cloud"=>0,"rain"=>0,"snow"=>0];

// get forecast data from openWeatherMap
$url=  "http://api.openweathermap.org/data/2.5/forecast";
$fullurl=$url."?lat=$latitude&lon=$longitude&APPID=$key";
$data = json_decode(@file_get_contents($fullurl));
if (is_null($data))die("Cannot load data from OpenWeather ($fullurl)");
if (!key_exists("cod",$data))die("Cannot parse data from OpenWeather ($fullurl)");
if ($data->cod!=200) die("OpenWeather error".$data->message);

// Crude method : count cloud, sun, rain and snow events based on condition code
for ( $i=0;$i<6;$i++)
{  printf($data->list[$i]->weather[0]->id." : ".$data->list[$i]->weather[0]->description."<br>\n");
   $id= $data->list[$i]->weather[0]->id;
   if (($id>=200) &&($id<=599))  {$stats["cloud"]++;$stats["rain"]++;}
   if (($id>=600) &&($id<=699))  {$stats["cloud"]++;$stats["snow"]++;}
   if (($id>=700) &&($id<=799))  {$stats["cloud"]++;}
   if ($id==800) {$stats["sun"]++;}
   if ($id==801) {$stats["sun"]++;$stats["cloud"]++;}
   if ($id>=802) {$stats["cloud"]++;}
}

// sort the stats array to find out  most represented events and
// decide best weather representation
arsort($stats);
$keys     = array_keys($stats);
$weather = "clear";
if (($keys[0]=="snow") || ($keys[1]=="snow"))  $weather= "snowy";
else if (($keys[0]=="rain")   || ($keys[1]=="rain"))  $weather= "rainy";
else if ((($keys[0]=="sun")   && ($keys[1]=="cloud")) ||
         (($keys[0]=="cloud") && ($keys[1]=="sun"))) $weather= "cloudy";
else if  ($keys[0]=="cloud")  $weather= "overcast";

// some debug info
for ($i =0; $i< count($keys); $i++)
  print($keys[$i].":" .$stats[$keys[$i]]."<br>\n");
Printf("Weather : $weather <br>\n");

// if we are running a call back, lets find the
// I2C  function and use it to start the job
//  matching the weather variable.
try
{if (yRegisterHub("callback") == (YAPI::SUCCESS))
 { $i2c= yFirstI2cPort();
   if (is_null($i2c)) Print("No i2c port found");
                 else $i2c->selectJob("$weather.job");
   yFreeAPI();
 }
}
catch (Exception $e) {
    print( "YAPI  error: ".  $e->getMessage(). "<br>\n");
}
print("Done.");



Configuration

La configuration du système est relativement simple, elle consiste à

  • Hardcoder dans le script PHP les coordonnées de l'endroit dont on veut connaitre les prévisions météo, on pourrait améliorer en passant les coordonées sur l'url du call back.
  • Uploader les fichiers .job sur le Yocto-I2C
  • Configuer le YoctoHub-Ethernet pour qu'il fasse un callback Yoctopuce API sur le script PHP, une fois par heure est largement suffisant.

Les commandes I2C sont sockées dans les jobs, notez la taille des fichiers
Les commandes I2C sont sockées dans les jobs, notez la taille des fichiers


Résultat

Et voici le résultat. En vrai, l'effet est encore plus saisissant: les icones semblent suspendues dans un bloc transparent et s'illuminent sans que l'on puisse voir d'où vient la lumière.

C'est encore plus spectaculaire en vrai
C'est encore plus spectaculaire en vrai


Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.