/////////////////////////////// // projet Telephone // // les enfants de Gutenberg // // musée de l’imprimerie Pam // /////////////////////////////// /* Voir le tuto en ligne sur wikidebrouillard : https://www.wikidebrouillard.org/wiki/Hacker_un_t%C3%A9l%C3%A9phone_%C3%A0_cadran_rotatif +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | | 5V/MISO2 [ ][ ] A4/SDA[ ] | | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | | [ ]IOREF MISO/12[X] |- Busy lecteur mp3 | [ ]RST MOSI/11[X]~|- RX lecteur mp3 | [ ]3V3 +---+ 10[X]~|- TX lecteur mp3 lecteur mp3 -| [X]5v -| A |- 9[ ]~| | [X]GND -| R |- 8[ ] | | [ ]GND -| D |- | | [ ]Vin -| U |- 7[X] |- impulsions | -| I |- 6[X]~|- rotations | [ ]A0 -| N |- 5[X]~|- combiné | [ ]A1 -| O |- 4[ ] | | [ ]A2 +---+ INT1/3[ ]~| | [ ]A3 INT0/2[ ] | | [ ]A4/SDA RST SCK MISO TX>1[ ] | | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ +-------\_/--------+ +5V |[X] MP3-TF-16P [X]|- broche Busy du lecteur mp3 vers 12 Broche 11 resist. 200ohms - RX |[X] DFPlayer [ ]| Broche 10 TX |[X] __________ [ ]| |[ ]| |[ ]| |[ ]| CARTE |[ ]| Haut-Parleur |[X]| SD |[ ]| GND |[X]| |[ ]| Haut-Parleur |[X]| |[ ]| |___|__________|___| Le cadran du telephone, 4 fils : - un rouge, Broche 7 : les impulsions : LOW au repos. - un bleu, Broche 6 : la mise en rotation du cadran. reste à l'état LOW tant qu'il tourne, HIGH au repos - un rouge pointillé, GND : la masse - un bleu pointillé : Le détecteur de combiné : - un interrupteur normalement fermé, Broche 5 et GND : il est à l'état HIGH lorsque raccroché et LOW quand il est décroché. ___ / ___ \ |_| | | /_/ _ ___ _ |_| |___|_| |_ ___|_ _| |___| |_| Les petits Débrouillards - Antony Le Goïc-Auffret septembre 2024 - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/ Schéma de l'Arduino en ASCII-ART CC-By http://busyducks.com/ascii-art-arduinos Sous licence CC-By-Sa (http://creativecommons.org/licenses/by-nc-sa/3.0/) */ // appels de bibliothèques #include #include // configurer de la communication lecteur <-> Arduino SoftwareSerial maComSerie(10, 11); // TX, RX (bon ordre, vérifié) DFRobotDFPlayerMini monPlayerMP3 ; // on défini le lecteur mp3 #define impulsions 7 // Cadran - fil rouge - LOW au repos #define rotation 6 // Cadran - fil bleu - HIGH au repos, LOW quand ça tourne #define combine 5 // Capteur Décroché Racroché #define busy 12 // Broche du lecteur mp3 qui indique il y a une lecture en cours ou pas : LOW lecture, HIGH pas int chiffre = 0; // chiffre composé int nbChiffre = 0; // comptage du nombre de chiffres dunuméro composé int numeroTel = 0; // numéro composé bool compose = 0; // 0 si on n'est pas en train de composer, 1 si composition en cours. bool implusionsPrec = 0; // gère l'effet rebond lors du comptage des impulsions bool stock; // Stocke la valeur de l'état du lecteur mp3 : LOW lecture, HIGH pas bool etatCombine; // Stocke la valeur de l'état du combiné : LOW lorsque décroché, HIGH lorsque raccroché void setup() { Serial.begin(9600); maComSerie.begin(9600) ; monPlayerMP3.begin(maComSerie) ; monPlayerMP3.setTimeOut(500); // place la communication serie time out 500ms monPlayerMP3.volume(15); // règle le volume (de 0 to 30). pinMode(impulsions, INPUT_PULLUP); pinMode(rotation, INPUT_PULLUP); pinMode(combine , INPUT_PULLUP); // Broche combinée en input Pullup pinMode(LED_BUILTIN, OUTPUT); // pour vérifier avec l'allumage de la led embarquée de l'Arduino pinMode(busy,INPUT_PULLUP); // état du lecteur MP3 - LOW en cours de lecture, HIGH si pas de lecture } void loop() { stock = digitalRead(busy); // test pour dev //testCombine etatCombine = digitalRead(combine); Serial.print("le combiné est : "); Serial.println(etatCombine); if (etatCombine) { // si le combiné est raccroché nbChiffre=0; // je ré-initialie le nb de chiffre dans le numéro. vérifier numeroTel = 0; // je ré-initialise le numéro de tel. vérifier if (!stock) (monPlayerMP3.stop()); // si une piste en cours de lecture, l'arrêter Serial.println("c'est raccroché ! "); return; } if (!etatCombine) { // si le combiné est décroché if (digitalRead(rotation) && digitalRead(busy)){ // si le cadran ne tourne et qu'il n'y pas de lecture en cours Serial.println("j'attend"); //j'attend la rotation du cadran lecture(1); // lance lecture de la tonalité. } } if (!digitalRead(rotation)){ //quand le cadrant commence tourner monPlayerMP3.stop(); // arret de la tonalité compose = 1; // c'est la composition d'un numéro while (compose){ Serial.println("numérotation en cours"); nbChiffre++; // je compte le nombre de chiffres composés while (!digitalRead(rotation)){ // tant que le cadrant tourne Serial.print("chiffre n° : "); Serial.println(nbChiffre); comptage(); // je compte les impulsions } calculNumeroTel(); // je calcule le numéro if (nbChiffre==4) (compose = 0); // une foi que j'ai 4 chiffres à mon numéro, j'arrête de composer while (digitalRead(rotation) && compose); // on attend la composition du prochain chiffre, sauf si c'est fini } } if (nbChiffre==4){ numero(); Serial.print("Le numéro composé est le : "); Serial.println(numeroTel); // delay(3000); nbChiffre=0; // je ré-initialie le nb de chiffre dans le numéro. numeroTel = 0; // je ré-initialise le numéro de tel } } void comptage() { // fonction de comptage des impulsions pour déterminé le chifffe composé bool lectureImpulsion = digitalRead(impulsions); if (lectureImpulsion!=implusionsPrec) { if (lectureImpulsion==1){ chiffre++, Serial.println("+ 1 impulsion, "); delay(20); } } if (chiffre>=10) chiffre=0; implusionsPrec = lectureImpulsion; } void calculNumeroTel() { // fonction qui détermine le numéro composé Serial.print("le chiffre composé est le : "); Serial.println(chiffre); switch (nbChiffre) { case 1 : numeroTel = numeroTel + (chiffre*1000); break; case 2 : numeroTel = numeroTel + (chiffre*100); break; case 3 : numeroTel = numeroTel + (chiffre*10); break; case 4 : numeroTel = numeroTel + chiffre; break; default: numeroTel = 0; break; } chiffre = 0; } void numero() { //fonction qui attribue une piste mp3 à un numéro composé switch (numeroTel) { case 1452 : acheminement(); lecture(6); break; case 1796 : acheminement(); lecture(7); break; case 1826 : acheminement(); lecture(8); break; case 1951 : acheminement(); lecture(9); break; case 1990 : acheminement(); lecture(10); break; default: lecture(5); break; } } void lecture(int piste) { // fonction qui lance la lecture d'une piste monPlayerMP3.stop(); // arret de la piste en cours de lecture monPlayerMP3.play(piste); Serial.print("lecture piste n° : "); Serial.println(piste); delay(100); } void acheminement() { monPlayerMP3.stop(); // arret de la piste en cours de lecture monPlayerMP3.play(3); // liste le son acheminement delay(1500); monPlayerMP3.stop(); // arret monPlayerMP3.play(4); // sonnerie }