Darkblur_seb Posté(e) Mai 1, 2019 Posté(e) Mai 1, 2019 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant