Vous devriez aussi vous référer aux connexions pour voir comment les composants doivent être connectés entre eux.
| MP3V4 | Arduino Uno | MPR121 |
|---|---|---|
| RX | D2 | |
| TX | D3 | |
| GND | GND | |
| VCC | 5V | 5V |
| SCL | SCL | |
| SDA | SDA | |
| GND | GND |
Note : Pour vos futurs circuits, c'est ce genre de tableau que vous devriez prendre en note. Un dessin comme ci-dessus c'est idéal mais ça prend du temps, une photo c'est instantané mais c'est toujours illisible donc inutile.
Allez sur https://www.arduino.cc/en/software
Sélectionnez “Win 10 and newer” si vous êtes sur Windows,
Ou sélectionnez “MacOS” si vous êtes sur MacOS.
Une fois que l’Arduino IDE est téléchargé, installé, et ouvert vous pouvez brancher votre Arduino Uno à votre PC. (Essayez de ne pas passer par un adaptateur si vous pouvez)
Sélectionnez votre Arduino dans le menu déroulant “Select Board”
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}Normalement, vous n'avez encore rien fait d'autre que de sélectionner votre carte et pourtant vous avez déjà ce code dans la fenêtre principale.
Tous les projets Arduino partent de ce bout de code plutôt que d'une page blanche. Si vous avez besoin d'une preuve supplémentaire vous pouvez cliquer sur File > New en haut à gauche de la fenêtre, ce qui ouvrira une nouvelle fenêtre avec un projet tout neuf contenant quand même ces quelques lignes.
Ce code est le cadre minimum. En échange de GRANDEMENT vous faciliter la tâche comparé à un projet d'électronique pur, l'environnement Arduino vous demande d'avoir au moins ces deux blocs.
Chaque bloc a un nom et son contenu est délimité par ses accolades {} (le "void" on verra plus tard).
Le code qui est dans setup() s'exécutera au démarrage de l'Arduino. Ensuite, le code qui est dans le bloc loop() s'exécutera et se relancera toujours dès qu'il se finit.
C'est beaucoup d'informations d'un coup, donc pratiquons un peu.
On va apprendre à faire l'une des manips les plus essentielles, on va voir comment afficher des informations dans la console de votre ordinateur depuis le code de l'Arduino. L'intérêt est que si on peut s'afficher des informations depuis l'Arduino, on pourra surveiller le comportement du programme pour avoir des indices sur ce qui cloche quand on n'aura pas le résultat qu'on cherche.
Si on copie ce code ci-dessous et qu'on l'utilise pour remplacer le code contenu dans votre éditeur ...
// put your setup code here, to run once at the start
void setup() {
//starts a connection between the Arduino and the computer
Serial.begin(9600);//9600 is the number of times the signal can be updated per second in the wire (you have the absolute permission to not care about that, just put 9600)
Serial.println("Hello");//send whatever is between the () to the computer
}
// put your main code here, to run over and over and over and...
void loop() {
}... que l'on appuie sur le bouton pour mettre le code dans l'Arduino ...
... et que vous cliquez sur cette icône pour ouvrir la console ...
... alors vous devriez y voir ce message
On peut aussi mettre le Serial.println() dans le loop comme ceci
// put your setup code here, to run once at the start
void setup() {
//starts a connection between the Arduino and the computer
Serial.begin(9600);//9600 is the number of times the signal can be updated per second in the wire (you have the absolute permission to not care about that, just put 9600)
}
// put your main code here, to run over and over and over and...
void loop() {
Serial.println("Hello");//send whatever is between the () to the computer
}(n'oubliez pas de cliquer sur le bouton de téléversement pour rafraîchir le code qui est sur la carte)
... et constater que le message se répète bien à l'infini puisque le bloc loop() recommence dès qu'il se finit.
D'ailleurs pour mieux se rendre compte du fait que ça défile, je vous activez l'option qui date les messages
Le code s'exécute toujours une ligne après l'autre, de haut en bas. On a d'abord Serial.begin() qui va ouvrir la connexion entre votre Arduino et votre ordinateur, puis Serial.println() qui va envoyer un message à votre ordinateur suivi d'un retour à la ligne.
D'ailleurs vous pouvez essayer d'inverser l'ordre des lignes, de mettre l'ouverture de la connexion APRÈS l'envoi du message pour constater que ça ne marche pas, peu importe combien de fois vous appuierez sur le bouton reset au coin de l'Arduino, on ne verra pas de nouveau message si les étapes ne sont pas faites dans l'ordre.
Le 9600 correspond au type de connexion qu'on essaie d'établir, il faut juste que la valeur dans le code et la valeur dans la console correspondent.
Vous pourriez remplacer 9600 par 115200 a ces deux endroits, ça marcherait aussi.
Pour ce qui est de Serial.println() vous pouvez changer le texte par ce que vous voulez mais vous remarquerez que si vous retirez les guillemets " le code ne sera plus valide. Et c'est normal parce que Serial.println() affichera la valeur qui est entre ses parenthèses et que si vous mettez des guillemets alors c'est littéralement du texte et que si vous n'en mettez pas c'est du code et Serial.println() affichera le résultat.
Comme ceci :
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("8 + 3");
Serial.println(8 + 3);
}Le premier Serial.println() affichera littéralement 8 + 3 tandis que le deuxième va exécuter le code entre les parenthèses et le donner à Serial.println() pour affichage.
Qu'est ce qu'il se passe si vous essayez le code ci-dessous?
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println(test);
}Vous aurez cette erreur de compilation :
C:\Users\quelque\part\sur\mon\disque\sketch_jul9a.ino:6:18: error: 'test' was not declared in this scope
Serial.println(test);
^~~~Déjà vous remarquerez que j'ai "oublié" de mettre des guillemets autour de test, ce qui fait que test est vu comme du code et non comme du texte. Lorsque nous avons un nom qui ne fait pas partie du langage, le code considérera que c'est une variable, ou une fonction si elle a une paire de parenthèses à sa droite, comme ceci maVariable et maFonction()
Ici, test est une variable parce que les parenthèses sont celles de Serial.println(), si test était une fonction on écrirait ceci Serial.println(test()).
Une variable est un nom auquel on fait correspondre une valeur, l'intérêt étant que cette valeur est réutilisable et modifiable pendant que le code s'exécute à l'inverse des valeurs que l'on rentre directement.
Déjà voyons comment créer une variable
void setup() {
Serial.begin(9600);
}
void loop() {
int test = 5;
Serial.println(test);
}L'erreur est partie, on peut donc mettre le code sur la carte et voir dans la console la valeur que représente test autrement dit 5.
Une variable peut contenir une valeur mais seulement une valeur d'un certain type et c'est à ça que sert int, il spécifie que cette variable ne peut contenir que des nombres entiers (des "integer" en anglais, d'où le nom).
Au final, la ligne pour créer une variable c'est d'abord son type puis son nom et très souvent sa valeur de départ.
Au-delà de tout ça, une variable se comporte comme une valeur et on peut écrire ceci
void setup() {
Serial.begin(9600);
}
void loop() {
int test = 5;
Serial.println(test + 3);
}Mais comme je disais on peut la changer comme ceci
void setup() {
Serial.begin(9600);
}
void loop() {
int test = 5;
Serial.println(test);
test = 8;
Serial.println(test);
test = test + 3;
Serial.println(test);
}On peut noter plusieurs choses de cet exemple
- on constate bien qu'afficher régulièrement la variable permet de suivre son évolution
- on spécifie le type (
int) de la variable uniquement moment de sa création test = test + 3est mathématiquement incorrect mais on s'en fiche parce qu'ici=veut dire "devient égal à" donc cette ligne veut dire "test devient égal à lui-même plus 3".
C'est sympa tout ça mais c'est fatiguant de travailler avec des valeurs qui ne représentent rien donc voyons comment brancher un bouton et le code qui va avec.
void setup() {
Serial.begin(9600);
pinMode(3,INPUT_PULLUP);
}
void loop() {
int buttonValue = 0;
buttonValue = digitalRead(3);
Serial.println(buttonValue);
}Les pins digitales peuvent être utilisées de plusieurs manières, mais seulement d'une seule manière à la fois, la fonction pinMode() permet de choisir comment une pin digitale est utilisée.
Pour pinMode on donne d'abord le numéro de la pin concernée (ici D3) et le mode qu'on veut lui donner (ici INPUT_PULLUP).
Il existe seulement 3 modes :
INPUT: pour lire la présence ou non de voltage sur la pinOUTPUT: pour contrôler la présence de voltage sur la pinINPUT_PULLUP: commeINPUTsauf que la pin présente un voltage en permanence sauf quand elle est connectée au ground.
Donc si on reprend notre montage, il y aura toujours du voltage sur la pin D3 sauf lorsqu'on appuie sur le bouton.
Nous avons aussi digitalRead() qui est nouveau, cette fonction fait quelque chose que l'on n'avait pas encore vu jusqu'ici, elle rend un résultat. Pour savoir quelle sera la valeur de buttonValue on va exécuter puis remplacer digitalRead(3) par son résultat. Cette modification ne dure que le temps d'exécuter la ligne et ne modifie pas le code.
Donc, si notre bouton n'est pas enfoncé alors digitalRead(3) vaudra 1 parce qu'il y a du voltage et donc buttonValue vaudra 1 à partir de cette ligne. En revanche si le bouton est enfoncé alors digitalRead(3) et donc buttonValue vaudront 0.
Et évidemment on finit par s'afficher le contenu de buttonValue sans quoi il serait impossible de savoir si ce que l'on a fait marche correctement.
Si à tout cela on ajoute la fonction digitalWrite() qui permet de contrôler la présence ou l'absence de voltage sur une pin digitale, on peut faire ceci :
void setup() {
Serial.begin(9600);
pinMode(3,INPUT_PULLUP);
pinMode(4,OUTPUT);
}
void loop() {
int buttonValue = 0;
buttonValue = digitalRead(3);
Serial.println(buttonValue);
digitalWrite(4,buttonValue);
}La fonction digitalWrite() prend d'abord le numéro de la pin digitale que l'on veut changer (ici D4) et si on veut que cette pin ait du voltage avec la valeur 1 ou non avec la valeur 0.
On sait que buttonValue vaut 1 lorsque le bouton n'est pas pressé et 0 lorsqu'il l'est donc la LED sur la pin D4 devrait être allumée par défaut et devrait s'éteindre lorsque l'on presse le bouton.
On peut maintenant dire qu'on a un système avec une entrée (le bouton), et une sortie (la LED).
Il est important de garder le Serial.println() même si on a un retour visuel avec la LED! Pourquoi? Parce que si vous avez un problème, comment est-ce que vous pouvez savoir si ça vient du bouton duquel on n'arrive pas à récupérer la valeur ou de la LED au travers de laquelle on n'arrive pas à faire passer un courant?
On ne peut pas. C'est pour ça que je parlais d'utiliser Serial.println() pour s'afficher des valeurs intermédiaires, ça nous permet de compartimenter notre code en plus petits bouts dont le comportement est vérifiable et validable séparemment.
Tout ceci étant dit, je vous rappelle qu'on peut changer la valeur contenue dans une variable, donc on peut essayer ceci
void setup() {
Serial.begin(9600);
pinMode(3,INPUT_PULLUP);
pinMode(4,OUTPUT);
pinMode(5,INPUT_PULLUP);
}
void loop() {
int blinkDelay = 1000;
int goFaster = 0;
int goSlower = 0;
goFaster = 1 - digitalRead(3);
goSlower = 1 - digitalRead(5);
blinkDelay = blinkDelay - goFaster + goSlower;
digitalWrite(4,1);
delay(blinkDelay);
digitalWrite(4,0);
delay(blinkDelay);
Serial.println(blinkDelay);
}Donc en principe :
goFastervaut1quand le bouton 3 est appuyégoSlowervaut1quand le bouton 5 est appuyé- ou ils valent
0quand leur bouton n'est pas appuyé.
On s'en sert pour réduire et augmenter la valeur du temps qu'on restera éteint et allumé. Plus blinkDelay est grand, plus on va attendre et plus le clignotement de la LED sera lent.
Mais si vous essayez ce code pour voir?
Il y a un truc qui ne va pas, on est d'accord?
On ne peut pas aller en dessous de 999 ni au-dessus de 1001. Pourquoi?
On se rappelle qu'avec int blinkDelay = 1000; on crée la variable parce qu'on précise son type (int) donc dès que loop() est fini on recommence et on crée blinkDelay à nouveau.
Ok, donc on peut mettre int blinkDelay = 1000; dans le setup() du coup? Comme ça elle sera créée pendant le setup puis elle ne sera pas recréée par la suite, nous laissant donc accumuler des changements, non?
Si vous essayez ça vous verrez l'erreur ci-dessous
Une variable n'existe que dans la paire d'accolade dans laquelle elle a été créée, donc si je la crée dans setup() je ne pourrai m'en servir que dans setup() et d'ailleurs elle est plus exactement détruite lorsque l'on atteint l'accolade fermante } de setup.
Mais on peut la créer en dehors de setup() et loop() dès la première ligne, ce qui fait qu'elle existera dès le tout début, qu'elle sera accessible partout, et qu'elle ne sera jamais détruite.
int blinkDelay = 1000;
void setup() {
Serial.begin(9600);
pinMode(3,INPUT_PULLUP);
pinMode(4,OUTPUT);
pinMode(5,INPUT_PULLUP);
}
void loop() {
int goFaster = 0;
int goSlower = 0;
goFaster = 1 - digitalRead(3);
goSlower = 1 - digitalRead(5);
blinkDelay = blinkDelay - goFaster + goSlower;
digitalWrite(4,1);
delay(blinkDelay);
digitalWrite(4,0);
delay(blinkDelay);
Serial.println(blinkDelay);
}Pourquoi on ne fait pas ça pour toutes les variables? Pour rendre le programme plus simple et plus facile à comprendre, on donne juste ce qu'il faut de permissions. Si tous nos éléments pouvaient tout faire tout le temps, bonjour l'angoisse quand il faudra trouver la cause d'un problème!
On peut faire plus simple, il y a un élément du langage qui permet d'exécuter un bloc de code seulement si une condition est remplie, le bloc if(){}.
Il ressemble à ceci et on exécute le code qui est entre accolades {} lorsque ce qui est entre les parenthèses () est vrai.
En sachant que = est pris pour dire que deux choses vont devenir égales, nous avons le double égal == pour comparer les deux valeurs.
Donc on pourrait reformuler le bout de code qu'on vient de voir comme ceci, ce qui est peut-être plus simple, sans rien changer à ce que l'on accomplit.
int blinkDelay = 1000;
void setup() {
Serial.begin(9600);
pinMode(3,INPUT_PULLUP);
pinMode(4,OUTPUT);
pinMode(5,INPUT_PULLUP);
}
void loop() {
// rappel avec INPUT_PULLUP:
// 0 == appuyé
// 1 == relâché
if(digitalRead(3) == 0){
blinkdelay = blinkdelay - 10;
}
if(digitalRead(5) == 0){
blinkdelay = blinkdelay + 10;
}
digitalWrite(4,1);
delay(blinkDelay);
digitalWrite(4,0);
delay(blinkDelay);
Serial.println(blinkDelay);
}Si ça n'accomplit rien de plus et rien de moins, pourquoi le faire? Parce que programmer c'est comme cuisiner, si on garde un espace de travail propre on sera plus efficace et moins submergé.
Le MPR121 est un module qui permet de savoir si un utilisateur touche l'une de ses pins numérotées de 0 à 11. On peut relier ces 12 pins à des éléments conducteurs (tant qu'ils ne sont pas trop gros) et savoir si l'utilisateur touche ces éléments, autrement dit on pourrait relier chacune de ces pins à des champignons et se faire une borne d'arcade mangeable (en admettant que les champignons le soient).
| Arduino Uno | MPR121 |
|---|---|
| 5V | 5V |
| SCL | SCL |
| SDA | SDA |
| GND | GND |
Ce coup-ci, on ne va pas directement manipuler des signaux électriques comme on l'a fait jusqu'ici, on va utiliser les pins SDA et SCL de notre Arduino et de notre MPR121 pour les faire communiquer. Un MPR121 est plus complexe qu'un bouton ou une LED et possède sa propre puce de contrôle comme celle que nous reprogrammons sur l'Arduino à chaque fois que l'on change le code.
Tout ça parait être un énorme bond en avant mais, au même titre que nous avons des fonctions Arduino pour nous aider, il existe des fonctions MPR121.
Ces fonctions MPR121 ne sont pas disponibles par défaut, il faut installer la "librairie" qui les contient. Une "librairie" est juste un ensemble de code fait par quelqu'un pour répondre à un certain problème, comme l'usage d'un MPR121.
La façon facile de faire est de passer par le manager de librairies inclus dans l'IDE Arduino
On veut la librairie "Adafruit MPR121" et en théorie il suffirait de cliquer sur son bouton "INSTALL" mais la dernière version de cette librairie mais je vous recommande d'utiliser la version 1.1.1.
Pour cela il faut ouvrir le petit menu déroulant à côté du bouton.
Et aussi nous allons accepter d'installer les librairies additionnelles dont la librairie "Adafruit MPR121" fait usage, sans quoi elle ne pourra pas fonctionner.
Lorsque vous installez une librairie elle vient avec des exemples qui marchent d'emblée, sauf si les composants sont mal branchés. Vous devriez lire et tester le code d'exemple le plus simple pour chaque librairie que vous installez car ça permet de :
- vérifier que tout est bien branché
- et si c'est le cas, s'assurer que votre composant est fonctionnel
- découvrir les fonctions fournies par la librairie et comment elles s'utilisent en contexte
Pour ceci il faut aller dans file > examples > MPR121
Mais❗ Exceptionnellement, on ne va pas faire ça parce que je trouve que l'exemple fourni avec le MPR121 pourrait être extrêmement plus simple, donc je vous propose une autre version ci-dessous.
Celle-ci :
#include <Wire.h>
#include "Adafruit_MPR121.h"
Adafruit_MPR121 cap = Adafruit_MPR121();
uint16_t lasttouched = 0;
uint16_t currtouched = 0;
void setup() {
Serial.begin(9600);
if (!cap.begin(0x5A)) {
Serial.println("MPR121 not found, check wiring?");
} else {
Serial.println("MPR121 found!");
}
}
void loop() {
// Get the currently touched pads
currtouched = cap.touched();
if (isMprPinTouched(0)) {
Serial.println("pin 0 touchée");
}
if (isMprPinTouched(1)) {
Serial.println("pin 1 touchée");
}
if (isMprPinTouched(2)) {
Serial.println("pin 2 touchée");
}
if (isMprPinTouched(10)) {
Serial.println("pin 10 touchée");
}
if (isMprPinTouched(11)) {
Serial.println("pin 11 touchée");
}
// reset our state
lasttouched = currtouched;
}
// pin : la pin du MPR121 que l'on veut lire
// résultat : est-ce que la pin est touchée(1) ou relâchée(0)
bool isMprPinTouched(int pin) {
bool pinTouching = currtouched & (1 << pin);
bool pinWasTouching = lasttouched & (1 << pin);
if (pinTouching && !pinWasTouching) {
return true;
}
return false;
}Une chose que je n'ai pas expliquée jusqu'ici, c'est le bout de code qui est tout a la fin du sketch, après le bloc loop().
Celui-ci:
// pin : la pin du MPR121 que l'on veut lire
// résultat : est-ce que la pin est touchée(1) ou relâchée(0)
bool isMprPinTouched(int pin) {
bool pinTouching = currtouched & (1 << pin);
bool pinWasTouching = lasttouched & (1 << pin);
if (pinTouching && !pinWasTouching) {
return true;
}
return false;
}Ce qu'il se passe est que l'on crée une fonction. Les fonctions qui nous sont fournies par Arduino comme pinMode() ou digitalWrite(), ou celles fournies par des librairies comme cap.begin(), ont leur création cachée, mais nous pouvons aussi créer nos propres fonctions et c'est ce que j'ai fait en créant isMprPinTouched() pour simplifier le reste du code.
Ne vous penchez pas dessus, ça me sert aussi à cacher des trucs qui ne méritent pas d'être expliqués aujourd'hui, tout ce qu'il faut savoir est que cette fonction s'utilise comme digitalRead() et qu'il faut laisser currtouched = cap.touched(); au début du loop() et lasttouched = currtouched; à la toute fin
Pour mettre les sons sur le module MP3, il vous suffit soit d'avoir un port micro-SD ou un adaptateur USB vers micro-SD.
Dans le code on pourra choisir quel son jouer en fonction de leurs numéros. Ces numéros sont en fait l'ordre dans lequel ils ont été mis sur la carte. Donc effacez tout ce qui est sur la carte puis transférez les fichiers 1 par 1 pour s'assurer que l'audio 1 est le premier, le 2 est le deuxième etc...
[!CAUTION] Quand vous transférez des fichiers avec un Mac vous créez des fichiers cachés additionnels. Or, le module ne marchera pas s'il n'y a pas UNIQUEMENT des fichiers MP3, donc vous ne pouvez pas transférer depuis un Mac.
Pour qu'une librairie soit installable depuis l'IDE Arduino, il faut la faire valider par Arduino.
Seeed qui est le fabricant de ce module MP3 a décidé de ne pas s'embêter avec ça et a choisi de distribuer cette librairie depuis GitHub.
Ça va se faire en deux étapes, télécharger la librairie, puis l'installer.
Pour la télécharger, allez visiter le lien ci-dessous et cliquez sur le bouton vert "Code". Puis sélectionnez l'option pour télécharger ce projet sous forme de fichier zip.
https://github.com/Seeed-Studio/Seeed_Serial_MP3_Player
Puis, pour l'installer sélectionnez dans l'IDE l'option ci-dessous pour sélectionner le zip que vous venez de télécharger.
Sketch > Include Library > Add .ZIP Library...
Encore une fois, le code d'exemple fourni avec la librairie n'est pas des plus simples. Je vous assure que ce sont vraiment deux exceptions mais que voulez-vous, ces deux modules sont marrants alors on prend le temps de faire un exemple exprès pour pouvoir se donner les moyens.
#include <SoftwareSerial.h>
#include "WT2605C_Player.h"
SoftwareSerial SSerial(2, 3); // RX, TX
#define mp3Serial SSerial
WT2605C<SoftwareSerial> Mp3Player;
int maxVolume = 30;
void setup() {
Serial.begin(9600);
mp3Serial.begin(115200);
delay(1);
Mp3Player.init(mp3Serial);
Mp3Player.volume(maxVolume / 4);
// Mp3Player.playMode(WT2605C_SINGLE_CYCLE);
// Mp3Player.playMode(WT2605C_DIR_CYCLE);
// Mp3Player.playMode(WT2605C_RANDOM);
Mp3Player.playMode(WT2605C_SINGLE_SHOT);
}
void loop() {
Mp3Player.playSDRootSong(0);
delay(1000);
Mp3Player.playSDRootSong(1);
delay(1000);
Mp3Player.playSDRootSong(2);
delay(1000);
Mp3Player.pause_or_play();
delay(1000);
Mp3Player.pause_or_play();
delay(1000);
}Cet exemple n'est pas très marrant mais nous permet de faire le tour des fonctions qui nous intéressent.
Tout ce qui est en dehors de loop() est nécessaire, on ne peut rien changer ni retirer c'est juste comme ça.
Il y a juste ce bloc:
// Mp3Player.playMode(WT2605C_SINGLE_CYCLE);
// Mp3Player.playMode(WT2605C_DIR_CYCLE);
// Mp3Player.playMode(WT2605C_RANDOM);
Mp3Player.playMode(WT2605C_SINGLE_SHOT);En fonction de la ligne qui est active (donc sans les //) le comportement du module changera.
- WT2605C_SINGLE_CYCLE => quand un fichier audio est fini on le recommence
- WT2605C_DIR_CYCLE => quand un fichier audio est fini on passe au suivant, quand on arrive à la fin des fichiers on joue le premier
- WT2605C_RANDOM => quand un fichier audio est fini on en commence un autre au hasard
- WT2605C_SINGLE_SHOT => quand un fichier audio est fini on met le module sur pause
En tout et pour tout il n'y a que 3 fonctions qui nous permettent de manipuler le lecteur MP3
Mp3Player.playSDRootSong()qui permet de jouer un fichier audio en fonction de son numéroMp3Player.volume()qui nous permet de changer le volumeMp3Player.next()qui nous permet de passer au fichier suivantMp3Player.pause_or_play()qui lance un audio si le module ne joue rien ou qui met l'audio sur pause si le module est en train de jouer du son
Le but ici va être plutôt évident si on imagine comment combiner ce que l'on a vu. On va faire un circuit qui permet de lire les touches détectées par le MPR121 pour chacune d'entre elles.
C.f. la partie connexions commune avec la partie fab.
#include <Wire.h>
#include "Adafruit_MPR121.h"
#include <SoftwareSerial.h>
#include "WT2605C_Player.h"
SoftwareSerial SSerial(2, 3); // RX, TX
#define mp3Serial SSerial
WT2605C<SoftwareSerial> Mp3Player;
int maxVolume = 30;
Adafruit_MPR121 cap = Adafruit_MPR121();
uint16_t lasttouched = 0;
uint16_t currtouched = 0;
void setup() {
Serial.begin(9600);
mp3Serial.begin(115200);
delay(1);
Mp3Player.init(mp3Serial);
Mp3Player.volume(maxVolume / 4);
// Mp3Player.playMode(WT2605C_SINGLE_CYCLE);
// Mp3Player.playMode(WT2605C_DIR_CYCLE);
// Mp3Player.playMode(WT2605C_RANDOM);
Mp3Player.playMode(WT2605C_SINGLE_SHOT);
if (!cap.begin(0x5A)) {
Serial.println("MPR121 not found, check wiring?");
} else {
Serial.println("MPR121 found!");
}
}
void loop() {
// Get the currently touched pads
currtouched = cap.touched();
if (isMprPinTouched(0)) {
Mp3Player.playSDRootSong(0);
}
if (isMprPinTouched(1)) {
Mp3Player.playSDRootSong(1);
}
if (isMprPinTouched(2)) {
Mp3Player.playSDRootSong(2);
}
if (isMprPinTouched(10)) {
Mp3Player.next();
}
if (isMprPinTouched(11)) {
Mp3Player.pause_or_play();
}
// reset our state
lasttouched = currtouched;
}
// pin : la pin du MPR121 que l'on veut lire
// résultat : est-ce que la pin est touchée(1) ou relâchée(0)
bool isMprPinTouched(int pin) {
bool pinTouching = currtouched & (1 << pin);
bool pinWasTouching = lasttouched & (1 << pin);
if (pinTouching && !pinWasTouching) {
return true;
}
return false;
}





















