claudiusmarius

ATtiny84DFPlayerMini

Jul 21st, 2021 (edited)
35
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  2.   // Commande de 2DFPlayer Mini à partir d'un ATtny84 - Horloge interne 8MHz (ne pas oublier de graver la séquence)
  3.   // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fonction ACCELERATION <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  4.   // La présence de parasites sonores a souvent été mentionnée par les utilisateurs de DFPlayer Mini, ce montage et le code, les suppriment.
  5.   // Attention le câblage doit être très soigné pour les Players, lorsque l'ampli est utilisé et que le Player est monté sur breadboard, un condensateur de 330µF et un autre de 470nF
  6.   // sont montés sur l'alimentation au plus prés du Player, les liaisons doivent être les plus courtes possibles, notamment par l'emploi de pinheaders strapps, les Dupont doivent  
  7.   // être réduits au maximum.
  8.   // Une alimentation dédiée est vivement recommandée pour alimenter les players, ne surtout pas passer par l'alimentation en provenance de l'USB.
  9.   // Bien sur, ne pas oublier de relier les masses de la partie MCU et de la puissance (Players).
  10.   // RP2 servait à simuler un régime moteur par augmentation volume sonore du moteur, cette solution fonctionnait très bien avec un ATtiny85, cependant, les résultats sont beaucoup
  11.   // moins concluants avec un ATtiny84 utilisant 2 liaisons RX/TX, RP2 (potPin) a néanmoins gardé en vue d'améliorations futures (temps de retard sur ATtiny84)
  12.   // Les ports TX1 et TX2 sont ouverts que si nécessaire (on les referme dés que l'on a plus besoin de faire transiter des informations, c'est une parade pour limiter les cliquetis
  13.   // La sortie 6 (MosfetGate) est dédiée à une future évolution.
  14.   // HP1 et HP2 sont des petits speakers de 4 ou 8 ohms récupérés sur un vieux ordinateur portable.
  15.   // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Claude DUFOURMONT +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  16.   //                                                                        
  17.   // ##################################################################### claude.dufourmont@laposte.net #############################################################################
  18.   //
  19.   //                                                              ############################################################
  20.   //                                                                      youtube.com/channel/UCvr9eb05lJow6N7m3SKqvNw  
  21.   //                                                              ############################################################
  22.  
  23.  
  24.   #include "Arduino.h"
  25.   #include <SoftwareSerial.h>
  26.   #include "DFRobotDFPlayerMini.h"
  27.  
  28.   #define TX1 4                                                         // Vers RX DFPlayer Mini 01
  29.    
  30.   #define TX2 0                                                         // Vers RX DFPlayer Mini 02
  31.  
  32.   #define potPin A2                                                     // Vers curseur RP2
  33.  
  34.   #define BPStartStop 10                                                // KEY3 ici ce BP ne sert qu'à lancer le cycle "arrêt moteur"
  35.   #define MosfetGate 6                                                  // Pour l'instant c'est la LED D1 - Ce port est destiné à une évolution future 1seul bouton Start/Stop                
  36.  
  37.   #define BPKlaxon 7                                                    // KEY1
  38.   #define BPAirPurge 8                                                  // KEY4, relaché d'air périodique selon la période "interval"
  39.  
  40.   // NOTE IMPORTANTE : Dans cette version KEY2 est câblé entre le Reset et le zéro volt de manière à relancer un cycle de démarrage.
  41.  
  42.    
  43.   // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  44.      
  45.    SoftwareSerial mySoftwareSerial_01 (5,4);                                          // RX1, TX1
  46.    SoftwareSerial mySoftwareSerial_02 (1,0);                                          // RX2, TX2
  47.  
  48.   // Réaffectation des RX/TX pour ne pas avoir de problème lors du téléversement
  49.   // Seuls les port TX sont réellement utilisés, les DFPlayer Mini, ne retournant rien dans cette configuration
  50.   // Les 1,2K branchées en série sur les port TX n'ont pas été installées car inefficaces, j'ai ajouté des zéners avec résistance pour écrêter les signaux TX aux valeurs de traitement par DFPlayer
  51.   // par DFPlayer Mini
  52.   // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  53.  
  54.   DFRobotDFPlayerMini myDFPlayer01;
  55.   byte volumeLevel_01 = 0;                                                            // variable du DFPlayer01 pour le contrôle de volume (0 à 30)
  56.   bool StateBPStartStop = 0;                                                          // état du BP Start ou Stop géré par le DFPlayer01
  57.   bool EnMarche = 0;
  58.  
  59.   DFRobotDFPlayerMini myDFPlayer02;
  60.   byte volumeLevel_02 = 0;
  61.   bool StateBPKlaxon = 0;                                                             // état du BP Klaxon géré par le DFPlayer02
  62.   bool StateBPAirPurge = 0;                                                           // état du BP AirPurge géré par le DFPlayer02
  63.    
  64.   const long interval = 15000;                                                        // Période PurgeAir                                                                        
  65.   unsigned long previousMillis = 0;
  66.  
  67.   void setup()
  68.   {
  69.  
  70.   EnMarche = 1;                                                                        // Dés que l'ATtiny84 est démarré, le moteur est déclaré en marche
  71.   pinMode (TX1, OUTPUT);                                                               // TX1 est déclaré ouverte
  72.   mySoftwareSerial_01.begin(9600);
  73.   myDFPlayer01.begin (mySoftwareSerial_01);
  74.  
  75.   pinMode (BPStartStop, INPUT_PULLUP);                                                  // Déclaration des E/S
  76.   pinMode (MosfetGate, OUTPUT);
  77.  
  78.   volumeLevel_01 = 30;                                                                  // Niveau sonore pour jouer le son du démarreur
  79.  
  80.   myDFPlayer01.play(7);       //7                                                       // Jouer la piste 7 du DFPlayer01 une seule fois (son du démarreur)                                    
  81.  
  82.   delay (1240);                                                                         // Le délais correspond à une attente équivalente à la durée démarreur (avant lancement de la prochaine commande)
  83.    
  84.   myDFPlayer01.loop(6);      //6                                                        // Jouer en bouccle infinie la piste 6 du DFPlayer01                                    
  85.   delay (5);
  86.   pinMode (TX1, INPUT_PULLUP);                                                          // Mise en haute impédance du port de liaison série TX1
  87.   digitalWrite (MosfetGate, LOW);
  88.   EnMarche = 1;
  89.  
  90.   mySoftwareSerial_02.begin(9600);
  91.   myDFPlayer02.begin (mySoftwareSerial_02);
  92.   pinMode (BPKlaxon, INPUT_PULLUP);
  93.   pinMode (BPAirPurge, INPUT_PULLUP);
  94.   }
  95.  
  96.   void loop()
  97.   {
  98.  
  99.   delay(5);
  100.   pinMode (TX1, OUTPUT);                                                                  // Le port TX1 est ouvert (positionné en sortie)
  101.   volumeLevel_01 = map(analogRead(potPin), 0, 1023, 15, 30);                              // Calibrage du niveau sonore en fonction de la valeur du potentiomètre
  102.   myDFPlayer01.volume(volumeLevel_01);  
  103.   delay(5);
  104.   pinMode (TX1, INPUT_PULLUP);                                                            // Mise en haute impédance du port de liaison série TX1
  105.   unsigned long currentMillis = millis();                                                 // Mémorisation de la valeur courante du temps écoulé à l'instant T
  106.   StateBPKlaxon =digitalRead (BPKlaxon);
  107.   if (currentMillis - previousMillis >= interval && EnMarche && StateBPKlaxon ==1)        // Test de dépassement de l'intervalle avec la condition moteur en marche
  108.   {
  109.   previousMillis = currentMillis;
  110.   pinMode (TX2, OUTPUT);
  111.   myDFPlayer02.volume(29);                                                                 // Volume sur DFPlayer02
  112.   myDFPlayer02.play(3);                                                                    // Jouer la piste 3 sur DFPlayer02 (échappement d'air)
  113.   pinMode (TX2, INPUT_PULLUP);                                                             // Le port TX2 est ouvert (positionné en sortie)
  114.   delay (5);
  115.   }
  116.    
  117.   StateBPStartStop =digitalRead (BPStartStop );                                                
  118.  
  119.   if (StateBPStartStop == LOW && EnMarche == 0)                                            // Conditions d'action suite appui du BP Start Stop
  120.   {
  121.   digitalWrite (MosfetGate, HIGH);
  122.   delay(5);
  123.   }
  124.  
  125.   if (StateBPStartStop == LOW && EnMarche == 1)
  126.   {
  127.   digitalWrite (MosfetGate, LOW);
  128.   delay(5);
  129.   pinMode (TX1, OUTPUT);                                                                    // Ouverture de la liaison série pour passer des commandes sur DFPlayer01
  130.   myDFPlayer01.volume(30);
  131.   delay(5);
  132.   //myDFPlayer01.disableLoopAll(); // Ne pas laisser cette ligne évite un léger blanc sonore indésirable// Comme une demande de Stop est interprétée, désactivation de toutes les pistes en cours sur le DFPlayer01
  133.   myDFPlayer01.play(11);                                                                    // Jouer la piste 11 du DFPlayer01 (son de l'arrêt moteur)
  134.   pinMode (TX1, INPUT_PULLUP);
  135.   delay (5);                                                                                
  136.   EnMarche = 0;                                                                             // L'état du moteur est déclaré à l'arrêt
  137.   }
  138.  
  139.   // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Actionnement Klaxon<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  140.   StateBPKlaxon =digitalRead (BPKlaxon);                                                    // Actualisation de l'état Klaxon
  141.   if (StateBPKlaxon == LOW)                                                                 // Si l'état Klaxon est à 1
  142.   {
  143.   pinMode (TX2, OUTPUT);                                                                    // Le port TX2 est ouvert (positionné en sortie)
  144.   myDFPlayer02.volume(30);                                                                  // Volume à fond sur DFPlayer02
  145.   myDFPlayer02.play(8);                                                                     // Jouer la piste 1 sur DFPlayer02
  146.   pinMode (TX2, INPUT_PULLUP);
  147.   delay (5);
  148.   }
  149.  
  150.   // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Actionnement AirPurge<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  151.   StateBPAirPurge =digitalRead (BPAirPurge);                                                // Actualisation de l'état Klaxon
  152.   if (StateBPAirPurge == LOW)                                                               // Si l'état Klaxon est à 1
  153.   {
  154.   pinMode (TX2, OUTPUT);
  155.   myDFPlayer02.volume(30);                                                                  // Volume à fond sur DFPlayer02
  156.   myDFPlayer02.play(3);                                                                     // Jouer la piste 1 sur DFPlayer02
  157.   pinMode (TX2, INPUT_PULLUP);
  158.   delay (5);
  159.   }
  160.   }
  161.  
  162.  
RAW Paste Data