ZigBee : Decouverte des modules Xbee

Description :

Le but de cet article est une présentation et rapide mise en œuvre du Zigbee en utilisant les modules Xbee de DIGI.

Vous pouvez consulter l’article de Wikipedia pour en apprendre plus sur le protocole ZigBee. En ce qui me concerne j’ai souvent tendance a dire que le ZigBee est le WIFI des microcontroleur ayant pour optique principale une consommation réduite d’énergie.

ZigBee_comparaison

Le ZigBee semble donc être la technologie idéale pour les réseaux de capteurs en domotique 😉

Dans un réseau mailles ZigBee il y a 3 types de nœuds : coordinateur, routeur, et “end device”. Pour résumer….le coordinateur est nécessaire et gère l’ensemble du réseau. Les routeurs routent les paquets qui ne peuvent pas être atteint en directs. Les “End Device” sont les capteurs a proprement parle.

Le réseau minimum doit donc être compose d’un coordinateur et au moins 1 “end device”. Vous trouverez plus de détails sur les réseaux zigbee mailles ici. Le type du module Xbee est déterminé par sa configuration.

Création d’un réseau maille :

Matériel :

J’utilise les modules Xbee de Digi (Serie 2 uniquement) comme module ZigBee dont vous trouverez une documentation complète ici. Pour résumer il faut savoir que les modules Xbee propose plusieurs configuration en fonction de ce que l’on veut faire : ZigBee ou ZNet. Le Znet est l’ancien protocole et il n’est pas conseillé de l’utiliser (Cf Site officiel Digi : ZNet 2.5 was an interim mesh-networking release until we had full Zigbee compliance (ZB)).

Module Xbee de Digi

Je n’utilise que les Serie 2 des modules Xbee qui sont complétement compatibles avec le protocole ZigBee et permettent les réseaux mailles ! Une liste exhaustive des différences entre les Xbee Serie 1 et Xbee Serie 2 est disponible ici.

Les modules Xbee communiqueront avec le PC par une liaison série (au travers d’un port USB). Pour permettre cette communication je vous conseil d’acheter un “explorateur Xbee” tel que le modèle de sparkfun disponible ici.

Configuration :

Maintenant que tout le matériel nécessaire est présenté…. passons à l’attaque. Un module Xbee sera configure en coordinateur (il faut obligatoirement un coordinateur pour le réseau) et l’autre module sera configure en “end device”. La configuration des modules peut se faire de plusieurs manière mais le plus simple/rapide est d’utiliser le logiciel X-Ctu (téléchargeable ici) distribue par Digi combiné a un explorateur Xbee.

Je ne détaille pas toutes les possibilités de X-CTU (vous trouverez ici une documentation complète sur le logiciel). Sur le premier onglet il faut penser a activer le mode API (niveau 2) pour être capable de dialoguer avec le module. Ceci est uniquement vrai si les modules sont déjà configuré en mode API !! Si vos modules ne sont pas encore configurés en mode API vous pouvez le faire en utilisant cet article.

On peut ensuite lire la configuration des modules avec l’onglet “modem configuration” pour chaque module : Le coordinateur et le end-device.

Pour que les 2 modules fassent partis du même réseau il suffit de leur mettre le même “PAN ID” (Personal Area Network). De plus il faut bien penser a choisir les bons types (1 coordinateur ZIGBEE et 1 end device ZIGBEE).

Voilà la configuration du “coordinateur” zigbee avec le PAN ID égale a 234. Le mode API active (mode 2), ainsi que son nom sur le réseau “COORDINATOR”. Ce nom sera utilisé pour l’envoie de message (pour éviter la lourdeur de l’adresse 64 bits).

La configuration du “end device” est similaire dans le sens où elle utilise également le PAN ID 234 et le mode API. En plus il faut penser a vérifier la configuration du paramètre “D0” pour s’assurer que le setting correspond à “NODE IDENTIFICATION BUTTON”. Ce paramètre assure qu’un changement d’état de la PIN DIO0 du module générera un message d’identification du nœud. C’est grâce à ça que nous pourrons vérifier que notre réseau fonctionne bien en s’assurant que ce message est reçu par le “coordiantor”.

Voilà à quoi devrai ressembler vos 2 modules pour pouvoir passer à l’étape suivante de communication réseau.

Mise en œuvre :

Le principe du test est très simple et ne repose sur aucun code (et ne peut donc pas comporter d’erreur). J’utilise ce test pour vérifier le bon fonctionnement de mon réseau/module. Grâce a la configuration du “end device” fait précédemment on sait que chaque front sur l’input DIO0 va générer un message de “node identification” qui sera reçu par notre coordinateur. Il suffit ensuite d’installer un logiciel sur le PC capable de recevoir les trames série. J’utilise principalement 2 logiciels pour ca : Advance Serial Port Monitor et Docklight (les 2 fonctionnent bien à vous de les essayer).

Il faut donc générer un front sur l’entree DIO0 du “end device” en mettant l’entrée a 0Volt un bref instant. Pour cela vous pouvez relier cette entrée avec la PIN masse du module.

Ceci va générer le message de “node identification” qui sera reçu par le coordinateur. Voilà ce que vous devriez obtenir sur le coordinateur.

 Analyse du message :

Voilà l’analyse de la trame réseau reçu par le coordinateur du réseau.

Offset Signification Valeur recu Explication
Message Trame
0 Debut de message 0x7E
1 Taille message (MSB) 0x00 0x22 = 34 bytes en plus (sans compter le checksum)
2 Taille message (LSB) 0x22
3 Type de frame 0x95
4 Adresse 64 bits émetteur(MSB) 0x00 0x007D33A200 correspond en fait à 0x0013A200 car le bit 0x13 est remplacé par 0x7D33 à cause du mode API 2 qui remplace certains caractères spéciaux (0x13 est utilisé dans le control de gestion de message)
5 Adresse 64 bits émetteur 0x7D
6 Adresse 64 bits émetteur 0x33
7 Adresse 64 bits émetteur 0xA2
8 Adresse 64 bits émetteur 0x00
9 Adresse 64 bits émetteur 0x40 0x406B7B64 correspond aux 32 bits de poids faible de l’adresse réseau du module. Cette adresse ne changera jamais
10 Adresse 64 bits émetteur 0x6B
11 Adresse 64 bits émetteur 0x7B
12 Adresse 64 bits émetteur(LSB) 0x64
13 Adresse 16 bits émetteur(MSB) 0xDE 0xDE39 est l’adresse 16 bits du module. Visible dans la configuration du module (paramètre MY). Attention cette adresse peut changer
14 Adresse 16 bits émetteur(LSB) 0x39
15 Option reçue 0x01 Acknowledge (car ce type de message peut aussi être une réponse générée suite à une requête du coordinateur)
16 Adresse 16 bits émetteur (MSB) 0xDE 0xDE39 est l’adresse 16 bits du module. Visible dans la configuration du module (paramètre MY). Attention cette adresse peut changer
17 Adresse 16 bits émetteur (LSB) 0x39
18 Adresse 64 bits émetteur (MSB) 0x00 0x007D33A200 correspond en fait à 0x0013A200 car le bit 0x13 est remplacé par 0x7D33 à cause du mode API 2 qui remplace certains caractères spéciaux (0x13 est utilisé dans le control de gestion de message)
19 Adresse 64 bits émetteur 0x7D
20 Adresse 64 bits émetteur 0x33
21 Adresse 64 bits émetteur 0xA2
22 Adresse 64 bits émetteur 0x00
23 Adresse 64 bits émetteur 0x40 0x406B7B64 correspond aux 32 bits de poids faible de l’adresse réseau du module. Cette adresse ne changera jamais
24 Adresse 64 bits émetteur 0x6B
25 Adresse 64 bits émetteur 0x7B
26 Adresse 64 bits émetteur (LSB) 0x64
27 Node Identifier émetteur(MSB) 0x45 0x45443100 = ED1/0 (string) et correspond au nom du module émetteur. Ce nom est un paramètre (NI) du module visible ds X-CTU
28 Node Identifier émetteur 0x44
29 Node Identifier émetteur 0x31
30 Node Identifier émetteur (LSB) 0x00
31 Adresse 16 bits du parent (MSB) 0xFF 0xFFFE car notre module émetteur n’a pas de parent
32 Adresse 16 bits du parent (LSB) 0xFE
33 Type de device 0x01 0x01 indique que notre “end device” est un module de type routeur
34 Evènement générateur de l’envoie du message 0x01 Le message d’identification a été envoyé suite à un front sur l’entrée DIO0
35 DIGI profil ID (MSB) 0xC1
36 DIGI profil ID (LSB) 0x05
37 Identification du constructeur du module (MSB) 0x10
38 Identification du constructeur du module (LSB) 0x1E
39 Checksum du message 0x10

Voilà! Nous avons créé un réseau ZIGBEE comportant 2 modules Xbee serie 2 de DIGI en utilisant le mode API. Nous avons également présenté un trame ZigBee ce qui nous permettra dans un prochain tutorial de créer un réseau plus large et de faire communiquer plusieurs module Xbee couple avec des cartes Arduino.

Site web dynamique AJAX (Jquery et Php)

Description :

Notre but est de créer un site web pour montrer le réseau de transport indien (Aérien et Ferroviaire). L’utilisateur choisit les réseaux (uniquement 2 réseaux pour le moment : AIR et RAIL) qu’il souhaite voir et une carte est mise a jour automatiquement.

 Librairies :

  • Jquery : librairies de fonction JavaScript
    «jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development.»
    http://jquery.com/
  • Gmap3 : librairie Jquery wrappant l’API Javascript de google map
    «A JQuery plugin to create google maps with advanced features (overlays, clusters, callbacks, events…) »
    http://gmap3.net/

 Fonctionnement :

Dans un premier temps il faut installer les frameworks nécessaires. Gmap3 contient déjà une version de Jquery et il n’est donc pas nécessaire d’installer Jquery directement. L’installation de Gmap3 est très simple (voir leur site) et se résume à 2 fichiers à uploader sur votre serveur (gmap3.min.js et jquery-1.6.1.min.js)

Il faut également une database Sqlite qui contient les gares et les aéroports indiens…. Je vous laisse trouver ca sur le net.

Le processus se fait dans 2 fichiers distincts :

ServiceProvider

Il est le provider de données et interroge la DataBase Sqlite en utilisant l’interface de PHP Data Objects (PDO). Cette interface permet une abstraction du SGBD utilise et on peut donc imaginer migrer vers une nouvelle base sans difficulté). Pour plus de détails sur PDO http://www.php.net/manual/fr/intro.pdo.php

Le Service Provider est appelé depuis la page d’accueil du site en AJAX avec un argument « action » (dont la valeur peut être AIR ou RAIL) et renvoi les stations correspondantes (aéroport ou gare) a la page d’accueil. La réponse est le résultat de la requête SQL encode en JSON (pour plus d’info sur le JSON http://fr.wikipedia.org/wiki/JavaScript_Object_Notation).

<?php
try
{
	//connect to SQLite database
	$dbh = new PDO("sqlite:../DataBase/DataBase2.db");

	if(isset($_REQUEST['action']))
	{
		switch($_REQUEST['action'])
		{
			case "AIR" :
			//SQL works
			$aSqlRequest = "select ... from AIR where (COUNTRY='IN')";
			break;
			case "RAIL" :
			$aSqlRequest = "select ... from RAIL where (COUNTRY='IN')";
			break;
		}
		$aListOfPointRequest = $dbh->query($aSqlRequest);
		$aListOfPoint = $aListOfPointRequest->fetchAll();
		//Response object
		$resultat = $aListOfPoint;
		print(json_encode($resultat));
	}

	//close the database connection
	$dbh = null;
}
catch(PDOException $e)
{
	echo $e->getMessage();
}
?>

La page d’accueil

Elle gère la vue et les interactions avec l’utilisateur.
A chaque changement dans la liste des modes de transport (RAIL ou AIR) la page envoi une requête AJAX au service provider pour récupérer les points et mettre à jour la carte. Voici le code simplifié avec les commentaires ajoute pour mieux comprendre :

$('input', $dpts).change(function () {
<<-- Recupere le tag clique (AIR ou RAIL)
  var region = $('label[for=' + $(this).attr('id') + ']', $dpts).html(),
<<-- Est ce que le tag a ete selectionne ou deselectionne
    checked = $(this).is(':checked'),
    map = $('#test1').gmap3('get'),
    markers;
<<-- Si le tag clique a ete selectionne
  if (checked) {
<<-- Appel AJAX au data provider avec le TAG clique (AIR ou RAIL)
    $.getJSON("ServiceProvider.php", {"action": region,"nombre_a": region},
<<-- fonction declanche lors de la reception AJAX du service provider
	function (data2) {
      $("input#resultat_addition").val(data2['resultat_addition']);
      var aTravelLocations = data2;
      var data = [];
<<--Mise a jour des donnees avec les nouvelles locations recu du data provider
      $.each(aTravelLocations, function (i, ville) {
        data.push({lat: ville.LATITUDE,lng: ville.LONGITUDE,tag: region,data: ville,
options: {icon: new google.maps.MarkerImage("http://djynet.net/Icon/" + region + ".png")}
        });
      });
<<-- mettre a jour la carte avec les nouveaux marqueurs (dans data)
      $('#test1').gmap3({action: 'addMarkers',markers: data});
    });
  }
<<-- le tag clique a ete deselctionne (on doit efface les marqueurs qui ont ce tag)
  else {
<<-- effacer les marqueurs qui ont le tag deselectione (AIR par exemple)
  var clear = {action: 'clear',name: 'marker',tag: region};$('#test1').gmap3(clear);
  }
});

Voilà le code complet de la page :

<html>

  <head>
	<TITLE> Indian Transportation Map </TITLE>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="jquery-1.6.1.min.js"></script>
    <script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script>
    <script type="text/javascript" src="gmap3.min.js"></script>
    <style>
      body {
        text-align:center;
      }
      #container {
        width: 100%;
        height: 90%;
        margin: 2% auto;
      }
      .gmap3 {
        border: 1px dashed #C0C0C0;
        width: 90%;
        height: 100%;
      }
      #dpts {
        float:right;
        width: 10%;
        height: 33%;
        text-align:left;
        border: 1px solid #999999;
        font-family: verdana;
        font-size: 11px;
        background-color:#99B3CC;
        color:#000000;
        text-shadow: #ffffff 1px 1px, #ffffff -1px 1px, #ffffff -1px -1px, #ffffff 1px -1px;
        line-height:17px;
      }
      #dpts input[type=checkbox] {
        margin-right:10px;
      }
    </style>
    <script type="text/javascript">
      $(function () {
        var regions = [];
        var k = [];
        var $dpts = $("#dpts");
        regions.push("RAIL");
        regions.push("AIR");
        regions = regions.sort();
        for (k in regions) {
          $dpts.append('<input id="chk' + k + '" type="checkbox"><label for="chk' + k + '">' + regions[k] + '</label><br />');
        }
        $('input', $dpts).change(function () {
          var region = $('label[for=' + $(this).attr('id') + ']', $dpts).html(),
            checked = $(this).is(':checked'),
            map = $('#test1').gmap3('get'),
            markers;
          if (checked) {
            $.getJSON("ServiceProvider.php", {
              "action": region,
              "nombre_a": region
            }, function (data2) {
              $("input#resultat_addition").val(data2['resultat_addition']);
              var aTravelLocations = data2;
              var data = [];
              $.each(aTravelLocations, function (i, ville) {
                data.push({
                  lat: ville.LATITUDE,
                  lng: ville.LONGITUDE,
                  tag: region,
                  data: ville,
                  options: {
                    icon: new google.maps.MarkerImage("http://djynet.net/Icon/" + region + ".png")
                  }
                });
              });
              $('#test1').gmap3({
                action: 'addMarkers',
                markers: data
              });
            });
          }
          else {
            var clear = {
              action: 'clear',
              name: 'marker',
              tag: region
            };
            $('#test1').gmap3(clear);
          }
        });
        $('#test1').gmap3({
          action: 'init',
          options: {
            center: [46.578498, 2.457275],
            zoom: 5
          }
        });
      });
    </script>

    <body>
      <div id="container">
        <div id="dpts"></div>
        <div id="test1"></div>
      </div>
    </body>

</html>

Le résultat final est visible ICI :

http://djynet.net/GoogleMapTest2/

 

 

 

RTC avec Arduino

Principe

L’application affiche l’heure et la date toutes les secondes

Materiel

Cablage

Code source

#include <Wire.h>
#include <LCDI2C.h>

//I2C display adress (found by I2C scanner
#define LCDI2C_ADDRESS 0x3B
//I2C RTC adress (found by I2C scanner - doc)
#define DS1307_I2C_ADDRESS 0x68

#if defined(ARDUINO) && ARDUINO >= 100   // Arduino v1.0 and newer
  #define I2C_WRITE Wire.write 
  #define I2C_READ Wire.read
