Outils pour utilisateurs

Outils du site


wiki:tutoriels:arduino:detecter_un_signal_electrique

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
wiki:tutoriels:arduino:detecter_un_signal_electrique [2021/06/15 11:20]
damien.muti [Application : Rendre la sonnerie aléatoire]
wiki:tutoriels:arduino:detecter_un_signal_electrique [2022/01/31 16:59] (Version actuelle)
damien.muti [Programme Arduino 2 : Détection analogique]
Ligne 22: Ligne 22:
   * AD8551 : Comparator CMOS RAIL/RAIL (ref: [[https://fr.farnell.com/maxim-integrated-products/max941cpa/comparator-cmos-rail-rail/dp/2518678?ost=max941cpa%2B|MAX941CPA+]]). [[https://datasheets.maximintegrated.com/en/ds/MAX941-MAX944.pdf|Datasheet]].   * AD8551 : Comparator CMOS RAIL/RAIL (ref: [[https://fr.farnell.com/maxim-integrated-products/max941cpa/comparator-cmos-rail-rail/dp/2518678?ost=max941cpa%2B|MAX941CPA+]]). [[https://datasheets.maximintegrated.com/en/ds/MAX941-MAX944.pdf|Datasheet]].
   * <del>(Timmer, 100K, 0, 15W, 1 tour (Ref: PT10MV11-104A2020-PM-S))</del>   * <del>(Timmer, 100K, 0, 15W, 1 tour (Ref: PT10MV11-104A2020-PM-S))</del>
-  * R7 : Résistance 1K, 0,25W 1% (ref: MF25 1K) +  * R6,R7 : Résistance 1K, 0,25W 1% (ref: MF25 1K 
-  * R2 : Résistance 100K0,25W 1% (ref: MF25 100K) +  * R2,R5 : Résistance 1M, 0,25W 1% (ref: MF25 1M)
-  * R5 : Résistance 1M, 0,25W 1% (ref: MF25 1M)+
   * C1 et C3 : Condensateur 1uF, 250V, Film, Rad (ref : MPMEF250W10JOI200)   * C1 et C3 : Condensateur 1uF, 250V, Film, Rad (ref : MPMEF250W10JOI200)
   * D2 : Diode Zener 500MW 4,7V (ref : BZX79-C4V7)   * D2 : Diode Zener 500MW 4,7V (ref : BZX79-C4V7)
Ligne 39: Ligne 38:
  
 {{ :wiki:tutoriels:arduino:signal_total.jpg?800 |}} {{ :wiki:tutoriels:arduino:signal_total.jpg?800 |}}
 +
 +{{ :wiki:tutoriels:arduino:caracteristiques_signal.png?200 |}}
  
 On remarque que le signal a une durée totale d'environ 18,5s. l'amplitude du signal varie entre environ +6,5V et -6,5V. On remarque que le signal a une durée totale d'environ 18,5s. l'amplitude du signal varie entre environ +6,5V et -6,5V.
Ligne 57: Ligne 58:
 ====Détection du signal ==== ====Détection du signal ====
 Nous utilisons ensuite un montage comparateur à Amplificateur Opérationnel comparateur, noté ici AD8551. Sur l’entrée V- du comparateur, il convient de placer un potentiomètre permettant de régler la tension de seuil de basculement de la tension de sortie Vs. En effet, la tension de sortie Vs = µ(V+ - V-), avec µ le gain de l’AO théoriquement infini de sorte que la tension de sortie vaut soit Vs = 5V, soit Vs = 0V. Le réglage de la tension d’entrée V- de référence permet d’éviter une fausse détection de la sonnerie qui serait causé par un bruit d’électronique. Si le signal d’entrée est inférieur à V-, la sortie vaut 0V. Si le signal d’entrée est supérieur à V-, la sortie est un signal rectangulaire 5V-0V de la même fréquence que le signal d’entrée. Nous utilisons ensuite un montage comparateur à Amplificateur Opérationnel comparateur, noté ici AD8551. Sur l’entrée V- du comparateur, il convient de placer un potentiomètre permettant de régler la tension de seuil de basculement de la tension de sortie Vs. En effet, la tension de sortie Vs = µ(V+ - V-), avec µ le gain de l’AO théoriquement infini de sorte que la tension de sortie vaut soit Vs = 5V, soit Vs = 0V. Le réglage de la tension d’entrée V- de référence permet d’éviter une fausse détection de la sonnerie qui serait causé par un bruit d’électronique. Si le signal d’entrée est inférieur à V-, la sortie vaut 0V. Si le signal d’entrée est supérieur à V-, la sortie est un signal rectangulaire 5V-0V de la même fréquence que le signal d’entrée.
 +
 +{{ :wiki:tutoriels:arduino:comparateur.png?400 |}}
 +
 +
 +
 +**__Attention__** : La tension de référence du comparateur (patte n°3) doit être expérimentalement réglée aux alentour de 2,2V .
  
 ==== Mise en forme, détection d’enveloppe ==== ==== Mise en forme, détection d’enveloppe ====
Ligne 68: Ligne 75:
 La sortie vaut 0V si le signal d’entrée est inférieur à V- (réglable par potentiomètre). La sortie vaut 0V si le signal d’entrée est inférieur à V- (réglable par potentiomètre).
 La sortie vaut 5V si le signal d’entrée est supérieur à V-. La sortie vaut 5V si le signal d’entrée est supérieur à V-.
 +
 +Physiquement, ceci revient à charger le condensateur C3 (1µF) avec le signal de sortie du comparateur. Lorsque le signal d'entrée devient nul, ou qu'il est trop faible pour être détecté (ceci apparaît lorsqu'il y a des silence dans la musique issu de la sonnerie initiale), le condensateur C3 se décharge via la résistance R2. 
 +
 +Le temps caractéristique de décharge est Tau=R2*C3= 10^6*10^-6 = 1s. Ce temps permet ainsi de pouvoir continuer à lancer de la musique, même si les silences dans le signal d'entrée (la sonnerie du lycée) sont importants. en effet, le condensateur C3 reste quasiment chargé sur une durée d'environ 1s, permettant le maintient de la tension de sortie à 5V, même s'il y a des silences dans le signal d'entrée.
  
 ===== Simulations (LT-Spice) ===== ===== Simulations (LT-Spice) =====
Ligne 73: Ligne 84:
 {{ :wiki:tutoriels:arduino:simulation_ltspice.png?700 |}} {{ :wiki:tutoriels:arduino:simulation_ltspice.png?700 |}}
  
 +===== Boîtier de protection  =====
 +A l'aide d'un générateur de boite en ligne ([[https://www.makercase.com/|Makercase]]), on modélise une boite hexagonale en lien avec le logo de l'ESDM :
 +
 +{{ :wiki:tutoriels:arduino:boitier_sonnerie.png?400 |}}
 +
 +Les paramètres sont les suivants :
 +  * Sides : 6
 +  * Inside Diameter : 200mm
 +  * Inside Height : 50mm
 +
 +Le fichier de la boite est le suivant : {{ :wiki:tutoriels:arduino:box_1.svg.zip |}}
 ===== Programme Python sur Raspberry Pi ===== ===== Programme Python sur Raspberry Pi =====
 Le programme python sur Raspberry Pi s'inspire du programme développé dans le projet "[[wiki:tutoriels:jukebox_raspberry|Juke-box]]". Le programme python sur Raspberry Pi s'inspire du programme développé dans le projet "[[wiki:tutoriels:jukebox_raspberry|Juke-box]]".
Ligne 85: Ligne 107:
   * [[http://www.sonelec-musique.com/electronique_bases_association_hp_100v.html]]    * [[http://www.sonelec-musique.com/electronique_bases_association_hp_100v.html]] 
  
 +
 +==== Câblage audio ====
 +
 +{{ :wiki:tutoriels:arduino:20210525_100150.jpg?400 |}}
 +{{ :wiki:tutoriels:arduino:20210525_103322.jpg?400 |}}
 +{{ :wiki:tutoriels:arduino:20210525_103628.jpg?400 |}}
 +
 +==== Schéma du montage ====
 +
 +{{ :wiki:tutoriels:arduino:20210923_093202.jpg?600 |}}
 +
 +==== Programme Arduino 1 : Détection digitale ====
 +
 +Le programme est téléchargeable sur ce lien: [[https://fr.farnell.com/|Sonnerie_Aleatoire_WT2003S_8.ino]] 
 +<code>
 +#include "WT2003S_Player.h"
 +
 +#ifdef __AVR__
 +#include <SoftwareSerial.h>
 +SoftwareSerial SSerial(5, 6); // RX, TX
 +#define COMSerial SSerial
 +#define ShowSerial Serial
 +
 +WT2003S<SoftwareSerial> Mp3Player;
 +#endif
 +
 +#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
 +#define COMSerial Serial1
 +#define ShowSerial SerialUSB
 +
 +WT2003S<Uart> Mp3Player;
 +#endif
 +
 +#ifdef ARDUINO_ARCH_STM32F4
 +#define COMSerial Serial
 +#define ShowSerial SerialUSB
 +
 +WT2003S<HardwareSerial> Mp3Player;
 +#endif
 +
 +
 +uint8_t vol = 10;
 +uint32_t spi_flash_songs = 0;
 +uint32_t sd_songs = 0;
 +STROAGE workdisk = SD;
 +struct Play_history {
 +  uint8_t disk;
 +  uint16_t index;
 +  char name[8];
 +}* SPISong, *SDSong;
 +
 +//////////////////////////////////////////////// mes variables globales et définitions /////////////////
 +#define BOUTON 2
 +#define ENTREE_DETECTEUR_SIGNAL A0
 +#define SEUIL_DETECTION 300 // déclenchement du son si l'entrée A0 > 0,5V soit une valeur de 1023/10 ~ 100
 +uint8_t status;
 +int entreeDetecteur =0;
 +// Defining some status codes from the WT2003S
 +#define STATUS_PLAY 0x01
 +#define STATUS_STOP 0x02
 +#define STATUS_PAUSE 0x03
 +//////////////////////////////////////////
 +
 +/////////////////////////////// Méthodes utilisées dans le setup() et le loop()
 +void readSongName(struct Play_history* ph, uint32_t num, STROAGE disk) {
 +  Mp3Player.volume(0);
 +  delay(100);
 +  switch (disk) {
 +    case SPIFLASH:
 +      Mp3Player.playSPIFlashSong(0x0001);
 +      break;
 +    case SD:
 +      Mp3Player.playSDRootSong(0x0001);
 +      break;
 +    case UDISK:
 +      Mp3Player.playUDiskRootSong(0x0001);
 +      break;
 +  }
 +  ShowSerial.println("2...");
 +  for (int i = 0; i < num ; i++) {
 +    delay(300);
 +    ph[i].disk = disk;
 +    ph[i].index = Mp3Player.getTracks();
 +    Mp3Player.getSongName(ph[i].name);
 +    Mp3Player.next();
 +  }
 +  ShowSerial.println("4...");
 +  Mp3Player.pause_or_play();
 +  Mp3Player.volume(14);
 +  delay(100);
 +}
 +
 +void getAllSong() {
 +  uint8_t diskstatus = Mp3Player.getDiskStatus();
 +  ShowSerial.println(diskstatus);
 +  spi_flash_songs = Mp3Player.getSPIFlashMp3FileNumber();
 +  ShowSerial.print("SPIFlash:");
 +  ShowSerial.println(spi_flash_songs);
 +  if (spi_flash_songs > 0) {
 +    SPISong = (struct Play_history*)malloc((spi_flash_songs + 1) * sizeof(struct Play_history));
 +    readSongName(SPISong, spi_flash_songs, SPIFLASH);
 +  }
 +  if (diskstatus && 0x02) { // have SD
 +    sd_songs = Mp3Player.getSDMp3FileNumber();
 +    ShowSerial.print("SD:");
 +    ShowSerial.println(sd_songs);
 +    if (sd_songs > 0) {
 +      SDSong = (struct Play_history*)malloc((sd_songs + 1) * sizeof(struct Play_history));
 +      ShowSerial.println("1...");
 +      readSongName(SDSong, sd_songs, SD);
 +    }
 +  }
 +}
 +void printSongs() {
 +  ShowSerial.print("-------------------");
 +  ShowSerial.print("index");
 +  ShowSerial.print("<-------->");
 +  ShowSerial.print("name");
 +  ShowSerial.print("-------------------");
 +  ShowSerial.println();
 +  ShowSerial.println("-------------------spi flash-------------------------------");
 +  for (int i = 0 ; i < spi_flash_songs; i++) {
 +    ShowSerial.print("-------------------");
 +    ShowSerial.print(SPISong[i].index);
 +    ShowSerial.print("<-------->");
 +    ShowSerial.print(SPISong[i].name);
 +    ShowSerial.print("-------------------");
 +    ShowSerial.println();
 +  }
 +  ShowSerial.println("-------------------sd card-------------------------------");
 +  for (int i = 0 ; i < sd_songs; i++) {
 +    ShowSerial.print("-------------------");
 +    ShowSerial.print(SDSong[i].index);
 +    ShowSerial.print("<-------->");
 +    ShowSerial.print(SDSong[i].name);
 +    ShowSerial.print("-------------------");
 +    ShowSerial.println();
 +  }
 +}
 +
 +void printMenu(void) {
 +  ShowSerial.println("MP3 Command List:");
 +  ShowSerial.println("-----------------");
 +  ShowSerial.println("'+' or '-'  : raise/lower volume");
 +  ShowSerial.println("'1' ~ '9'   : select a song");
 +  ShowSerial.println("'n'         : next song");
 +  ShowSerial.println("'s'         : switch play disk, spi flash");
 +  ShowSerial.println("'p'         : play or pause");
 +  ShowSerial.println("'w'         : set playmode single no loop");
 +  ShowSerial.println("'x'         : set playmode single loop");
 +  ShowSerial.println("'y'         : set playmode all loop");
 +  ShowSerial.println("'z'         : set playmode random");
 +  ShowSerial.println("'c'         : Copy mp3 to SPIFlash");
 +  ShowSerial.println("             (Yes, this really does go by copy order.)");
 +  ShowSerial.println();
 +  ShowSerial.println("Any other key to show this menu");
 +  ShowSerial.println();
 +}
 +
 +void audio(int cmd) {
 +  ShowSerial.print("play:");
 +  if (workdisk == SD) {
 +    Mp3Player.playSDRootSong(cmd);
 +    ShowSerial.print("Son joué : ");
 +    ShowSerial.println(SDSong[cmd - '0'].name);
 +  }
 +  if (workdisk == SPIFLASH) {
 +    Mp3Player.playSPIFlashSong(cmd - '0' - 1);
 +    ShowSerial.print(cmd + ": ");
 +    ShowSerial.print(SPISong[cmd - '0'].name);
 +  }
 +  ShowSerial.println();
 +}
 +
 +void afficheSerialSon(int i) {
 +  ShowSerial.print("-------------------");
 +  ShowSerial.print(SPISong[i].index);
 +  ShowSerial.print("<-------->");
 +  ShowSerial.print(SPISong[i].name);
 +  ShowSerial.print("-------------------");
 +  ShowSerial.println();
 +}
 +/////////////////////////////////////////////////////////////////////// setup ///////////////////////
 +void setup() {
 +  while (!ShowSerial);
 +  ShowSerial.begin(9600);
 +  COMSerial.begin(9600);
 +  ShowSerial.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
 +  Mp3Player.init(COMSerial);
 +
 +
 +  ShowSerial.println("0...");
 +  getAllSong();
 +  printMenu();
 +  printSongs();
 +
 +  /// volume au max
 +  Mp3Player.volume(32);
 +  // pin du bouton
 +  pinMode(BOUTON, INPUT);
 +}
 +///////////////////////////////////////////// Loop ///////////////////////////////////
 +void loop() {
 +  // tester le statut du lecteur : (1) est en train de jouer, (2): stop, (3): en pause
 +  status = Mp3Player.getStatus();
 +  entreeDetecteur = analogRead(ENTREE_DETECTEUR_SIGNAL);
 +  if ( entreeDetecteur > SEUIL_DETECTION && (status == STATUS_STOP || status == STATUS_PAUSE)) { // si la tension en A0 est supéreure au seuil ET que le son ne joue pas 0x02:stop, 0x03: pause
 +    // debug
 +    ShowSerial.print("ENTREE_DETECTEUR_SIGNAL (A0) : ");
 +    ShowSerial.println(entreeDetecteur);
 +
 +    digitalWrite(13, HIGH); // allumer la led LEDBUILTIN
 +    // sélection aléatoire de l'indice de la musique
 +    byte indexMusic = floor(random(0, sd_songs));
 +    // affiche les caractéristiques de la musique
 +    //afficheSerialSon(indexMusic);
 +    ShowSerial.print("indice musique : ");
 +    ShowSerial.println(indexMusic);
 +    // joue la musique
 +    Mp3Player.playMode(SINGLE_CYCLE);// joue la même musique en boucle
 +    audio(indexMusic); // lance le son
 +  }
 +  else if (entreeDetecteur < SEUIL_DETECTION && status == STATUS_PLAY) { // OU si la tension en A0 est inférieure au seuil ET que le son joue : on l'arrête
 +    // si le bouton est relâché et que le son joue : on l'arrête
 +    digitalWrite(13, LOW);
 +    //Mp3Player.stopPlaying(); // avec la librairie Sparkfun
 +    Mp3Player.pause_or_play();
 +
 +  }
 +}
 +</code>
 +
 +
 +==== Programme Arduino 2 : Détection analogique ====
 +
 +Le programme est téléchargeable sur ce lien: {{ :wiki:tutoriels:arduino:sonnerie_aleatoire_wt2003s_9_lecture_analog.ino.zip |}}
 +
 +
 +
 +<code>
 +
 +///////// MOdule MP3 ///////////////////////////
 +#include "WT2003S_Player.h"
 +#ifdef __AVR__
 +#include <SoftwareSerial.h>
 +SoftwareSerial SSerial(5, 6); // 5-RX, 6-TX
 +#define COMSerial SSerial
 +#define ShowSerial Serial
 +
 +WT2003S<SoftwareSerial> Mp3Player;
 +#endif
 +
 +#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
 +#define COMSerial Serial1
 +#define ShowSerial SerialUSB
 +
 +WT2003S<Uart> Mp3Player;
 +#endif
 +
 +#ifdef ARDUINO_ARCH_STM32F4
 +#define COMSerial Serial
 +#define ShowSerial SerialUSB
 +
 +WT2003S<HardwareSerial> Mp3Player;
 +#endif
 +
 +
 +uint8_t vol = 10;
 +uint32_t spi_flash_songs = 0;
 +uint32_t sd_songs = 0;
 +STROAGE workdisk = SD;
 +struct Play_history {
 +  uint8_t disk;
 +  uint16_t index;
 +  char name[8];
 +} *SPISong, *SDSong;
 +
 +//////////////////////////////////////////////// mes variables globales et définitions /////////////////
 +#define BOUTON 2
 +#define ENTREE_SIGNAL_DETECTION 4 // slot D3 (fil blanc)
 +#define LED 7
 +uint8_t status;
 +boolean etat_entree_signal_ou_bouton = false;
 +boolean etat_bouton = false;
 +
 +// entrée analogique
 +#define ENTREE_DETECTEUR_SIGNAL A1 ////////// Système de mesure du signal venant d
 +#define SEUIL_DETECTION 100 // déclenchement du son si l'entrée A1 > 5/1023*SEUIL_DETECTION V soit une valeur de 5/1023*100 = 0,488 V
 +int entreeDetecteur = 0; // variable de mémorisation du signal d'entrée A0
 +
 +
 +// Defining some status codes from the WT2003S
 +#define STATUS_PLAY 0x01
 +#define STATUS_STOP 0x02
 +#define STATUS_PAUSE 0x03
 +//////////////////////////////////////////
 +
 +/////////////////////////////// Méthodes utilisées dans le setup() et le loop()
 +void readSongName(struct Play_history* ph, uint32_t num, STROAGE disk) {
 +  Mp3Player.volume(0);
 +  delay(100);
 +  switch (disk) {
 +    case SPIFLASH:
 +      Mp3Player.playSPIFlashSong(0x0001);
 +      break;
 +    case SD:
 +      Mp3Player.playSDRootSong(0x0001);
 +      break;
 +    case UDISK:
 +      Mp3Player.playUDiskRootSong(0x0001);
 +      break;
 +  }
 +  ShowSerial.println("2...");
 +  for (int i = 0; i < num ; i++) {
 +    delay(300);
 +    ph[i].disk = disk;
 +    ph[i].index = Mp3Player.getTracks();
 +    Mp3Player.getSongName(ph[i].name);
 +    Mp3Player.next();
 +  }
 +  ShowSerial.println("4...");
 +  Mp3Player.pause_or_play();
 +  Mp3Player.volume(14);
 +  delay(100);
 +}
 +
 +void getAllSong() {
 +  uint8_t diskstatus = Mp3Player.getDiskStatus();
 +  ShowSerial.println(diskstatus);
 +  spi_flash_songs = Mp3Player.getSPIFlashMp3FileNumber();
 +  ShowSerial.print("SPIFlash:");
 +  ShowSerial.println(spi_flash_songs);
 +  if (spi_flash_songs > 0) {
 +    SPISong = (struct Play_history*)malloc((spi_flash_songs + 1) * sizeof(struct Play_history));
 +    readSongName(SPISong, spi_flash_songs, SPIFLASH);
 +  }
 +  if (diskstatus && 0x02) { // have SD
 +    sd_songs = Mp3Player.getSDMp3FileNumber();
 +    ShowSerial.print("SD:");
 +    ShowSerial.println(sd_songs);
 +    if (sd_songs > 0) {
 +      SDSong = (struct Play_history*)malloc((sd_songs + 1) * sizeof(struct Play_history));
 +      ShowSerial.println("1...");
 +      readSongName(SDSong, sd_songs, SD);
 +    }
 +  }
 +}
 +void printSongs() {
 +  ShowSerial.print("-------------------");
 +  ShowSerial.print("index");
 +  ShowSerial.print("<-------->");
 +  ShowSerial.print("name");
 +  ShowSerial.print("-------------------");
 +  ShowSerial.println();
 +  ShowSerial.println("-------------------spi flash-------------------------------");
 +  if (spi_flash_songs > 0) {
 +    for (int i = 0 ; i < spi_flash_songs; i++) {
 +      ShowSerial.print("-------------------");
 +      ShowSerial.print(SPISong[i].index);
 +      ShowSerial.print("<-------->");
 +      ShowSerial.print(SPISong[i].name);
 +      ShowSerial.print("-------------------");
 +      ShowSerial.println();
 +    }
 +  }
 +  else {
 +    ShowSerial.println("Aucune Chanson dans spi flash");
 +  }
 +  ShowSerial.println("-------------------sd card-------------------------------");
 +  for (int i = 0 ; i < sd_songs; i++) {
 +    ShowSerial.print("-------------------");
 +    ShowSerial.print(SDSong[i].index);
 +    ShowSerial.print("<-------->");
 +    ShowSerial.print(SDSong[i].name);
 +    ShowSerial.print("-------------------");
 +    ShowSerial.println();
 +  }
 +}
 +
 +void printMenu(void) {
 +  ShowSerial.println("MP3 Command List:");
 +  ShowSerial.println("-----------------");
 +  ShowSerial.println("'+' or '-'  : raise/lower volume");
 +  ShowSerial.println("'1' ~ '9'   : select a song");
 +  ShowSerial.println("'n'         : next song");
 +  ShowSerial.println("'s'         : switch play disk, spi flash");
 +  ShowSerial.println("'p'         : play or pause");
 +  ShowSerial.println("'w'         : set playmode single no loop");
 +  ShowSerial.println("'x'         : set playmode single loop");
 +  ShowSerial.println("'y'         : set playmode all loop");
 +  ShowSerial.println("'z'         : set playmode random");
 +  ShowSerial.println("'c'         : Copy mp3 to SPIFlash");
 +  ShowSerial.println("             (Yes, this really does go by copy order.)");
 +  ShowSerial.println();
 +  ShowSerial.println("Any other key to show this menu");
 +  ShowSerial.println();
 +}
 +
 +void audio(int cmd) {
 +  ShowSerial.println("PLAY");
 +  if (workdisk == SD) {
 +    Mp3Player.playSDRootSong(cmd);
 +    ShowSerial.print("Son joué : ");
 +    ShowSerial.print("N°=");
 +    ShowSerial.print(cmd);
 +    ShowSerial.print(" ; name : ");
 +    ShowSerial.println(SDSong[cmd - '0'].name);
 +  }
 +  if (workdisk == SPIFLASH) {
 +    Mp3Player.playSPIFlashSong(cmd - '0' - 1);
 +    ShowSerial.print(cmd + ": ");
 +    ShowSerial.print(SPISong[cmd - '0'].name);
 +  }
 +  ShowSerial.println();
 +}
 +
 +void afficheSerialSon(int i) {
 +  ShowSerial.print("-------------------");
 +  ShowSerial.print(SPISong[i].index);
 +  ShowSerial.print("<-------->");
 +  ShowSerial.print(SPISong[i].name);
 +  ShowSerial.print("-------------------");
 +  ShowSerial.println();
 +}
 +/////////////////////////////////////////////////////////////////////// setup ///////////////////////
 +void setup() {
 +  while (!ShowSerial);
 +  ShowSerial.begin(9600);
 +  COMSerial.begin(9600);
 +  ShowSerial.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
 +  Mp3Player.init(COMSerial);
 +
 +
 +  ShowSerial.println("0...");
 +  getAllSong();
 +  printMenu();
 +  printSongs();
 +
 +  /// volume au max
 +  Mp3Player.volume(32);
 +  // pin du bouton
 +  pinMode(BOUTON, INPUT);
 +  pinMode(ENTREE_SIGNAL_DETECTION, INPUT);
 +  pinMode(LED, OUTPUT);
 +}
 +///////////////////////////////////////////// Loop ///////////////////////////////////
 +void loop() {
 +  // tester le statut du lecteur : (1) est en train de jouer, (2): stop, (3): en pause
 +  status = Mp3Player.getStatus();
 +
 +  // lecture entrée analogique A0 -> signal de sortie du détecteur
 +  entreeDetecteur = analogRead(ENTREE_DETECTEUR_SIGNAL);
 +
 +  etat_bouton = digitalRead(BOUTON);
 +  etat_entree_signal_ou_bouton = (etat_bouton == HIGH || entreeDetecteur > SEUIL_DETECTION);
 +  // debug
 +   //ShowSerial.print("etat_entree_signal_ou_bouton=");
 +   //ShowSerial.println(etat_entree_signal_ou_bouton);
 +
 +  if (etat_entree_signal_ou_bouton == true && (status == STATUS_STOP || status == STATUS_PAUSE) ) {
 +
 +    // debug
 +    //ShowSerial.print("entrée Analog  = ");
 +    //ShowSerial.println(etat_entree_signal_ou_bouton);
 +
 +    // debug
 +    //ShowSerial.println("lance musique aléatoire");
 +    // debug
 +    ShowSerial.print("entrée Analog  = ");
 +    ShowSerial.println(entreeDetecteur);
 +    ShowSerial.print("entrée BOUTON  = ");
 +    ShowSerial.println(etat_bouton);
 +
 +    // si bouton appuyé ET que le son ne joue pas 0x02:stop, 0x03: pause
 +    digitalWrite(LED, HIGH); // allumer la led
 +    // sélection aléatoire de l'indice de la musique
 +    byte indexMusic = floor(random(0, sd_songs));
 +    // debug
 +    // affiche les caractéristiques de la musique
 +    //ShowSerial.print("indice musique : ");
 +    //ShowSerial.println(indexMusic);
 +    // joue la musique
 +    Mp3Player.playMode(SINGLE_CYCLE);// joue la même musique en boucle
 +    audio(indexMusic); // lance le son
 +  }
 +  else if (etat_entree_signal_ou_bouton == false && status == STATUS_PLAY) {
 +    // si le bouton est relâché et que le son joue : on l'arrête
 +    digitalWrite(LED, LOW);
 +    //Mp3Player.stopPlaying();
 +    Mp3Player.pause_or_play();
 +
 +  }
 +
 +  // debug
 +  //delay(300);
 +}
 +</code>
wiki/tutoriels/arduino/detecter_un_signal_electrique.1623748851.txt.gz · Dernière modification: 2021/06/15 11:20 de damien.muti