La suite va consister avant de programmer les étapes à ajouter des fonctions qui seront appelées depuis les étapes.
Commande du relaisJe vais ajouter deux fonctions pour l'allumage et l'extinction du relais. N'oublions pas que le relais est sur une sortie PWM et que pour l'allumer, il faut envoyer un signal carré 50/50 qui une fois redressé donnera un maximum de tension continue. Les sorties analogiques/PWM allant de 0 à 255, on obtiens le maximum à 127. Les deux fonctions suivantes permettent d'allumer et d^éteindre le relais en faisant abstraction de ce détails de PWM.
Code:
void RelayOn(void)
{
analogWrite(relayPin, 127);
}
void RelayOff(void)
{
analogWrite(relayPin, 0);
}
La LEDLa gestion de la LED est un peu complexe car il faut pouvoir
• Choisir la couleur
• Choisir la fréquence de clignotement.
Avec ces deux informations, il est possible d'indiquer une multitude d'états pour autant qu'on sache à quoi ça correspond.
La première fonction allume ou éteint la LED. On passe en paramètre, la couleur et l'état. Comme j'ai une LED à l'intérieur de l'ampli, j'en profite pour lui faire suivre l'état général quelque soit la couleur. C'est assez utile quand l'ampli est ouvert, et permet aussi de voir qu'il est allumé même retourné.
Code:
// LED Colors
#define LED_GREEN 0
#define LED_RED 1
void LedToogle(int color, int state)
{
switch (color)
{
case LED_GREEN:
// State is inverted, because LED is common anode
digitalWrite(ledGreenPin, !state);
digitalWrite(ledRedPin, HIGH);
break;
case LED_RED:
// State is inverted, because LED is common anode
digitalWrite(ledRedPin, !state);
digitalWrite(ledGreenPin, HIGH);
break;
}
digitalWrite(ledOnBoard, state);
}
Deux fonction pour allumer ou éteindre la LED courante en fonction d'une valeur globale currentLedColor
Code:
int currentLedColor = LED_GREEN;
void LedOn()
{
LedToogle(currentLedColor, HIGH);
}
void LedOff()
{
LedToogle(currentLedColor, LOW);
}
Et une fonction pour gérer le clignotement en fonction de deux paramètres globaux
• ledBlinkOn indique le nombre de cycle durant lesquels la LED va rester allumée
• ledBlinkMax indique le nombre de cycles totaux avant de ré-allumer la LED
Code:
int ledBlinkCount = 0;
int ledBlinkMax = 0;
int ledBlinkOn = 0;
void LedBlinking(void)
{
ledBlinkCount++;
if (ledBlinkMax == 0 || ledBlinkCount > ledBlinkMax)
{
LedOff();
ledBlinkCount = 0;
}
else if (ledBlinkOn == ledBlinkMax)
{
LedOn();
ledBlinkCount = 0;
}
else if (ledBlinkCount < ledBlinkOn)
{
LedOn();
}
else
{
LedOff();
}
}
Et la dernière fonction permet d'initialiser ces valeurs
Code:
void BlinkLed(int enabledCount,int totalCount)
{
ledBlinkMax = totalCount;
ledBlinkOn = enabledCount;
}
Un appel de
BlinkLed(500, 1000); fera clignoter la LED pendant 500 cycles sur un total de 1000.
BlinkLed(100, 800); fera clignoter la LED sur un total de 800.
A noter encore que LedBlinking(); est appelé à chaque tour de boucle pour permettre les comptages.
La fonction de positionnement des régulateursCette fonction permet de positionner tous les régulateurs à une valeur fixe. C'est utile soit pour les mettre tous à zero, soit pour les mettre tous à une valeur de départ lors de la vérification de leur fonctionnement.
Code:
float reg1LOutput = 0;
float reg2LOutput = 0;
float reg3LOutput = 0;
float reg4LOutput = 0;
float reg1ROutput = 0;
float reg2ROutput = 0;
float reg3ROutput = 0;
float reg4ROutput = 0;
void SetRegulatorsOutput(int value)
{
reg1LOutput = value;
reg2LOutput = value;
reg3LOutput = value;
reg4LOutput = value;
reg1ROutput = value;
reg2ROutput = value;
reg3ROutput = value;
reg4ROutput = value;
SetMasterRegulatorsOutput();
SetSlaveRegulatorsOutput();
}
void SetMasterRegulatorsOutput(void)
{
reg1LOutput = constrain(reg1LOutput, 0, 255);
reg2LOutput = constrain(reg2LOutput, 0, 255);
reg1ROutput = constrain(reg1ROutput, 0, 255);
reg2ROutput = constrain(reg2ROutput, 0, 255);
analogWrite(reg1LPin, reg1LOutput);
analogWrite(reg2LPin, reg2LOutput);
analogWrite(reg1RPin, reg1ROutput);
analogWrite(reg2RPin, reg2ROutput);
}
void SetSlaveRegulatorsOutput(void)
{
reg3LOutput = constrain(reg3LOutput, 0, 255);
reg4LOutput = constrain(reg4LOutput, 0, 255);
reg3ROutput = constrain(reg3ROutput, 0, 255);
reg4ROutput = constrain(reg4ROutput, 0, 255);
analogWrite(reg3LPin, reg3LOutput);
analogWrite(reg4LPin, reg4LOutput);
analogWrite(reg3RPin, reg3ROutput);
analogWrite(reg4RPin, reg4ROutput);
}
La fonction ResetLa fonction Reset permet essentiellement de placer l'ampli dans son état initial, régulateurs à zero et relais HT off. Il suffit simplement de rappeler les fonctions précédentes.
Code:
void Reset(void)
{
SetRegulatorsOutput(0);
RelayOff();
}
La fonction CheckInRangeCette fonction va permettre de vérifier si tous les tubes sont dans les limites passées à la fonction en paramètres, et mémorisera le tube responsable en cas de dépassement, ce qui permettra par la suite de l'afficher. Les limites sont passées en paramètre, car elle dépendent de l'étape en cours. Par exemple pas de courant dans les tubes pendant le chauffage est normal, mais en fonctionnement normal, ça peut être considéré comme un dysfonctionnement.
Code:
boolean CheckInRange(int minValue, int maxValue)
{
if (reg1LCurrentAverage < minValue || reg1LCurrentAverage > maxValue)
{
errorTubeNumber = 1;
return false;
}
if (reg2LCurrentAverage < minValue || reg2LCurrentAverage > maxValue)
{
errorTubeNumber = 2;
return false;
}
if (reg3LCurrentAverage < minValue || reg3LCurrentAverage > maxValue)
{
errorTubeNumber = 3;
return false;
}
if (reg4LCurrentAverage < minValue || reg4LCurrentAverage > maxValue)
{
errorTubeNumber = 4;
return false;
}
if (reg1RCurrentAverage < minValue || reg1RCurrentAverage > maxValue)
{
errorTubeNumber = 5;
return false;
}
if (reg2RCurrentAverage < minValue || reg2RCurrentAverage > maxValue)
{
errorTubeNumber = 6;
return false;
}
if (reg3RCurrentAverage < minValue || reg3RCurrentAverage > maxValue)
{
errorTubeNumber = 7;
return false;
}
if (reg4RCurrentAverage < minValue || reg4RCurrentAverage > maxValue)
{
errorTubeNumber = 8;
return false;
}
return true;
}
A Suivre...