Station météo Zigbee

Présentation

Le but de ce projet est la réalisation d’une station capable d’effectuer certaines mesures (luminosité, température, humidité, humidité du sol) et d’envoyer ces données à une autre carte par ZigBee.

Voilà la carte de mesure :

composée de :

  1. Capteur de mesure d’humidité du sol de DF robot (http://www.dfrobot.com/index.php?route=product/product&product_id=599)
  2. Carte Arduino Fio + Module Xbee Serie 2 (en mode API/ZigBee)
  3. Capteur de température et humidité RHT03 de MaxDetect (http://www.sparkfun.com/products/10167)
  4. Capteur de luminosité Phidgets 1127 (http://www.phidgets.com/products.php?product_id=1127_0) déjà utilise lors de précédents montage (lien vers article)
  5. Chargeur/batterie solaire pour téléphone portable relie à l’Arduino Fio

La carte de mesure communique avec une seconde carte autonome (je prévois de la relie a un Raspberry pi (http://www.raspberrypi.org/) dès que j’aurai réussi à m’en procurer un 😉

Voici la carte autonome :

composée de :

  1.  Arduino Uno + “communication shield” avec un module Xbee Serie 2 en Mode Zigbee Routeur API
  2. Carte BP + Led pour interagir avec l’utilisateur
  3. Afficheur LCD I2C Barton déjà utilise dans des montages précédents

La carte Fille

Au boot la carte fille initialise certains éléments tels que la liaison série, Xbee dans la fonction d’init.

void setup()
 {
 // start serial port
 Serial.begin(9600);
 // start serial
 _Xbee.begin(9600);
 }

Ensuite le programme entre dans la boucle principale qui vérifie si un message est arrivé sur la liaison ZigBee

//Read if we received an inoming message
 _Xbee.readPacket();
 if (_Xbee.getResponse().isAvailable()) {
 // got something

Si un message est disponible alors il est stocke dans “_CmdReceived” (qui devient donc non nulle)

_CmdReceived = _ZbRxResp.getData(0);

Ensuite le programme va effectuer certains relevés (température, humidité, luminosité,…) en fonction de la valeur reçu :

if(_CmdReceived==1)
 {
 _DataToSend=analogRead(_InPinLedMeasure);
 }
 else if((_CmdReceived==2)||(_CmdReceived==3))
 {
 delay(50);
 DHT22_ERROR_t errorCode;
 Serial.print("Requesting data...");
 errorCode = _Dht22.readData();
 switch(errorCode)
 {
 case DHT_ERROR_NONE:
 if (_CmdReceived==2)
 {
 _DataToSend=_Dht22.getTemperatureCAsInt();
 }
 else if(_CmdReceived==3)
 {
 _DataToSend=_Dht22.getHumidityAsInt();
 }
 ...
 break;
 }
 }
 else if(_CmdReceived==4)
 {
 _DataToSend=analogRead(_InPinMoistureMeasure);
 }

Enfin, le process envoi la valeur mesure a la carte mère par ZigBee

aPayload[0] = _DataToSend & 0xff; //LSB
 Serial.print("Data0: 0x");
 Serial.println(aPayload[0], HEX);
 aPayload[1] = (_DataToSend >> 8) & 0xff; //MSB
 Serial.print("Data1: 0x");
 Serial.println(aPayload[1], HEX);
// Specify the address of the remote XBee (this is the SH + SL)
 XBeeAddress64 aAddr64 = XBeeAddress64(0x0013a200, 0x400a3e5e);
// Create a TX Request
 ZBTxRequest aZbTx = ZBTxRequest(aAddr64, aPayload, sizeof(aPayload));
// Send your request
 _Xbee.send(aZbTx);

Remarque importante sur la carte fille :

Pour la communication série avec le capteur de température DHT22 j’utilise une librairie disponible ICI. La communication ZigBee entre les modules Xbee se fait en Mode API (pour pouvoir utiliser un réseau MESH) avec la librairie disponible ICI. Je remercie d’ailleurs les DEV de ses librairies qui m’ont fait gagner un temps fou !

La carte Mère

La carte mère est composée d’un adruino UNO + shield ZigBee/Xbee et de 2 interfaces utilisateur : un écran LCD Barton (communication série) et une carte avec 5 BP et 5Leds.

L’écran LCD Barton est le même que dans mes montages précédant ou vous trouverez plus d’explication dessus et des exemples de codes. Les BP sont utilisés par l’utilisateur pour :

  • Choisir la commande a envoyer ({“Moisture”, “Temp”, “Humidity”, “Light”};)
  • Choisir le destinataire de la commande ({0x406b7b64, 0x400a3e5d};). Il s’agit en fait de l’adresse Xbee du module que l’on target.
  • Envoyer la commande au destinataire.

Le choix de la commande et le choix du destinataire fonctionne de la même façon. Les différentes possibilités sont mise dans un ENUM et lie a deux autres tableau : un tableau pour le texte et un autre tableau pour le code de la commande.

enum Tcommand {
  Moisture=0,
  Temp,
  Humidity,
  Light,
  LastCommandIndex
};
const int _possibleCommand[] = {4, 2, 3, 1};
const String _possibleCommandTxt[] = {"Moisture", "Temp", "Humidity", "Light"};

Lors d’un appuie sur le bouton correspondant l’enum est incrémenté (et remis a zéro si on arrive au dernier) et le texte correspondant est affiche sur le LCD grâce a cette méthode :

void changeCommand()
{
  _Command=(Tcommand)(_Command+1);
  if (_Command>=LastCommandIndex)
  {
    _Command=(Tcommand)0;
  }
  lcd.clear();
  lcd.printstr("Command :");
  lcd.setCursor(1,0);
  lcd.printstr(_possibleCommandTxt[_Command]);
}

Une fois que la commande et le destinataire sont choisis il suffit d’envoyer le message avec un appuie sur un BP.

int aPayload=_possibleCommand[_Command];
    Serial.print("We are going to send a ZigBee message with Cmd : ");
    Serial.print(_Command);
    Serial.print(" which correspond to value : ");
    Serial.print(aPayload);
    Serial.print(" to this destination : ");
    Serial.print(_Receiver);
    Serial.print(" which correspond to value : ");
    Serial.println(_possibleReceiver[_Receiver]);
    sendZigBeeMsg(aPayload,_possibleReceiver[_Receiver]);

La commande est envoyée par ZigBee. Vous trouverez qq infos sur le ZigBee (pour les modules Xbee) dans mes articles précédents. Je vous rappelle que j’utilise une très bonne lib Xbee dispo ICI. Par rapport a mes premiers montage/code Zigbee j’ai ajouté la gestion du ACK qui fera sonner un buzzer si le message n’est pas bien envoyé/reçu.

void sendZigBeeMsg(unsigned int iPayLoad, unsigned long iAddrToTarget)
{
  Serial.println("We are going to send a ZigBee message");
  // Create an array for holding the data you want to send.
  uint8_t aPayload[1];
  // Fill it with the data
  aPayload[0] = iPayLoad;

  // Specify the address of the remote XBee (this is the SH + SL)
  XBeeAddress64 addr64 = XBeeAddress64(0x0013a200, iAddrToTarget);

  // Create a TX Request
  ZBTxRequest zbTx = ZBTxRequest(addr64, aPayload, sizeof(aPayload));

  // Send your request
  _Xbee.send(zbTx);
  Serial.println("Message Sent - Waiting for the ACK");

  if (_Xbee.readPacket(5000)) {
    Serial.println("We got a response to the message");

    // should be a znet tx status  
    ZBTxStatusResponse aZbTxStatus = ZBTxStatusResponse();        
    if (_Xbee.getResponse().getApiId() == ZB_TX_STATUS_RESPONSE) {
      _Xbee.getResponse().getZBTxStatusResponse(aZbTxStatus);

      // get the delivery status, the fifth byte
      if (aZbTxStatus.getDeliveryStatus() == SUCCESS) {
        Serial.println("The Trx was OK");
      } 
      else {
        Serial.println("Warning : The Trx was KO");
      }
    } 
    else{
      Serial.print("It was not a Trx status. ApiId:");
      Serial.println(_Xbee.getResponse().getApiId());
    }   
  } 
  else {
    Serial.println("Warning : This should never happen");
    flashPin(_OutPinBuz1, 1, 250);
  }
}

La carte mère vérifie également si une donnée a été reçue d’une carte fille (une réponse à une commande envoyée) et l’affiche sur le LCD.

if (_Xbee.getResponse().isAvailable()) {
    // got something
    Serial.println("We have something on the serial");
    Serial.print("ApiId: 0x");
    Serial.println(_Xbee.getResponse().getApiId(), HEX);

    if (_Xbee.getResponse().getApiId() == ZB_RX_RESPONSE) {
      Serial.println("This is a ZB response");

      // now fill our zb rx class
      _Xbee.getResponse().getZBRxResponse(_ZbRxResp);

      Serial.print("Data0: 0x");
      Serial.println(_ZbRxResp.getData(0), HEX);
      Serial.print("Data1: 0x");
      Serial.println(_ZbRxResp.getData(1), HEX);
      _ServoPosition=word(_ZbRxResp.getData(1),_ZbRxResp.getData(0));
      //_ServoPosition = int(_ZbRxResp.getData(0),_ZbRxResp.getData(1));
      updateDisplayedValue(_ServoPosition);

      if (_ZbRxResp.getOption() == ZB_PACKET_ACKNOWLEDGED) {
        Serial.println("This is a ZB ACK");
      } 
    }  
  }

La prochaine étape est d’ajouter la possibilité de piloter la carte mère grâce à un site WEB PHP et une liaison USB depuis mon serveur Linux (ou un Raspberry Pi) pour envoyer les commandes. Je prévois également d’ajouter un pilotage CPL pour commander l’ouverture de volets.

 

Fritzing – Creation de CI

Fritzing est un logiciel open source qui permet de créer des circuits imprimés assez facilement. Avec un peu de chance tous les composants que vous utilisez seront déjà présents dans la bibliothèque (assez réduite à l’heure actuelle). Le résultat est plutôt limite pour l’instant car la gestion du multi-couche n’est pas implémenté. Un exemple de résultat :

Plus de détails sur leur page officiel ici.

Pour créer un nouveau composant je vous conseille de commencer par lire la doc officiel ici ET surtout de ne rien faire avant d’avoir tout compris (il est aussi très pratique d’utiliser les templates disponibles ici).

Voici le résultat obtenu pour le capteur de lumière phidget 1127 :

Source ZIP : Phidget1127_Fritzing

Update library LCDI2C vers arduino 1.0

Ce week-end j’ai voulu utiliser mon afficheur LCD I2C Batron BT HQ 21605AV sur mon nouveau projet ZigBee (un exemple de projet utilisant cet afficheur LCD ici). Comme il s’agit d’un projet que j’ai commencé récemment j’utilise la version 1.0 d’Arduino et la librairie n’est plus compatible.

Cette librairie a été développée en 2009 par Digid (https://public.me.com/digid/fr/) mais pas maintenue à jour par manque de temps. J’ai donc décidé de la migrer à Arduino V1.0 et je poste ici la nouvelle Version en espérant qu’elle puisse servir à d’autres personnes. Les modifications ne sont pas compliquées et détaillées dans le header.

La version compatible Arduino 1.0 est donc disponible ici -> LCD

 

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.

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