Publié le

Module RTC et Arduino

Aujourd’hui je vais me pencher sur les modules RTC (Real Time Clock) et voir ce qu’on peut en faire avec un Arduino (Méga dans mon cas).

 

Matériel requis :

 

  • Un Arduino MEGA;
  • Un module RTC DS3231;

Description du module RTC :

 

Le module que j’ai choisit dispose d’une batterie Lithium pour nous permettre de de sauvegarder l’heure et la date si on le débranche (plus pratique qu’un module RTC sans pile).

IMG_2461

Dans cet exemple, nous n’allons utiliser que les entrée SDA et SCL (Nous verrons plus tard à quoi servent 32K et SQW).

Nous allons avoir besoin de deux librairies pour faire fonctionner le programme :

  • Wire.h qui est inclue dans les librairies Arduino
  • RTClib.h que vous pouvez trouver ici : RTClib.h

Pour connecter le module RTC sur un Arduino MEGA, il suffit juste de raccorder SCL sur le pin 21 et SDA sur le pin 20 ainsi que l’alimentation évidement !

RTC_bb

 

Programmation :

Premier test : 

#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC; // Avec cette librairie on déclare le DS3231 comme un DS1307

void setup() {
 Serial.begin(9600);
 Wire.begin();
 RTC.begin();
}

void loop() {
  //Affichage de l'heure
  DateTime now = RTC.now(); // Lit l'heure du module
  Serial.print(now.day(), DEC); // Affiche le jour
  Serial.print('/');
  Serial.print(now.month(), DEC); // Affiche le mois
  Serial.print('/');
  Serial.print(now.year(), DEC);  //Affiche l'année
  Serial.print(' ');
  Serial.print(now.hour(), DEC); //Affiche les heures
  Serial.print(':');
  Serial.print(now.minute(), DEC); // Affiche les minutes
  Serial.print(':');
  Serial.print(now.second(), DEC); // Affiche les secondes
  Serial.println();
  delay(3000);

}

Résultat :

Progr1

Ah non, nous ne sommes pas le 1er Janvier 2000 à minuit !

 

Mise à l’heure du module :

Nous allons ouvrir un nouvel onglet pour créer une fonction qui va mettre notre module à l’heure par rapport à l’heure de compilation du programme. Assez pratique même si nous aurons quelques secondes de décalage par rapport à l’heure de notre PC.

On modifie juste le « void setup » pour ajouter la fonction « reglageheure() »

void setup() {
 Serial.begin(9600);
 Wire.begin();
 RTC.begin();
reglageheure();
}

On ouvre un onglet pour la fonction avec le code suivant :

void reglageheure()
{
  Serial.println("Mise a l'heure");
  RTC.adjust(DateTime(__DATE__, __TIME__));
  DateTime now = RTC.now();
  Serial.print(now.day(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.year(), DEC);
  Serial.print(' ');
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
  delay(5000);
}

On compile et on ouvre le moniteur série :

mise à l'heure

Heure de mon iMac : 16:45:06

Heure du module RTC : 16:44:52

Nous avons donc 14 secondes d’écart entre les deux ce qui reste convenable.

 

Publié le

Commande d'éclairage de LEDs par un relais avec un Arduino

Les relais peuvent être utile pour commander un appareil en 220V à partir de l’Arduino. Par exemple on peut commander un éclairage, une pompe… Ici je vous propose de voir simplement comment fonctionne un relais :

 

Matériel requis :

  • Un Arduino Mega;
  • 2 Résistances 330Ω;
  • 2 LEDs (une bleu, une rouge);
  • Des fils;

Le montage :

 

Pour étudier le relais on va tester les deux sorties du relais, la led bleu sera allumée puis la rouge et ainsi de suite :

relais+led_bb

Programmation :

Programmation relativement simple ici, on change juste l’état du pin 3 pour faire commuter le relais :

const int RELAIS = 3; // On déclare le PIN sur lequel est connecté In1 du relais
boolean EtatRelais = 0; // On crée un booléen ( 0 - 1) pour définir l'état du PIN 3

void setup() {
  pinMode(RELAIS,OUTPUT); // On définit le pin 3 comme une sortie

}

void loop() {
  EtatRelais =! EtatRelais; // On inverse la valeur du booléen ( Note : "!=" signifie différent et "=!" donne l'inverse)
  digitalWrite(RELAIS,EtatRelais);
  delay(2500*);

}

 

Résultat :

Et voilà, on sait a présent faire fonctionner le relais.

Publié le

Organisation différente d'un programme Arduino

Aujourd’hui je ne vous propose pas un nouveau montage, mais plutôt de regarder comment on peut améliorer la visibilité dans un programme Arduino.

Le programme de base :

Je vais reprendre le programme que j’avais fait pour le capteur température avec l’afficheur LED à segments.

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2
OneWire ourWire(ONE_WIRE_BUS);
DallasTemperature sensors(&ourWire);



float temp;
int temp2;



int ledA = 13;
int ledB = 4;
int ledC = 8;
int ledD = 11;
int ledE = 12;
int ledF = 3;
int ledG = 5;
int Ana1 = 6;
int Ana2 = 7;
int Ana3 = 9;
int Ana4 = 10;

void setup() {
  Serial.begin(9600);
  pinMode(ledA, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(ledC, OUTPUT);
  pinMode(ledD, OUTPUT);
  pinMode(ledE, OUTPUT);
  pinMode(ledF, OUTPUT);
  pinMode(ledG, OUTPUT);
  pinMode(Ana1, OUTPUT);
  pinMode(Ana2, OUTPUT);
  pinMode(Ana3, OUTPUT);
  pinMode(Ana4, OUTPUT);
  sensors.begin();

}

void loop() {
   sensors.requestTemperatures();
  Serial.println(sensors.getTempCByIndex(0));
  temp2 = 10* sensors.getTempCByIndex(0);


for (int i=0; i<1000; i++)
    {

     int tab[3];
     tab[0] = temp2 % 10;
     tab[1] = (temp2 /10) % 10 ;
     tab[2] = temp2 /100 ;
     digitalWrite(Ana1,HIGH);
     digitalWrite(Ana2,LOW);
     digitalWrite(Ana3,LOW);
     digitalWrite(Ana4,LOW);
     affichenombre(tab[2]);
     delay(5);
     digitalWrite(Ana1,LOW);
     digitalWrite(Ana2,HIGH);
     digitalWrite(Ana3,LOW);
     digitalWrite(Ana4,LOW);
     affichenombre(tab[1]);
     delay(5);
     digitalWrite(Ana1,LOW);
     digitalWrite(Ana2,LOW);
     digitalWrite(Ana3,HIGH);
     digitalWrite(Ana4,LOW);
     digitalWrite(ledA,LOW);
     digitalWrite(ledB,LOW);
     digitalWrite(ledG,LOW);
     digitalWrite(ledF,LOW);
     digitalWrite(ledC,HIGH);
     digitalWrite(ledD,HIGH);
     digitalWrite(ledE,HIGH);
     delay(5);
     digitalWrite(Ana1,LOW);
     digitalWrite(Ana2,LOW);
     digitalWrite(Ana3,LOW);
     digitalWrite(Ana4,HIGH);
     affichenombre(tab[0]);
     delay(5);

    }
     digitalWrite(Ana1,LOW);
     digitalWrite(Ana2,LOW);

}

void affichenombre(int nombre)

{
  if (nombre != 1 && nombre !=4)
  digitalWrite(ledA,LOW);
  else digitalWrite(ledA,HIGH);

  if (nombre != 5 && nombre !=6)
  digitalWrite(ledB,LOW);
  else digitalWrite(ledB,HIGH);

  if (nombre != 2)
  digitalWrite(ledC,LOW);
  else digitalWrite(ledC,HIGH);

  if (nombre != 1 && nombre !=4 && nombre != 7)
  digitalWrite(ledD,LOW);
  else digitalWrite(ledD,HIGH);

  if (nombre != 1 && nombre != 3 && nombre != 4 && nombre != 5 && nombre != 7 && nombre !=9)
  digitalWrite(ledE,LOW);
  else digitalWrite(ledE,HIGH);

  if (nombre != 1 && nombre != 2 && nombre != 3 && nombre !=7)
  digitalWrite(ledF,LOW);
  else digitalWrite(ledF,HIGH);

  if (nombre != 0 && nombre != 1 && nombre !=7)
  digitalWrite(ledG,LOW);
  else digitalWrite(ledG,HIGH);

}

Personnellement, je le trouve très long à cause des fonctions. Comme j’aime bien avec des programmes propres, je vais mettre mes fonctions dans un autre fichier .ino !

Ajouter un fichier lié :

Capture1

On clique sur la petite flèche et sur « nouvel onglet » :

Capture2

On donne le nom de notre fonction, ici ça sera « affichenombre » (on ne met pas l’extension juste le nom de la fonction) et on y colle le code de notre fonction :

Capture3

Utilité :

Dans la plus part des programmes que j’écris et qui ont été présentés ici pour le moment, il n’y a aucune utilité à mettre les fonction dans un autre fichier, à part une meilleure visibilité dans le programme.

Cependant, quand on a besoin de récupérer une fonction en particulier dans un programme, on sait directement ou la trouver.

 

Publié le

Capteur température avec afficheur 7 segments 4 digits

C’est mon premier article donc ça risque d’être un peu approximatif et je m’en excuse.

J’ai récupéré sur un vieux démodulateur, deux afficheurs 7 segments 2 digits qui étaient couplés sur un CI les afficheurs sont des LA4022 (à anode commune donc) voici les extraits du datasheet :
LA4022

LA4022-2

Voilà a quoi ressemble le module qui était monté sur mon vieux démodulateur :

IMG_1901

En faisant des recherches j’ai vu qu’il fallait ajouter des résistances de 330Ω sur les cathodes (les broches A, B, C, D, E, F et G). Donc sur un premier PCB j’ai monté des headers femelles et mes résistances :

pcb1

Pour la connexion à l’Arduino nano, j’ai monté un second PCB auquel j’ai rajouté une sonde DS18b20 (avec sa résistance de 4.7kΩ) :

Capture

Pour les librairies je les ai téléchargées ici :

https://arduino-info.wikispaces.com/Brick-Temperature-DS18B20

Le code complet :

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2
OneWire ourWire(ONE_WIRE_BUS);
DallasTemperature sensors(&ourWire);



float temp;
int temp2;



int ledA = 13;
int ledB = 4;
int ledC = 8;
int ledD = 11;
int ledE = 12;
int ledF = 3;
int ledG = 5;
int Ana1 = 6;
int Ana2 = 7;
int Ana3 = 9;
int Ana4 = 10;

void setup() {
  Serial.begin(9600);
  pinMode(ledA, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(ledC, OUTPUT);
  pinMode(ledD, OUTPUT);
  pinMode(ledE, OUTPUT);
  pinMode(ledF, OUTPUT);
  pinMode(ledG, OUTPUT);
  pinMode(Ana1, OUTPUT);
  pinMode(Ana2, OUTPUT);
  pinMode(Ana3, OUTPUT);
  pinMode(Ana4, OUTPUT);
  sensors.begin();

}

void loop() {
   sensors.requestTemperatures();
  Serial.println(sensors.getTempCByIndex(0));
  temp2 = 10* sensors.getTempCByIndex(0);


for (int i=0; i<1000; i++)
    {

     int tab[3];
     tab[0] = temp2 % 10;
     tab[1] = (temp2 /10) % 10 ;
     tab[2] = temp2 /100 ;
     digitalWrite(Ana1,HIGH);
     digitalWrite(Ana2,LOW);
     digitalWrite(Ana3,LOW);
     digitalWrite(Ana4,LOW);
     affichenombre(tab[2]);
     delay(5);
     digitalWrite(Ana1,LOW);
     digitalWrite(Ana2,HIGH);
     digitalWrite(Ana3,LOW);
     digitalWrite(Ana4,LOW);
     affichenombre(tab[1]);
     delay(5);
     digitalWrite(Ana1,LOW);
     digitalWrite(Ana2,LOW);
     digitalWrite(Ana3,HIGH);
     digitalWrite(Ana4,LOW);
     digitalWrite(ledA,LOW);
     digitalWrite(ledB,LOW);
     digitalWrite(ledG,LOW);
     digitalWrite(ledF,LOW);
     digitalWrite(ledC,HIGH);
     digitalWrite(ledD,HIGH);
     digitalWrite(ledE,HIGH);
     delay(5);
     digitalWrite(Ana1,LOW);
     digitalWrite(Ana2,LOW);
     digitalWrite(Ana3,LOW);
     digitalWrite(Ana4,HIGH);
     affichenombre(tab[0]);
     delay(5);

    }
     digitalWrite(Ana1,LOW);
     digitalWrite(Ana2,LOW);

}

void affichenombre(int nombre)

{
  if (nombre != 1 && nombre !=4)
  digitalWrite(ledA,LOW);
  else digitalWrite(ledA,HIGH);

  if (nombre != 5 && nombre !=6)
  digitalWrite(ledB,LOW);
  else digitalWrite(ledB,HIGH);

  if (nombre != 2)
  digitalWrite(ledC,LOW);
  else digitalWrite(ledC,HIGH);

  if (nombre != 1 && nombre !=4 && nombre != 7)
  digitalWrite(ledD,LOW);
  else digitalWrite(ledD,HIGH);

  if (nombre != 1 && nombre != 3 && nombre != 4 && nombre != 5 && nombre != 7 && nombre !=9)
  digitalWrite(ledE,LOW);
  else digitalWrite(ledE,HIGH);

  if (nombre != 1 && nombre != 2 && nombre != 3 && nombre !=7)
  digitalWrite(ledF,LOW);
  else digitalWrite(ledF,HIGH);

  if (nombre != 0 && nombre != 1 && nombre !=7)
  digitalWrite(ledG,LOW);
  else digitalWrite(ledG,HIGH);

}

 

Et voici le résultat :

CKWKrTAWwAARykD