Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //============================================================================================================================================
- //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
- // IMPORTANT, LES COURANTS SONT EXPRIMES EN milliAmpères
- // Io = VCC/920 le résultat est en mA ce courant est constamment débité par l'alimentation ALIM
- // I1 = VCC/9.4 le résultat est en mA ce courant est seulement débité quand :digitalWrite(GateQ1, HIGH);
- // I2 = VCC/94 le résultat est en mA ce courant est seulement débité quand :digitalWrite(GateQ2, HIGH);
- // I3 = VCC/94 le résultat est en mA ce courant est seulement débité quand :digitalWrite(GateQ3, HIGH);
- // IMPORTANT : pour connaître VCC c'est RatioVCCFiltre*K5
- // 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
- // ================================SOUTENEZ MOI EN LIKANT, PARTAGEANT, COMMENTANT ET EN VOUS ABONNANT=========================================
- // www.youtube.com/@ClaudeDufourmont
- // ===========================================================================================================================================
- #include <TM1637Display.h>
- #include <Adafruit_NeoPixel.h>
- #include <Arduino.h>
- #define CLK1 D5
- #define DIO1 D4
- #define GateQ1 D7
- #define GateQ2 D8
- #define GateQ3 D9
- #define BrocheNeopixel D3
- #define NLed 12
- #define BrocheRatioVcc A10
- #define K0 1.00 //Facteur d'ajustement du courant I0
- #define K1 1.00 //Facteur d'ajustement du courant I1
- #define K2 1.00 //Facteur d'ajustement du courant I2
- #define K3 1.00 //Facteur d'ajustement du courant I3
- #define K4 1.00 //Facteur d'ajustement de la tension RatioVCCFiltre
- #define K5 9.32 //Rapport ptentiomètrique --REEL-- inversé de R27/(R26 + R27)
- TM1637Display display1(CLK1, DIO1);
- Adafruit_NeoPixel Strip(NLed, BrocheNeopixel, NEO_GRB + NEO_KHZ800);
- #define Luminosite 11 // Lumunosité Matrice (de 0 à 255)
- int PotentiometerGros = 0;
- int LastPotentiometerGros = 0;
- int PotentiometerFin = 0;
- int TemperatureDissipateur = 0;
- const int NombreEchantillons = 40; // Nombre d'échantillons pour la moyenne mobile
- int Lectures[NombreEchantillons]; // Tableau pour stocker les échantillons
- int readIndex = 0; // Index de lecture dans le tableau
- int total = 0; // Somme des échantillons
- int RatioVcc;
- // ++++++++++++++++++++++++++++++++++++++++++Ci-desssous création des 3 libellés d'alarmes+++++++++++++++++++++++++++++++++++++++++++
- const uint8_t ERR1[] = {
- SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G ,
- SEG_F| SEG_E | SEG_D ,
- SEG_A | SEG_B | SEG_C | SEG_D | SEG_E| SEG_F,
- SEG_B | SEG_C };
- //----------------------------------------------------AL01 (LIMITE SUPERIEURE VCC)----------------------------------------------------
- const uint8_t ERR2[] = {
- SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G ,
- SEG_F| SEG_E | SEG_D ,
- SEG_A | SEG_B | SEG_C | SEG_D | SEG_E| SEG_F,
- SEG_A |SEG_B | SEG_G | SEG_D | SEG_E };
- //----------------------------------------------------AL02 (LIMITE INFERIEURE VCC)----------------------------------------------------
- const uint8_t ERR3[] = {
- SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G ,
- SEG_F| SEG_E | SEG_D ,
- SEG_A | SEG_B | SEG_C | SEG_D | SEG_E| SEG_F,
- SEG_A |SEG_B | SEG_G | SEG_D | SEG_C };
- //------------------------------------------AL03 (LIMITE SUPERIEURE TEMPERATURE DISSIPATEUR)------------------------------------------
- #define FILTER_ALPHA 0.1 // Facteur de lissage, ajustez selon vos besoins
- int RatioVCCFiltre = 0;
- #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
- #define Hysteresis0 0 // Hystérésis non utilisé pour l'instant
- #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
- #define Hysteresis1 0 // Hystérésis non utilisé pour l'instant
- #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
- #define Hysteresis2 0 // Hystérésis non utilisé pour l'instant
- #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
- #define Hysteresis3 0 // Hystérésis non utilisé pour l'instant
- #define SeuilIntermediaire4 (1 * 1023) // seuil de la tension à tester hors butée
- #define Hysteresis4 0 // Hystérésis non utilisé pour l'instant
- int step = 0;
- void setup()
- {
- Serial.begin(9600);
- //Serial.println("Démarrage du programme..."); // Uniquement en débogage
- pinMode(GateQ1, OUTPUT);
- pinMode(GateQ2, OUTPUT);
- pinMode(GateQ3, OUTPUT);
- analogReadResolution(10);
- analogWriteResolution(10); // Résolution du DAC (10 bits)
- display1.setBrightness(0x0A); // Luminosité entre 0x0A et 0x0F
- Strip.begin(); // Initialisation des Néopixel de 10 Leds
- Strip.setBrightness(Luminosite);
- analogWrite(A0, 0); // Initaialisation du DAC à zéro pendant 2 secondes
- digitalWrite(GateQ1, LOW); //Blocage Q4
- digitalWrite(GateQ2, LOW); //Blocage Q5
- digitalWrite(GateQ3, LOW); //Blocage Q6
- // ==> Les 3 doubles shunts sont passants
- Synoptique0();
- Strip.clear(); // Éteindre toutes les NeoPixels
- Strip.show();
- delay(2000);
- }
- void loop()
- {
- PotentiometerGros = analogRead(A6);
- PotentiometerFin = analogRead(A1);
- TemperatureDissipateur = analogRead(A2);
- PotentiometerFin = map(PotentiometerFin, 0, 1023, -30, 30);
- RatioVcc = analogRead(BrocheRatioVcc);
- RatioVCCFiltre = (int)(FILTER_ALPHA * RatioVcc + (1.0 - FILTER_ALPHA) * RatioVCCFiltre);
- if (TemperatureDissipateur > 200)
- //if (TemperatureDissipateur > 50)
- //if (TemperatureDissipateur > 120)
- {
- digitalWrite(GateQ1, LOW); //Blocage Q4
- digitalWrite(GateQ2, LOW); //Blocage Q5
- digitalWrite(GateQ3, LOW); //Blocage Q6
- Erreur013(); //Activation Fonction depassement de température dissipateur
- }
- if (RatioVCCFiltre <= (0.51 / 3.3 * 1023)) //Le terme 0.51 correspond à 4.7V ( 9.2 * 0.51) seuil de la tension à tester minimale
- {
- digitalWrite(GateQ1, LOW); //Blocage Q4
- digitalWrite(GateQ2, LOW); //Blocage Q5
- digitalWrite(GateQ3, LOW); //Blocage Q6
- Erreur012(); // Activation Fonction descente sous limite inférieure VCC
- }
- else if (RatioVCCFiltre <= SeuilIntermediaire0 - Hysteresis0)
- {
- digitalWrite(GateQ1, HIGH); //Saturation Q4
- digitalWrite(GateQ2, LOW); //Blocage Q5
- digitalWrite(GateQ3, LOW); //Blocage Q6
- // ==> Bypassage complet des 3 doubles shunts
- Synoptique0();
- Strip.show();
- }
- else if (RatioVCCFiltre <= SeuilIntermediaire1 - Hysteresis1)
- {
- digitalWrite(GateQ1, LOW); //Blocage Q4
- digitalWrite(GateQ2, HIGH); //Saturation Q5
- digitalWrite(GateQ3, LOW); //Blocage Q6
- // ==> Bypassage complet des 2 doubles shunts supérieurs
- Synoptique1();
- delay(20);
- Strip.show();
- }
- else if (RatioVCCFiltre <= SeuilIntermediaire2 - Hysteresis2) // Le terme 2.17 correspond à 19.64V ( 9.2 * 2.17) seuil de la tension à tester Maximal admissible
- {
- digitalWrite(GateQ1, LOW); //Blocage Q4
- digitalWrite(GateQ2, LOW); //Blocage Q5
- digitalWrite(GateQ3, HIGH); //Saturation Q6
- // ==> Bypassage complet du double shunt supérieur
- Synoptique2();
- delay(20);
- Strip.show();
- }
- else if (RatioVCCFiltre <= SeuilIntermediaire3 - Hysteresis3) // Le terme 2.4 correspond à 22.08V ( 9.2 * 2.4) seuil de la tension à tester Maximal admissible
- {
- digitalWrite(GateQ1, LOW); //Blocage Q4
- digitalWrite(GateQ2, LOW); //Blocage Q5
- digitalWrite(GateQ3, LOW); //Blocage Q6
- Synoptique3();
- delay(20);
- Strip.show();
- }
- else if (RatioVCCFiltre <= SeuilIntermediaire4 - Hysteresis4)
- {
- delay(10);
- analogWrite(A0, 0); //Arrêt débit
- digitalWrite(GateQ1, LOW); //Blocage Q4
- digitalWrite(GateQ2, LOW); //Blocage Q5
- digitalWrite(GateQ3, LOW); //Blocage Q6
- analogWrite(A0, 0); //Arrêt débit
- Erreur011();
- }
- int adjustedValue = (PotentiometerGros + PotentiometerFin);
- int displayValue = constrain(adjustedValue, 0, 1023);
- int displayValue1 = map(adjustedValue, 0, 1023, 0, 1000);
- int displayForTM1637 = constrain(displayValue1, 0, 1000);
- total = total - Lectures[readIndex];
- Lectures[readIndex] = displayValue1;
- total = total + Lectures[readIndex];
- readIndex = (readIndex + 1) % NombreEchantillons;
- int maxVal = Lectures[0];
- int minVal = Lectures[0];
- for (int i = 1; i < NombreEchantillons; i++)
- {
- maxVal = max(maxVal, Lectures[i]);
- minVal = min(minVal, Lectures[i]);
- }
- int averageValue = (total - maxVal - minVal) / (NombreEchantillons - 2);
- averageValue = constrain(averageValue, 0, 1023);
- if (abs(averageValue - LastPotentiometerGros) > 1)
- {
- float VCCFiltre = K4 * RatioVCCFiltre * K5*3.3/1023;
- float Io = K0 * VCCFiltre / 920.0;
- 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
- // Nota : en fait j'ai fait une petite erreur sur R2 et R3 : j'ai installé 2 fois 4,7K au lieu de 47K
- float I2 = K2 * (digitalRead(GateQ2) ? VCCFiltre / 94.0 : 0); //94 (Kohms) correspond à R6+R7, but prendre en compte le coourant de pont de Q2
- float I3 = K3 * (digitalRead(GateQ3) ? VCCFiltre / 94.0 : 0); //94 (Kohms) correspond à R11+R12, but prendre en compte le coourant de pont de Q3
- float correctedDisplayValue = displayForTM1637 + Io + I1 + I2 + I3;
- // 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
- display1.showNumberDec(correctedDisplayValue, false, 4, 0);
- /*Serial.print("VCCFiltre: "); // UNIQUEMENT EN MISE AU POINT ET DEBOGAGE
- Serial.print(VCCFiltre);
- Serial.print("\t Io: ");
- Serial.print(Io);
- Serial.print("\t I1: ");
- Serial.print(I1);
- Serial.print("\t I2: ");
- Serial.print(I2);
- Serial.print("\t I3: ");
- Serial.print(I3);
- Serial.print("\t Q1: ");
- Serial.print(digitalRead(GateQ1));
- Serial.print("\t Q2: ");
- Serial.print(digitalRead(GateQ2));
- Serial.print("\t Q3: ");
- Serial.print(digitalRead(GateQ3));
- Serial.print("\t correctedDisplayValue: ");
- Serial.println(correctedDisplayValue);*/
- LastPotentiometerGros = averageValue;
- }
- analogWrite(A0, map((0.979*displayForTM1637), 0, 1000, 0, 1005));
- }
- void Synoptique0()
- {
- Strip.clear();
- for (int i = 0; i <= 5; i++)
- {
- Strip.setPixelColor(i, 0, 0, 0);
- }
- for (int i = 9; i <= 11; i++)
- {
- Strip.setPixelColor(i, 0, 0, 0);
- }
- for (int i = 6; i <= 8; i++)
- {
- Strip.setPixelColor(i, 255, 0, 0);
- }
- Strip.show();
- }
- void Synoptique1()
- {
- Strip.clear();
- for (int i = 0; i <= 3; i++)
- {
- Strip.setPixelColor(i, 0, 0, 0);
- }
- for (int i = 6; i <= 8; i++)
- {
- Strip.setPixelColor(i, 0, 0, 0);
- }
- Strip.setPixelColor(11, 0, 0, 0);
- for (int i = 9; i <= 10; i++)
- {
- Strip.setPixelColor(i, 255, 0, 0);
- }
- for (int i = 4; i <= 5; i++)
- {
- Strip.setPixelColor(i, 255, 0, 0);
- }
- Strip.show();
- }
- void Synoptique2()
- {
- Strip.clear();
- for (int i = 0; i <= 2; i++)
- {
- Strip.setPixelColor(i, 0, 0, 0);
- }
- for (int i = 6; i <= 8; i++)
- {
- Strip.setPixelColor(i, 0, 0, 0);
- }
- Strip.setPixelColor(11, 255, 0, 0);
- for (int i = 9; i <= 10; i++)
- {
- Strip.setPixelColor(i, 0, 0, 0);
- }
- for (int i = 2; i <= 5; i++)
- {
- Strip.setPixelColor(i, 255, 0, 0);
- }
- Strip.show();
- }
- void Synoptique3()
- {
- Strip.clear();
- for (int i = 0; i <= 5; i++)
- {
- Strip.setPixelColor(i, 255, 0, 0);
- }
- for (int i = 6; i <= 11; i++)
- {
- Strip.setPixelColor(i, 0, 0, 0);
- }
- Strip.show();
- }
- void Erreur011()
- {
- analogWrite(A0, 0); //Arrêt débit
- display1.setSegments(ERR1, 4); //Affichage "AL01" sur le display 4 digits
- Strip.clear();
- analogWrite(A0, 0); //Arrêt débit
- for (int i = 0; i <= 5; i++)
- {
- Strip.setPixelColor(i, 255, 0, 0);
- }
- Strip.setPixelColor(11, 0, 0, 255 * step);
- for (int i = 6; i <= 10; i++)
- {
- Strip.setPixelColor(i, 0, 0, 0);
- }
- Strip.show();
- step = 1 - step; // Alterner entre les deux états
- delay (100);
- }
- void Erreur012()
- {
- analogWrite(A0, 0); //Arrêt débit
- display1.setSegments(ERR2, 4); //Affichage "AL02" sur le display 4 digits
- Strip.clear();
- analogWrite(A0, 0); //Arrêt débit
- for (int i = 0; i <= 5; i++)
- {
- Strip.setPixelColor(i, 255, 0, 0);
- }
- Strip.setPixelColor(11, 0, 0, 0);
- for (int i = 6; i <= 8; i++)
- {
- Strip.setPixelColor(i, 0, 0, 0);
- }
- for (int i = 9; i <= 10; i++)
- {
- Strip.setPixelColor(i, 0, 0, 255 * step);
- }
- Strip.show();
- step = 1 - step; // Alterner entre les deux états
- delay(100);
- }
- void Erreur013()
- {
- analogWrite(A0, 0); //Arrêt débit
- display1.setSegments(ERR3, 4); //Affichage "AL03" sur le display 4 digits
- Strip.clear();
- analogWrite(A0, 0);
- for (int i = 0; i <= 5; i++)
- {
- Strip.setPixelColor(i, 255, 0, 0);
- }
- for (int i = 9; i <= 11; i++)
- {
- Strip.setPixelColor(i, 0, 0, 0);
- }
- for (int i = 6; i <= 8; i++)
- {
- Strip.setPixelColor(i, 0, 0, 255 * step);
- }
- Strip.show();
- step = 1 - step; // Alterner entre les deux états
- delay(100);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement