Aller au contenu

Filament ABS

Darkblur_seb

Pilotage de 2 plaques chauffantes 220v

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez poster un message et vous inscrire plus tard. Si vous avez déjà un compte, connectez-vous afin de poster avec.

Invité
Répondre à ce sujet…

×   Vous avez copié du contenu avec formatage.   Supprimer le formatage

  Only 75 emoji are allowed.

×   Votre lien a été automatiquement intégré.   Afficher en tant que lien à la place

×   Le contenu sauvegardé a été restauré.   Effacer l'éditeur

×   You cannot paste images directly. Upload or insert images from URL.


  • Sur cette page :   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.

×
×
  • Créer...