Aller au contenu

GO Print

Pilotage de 2 plaques chauffantes 220v


Darkblur_seb

Messages recommandés

Salut

Je suis en train de voir pour modifier une presse à chaud et je voulais un avis sur mon programme arduino tout frais écris.

L'idée est de piloter 2 éléments chauffants en silicone 220v 300w collés chacun sur leur plaque d'aluminium (ep 8 mm).

Donc, arduino uno (test) /nano (en boîte), 2 SSR 10A, et 2 thermistance NTC 100k (même si pour le moment, il n'y a qu'une seule lecture).

#include <PID_v1.h>
#include <LiquidCrystal_I2C.h>


    //entrées
    int ThermistorPin = 0;
    int DebutTimerPin = 2;
    //sorties
    int RelayHautPin = 5;
    int RelayBasPin = 6;

    //Mes valeurs de références
    long Tempo = 600000; //minuterie 10min, à faire varier plus tard dans un menu
    int Tref = 100; //température de référence 100°C, à faire varier plus tard dans un menu
   
    //PID
    int WindowSize = 5000;
    unsigned long windowStartTime;
    double Setpoint, Input, Output;
        
    //thermistance ntc 100k montée en série avec R1
    int Vo;
    float R1 = 10000; //à ajuster avec une mesure fil+résistance
    float logR2, R2, Tmesure;
    float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;

    //varaible pour la minuterie
    volatile long PressTime;
    long TempsRestant;
    int Minutes;
    int Secondes; 
    
    PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT);
    LiquidCrystal_I2C lcd(0x27,16,4); //attention à l'adresse

void setup() {
    Serial.begin(9600);
    lcd.init();
    lcd.backlight();

    pinMode(RelayHautPin, OUTPUT);
    pinMode(RelayBasPin, OUTPUT);
    pinMode(DebutTimerPin, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(DebutTimerPin), minuterie, RISING);
    
    windowStartTime = millis();

    //initialize the variables we're linked to
    Setpoint = Tref;
 
    //tell the PID to range between 0 and the full window size
    myPID.SetOutputLimits(0, WindowSize);

    //turn the PID on
    myPID.SetMode(AUTOMATIC);

}

void loop() {

    Vo = analogRead(ThermistorPin);
    R2 = R1 * (1023.0 / (float)Vo - 1.0);
    logR2 = log(R2);
    Tmesure = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
    Tmesure = Tmesure - 273.15;
    Input = Tmesure;

    //calcul affichage minuterie min:sec
    unsigned long now = millis();
    TempsRestant = Tempo - (now - PressTime);
    Minutes = TempsRestant / 60000;
    Secondes = (TempsRestant - (60000 * Minutes)) / 1000;
    
    lcd.print("Temp = ");
    lcd.print(Tmesure);   
    lcd.print(" / ");
    lcd.print(Tref);   
    lcd.print(" °C");
    lcd.setCursor(0, 1);
    lcd.print("Timer = ");
    lcd.print(Minutes);
    lcd.print(":");
    lcd.print(Secondes);
    lcd.clear();

    if (now - PressTime < Tempo){
    
       Input = analogRead(ThermistorPin);
       myPID.Compute();

        /***turn the output pin on/off based on pid output***/
       
        if (now - windowStartTime > WindowSize){           //time to shift the Relay Window
            windowStartTime += WindowSize;
          }
        
        if (Output > now - windowStartTime){ 
            digitalWrite(RelayHautPin, HIGH);
            digitalWrite(RelayBasPin, HIGH);
        } 
        else{
            digitalWrite(RelayHautPin, LOW);
            digitalWrite(RelayBasPin, LOW);
        }
    }
    else{
        digitalWrite(RelayHautPin, LOW);
        digitalWrite(RelayBasPin, LOW);
    }
}


void minuterie() {
    volatile unsigned long PressTime = millis();
}

Pour le PID, je crois que je peux diminuer la valeur de "WindowSize" vers 800, car j'utilise un SSR, et non pas un relais (code issu de l'exemple de relais).

J'ai pu vérifier l'absence d'erreur de compilation, mais pas encore tester. Je verrais demain pour l'affichage au moins.

Dans les évolutions prévues, déjà passer sur la lecture des thermistance et un PID propre à chaque plaque. Ca reste à ma portée, c'est en postant que je me suis rendu compte de l'oubli de la 2e thermistance. Donc recopie d'une grosse partie du code du pid en changeant le nom des variables (1 et 2 en gros ou haut et bas, comme le reste).

Merci

Sébastien

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
  • Sur cette page :   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
  • There was an error loading the RSS feed. Please check your settings and try again.
×
×
  • Créer...