Advertisement
claudiusmarius

SimulateurChargeClaudiusMarius01

Feb 20th, 2024
660
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.26 KB | None | 0 0
  1. //============================================================================================================================================
  2.   //INFORMATION SUR les courants débités par l'alimentation à tester appelon la ALIM dont la tension d'alimentation VCC est variable de 5V à 24V
  3.   // IMPORTANT, LES COURANTS SONT EXPRIMES EN milliAmpères
  4.   // Io = VCC/920 le résultat est en mA ce courant est constamment débité par l'alimentation ALIM
  5.   // I1 = VCC/9.4 le résultat est en mA ce courant est seulement débité quand :digitalWrite(GateQ1, HIGH);
  6.   // I2 = VCC/94 le résultat est en mA ce courant est seulement débité quand :digitalWrite(GateQ2, HIGH);
  7.   // I3 = VCC/94 le résultat est en mA ce courant est seulement débité quand :digitalWrite(GateQ3, HIGH);
  8.   // IMPORTANT : pour connaître VCC c'est RatioVCCFiltre*K5
  9.   // Comme leTM1637 ne tient pas compte de ce courant c'est du courant supplémentaire par la rapport à celui affiché sur le TM1637 il faut donc les rajouter
  10.  
  11.   // ================================SOUTENEZ MOI EN LIKANT, PARTAGEANT, COMMENTANT ET EN VOUS ABONNANT=========================================
  12.  
  13.   //                                             www.youtube.com/@ClaudeDufourmont
  14.  
  15.   // ===========================================================================================================================================
  16.  
  17.   #include <TM1637Display.h>
  18.   #include <Adafruit_NeoPixel.h>
  19.   #include <Arduino.h>
  20.   #define CLK1 D5
  21.   #define DIO1 D4
  22.   #define GateQ1 D7
  23.   #define GateQ2 D8
  24.   #define GateQ3 D9
  25.   #define BrocheNeopixel D3
  26.   #define NLed 12
  27.   #define BrocheRatioVcc A10
  28.                                        
  29.   #define K0 1.00                                             //Facteur d'ajustement du courant I0
  30.   #define K1 1.00                                             //Facteur d'ajustement du courant I1
  31.   #define K2 1.00                                             //Facteur d'ajustement du courant I2
  32.   #define K3 1.00                                             //Facteur d'ajustement du courant I3
  33.   #define K4  1.00                                            //Facteur d'ajustement de la tension RatioVCCFiltre
  34.   #define K5  9.32                                            //Rapport ptentiomètrique --REEL-- inversé de  R27/(R26 + R27)
  35.  
  36.   TM1637Display display1(CLK1, DIO1);
  37.   Adafruit_NeoPixel Strip(NLed, BrocheNeopixel, NEO_GRB + NEO_KHZ800);
  38.  
  39.   #define Luminosite 11 // Lumunosité Matrice (de 0 à 255)
  40.  
  41.   int PotentiometerGros = 0;
  42.   int LastPotentiometerGros = 0;
  43.   int PotentiometerFin = 0;
  44.   int TemperatureDissipateur = 0;
  45.   const int NombreEchantillons = 40;                          // Nombre d'échantillons pour la moyenne mobile
  46.  
  47.   int Lectures[NombreEchantillons];                           // Tableau pour stocker les échantillons
  48.   int readIndex = 0;                                          // Index de lecture dans le tableau
  49.   int total = 0;                                              // Somme des échantillons
  50.   int RatioVcc;
  51.  
  52.  
  53.   // ++++++++++++++++++++++++++++++++++++++++++Ci-desssous création des 3 libellés d'alarmes+++++++++++++++++++++++++++++++++++++++++++
  54.  
  55.   const uint8_t ERR1[] = {
  56.     SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G ,
  57.     SEG_F| SEG_E | SEG_D ,
  58.     SEG_A | SEG_B | SEG_C | SEG_D | SEG_E| SEG_F,
  59.     SEG_B | SEG_C };
  60.   //----------------------------------------------------AL01 (LIMITE SUPERIEURE VCC)----------------------------------------------------
  61.  
  62.    const uint8_t ERR2[] = {
  63.     SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G ,
  64.     SEG_F| SEG_E | SEG_D ,
  65.     SEG_A | SEG_B | SEG_C | SEG_D | SEG_E| SEG_F,
  66.     SEG_A |SEG_B | SEG_G | SEG_D | SEG_E };
  67.   //----------------------------------------------------AL02 (LIMITE INFERIEURE VCC)----------------------------------------------------
  68.  
  69.   const uint8_t ERR3[] = {
  70.     SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G ,
  71.     SEG_F| SEG_E | SEG_D ,
  72.     SEG_A | SEG_B | SEG_C | SEG_D | SEG_E| SEG_F,
  73.     SEG_A |SEG_B | SEG_G | SEG_D | SEG_C };
  74.   //------------------------------------------AL03 (LIMITE SUPERIEURE TEMPERATURE DISSIPATEUR)------------------------------------------
  75.  
  76.   #define FILTER_ALPHA 0.1 // Facteur de lissage, ajustez selon vos besoins
  77.   int RatioVCCFiltre = 0;
  78.  
  79.   #define SeuilIntermediaire0 (1.19 / 3.3 * 1023) // Le terme 1.19 correspond à 10,94V ( 9.2 * 1.19) seuil de la tension à tester en dessous duquel Bypassage complet des 3 doubles shunts
  80.   #define Hysteresis0 0                            // Hystérésis non utilisé pour l'instant
  81.  
  82.   #define SeuilIntermediaire1 (1.74 / 3.3 * 1023) // Le terme 1.74 correspond à 16.08V ( 9.2 * 1.74) seuil de la tension à tester en dessous duquel Bypassage complet des 2 doubles shunts supérieurs
  83.   #define Hysteresis1 0                            // Hystérésis non utilisé pour l'instant
  84.  
  85.   #define SeuilIntermediaire2 (2.17 / 3.3 * 1023) // Le terme 2.17 correspond à 19,96V ( 9.2 * 2.17) seuil de la tension à tester en dessous duquel Bypassage complet du double shunt supérieur
  86.   #define Hysteresis2 0                            // Hystérésis non utilisé pour l'instant
  87.  
  88.   #define SeuilIntermediaire3 (2.6 / 3.3 * 1023)  // Le terme 2.6 correspond à 23,92V ( 9.2 * 2,6) seuil de la tension à tester Maximal admissible
  89.   #define Hysteresis3 0                            // Hystérésis non utilisé pour l'instant
  90.  
  91.   #define SeuilIntermediaire4 (1 * 1023)           //  seuil de la tension à tester hors butée
  92.   #define Hysteresis4 0                            // Hystérésis non utilisé pour l'instant
  93.  
  94.  
  95.   int step = 0;
  96.  
  97.   void setup()
  98.   {
  99.   Serial.begin(9600);
  100.   //Serial.println("Démarrage du programme...");                    // Uniquement en débogage
  101.   pinMode(GateQ1, OUTPUT);
  102.   pinMode(GateQ2, OUTPUT);
  103.   pinMode(GateQ3, OUTPUT);
  104.   analogReadResolution(10);
  105.   analogWriteResolution(10);                                         // Résolution du DAC (10 bits)
  106.   display1.setBrightness(0x0A);                                      // Luminosité entre 0x0A et 0x0F
  107.  
  108.   Strip.begin(); // Initialisation des Néopixel  de 10 Leds
  109.   Strip.setBrightness(Luminosite);
  110.  
  111.   analogWrite(A0, 0);                                                 // Initaialisation du DAC à zéro pendant 2 secondes
  112.  
  113.   digitalWrite(GateQ1, LOW);                                          //Blocage Q4
  114.   digitalWrite(GateQ2, LOW);                                          //Blocage Q5
  115.   digitalWrite(GateQ3, LOW);                                          //Blocage Q6
  116.   //                                ==> Les 3 doubles shunts sont passants
  117.  
  118.   Synoptique0();
  119.   Strip.clear(); // Éteindre toutes les NeoPixels
  120.   Strip.show();
  121.   delay(2000);
  122.   }
  123.  
  124.   void loop()
  125.   {
  126.   PotentiometerGros = analogRead(A6);
  127.   PotentiometerFin = analogRead(A1);
  128.   TemperatureDissipateur = analogRead(A2);
  129.   PotentiometerFin = map(PotentiometerFin, 0, 1023, -30, 30);
  130.  
  131.   RatioVcc = analogRead(BrocheRatioVcc);
  132.   RatioVCCFiltre = (int)(FILTER_ALPHA * RatioVcc + (1.0 - FILTER_ALPHA) * RatioVCCFiltre);
  133.  
  134.   if (TemperatureDissipateur > 200)
  135.   //if (TemperatureDissipateur > 50)
  136.   //if (TemperatureDissipateur > 120)
  137.  
  138.   {
  139.   digitalWrite(GateQ1, LOW);                                          //Blocage Q4
  140.   digitalWrite(GateQ2, LOW);                                          //Blocage Q5
  141.   digitalWrite(GateQ3, LOW);                                          //Blocage Q6
  142.   Erreur013();                                                        //Activation Fonction depassement de température dissipateur
  143.   }
  144.  
  145.   if (RatioVCCFiltre <= (0.51 / 3.3 * 1023))  //Le terme 0.51 correspond à 4.7V ( 9.2 * 0.51) seuil de la tension à tester minimale
  146.   {
  147.  
  148.   digitalWrite(GateQ1, LOW);                                          //Blocage Q4
  149.   digitalWrite(GateQ2, LOW);                                          //Blocage Q5
  150.   digitalWrite(GateQ3, LOW);                                          //Blocage Q6
  151.   Erreur012();                                                        // Activation Fonction descente sous limite inférieure VCC
  152.   }
  153.  
  154.   else if (RatioVCCFiltre <= SeuilIntermediaire0 - Hysteresis0)
  155.   {
  156.   digitalWrite(GateQ1, HIGH);                                         //Saturation Q4
  157.   digitalWrite(GateQ2, LOW);                                          //Blocage Q5
  158.   digitalWrite(GateQ3, LOW);                                          //Blocage Q6
  159.   //                                ==> Bypassage complet des 3 doubles shunts
  160.  
  161.   Synoptique0();
  162.   Strip.show();
  163.   }
  164.   else if (RatioVCCFiltre <= SeuilIntermediaire1 - Hysteresis1)
  165.   {
  166.   digitalWrite(GateQ1, LOW);                                          //Blocage Q4
  167.   digitalWrite(GateQ2, HIGH);                                         //Saturation Q5
  168.   digitalWrite(GateQ3, LOW);                                          //Blocage Q6
  169.   //                                ==> Bypassage complet des 2 doubles shunts supérieurs
  170.  
  171.   Synoptique1();
  172.   delay(20);
  173.   Strip.show();
  174.   }
  175.   else if (RatioVCCFiltre <= SeuilIntermediaire2 - Hysteresis2)   // Le terme 2.17 correspond à 19.64V ( 9.2 * 2.17) seuil de la tension à tester Maximal admissible
  176.  
  177.   {
  178.   digitalWrite(GateQ1, LOW);                                          //Blocage Q4
  179.   digitalWrite(GateQ2, LOW);                                          //Blocage Q5
  180.   digitalWrite(GateQ3, HIGH);                                        //Saturation Q6
  181.   //                                ==> Bypassage complet du  double shunt supérieur
  182.  
  183.   Synoptique2();
  184.   delay(20);
  185.   Strip.show();
  186.   }
  187.   else if (RatioVCCFiltre <= SeuilIntermediaire3 - Hysteresis3)    // Le terme 2.4 correspond à 22.08V ( 9.2 * 2.4) seuil de la tension à tester Maximal admissible
  188.   {
  189.   digitalWrite(GateQ1, LOW);                                          //Blocage Q4
  190.   digitalWrite(GateQ2, LOW);                                          //Blocage Q5
  191.   digitalWrite(GateQ3, LOW);                                          //Blocage Q6
  192.   Synoptique3();
  193.   delay(20);
  194.   Strip.show();
  195.   }
  196.   else if (RatioVCCFiltre <= SeuilIntermediaire4 - Hysteresis4)
  197.   {
  198.   delay(10);
  199.   analogWrite(A0, 0);                                                 //Arrêt débit
  200.   digitalWrite(GateQ1, LOW);                                          //Blocage Q4
  201.   digitalWrite(GateQ2, LOW);                                          //Blocage Q5
  202.   digitalWrite(GateQ3, LOW);                                          //Blocage Q6
  203.   analogWrite(A0, 0);                                                 //Arrêt débit
  204.   Erreur011();
  205.   }
  206.  
  207.   int adjustedValue = (PotentiometerGros + PotentiometerFin);
  208.   int displayValue = constrain(adjustedValue, 0, 1023);
  209.   int displayValue1 = map(adjustedValue, 0, 1023, 0, 1000);
  210.   int displayForTM1637 = constrain(displayValue1, 0, 1000);
  211.  
  212.   total = total - Lectures[readIndex];
  213.   Lectures[readIndex] = displayValue1;
  214.   total = total + Lectures[readIndex];
  215.   readIndex = (readIndex + 1) % NombreEchantillons;
  216.  
  217.   int maxVal = Lectures[0];
  218.   int minVal = Lectures[0];
  219.   for (int i = 1; i < NombreEchantillons; i++)
  220.   {
  221.   maxVal = max(maxVal, Lectures[i]);
  222.   minVal = min(minVal, Lectures[i]);
  223.   }
  224.  
  225.   int averageValue = (total - maxVal - minVal) / (NombreEchantillons - 2);
  226.   averageValue = constrain(averageValue, 0, 1023);
  227.  
  228.   if (abs(averageValue - LastPotentiometerGros) > 1)
  229.   {
  230.   float VCCFiltre = K4 * RatioVCCFiltre * K5*3.3/1023;
  231.                                                
  232.   float Io = K0 * VCCFiltre / 920.0;
  233.                                                
  234.   float I1 = K1 * (digitalRead(GateQ1) ? VCCFiltre / 9.40 : 0);       //9.4 (Kohms) correspond à R2+R3, but prendre en compte le coourant de pont de Q1
  235.               // Nota : en fait j'ai fait une petite erreur sur R2 et R3 : j'ai installé 2 fois 4,7K au lieu de 47K
  236.   float I2 = K2 * (digitalRead(GateQ2) ? VCCFiltre / 94.0 : 0);       //94 (Kohms) correspond à R6+R7, but prendre en compte le coourant de pont de Q2
  237.   float I3 = K3 * (digitalRead(GateQ3) ? VCCFiltre / 94.0 : 0);       //94 (Kohms) correspond à R11+R12, but prendre en compte le coourant de pont de Q3
  238.  
  239.   float correctedDisplayValue = displayForTM1637 + Io + I1 + I2 + I3;  
  240.   // En fait le courant débité par l'alim à tester doit inclure les courants de pont de Q1 à Q3 et celui du pont de ratio créé par R26 et R27
  241.  
  242.   display1.showNumberDec(correctedDisplayValue, false, 4, 0);
  243.  
  244.   /*Serial.print("VCCFiltre: ");                            // UNIQUEMENT EN MISE AU POINT ET DEBOGAGE
  245.   Serial.print(VCCFiltre);
  246.   Serial.print("\t Io: ");
  247.   Serial.print(Io);
  248.   Serial.print("\t I1: ");
  249.   Serial.print(I1);
  250.   Serial.print("\t I2: ");
  251.   Serial.print(I2);
  252.   Serial.print("\t I3: ");
  253.   Serial.print(I3);
  254.   Serial.print("\t Q1: ");
  255.   Serial.print(digitalRead(GateQ1));
  256.   Serial.print("\t Q2: ");
  257.   Serial.print(digitalRead(GateQ2));
  258.   Serial.print("\t Q3: ");
  259.   Serial.print(digitalRead(GateQ3));
  260.   Serial.print("\t correctedDisplayValue: ");
  261.   Serial.println(correctedDisplayValue);*/
  262.   LastPotentiometerGros = averageValue;
  263.   }
  264.  
  265.   analogWrite(A0, map((0.979*displayForTM1637), 0, 1000, 0, 1005));
  266.   }
  267.  
  268.   void Synoptique0()
  269.   {
  270.   Strip.clear();
  271.   for (int i = 0; i <= 5; i++)
  272.   {
  273.   Strip.setPixelColor(i, 0, 0, 0);
  274.   }
  275.   for (int i = 9; i <= 11; i++)
  276.   {
  277.   Strip.setPixelColor(i, 0, 0, 0);
  278.   }
  279.   for (int i = 6; i <= 8; i++)
  280.   {
  281.   Strip.setPixelColor(i, 255, 0, 0);
  282.   }
  283.   Strip.show();
  284.   }
  285.  
  286.   void Synoptique1()
  287.   {
  288.   Strip.clear();
  289.   for (int i = 0; i <= 3; i++)
  290.   {
  291.   Strip.setPixelColor(i, 0, 0, 0);
  292.   }
  293.   for (int i = 6; i <= 8; i++)
  294.   {
  295.   Strip.setPixelColor(i, 0, 0, 0);
  296.   }
  297.   Strip.setPixelColor(11, 0, 0, 0);
  298.  
  299.   for (int i = 9; i <= 10; i++)
  300.   {
  301.   Strip.setPixelColor(i, 255, 0, 0);
  302.   }
  303.   for (int i = 4; i <= 5; i++)
  304.   {
  305.   Strip.setPixelColor(i, 255, 0, 0);
  306.   }
  307.   Strip.show();
  308.   }
  309.  
  310.   void Synoptique2()
  311.   {
  312.   Strip.clear();
  313.   for (int i = 0; i <= 2; i++)
  314.   {
  315.   Strip.setPixelColor(i, 0, 0, 0);
  316.   }
  317.   for (int i = 6; i <= 8; i++)
  318.   {
  319.   Strip.setPixelColor(i, 0, 0, 0);
  320.   }
  321.   Strip.setPixelColor(11, 255, 0, 0);
  322.  
  323.   for (int i = 9; i <= 10; i++)
  324.   {
  325.   Strip.setPixelColor(i, 0, 0, 0);
  326.   }
  327.   for (int i = 2; i <= 5; i++)
  328.   {
  329.   Strip.setPixelColor(i, 255, 0, 0);
  330.   }
  331.   Strip.show();
  332.   }
  333.  
  334.   void Synoptique3()
  335.   {
  336.   Strip.clear();
  337.   for (int i = 0; i <= 5; i++)
  338.   {
  339.   Strip.setPixelColor(i, 255, 0, 0);
  340.   }
  341.  
  342.   for (int i = 6; i <= 11; i++)
  343.   {
  344.   Strip.setPixelColor(i, 0, 0, 0);
  345.   }
  346.   Strip.show();
  347.   }
  348.  
  349.   void Erreur011()
  350.   {
  351.   analogWrite(A0, 0);                                         //Arrêt débit
  352.   display1.setSegments(ERR1, 4);                              //Affichage "AL01" sur le display 4 digits
  353.   Strip.clear();
  354.   analogWrite(A0, 0);                                         //Arrêt débit
  355.   for (int i = 0; i <= 5; i++)
  356.   {
  357.   Strip.setPixelColor(i, 255, 0, 0);
  358.   }
  359.   Strip.setPixelColor(11, 0, 0, 255 * step);
  360.  
  361.   for (int i = 6; i <= 10; i++)
  362.   {
  363.   Strip.setPixelColor(i, 0, 0, 0);
  364.   }
  365.   Strip.show();
  366.   step = 1 - step; // Alterner entre les deux états
  367.   delay (100);
  368.   }
  369.  
  370.   void Erreur012()
  371.   {
  372.   analogWrite(A0, 0);                                         //Arrêt débit
  373.   display1.setSegments(ERR2, 4);                              //Affichage "AL02" sur le display 4 digits
  374.   Strip.clear();
  375.   analogWrite(A0, 0);                                         //Arrêt débit
  376.   for (int i = 0; i <= 5; i++)
  377.   {
  378.   Strip.setPixelColor(i, 255, 0, 0);
  379.   }
  380.   Strip.setPixelColor(11, 0, 0, 0);
  381.   for (int i = 6; i <= 8; i++)
  382.   {
  383.   Strip.setPixelColor(i, 0, 0, 0);
  384.   }
  385.   for (int i = 9; i <= 10; i++)
  386.   {
  387.   Strip.setPixelColor(i, 0, 0, 255 * step);
  388.   }
  389.   Strip.show();
  390.   step = 1 - step; // Alterner entre les deux états
  391.   delay(100);
  392.   }
  393.  
  394.   void Erreur013()
  395.   {
  396.   analogWrite(A0, 0);                                         //Arrêt débit
  397.   display1.setSegments(ERR3, 4);                              //Affichage "AL03" sur le display 4 digits
  398.   Strip.clear();
  399.   analogWrite(A0, 0);
  400.   for (int i = 0; i <= 5; i++)
  401.   {
  402.   Strip.setPixelColor(i, 255, 0, 0);
  403.   }
  404.   for (int i = 9; i <= 11; i++)
  405.   {
  406.   Strip.setPixelColor(i, 0, 0, 0);
  407.   }
  408.  
  409.   for (int i = 6; i <= 8; i++)
  410.   {
  411.   Strip.setPixelColor(i, 0, 0, 255 * step);
  412.   }
  413.   Strip.show();
  414.   step = 1 - step; // Alterner entre les deux états
  415.   delay(100);
  416.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement