On va travailler uniquement sur une vraie carte Arduino UNO R3 d'Italie (l'original).
Lorsque la carte est alimentée par l'USB d'un ordinateur une LED verte s'allumera.
Lorsque la carte est alimentée par un jack une LED verte s'allumera.
Si dans le menu Croquis, puis vous Vérifier/Compiler et que vous ayez un message en rouge, il est possible que votre carte Arduino UNO R3 ne soit pas reconnue à cause de votre USB (com7).
Attention tous les capteurs non pas nécessairement le même brochage.
sketch 01
-1- Voici notre 1er sketch, on va allumer la LED D13 jaune qui se situe sur la carte Arduino UNO R3.
1-
2-void setup() // Appelle qu'à une et une seule boucle d'initialisation
3-{
4-pinMode(13,OUTPUT); // Configurer le pin n°13 de la carte Arduino UNO R3 en sortie
5-}
6-
7-void loop() // Appelle d'une boucle à l'infini
8-{
9-digitalWrite(13,HIGH); // Mettre à +5v le pin n° 13 de la carte Arduino UNO R3 en sortie
10- // Boucle à l'infini
11- }
12-
-2- Allez sur Croquis du menu supérieur et après sur Vérifier/Compiler, ensuite, on va Téléverser!
-3- En dessous de chaque sketch, il y aura moyen de faire un copier-coller du code de l'Arduino IDE.
-4- Évitez, les caractères accentués sauf pour les explications.
-5-// pour une ligne d'explication
/*
pour des explications à plusieurs lignes
*/
void setup ( )
{
// une seule boucle (pour les initialisations)
}
void loop ( )
{
// boucle à l'infini (pour réaliser les instructions les unes après les autres)
}
Un sketch est un bloc de codes en Arduino IDE.
Certains périphériques ont besoin d'une librairie.
Une librairie doit être installée, ce n'est pas toujours facile de trouver la librairie de certains périphériques.
Les variables
boolean 8 bits false true
char 8 bits -128 +127
byte 8 bits 0 255
int 16 bits -32768 +32767
unsigned int 16 bits 0 +65535
long 32 bits -2147483648 +2147483647
unsigned long 32 bits 0 +4294967295
float 32 bits de 6 à 7 chiffres à virgule
Opérateurs logiques de comparaison :
x == y (x est égal à y)
x != y (x est différent de y)
x < y (x est inférieur à y)
x > y (x est supérieur à y)
x <= y (x est inférieur ou égal à y)
x >= y (x est supérieur ou égal à y)
Attention, ne pas utiliser x = y ou x = 5.
tone (broche, fréquence, durée) -> génère un signal carré
Une durée
delay(20); //attendre 20 ms. le Maximum est de 4 294 967 295 ms.
delayMicroseconds(20); //attendre 20 us. la gamme est de 16383 us à 3 us.
variable = millis( ); commence à 0 depuis le reset du microcontrôleur et il peut aller jusqu'à 4 294 967 295 -> Max 50 jours.
Une pin de la carte arduino UNO R3 peut être en entrée (INPUT) ou en sortie (OUTPUT ).
pinMode (13,OUTPUT); //mettre la pin 13 en sortie
pinMode (12,INPUT); //mettre la pin 12 en entrée
Une pin de la carte arduino UNO R3 peut être en lecture (Read) ou en écriture (Write).
digitalWrite (13,HIGH); //allume la LED de la carte Arduino D13
int buttonState = 0; // Initialisation d'une variable globale
buttonState = digitalRead(12); //on lit la pin 12 (0 ou 1) et on place la valeur dans la variable buttonState
Il faut absolument une variable pour y placer le contenu d'un pin de la carte Arduino UNO R3.
Une variable ce n'est rien d'autre qu'une case mémoire à 8 bit.
Sketch 01 , on va allumer la diode LED D13 qui se situe sur la carte Arduino UNO R3.
Sketch 02
Voici une 2e façon de faire la même chose.
1-void setup()
2- {
3-// on va lui dire que la LED est sur la sortie D13 de la carte Arduino UNO R3
4-pinMode (13,OUTPUT); //mettre la pin 13 en sortie
5-digitalWrite (13,HIGH);//allume la LED D13 de la carte Arduino UNO R3
6-}
7-
8-void loop()
9-{
10- //on ne fait rien sur cette boucle infinie, donc la LED restera toujours allumée
11-}
12-
Sketch 03, allumer toujours la même LED D13 qui se situe sur votre carte Arduino UNO R3 avec un interrupteur sur la borne D12.
1-/*
2- interrupteur sur la borne n°12 qui allume la LED 13 qui se situe sur la carte Arduino UNO R3
3-*/
4- // variables globales
5-int buttonState = 0; // Initialisation d'une variable globale
6- // buttonState est une variable globale pour lire l'interrupteur
7- // int informe que cette variable pourrait prendre une valeur de 0 à 32767
8-void setup()
9-{
10-pinMode(13, OUTPUT); // la pin 13 est une sortie pour la LED
11- pinMode(12, INPUT);// la pin 12 est une entrée pour l'interrupteur
12-}
13-
14-void loop()
15- {
16- // lit l'état de l'interrupteur
17- buttonState = digitalRead(12); //on lit la pin 12 (0 ou 1) et
18- //on place la valeur dans la variable buttonState
19-
20- // si l'interrupteur est ouvert la LED sera éteint
21- if (buttonState == HIGH) // si bouton = +5 V située sur la carte Arduino UNO R3
22- {
23-digitalWrite(13, LOW); // on éteint la LED D13 située sur la carte Arduino UNO R3
24-}
25-else // dans le cas contraire
26-{
27-digitalWrite(13, HIGH); // la LED sera allumé
28-}
29-}
30-
Un bus I²C contient 4 fils, un pour la masse, un pour le +5V, un pour SDA (A4) et un pour SCL (A5). On peut relier à ce bus I²C plusieurs appareils et chacun de ces appareils aura une adresse différente pour les différencier.
Chaque appareil aura sa propre librairie.
L'I²C possède sa propre librairie (Wire.h).
On va devoir indiquer au programme Arduino IDE, qu'il doit utiliser la librairie de l'I²C tout au début du programme. Pour un LCD 2 lignes à 16 caractères I²C.
#include <Wire.h> // pour I²C
#include <LiquidCrystal.h> // Pour un LCD 2 lignes à 16 caractères I²C.
Si un appareil I²C ne fonctionne pas, c'est souvent parce que l'on a installé la mauvaise librairie. Alors, il faut la désinstaller et réinstaller une autre librairie.
Sketch 04, écrire salut sur un LCD I²C de keyestudio UNO.
Il y a un connecteur de 4 fils, 1 fil pour la masse, 1 fil pour le +Vcc de +5 V, 1 fil pour SDA raccordé sur A4, 1 fil pour SCL vert raccordé sur A5 qui fonctionne en I²C.
#include <Wire.h> //déclarer l'utilisation de la librairie I²C
#include <LiquidCrystal_I2C.h> //déclarer l'utilisation de la librairie LCD I²C
LiquidCrystal_I2C lcd(0x27,16,2); // LCD à l'adresse 27 hexa, il a 2 lignes à 16 caractères
void setup()
{
lcd.init(); // initialise le LCD, il faut lui laisser un peu de temps pour démarrer
lcd.init(); // encore un peu de temps
// écrire un message sur ce LCD.
lcd.backlight(); //efface le LCD
lcd.setCursor(5,0); // sur la ligne 0 (sup) à partir du 6e caractère
lcd.print("Salut"); // écrire (Salut)
lcd.setCursor(0,1); // sur la ligne 1 (inf) à partir du 1er caractère
lcd.print("La force est la"); // écrire (La force est la)
}
void loop()
{
}
Vous avez remarqué que l'adresse du LCD est 0x27 codée en hexadécimale.
Voici un site du calcul qui transforme l'hexadécimal en décimal.
En hexadécimal = 0x27 -> en Binaire = 0010 0111 -> en décimal = 39.
Le binaire 00100111 est le langage du microcontrôleur.
Le décimal 39 est le langage des humains.
Vous aurez sûrement un message rouge d'erreur, il ne reconnaît pas la bibliothèque du LCD de keyestudio uno.
Il faudra alors installer celle de LiquidCristal de Frank Brabander.
Pour ce faire, un clic gauche sur Outils du menu supérieur puis un clic gauche sur Gérer les bibliothèques... ensuite une colonne à gauche va apparaître, il y faudra taper LCD I2C, reste plus qu'à trouver LiquidCristal de Frank Brabander et à l'installer.
OK cela ira bien!
Si le LCD i²C de keyestudio uno ne va toujours pas, vous télécharger la librairie de Keyestudio et vous la placez dans le répertoire Users/votre nom/ AppData/Local/Arduino15/LiquidCrystal_I2C/...
On peut aussi la placer dans Documents/Arduino/libraries/LiquidCrystal_I2C...
if (uneVariable > 50) { // faire quelque chose } -> si la variable uneVariable est supérieure à 50 alors { } on fera quelque chose qui sera placé entre les accolades.
if (brocheCinqEntree < 500) { // action A } else { // action B } -> si la variable brocheCinqEntree est inférieure à 500 alors on fera l'action A et si ce n'est pas le cas, on fera l'action B.
Sketch 05, on va balayer la course d'un servomoteur sup de keystudio UNO qui va aller de 20 à 120 ° d'angle et ce vers le pin 9 PWM.
Pour ne pas brûler le servomoteur, il faut repérer le 0° pour qu'il ne cogne pas sur un objet et se pendant toute sa course.
Il n'est pas conseillé, de faire tourner le servomoteur sur l'alimentation du USB de votre PC, en effet le courant est trop grand.
Sur l'entrée du +5v de l'USB, juste avant le fusible de 0,5 A, j'ai soudé une diode schottky afin d'éviter un retour d'alimentation.
J'ai mis une alimentation de +9 V 2A sur le jack la carte Arduino UNO R3.
Maintenant, on peut tourner avec les 2 alimentations.
On va utiliser la librairie de la carte keyestudio UNO.
Cette carte est meilleure que la carte Arduino UNO R3 pour les servomoteurs.
/* Sweep
by BARRAGAN
http://www.arduino.cc/en/Tutorial/Sweep
*/
#include <Servo.h>
Servo myservo; //Créer la course d'un servomoteur sup du keyestudio UNO
int pos = 0; // variable de position 0 du servomoteur de 180° d'angle
void setup() {
myservo.attach(9); // Le pin 9 va actionner l'angle du servomoteur
}
void loop() {
for (pos = 20; pos <= 120; pos += 1) { // la course va de 20 à 120 degrés
// pas de 1 degré
myservo.write(pos); // nouvelle position de l'angle
delay(15); // change de position tous les 15 ms
}
for (pos = 120; pos >= 20; pos -= 1) { // la course va de 120 à 20 degrés
myservo.write(pos); // nouvelle position de l'angle
delay(15); // change de position tous les 15 ms
}
}
Sketch 06, on va lire l'intensité lumineuse d'une carte BH1750 I²C avec un LCD I²C
Le bus I²C se compose de 4 fils, un pour la masse, un pour le +Vcc = +5V, un pour le SDA qui va à la borne A4 et un pour SCL qui va sur la borne A5 de la carte Arduino UNO R3. Et c'est, leur propre adresse qui va les différencier l'un de l'autre.
Le 0x23 = 35 pour le capteur BH1750 et 0x27 = 39 pour le LCD.
Attention, il y a 2 modèles de carte BH1750.
1-/* Sweep
2-by BARRAGAN
3-http://www.arduino.cc/en/Tutorial/Sweep
4-*/
5-#include <Wire.h> // librairie pour l'I²C
6-#include <LiquidCrystal_I2C.h> //librairie pour le LCD
7-#include <BH1750.h> // librairie pour le capteur analogique
8-
9-BH1750 lightMeter(0x23); //l'adresse du capteur
10-LiquidCrystal_I2C lcd (0x27, 16,2); //l'adresse du LCD
11-float lux =0;
12-int luxi = 0;
13-void setup(){
14-Serial.begin(9600); // Initialise la connexion du LCD
15-lcd. init (); // donne un peu de temps au LCD
16-lcd. init (); // donne un peu de temps au LCD
17-Wire.begin(); // Initialise le bus I²C
18-lcd. backlight (); // efface le LCD.
19-lcd.setCursor (0, 0); // Caractère 0 de la ligne 0
20-lcd. print ( "Luminance:" ); // écrit le mot Luminance sur la ligne supérieure LCD
21- /*
la liste complète du mode du capteur de 0 lux à 65535 lux
BH1750_CONTINUOUS_LOW_RES_MODE
BH1750_CONTINUOUS_HIGH_RES_MODE (default)
BH1750_CONTINUOUS_HIGH_RES_MODE_2
BH1750_ONE_TIME_LOW_RES_MODE
BH1750_ONE_TIME_HIGH_RES_MODE
BH1750_ONE_TIME_HIGH_RES_MODE_2
Each mode, has three different precisions:
- Low Resolution Mode - (4 lx precision, 16ms measurement time)
- High Resolution Mode - (1 lx precision, 120ms measurement time)
- High Resolution Mode 2 - (0.5 lx precision, 120ms measurement time)
*/
39- // On donne au capteur le mode de résolution et on le met en service
40-if (lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE_2)) {
41-Serial.println(F("BH1750 Advanced begin"));
42-}
43-else {
44-Serial.println(F("Error initialising BH1750")); //Détecte un problème
45-}
46-}
47
48-void loop() {
49-lux = lightMeter.readLightLevel(); //charge la valeur du capteur
50-lcd.setCursor (0,1); //colonne n°1 de la ligne inférieure du LCD
51-lcd.print(" "); //efface les 6 premiers caractères avant la virgule
52-lcd.setCursor (7,1);
53-lcd.print(" "); //efface les 3 caractères après la virgule
54-if (lux > 99999.99) {lcd.setCursor (1,1);}
55-if (lux < 10000,00) {lcd.setCursor (2,1);}
56-if (lux < 1000.00) {lcd.setCursor (3,1);}
57-if (lux < 100.00) {lcd.setCursor (4,1);}
58-if (lux < 10.00) {lcd.setCursor (5,1);}
59-lcd.print(lux);
60-lcd.setCursor (6, 1);
61-lcd.print(","); // charge la virgule sur la colonne n°7 de la ligne inférieure du capteur
62-lcd.setCursor (11,1);
63-lcd.print("Lux");// charge le mot Lux sur la colonne n°12 de la ligne inférieure du capteur
64-delay(1200);
65-lux=0;
66-}
67-
Le BH1750 analogique vers digital et de sortie sur 16 bit pour aller de 0 à 65000 lux en I²C. La gamme est de 0,5 lux à 120000 lux.
Sur votre plan de travail vous aurez 300 lux.
Le LCD en I²C.
Sketch 07, on va lire l'intensité lumineuse d'une carte BH1750 I²C avec 4 digits de sept segments TM1637.
1-/* Sweep
2-by BARRAGAN
3-http://www.arduino.cc/en/Tutorial/Sweep
4-*/
5-#include <Wire.h> // librairie pour l'I²C
6-
7-#include <BH1750.h> // librairie pour le capteur analogique
8-#include <TM1637Display.h> // librairie pour l'afficheur 4 digits 7 segments
9-#define CLK 2 //sur la pin n°2 de la carte arduino uno R3
10-#define DIO 3 //sur la pin n°3 de la carte arduino uno R3
11-BH1750 lightMeter(0x23); //l'adresse du capteur
12-TM1637Display display(CLK, DIO); //signaux pour l'afficheur 4 digits 7 segments
13-float lux =0;
14-int luxi = 0;
15-void setup()
16-{
17-// Serial.begin(9600); // Initialise la connexion du LCD
18-Wire.begin(); // Initialise le bus I²C
19- /*
20- la liste complète du mode du capteur de 0 lux à 65535 lux
BH1750_CONTINUOUS_LOW_RES_MODE
BH1750_CONTINUOUS_HIGH_RES_MODE (default)
BH1750_CONTINUOUS_HIGH_RES_MODE_2
BH1750_ONE_TIME_LOW_RES_MODE
BH1750_ONE_TIME_HIGH_RES_MODE
BH1750_ONE_TIME_HIGH_RES_MODE_2
Each mode, has three different precisions:
- Low Resolution Mode - (4 lx precision, 16ms measurement time)
- High Resolution Mode - (1 lx precision, 120ms measurement time)
- High Resolution Mode 2 - (0.5 lx precision, 120ms measurement time)
21-*/
37-
38- // On donne au capteur le mode de résolution et on le met en service
39-if (lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE_2)) {
40- Serial.println(F("BH1750 Advanced begin"));
41-}
42-else {
43-Serial.println(F("Error initialising BH1750")); //Détecte un problème
44-}
45-display.setBrightness(7); //met la briance au maxi
46-}
47-void loop()
48-{
49-lux = lightMeter.readLightLevel(); //charge la valeur du capteur
50-luxi = round(lux); // arrondi à la partie décimal
51-display.showNumberDec(luxi,false); //affiche la partie entière dans afficheur 4 digits de 7 segments
52-
53-delay(1200);
54-lux =0;
55-}
56-
Sketch 08, on va lire l'intensité lumineuse d'une carte BH1750 I²C avec 4 digits de sept segments TM1637 et actionner un buzzer sur la pin 5, lorsqu'il y a plus de 1000 lux.
#include <Wire.h> // librairie pour l'I²C
#include <BH1750.h> // librairie pour le capteur analogique
#include <TM1637Display.h>
int CLK= 2;
int DIO= 3;
BH1750 lightMeter(0x23); //l'adresse du capteur
TM1637Display display(CLK, DIO);
float lux =0;
int luxi = 0;
const int buzzer= 5;
void setup()
{
//Serial.begin(9600); // Initialise la connexion du LCD
Wire.begin(); // Initialise le bus I²C
pinMode(buzzer, OUTPUT); // mettre la pin 5 en sortie
/*
la liste complète du mode du capteur de 0 lux à 65535 lux
BH1750_CONTINUOUS_LOW_RES_MODE
BH1750_CONTINUOUS_HIGH_RES_MODE (default)
BH1750_CONTINUOUS_HIGH_RES_MODE_2
BH1750_ONE_TIME_LOW_RES_MODE
BH1750_ONE_TIME_HIGH_RES_MODE
BH1750_ONE_TIME_HIGH_RES_MODE_2
Each mode, has three different precisions:
- Low Resolution Mode - (4 lx precision, 16ms measurement time)
- High Resolution Mode - (1 lx precision, 120ms measurement time)
- High Resolution Mode 2 - (0.5 lx precision, 120ms measurement time)
*/
// On donne au capteur le mode de résolution et on le met en service
if (lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE_2)) {
Serial.println(F("BH1750 Advanced begin"));
}
else
{
Serial.println(F("Error initialising BH1750")); //Détecte un problème
}
display.setBrightness(7); //met la briance au maxi
}
void loop()
{
lux = lightMeter.readLightLevel(); //charge la valeur du capteur
luxi = round(lux); // arrondi à la partie décimal
display.showNumberDec(luxi,false); //affiche la partie entière dans afficheur 4 digits de 7 segments
if (luxi > 1000){tone (5, 500,2000);} // si luxi sup à 1000 alors on met du 500 Hz vers le pin 5, pendant 2 s
delay(1200);
lux =0;
}
Sketch 09, on va lire un DTH11 sur le pin n° 7 avec 4 digits de sept segments TM1637
Une bibliothèque Arduino pour le capteur de température et d'humidité DHT11.
Pour le TM1637, j'ai gardé le même brochage que pour sketch 08.
Attention au brochage du DHT11, toutes les cartes ne sont pas identiques.
Le DHT11 est normalement de couleur bleue.
Le DHT11 n'est pas en I²C. (carte qui vient keyestudio UNO)
// Capteur de température et d’humidité DHT11
// Définit le pin n°7 de l'Arduino UNO R3 sur laquelle la broche DATA du capteur est reliée
#include "DHT.h" // librairie du DHT11 DHT kxn Adafruit v3.4.4
// DHT dht(DHTPIN, DHTTYPE); // Déclare un objet de type DHT
#define DHTTYPE DHT11
#include <TM1637Display.h> //librairie du 4 digits à 7 segments
int DHTPIN=7; //Définit le pin n°7 de l'Arduino UNO R3 sur laquelle la broche DATA du capteur est reliée
int CLK= 2; // pour le 4 digits à 7 segments
int DIO= 3; // pour le 4 digits à 7 segments
float lux =0;
float luxi = 0;
int temp = 0;
int humid = 0;
TM1637Display display(CLK, DIO); //4 digits à 7 segments
DHT dht(DHTPIN, DHTTYPE); // constructeur pour déclarer notre capteur
void setup()
{
// Serial.begin(9600); //pour le moniteur série
// Initialise la capteur DHT11
dht.begin(); //mise en route du DHT11
display.setBrightness(7); //met la brillance au maxi pour le 4 digits à 7 segments
}
void loop()
{
// Récupère la température et l’humidité du capteur et l'affiche
delay(2000);
// sur le moniteur série
luxi = dht.readTemperature(); // lit la température du DHT11 pour le mettre dans la variable luxi
temp = round(luxi); //prendre la partie entière
lux = dht.readHumidity(); // lit le taux d'humidité en % du DHT11 pour le mettre dans la variable lux
humid = round(lux); //prendre la partie entière
display.showNumberDec(temp,false); //affiche la partie entière dans afficheur 4 digits de 7 segments
// Serial.println("Temperature = " + String(dht.readTemperature())+" °C"); sur le moniteur série
// Serial.println("Humidite = " + String(dht.readHumidity())+" %"); sur le moniteur série
// Attend 2 secondes avant de reboucler
delay(2000);
display.showNumberDec(humid,false);
}
Sketch 10, on va lire une cellule photorésistance branchée sur le pin n° A0 (analogique) avec l'afficheur 4 digits 7 segments branchés comme le sketch 08.
// Capteur de lumière d'une photorésistance
// Définit le pin n°A0 (analogique) de l'Arduino UNO R3 sur laquelle la broche DATA du capteur est reliée
#include <TM1637Display.h> //librairie du 4 digits à 7 segments
#define LDR A0 // composante photorésistance sur la pin A0
int CLK= 2; // pour le 4 digits à 7 segments
int DIO= 3; // pour le 4 digits à 7 segments
float lux =0;
float luxi = 0;
int temp = 0;
int humid = 0;
int b1=0;
int b2=0;
int b3=0;
int b4=0;
int b5=0;
int b6=0;
int b7=0;
int b8=0;
int b9=0;
int b10=0;
TM1637Display display(CLK, DIO); //4 digits à 7 segments
void setup()
{
display.setBrightness(7); //met la brillance au maxi pour le 4 digits à 7 segments
pinMode(LDR, INPUT); // initialise la broche
}
void loop()
{
// Récupère la température et l’humidité du capteur et l'affiche
delay(200);
humid =humid+1;
lux = analogRead(LDR);
temp = round(lux);
if (humid<2){(b1=temp);}
if (humid<3){(b2=b1+temp);}
if (humid<4){(b3=b2+temp);}
if (humid<5){(b4=b3+temp);}
if (humid<6){(b5=b4+temp);}
if (humid<7){(b6=b5+temp);}
if (humid<8){(b7=b6+temp);}
if (humid<9){(b8=b7+temp);}
if (humid<10){(b9=b8+temp);}
if (humid>9){(temp=b9/20);} // vous pouvez ajuster pour avoir une vraie valeur en lux
if (humid>9){
display.showNumberDec(temp,false); //affiche la partie entière dans afficheur 4 digits de 7 segments
}
if (humid>9){(humid=0);}
if (humid>9){(temp=0);}
if (humid>9){(b1=0);}
if (humid>9){(b2=0);}
if (humid>9){(b3=0);}
if (humid>9){(b4=0);}
if (humid>9){(b5=0);}
if (humid>9){(b6=0);}
if (humid>9){(b7=0);}
if (humid>9){(b8=0);}
if (humid>9){(b9=0);}
}
Une photorésistance n'est pas aussi précise que le capteur BH1750