#else                                   // Arduino Prior to v1.0 
  #define I2C_WRITE Wire.send 
  #define I2C_READ Wire.receive
#endif

//int currentValue = 0;
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
byte zero;
char  *Day[] = {"","Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
char  *Mon[] = {"","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
//I2C display setup : Number of lines, char and i2c address of the display
LCDI2C lcd = LCDI2C(2,16,LCDI2C_ADDRESS);  

void setup() 
{
  //Start I2C bus
  Wire.begin();
  Serial.begin(57600); 
  setDateDs1307();

  //Init the display, clears the display
  lcd.init();                          
  lcd.printstr("Starting...");

  //Init RTC
  zero=0x00;
}

void updateDisplayedValue() 
{
  lcd.clear();

  //Prepare Date string
  String aDate("Date: ");
  String aDoW(Day[dayOfWeek]);
  aDate = aDate.concat(aDoW);
  String aDoM(dayOfMonth, DEC);
  aDate = aDate.concat(aDoM);
  String aMon(Mon[month]);
  aDate = aDate.concat(aMon);

  //Display it in the first line
  char charBuf[50];
  aDate.toCharArray(charBuf, 50);
  lcd.printstr(charBuf);

  //Prepare Time string
  lcd.setCursor(1,0);
  String aTime("Time: ");
  String aHour(hour, DEC);
  aTime = aTime.concat(aHour);
  String aSpace(".");
  aTime = aTime.concat(aSpace);
  String aMin(minute, DEC);
  aTime = aTime.concat(aMin);
  aTime = aTime.concat(aSpace);
  String aSec(second, DEC);
  aTime = aTime.concat(aSec);

  //Display it in the second line
  aTime.toCharArray(charBuf, 50);
  lcd.printstr(charBuf);
}

void setDateDs1307()                
{
  //T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99) - T(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year) - T Sets the date of the RTC DS1307 Chip. 
   second = (byte) (0); // Use of (byte) type casting and ascii math to achieve result.  
   minute = (byte) (54);
   hour  = (byte) (12);
   dayOfWeek = (byte) (7);
   dayOfMonth = (byte) (18);
   month = (byte) (02);
   year= (byte) (12);
   Wire.beginTransmission(DS1307_I2C_ADDRESS);
   I2C_WRITE(zero);
   I2C_WRITE(decToBcd(second) & 0x7f);    // 0 to bit 7 starts the clock
   I2C_WRITE(decToBcd(minute));
   I2C_WRITE(decToBcd(hour));      // If you want 12 hour am/pm you need to set
                                   // bit 6 (also need to change readDateDs1307)
   I2C_WRITE(decToBcd(dayOfWeek));
   I2C_WRITE(decToBcd(dayOfMonth));
   I2C_WRITE(decToBcd(month));
   I2C_WRITE(decToBcd(year));
   Wire.endTransmission();
}

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

// Gets the date and time from the ds1307 and prints result
void getDateDs1307()
{
  // Reset the register pointer
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  I2C_WRITE(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  // A few of these need masks because certain bits are control bits
  second = bcdToDec(I2C_READ() & 0x7f);
  minute = bcdToDec(I2C_READ());
  hour = bcdToDec(I2C_READ() & 0x3f);  // Need to change this if 12 hour am/pm
  dayOfWeek  = bcdToDec(I2C_READ());
  dayOfMonth = bcdToDec(I2C_READ());
  month = bcdToDec(I2C_READ());
  year = bcdToDec(I2C_READ());
}

void loop()
{
  //retrieve RTC info
  getDateDs1307();
  //display time
  updateDisplayedValue();
  //wait a little                       
  delay(1000);                                            
}

librairies

  • LCDI2C : http://www.arduino.cc/playground/Code/LCDi2c
  • Wire : http://www.arduino.cc/en/Reference/Wire
  • Arduino beta 23

Connection Afficheur LCD I2C avec Arduino

Principe

Une variable est incrémenté a chaque boucle et affichée

Materiel

Cablage

Code source

 

#include <Wire.h>
#include <LCDI2C.h>

const int PIN_BOUTON_RESET = 6;
int currentValue = 0;

//I2C display adress (found by I2C scanner
#define LCDI2C_ADDRESS 0x3B

//I2C display setup : Number of lines, char and i2c address of the display
LCDI2C lcd = LCDI2C(2,16,LCDI2C_ADDRESS);             

void setup()
{
  //defined input button
  pinMode(PIN_BOUTON_RESET,INPUT);

  //Active resistor as pull up
  digitalWrite(PIN_BOUTON_RESET,HIGH);

  //Start I2C bus
  Wire.begin();

  //Init the display, clears the display
  lcd.init();
  lcd.printstr("Starting...");
}

void updateDisplayedValue()
{
  lcd.clear();
  lcd.printstr("Value");
  lcd.setCursor(1,0);
  String atexte=String(currentValue);
  char charBuf[50];
  atexte.toCharArray(charBuf, 50);
  lcd.printstr(charBuf);
}

void loop()
{
  //Read button status
  int aInputDigitalValue = digitalRead(PIN_BOUTON_RESET);
  //Reset the counter if button is press
  if (aInputDigitalValue == LOW)
  {
    currentValue=0;
  }
  else
  {
    currentValue=currentValue+1;
  }
  //update the display with new value
  updateDisplayedValue();
  //wait a little
  delay(150);
}

librairies

  • LCDI2C : http://www.arduino.cc/playground/Code/LCDi2c
  • Wire : http://www.arduino.cc/en/Reference/Wire
  • Arduino beta 23

Detection de presence avec Arduino

Principe

Une variable est incrémenté a chaque boucle et affichée. Un passage devant le détecteur fait passer l’input a l’état haut et remet a 0 le compteur.

Materiel

Cablage

Code source

#include <Wire.h>
#include <LCDI2C.h>

const int PIN_BOUTON_RESET = 6;
int currentValue = 0;

//I2C display adress (found by I2C scanner
#define LCDI2C_ADDRESS 0x3B

//I2C display setup : Number of lines, char and i2c address of the display
LCDI2C lcd = LCDI2C(2,16,LCDI2C_ADDRESS);             

void setup()
{
  //defined input button
  pinMode(PIN_BOUTON_RESET,INPUT);

  //Active resistor as pull up
  //digitalWrite(PIN_BOUTON_RESET,HIGH);

  //Start I2C bus
  Wire.begin();

  //Init the display, clears the display
  lcd.init();
  lcd.printstr("Starting...");
}

void updateDisplayedValue()
{
  lcd.clear();
  lcd.printstr("Value");
  lcd.setCursor(1,0);
  String atexte=String(currentValue);
  char charBuf[50];
  atexte.toCharArray(charBuf, 50);
  lcd.printstr(charBuf);
}

void loop()
{
  //Read button status
  int aInputDigitalValue = digitalRead(PIN_BOUTON_RESET);
  //Reset the counter if button is press
  if (aInputDigitalValue == HIGH)
  {
    currentValue=0;
  }
  else
  {
    currentValue=currentValue+1;
  }
  //update the display with new value
  updateDisplayedValue();
  //wait a little
  delay(150);
}

librairies

  • LCDI2C : http://www.arduino.cc/playground/Code/LCDi2c
  • Wire : http://www.arduino.cc/en/Reference/Wire
  • Arduino beta 23

Mesure de lumiere avec Arduino

Principe

La valeur du capteur de lumière est affiche sur le LCD

Materiel

Cablage

Code source

#include <Wire.h>
#include <LCDI2C.h>

const int PIN_INPUT_SENSOR = A0;
int currentValue = 0;

//I2C display adress (found by I2C scanner
#define LCDI2C_ADDRESS 0x3B

//I2C display setup : Number of lines, char and i2c address of the display
LCDI2C lcd = LCDI2C(2,16,LCDI2C_ADDRESS);             

void setup()
{
  //Start I2C bus
  Wire.begin();

  //Init the display, clears the display
  lcd.init();
  lcd.printstr("Starting...");
}

void updateDisplayedValue()
{
  lcd.clear();
  lcd.printstr("Value");
  lcd.setCursor(1,0);
  String atexte=String(currentValue);
  char charBuf[50];
  atexte.toCharArray(charBuf, 50);
  lcd.printstr(charBuf);
}

void loop()
{
  //Read sensor value
  currentValue = analogRead(PIN_INPUT_SENSOR)*100;

  //update the display with new value
  updateDisplayedValue();

  //wait a little
  delay(150);
}

librairies

  • LCDI2C : http://www.arduino.cc/playground/Code/LCDi2c
  • Wire : http://www.arduino.cc/en/Reference/Wire
  • Arduino beta 23