Arduino Forum

International => Deutsch => Topic started by: Marfiosie on Nov 10, 2016, 11:49 pm

Title: Temperaturregelung mittels Arduino UNO[UPDATE]
Post by: Marfiosie on Nov 10, 2016, 11:49 pm
Hallo,

ich bin grade ganz frisch in das Forum eingestiegen und gehe auch davon aus, dass das in Zukunft häufiger passieren wird ;) . Mit dem Arduino Boards habe ich bisher vorallen im Bereich der 3D- Druckern zu tun, wobei zugegeben einem dort die meiste Arbeit durch die Firmware abgenommen wird. Ich bin grade dabei mich fleißig in die Materie einzulesen, allerdings dauert hier (im Trumpland) der Versand so ewig, dass ich zumindest diesen schon gleich vornehmen würde und vielleicht kann mir der ein- oder andere ein paar Tipps geben...



Was will ich machen:
Ich mächte eine Metallplatte mit 12x12 mm Fläche mit einem Heizbett mit integrierten Temperatursensor versehen und dieses regeln. Das Heizbett soll unterhalb der Platte angebracht werden und mit einem Arduino gesteuert werden. Über die serielle Schnittstelle würde ich gerne die Temperatur angezeigt bekommen und bei Bedarf eine neue vorgegben. Später soll noch ein zweiter Temperatursensor angebracht werden, der aber rein Informativ wirkt. Die Reglung darf rühig etwas überschwingen und Temperaturen weden im Bereich von 20 bis allerhöchsten 80°C angestrebt.



Was ich bereits habe:
Ich habe bereits ein passendes Heizbett in Aussicht.Dieses verfügt über einen integrierten 100k Thermistor den ich auslesen möchte. Das Heizbett läuft bei 12 V.
Link:
https://www.amazon.com/100x100mm-Silicone-Rubber-Heater-Printer/dp/B00I50G4O8/ref=sr_1_5?ie=UTF8&qid=1478817191&sr=8-5&keywords=100x100+heated+bed

Was ich auch bereits durch zur Verfügung habe ist ein Sammelsorium an Basiselementen, welche sicherlichlich nicht die hochwertigsten sind aber für diesen Zweck genügen sollen.
Link:
https://www.amazon.com/Elegoo-Project-Complete-Tutorial-MEGA2560/dp/B01CZTLHGE/ref=sr_1_7?s=pc&ie=UTF8&qid=1478786784&sr=1-7&keywords=arduino+kit

Als letztes habe ich mir bereits ncoh eien Laborstromquelle organisiert um das Heizbett zu versorgen...




Was ich gern wüsste
Zunächst ist erstmal wichtig bevor ich anfange alle Teile beisammen zu haben. Daher wäre für mich vorrangig zu wissen, was noch fehlt und ich mir besorgen muss. Ein paar Tipps wären da sicherlich hilfreich bei der Auswahl.

Zum zweiten habe ich jetzt noch nichts genaues gefunden wie ich einen Thermistor auslese. Bis der ganze Kram eingetrudelt ist vergeht sicher noch eineinhalb Wochen und die Zeit würde ich gerne nutzen um mich ein bisschen kundiger in der Materie zu machen. Vielleicht kennt jemand von euch einen guten Link, wo ich das grundlegende zur Programmierung nachlesen kann...

Punkt drei besteht in der Regelung. Bei den 3D- Druckern war es immer sehr einfach- Thermistor auswählen, Reglungstyp (PID, Zweitpunkt ect) aussuchen und fertig. Gibt es dort eventuell eine gute Vorlage an der ich mich orientiern kann?

Ich danke euch schon mal im voraus.
VG Marvin
Title: Re: Temperaturregelung mittels Arduino UNA [Basics]
Post by: HotSystems on Nov 11, 2016, 12:00 am
Gegenfrage:
Was ist der Arduino UNA ?
Title: Re: Temperaturregelung mittels Arduino UNA [Basics]
Post by: Marfiosie on Nov 11, 2016, 12:01 am
Gegenfrage:
Was ist der Arduino UNA ?

Ein Arduino UNO Rev3, werde es für dich sofort korrigieren ;)
Title: Re: Temperaturregelung mittels Arduino UNA [Basics]
Post by: HotSystems on Nov 11, 2016, 12:04 am
Ein Arduino UNO Rev3, werde es für dich sofort korrigieren ;)
Oh wie großzügig...

Ist nicht nur für mich.
Title: Re: Temperaturregelung mittels Arduino UNA [Basics]
Post by: Marfiosie on Nov 11, 2016, 12:09 am
Allerdings darf man das wohl erst nach fünf Minuten- Hatte erst MEGA da stehn, wollte allerdings mein UNO dann lieber verwenden...
Title: Re: Temperaturregelung mittels Arduino UNA [Basics]
Post by: agmue on Nov 11, 2016, 12:26 am
Hallo Marvin,

bei "Trumpland" mußte ich erstmal grübeln, obwohl die Nachrichten derzeit kein anderes Thema haben. Nun ist der Groschen gefallen! Wer nicht in D wohnt, wird den rauhen Umgangston hier im Forum zu "schätzen" wissen. Menschen, die in anderen Ländern unterwegs sind, berichten mir, daß man auch ganz anders, freundlicher kommunizieren kann. Direkt ist aber manchmal auch besser, als ewig um den heißen Brei zu reden. Nunja, Du bist freiwillig hier :) Damit willkommen im Forum!

Zum zweiten habe ich jetzt noch nichts genaues gefunden wie ich einen Thermistor auslese.
Ist das nicht ein temperaturabhäbgiger Widerstand? In der Annahme, die englische Sprache ist Dir nicht gänzlich unbekannt, könntest Du mal Using a Thermistor (https://learn.adafruit.com/thermistor/using-a-thermistor) lesen.

Hinsichtlich PID-Regelung solltest Du ein paar Beiträge aus jüngster Zeit hier im Forum finden, z. B. Problem bei Temperaturregelung mit PID-Bibliothek (http://forum.arduino.cc/index.php?topic=431772.msg2976413#msg2976413). Eine Bibliothek gibt es auch dazu.
Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: Marfiosie on Nov 11, 2016, 12:35 am
Hallo,

danke für den Link genau so etwas habe ich gesucht. Ich bin momentan noch via Handy im Internet und entsprechend schwierig gestaltet sich das surfen. Aber ab morgen ist Besserung in Aussicht. Werde mir das mal in aller Ruhe zu ansehen.
Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: agmue on Nov 11, 2016, 12:48 am
Ich kann keine Angabe finden, wie viel Strom das Heizelement braucht. Wenn Du es hast, kannst Du das auch messen. Dann benötigst Du einen FET, der Spannung und Strom verträgt, damit Du den vom Arduino mittels PWM ansteuern kannst. Oder hast Du einen anderen Plan?
Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: Marfiosie on Nov 11, 2016, 12:52 am
Nun von dem Equipment was ich da hab war meine erste Idee ein Relais zu nehmen und einen simplen Zweipunktregler zu bauen, aber das ist glaube ich nicht besonders sauber...
Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: agmue on Nov 11, 2016, 01:24 am
Pack mal einen passenden FET (fünf Stück) zusammen mit den notwendigen Widerständen, wenn Du die nicht in der Bastelkiste hast, auf die Einkaufsliste, kann nie schaden :)
Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: Marfiosie on Nov 11, 2016, 01:38 am
Okay, ich glaube MOFSETs sollten noch irgendwo im Werkstattlabor bei uns rumleigen- dnake für die Tipps
Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: chefin on Nov 11, 2016, 10:23 am
Dein Heizelement braucht unter 1 Minute auf 120grad. Das ist so träge wie ein 2CV(Ente) auf der Autobahn beim Überholen.

Ein PID müsste also extrem langsam arbeiten, meines erachtens bei diesem Heizelement unnötig. 2Punkt reicht völlig. Du sagtest ja, etwas überhöhen ist erlaubt. Da es reine Software ist, lässt sich das später auch jederzeit ändern.

was mir aber gerade komisch vorkommt (oder ist das auch nur Schreibfehler): 12x12mm Platte mit 100x100mm Heizelement aufheizen. Heist doch, das ein großer Teil des Heizelements in der Luft hängt. Die Platte wird dann lediglich die kälteste Stelle des Elements bestimmen, weil es Wärme besser leitet. Das dürfte bei dem Flächenunterschied keine vernüftige Messung zulassen.

Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: fckw on Nov 11, 2016, 10:45 am
Also wenn du Dich für einen Mosfet als "Leistungssteller" entscheidest dann würde ich auch die "PIDArduino Library" benutzen. Für deinen Temperaturreglung benutzt du am besten nur die Parameter Kp und Ki, du bildest damit einen sogenanten PI-Regler. Kp ist dein Proportionalbeitrag (der Wert wie weit der Mosfet schonmal aufmacht). Ki ist das integral, also der Wert für den Regler wie "schnell" der Regler auf den Zielwert zusteuert. Die Werte ermittelst du am besten durch ausprobieren. Auf einen "Kd-Beitrag" verzichtest du einfach ganz.
So bekommst du einen schöne Temperaturregleung ohne Hysterese und überschwinger.
Für eine Zweipunktregelung kannst du dir ja auch gleich einfach einen Thermostat nehmen, fertig....
Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: agmue on Nov 11, 2016, 10:57 am
Ki ist das integral, also der Wert für den Regler wie "schnell" der Regler auf den Zielwert zusteuert.
Ich stimme Dir weitgehend zu, nur über das "schnell" stolpere ich. Nach meiner Erinnerung hat P eine bleibende Regelabweichung, die von I geschlossen wird und D macht die Schnelligkeit, die auch zu Überschwingern führen kann. Täuscht meine Erinnerung, oder habe ich die Formulierung nur falsch verstanden?
Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: fckw on Nov 11, 2016, 11:31 am
Der I-Anteil ist ein Zeitintegral, ist es zu schnell kann der Regler überschwingen, deswegen auch die "".
Der D-Anteil bewertet die Änderung einer Regelabweichung (er differenziert) und berechnet so deren Änderungsgeschwindigkeit. Mit dem D-Anteil kannst du praktisch "Vorhalten" für schnelle Regelstrecken brauchst du das. Also über die Änderungsgeschwindigkeit deiner Regelabweichung hast du sowas wie eine "Vorahnung" und kannst weit früher reagieren.
Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: agmue on Nov 11, 2016, 11:58 am
Jetzt verstehe ich Deinen Text mit den Anführungszeichen, wie Du es gemeint hast. Ja, ok, danke :)
Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: Nanunan on Nov 11, 2016, 01:12 pm
Wenn du tiefer in die Regelungstechnik einsteigen willst, dann kann ich dir nur Bücher wie dieses hier empfehlen:
https://www.amazon.de/Einstieg-die-Regelungstechnik-Vorgehensmodell-Reglerentwurf/dp/3446432612/ref=sr_1_1/256-4128308-7524236?s=books&ie=UTF8&qid=1478861613&sr=1-1&keywords=Philippsen

Damit bist du in der Lage selber digitale Regler zu schreiben. Außerdem kannst du dann alle Spielerein wie Anti-windup Effekt mit reinbringen.

Ansonsten hat fckw den Regler schon ganz gut erklärt ;)

Die Nutzung einer Bibliothek dürfte wohl der einfachere Weg sein dein Projekt umzusetzen!
Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: Marfiosie on Nov 11, 2016, 05:09 pm
Hallo,

danke für all die Ratschläge. Bitte entschuldigt die spräte Rückmeldung, aufgrund der Zeitverschiebung liegt man ein bisschen auseinander. Ich werde mich für den Anfang an einem Zweitpunktregler probieren und die Sache dann wohl als PI verfeinern. Die Semester Reglungstechnik sind bei mir schon eine Weile her...
Wo finde ich die PIDArduino Library ? Oder ist die in der IDE mit drin...

Danke für die Anregungen! Ich werde mich die Tage mal reinfitzen.

Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: skorpi080 on Nov 11, 2016, 05:30 pm
http://playground.arduino.cc/Main/LibraryList (http://playground.arduino.cc/Main/LibraryList)
http://playground.arduino.cc/Code/PIDLibrary (http://playground.arduino.cc/Code/PIDLibrary)
Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: Marfiosie on Nov 11, 2016, 05:31 pm
http://playground.arduino.cc/Main/LibraryList (http://playground.arduino.cc/Main/LibraryList)
http://playground.arduino.cc/Code/PIDLibrary (http://playground.arduino.cc/Code/PIDLibrary)
Super! Danke dir.
Title: Re: Temperaturregelung mittels Arduino UNO[Basics]
Post by: Marfiosie on Nov 16, 2016, 07:23 am
Hallo nochmal,

es ist jetzt einige Zeit vergangen, aber ich habe die Zeit  genutzt um mich ein bisschen einzuarbeiten und meinen ersten Sketch zu schreiben. Das Auslesen der Thermistoren scheint schon ganz gut zu klappen, wenngleich ich es nur rudimentär mit fixen Widerständen prüfen konnte, da die Thermistoren erst die Woche bei mir eintrudeln...
Der Sketch ist noch nicht ganz fertig. Es soll noch ein zweiter Sensor rein und eine Möglichkeit mittels Potentiometer den Sollwert vorzugeben, aber das denke ich krieg ich gebacken. Woran ich grade etwas zu knabbern habe ist meine Regelung :smiley-confuse: . Aber zunächst der Reihe nach noch mal die Fakten:

Was soll rauskommen:
Eine (PID ?) Regelung einer Heizplatte (12V)...
Dabei handelt es sich um die folgende: HEATBED (https://www.amazon.com/gp/product/B00I50G4O8/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)


Bisher habe ich den folgenden Sketch, welcher an der ein oder anderen Stelle sicherlich noch nicht ganz sauber geschrieben ist:

Code: [Select]


///////////////////////////////
//////// Declaration //////////
///////////////////////////////
// Loading config- File
#include "config.h"
// Loading  Thermistor read function
#include "get_thermistor_temp.h"
#include <LiquidCrystal.h>


LiquidCrystal lcd(7,8,9,10,11,12,13);
///////////////////////////////
//////////// Setup ////////////
///////////////////////////////
void setup()
{

Serial.begin(9600);
Serial.println("Starting Controlling");
 
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("Starting Controlling");
   
}

///////////////////////////////
//////////// Loop /////////////
///////////////////////////////

long T_set=0;
void loop()

{
  // TEMPERARATUR 1
  int T1=get_thermistor_temp(THERMISTOR1_TYPE, THERMISTOR1_PIN);

  // Serial Input Controller Temperature
  if(Serial.available()){ 
    T_set=Serial.parseInt();
  }

  // Seriell Output
  Serial.print("TEMP 1 = ");
  Serial.print(T1);   
  Serial.println(" C");
 
  Serial.print("SET_TEMP = ");
  Serial.print(T_set);   
  Serial.println(" C");

 
  // LCD OUTPUT
  lcd.setCursor(0,0);
  lcd.clear();
  lcd.print("T1: ");
  lcd.print(T1);   
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print("T2: ");
  //lcd.print(T2);   // comming soon
  lcd.print(" C");
  delay(1000);
  lcd.setCursor(0,0);
  lcd.clear();
  lcd.print("T_set: ");
  lcd.print(T_set);   
  lcd.print(" C");
 
  if (T_set-T1 > 2){
    lcd.setCursor(0,1);
    lcd.print("HEATING");
  }
  delay(1000);
 
         

}


Code: [Select]
// CONFIG_ FILE

// Define Thermistor Pins: (max.:2)
  #define NUM_THERMISTOR 1
  #define THERMISTOR1_PIN 0
  //#define THERMISTOR2_PIN 1

// Define Thermocpuple Pins: (max.:2)
  #define NUM_THERMOCOUPLE 0
  //#define THERMOCOUPLE1_PIN 1
  //#define THERMOCOUPLE1_PIN 1

//Define Theristor Typ:
  // 1: Epcos 100K Thermistor
  #define THERMISTOR1_TYPE 1
  //#define THERMISTOR2_TYPE 1

//Define Thermocouple Typ:
  // 1: ...
  //#define THERMOCOUPLE1_TYPE 1
  //#define THERMOCOUPLE2_TYPE 1

//PID
  #define K_P 7
  #define K_I 2
  #define K_D 40



Code: [Select]
// Input: Type, Voltage; Output: Temperature

int get_thermistor_temp(int type, int pin) {
  /////////////////////////
  /// Temperauture Table///
  ////////////////////////

  // TYPE 1: EPCOS 100K
  int steps_THMI_type1 = 20;
  short temptable_THMI_type1[steps_THMI_type1][2] = {
   {1, 841},
   {54, 255},
   {107, 209},
   {160, 184},
   {213, 166},
   {266, 153},
   {319, 142},
   {372, 132},
   {425, 124},
   {478, 116},
   {531, 108},
   {584, 101},
   {637, 93},
   {690, 86},
   {743, 78},
   {796, 70},
   {849, 61},
   {902, 50},
   {955, 34},
   {1008, 3}
  };

  // TYPE 2: ...

  ////////////////////
  /// Interpolation///
  ////////////////////

  int rawtemp = analogRead(pin);
 
  switch (type) {
    case 1: {
        int i;
        for (i = 1; i<steps_THMI_type1; i++){
          if (temptable_THMI_type1[i][0] > rawtemp){
            int realtemp =temptable_THMI_type1[i - 1][1] + (rawtemp - temptable_THMI_type1[i - 1][0]) * (temptable_THMI_type1[i][1] - temptable_THMI_type1[i - 1][1]) / (temptable_THMI_type1[i][0] - temptable_THMI_type1[i - 1][0]);
     
            if (realtemp > 255){
              realtemp = 255;
            }
            return realtemp;
     
            break;
          }
        }
      break;
    }
    case 2: {
      break;
    }
    default: {
      break;
    }
  }
 
   
}


Ich möchte als nächsten Schritt eine PID- Reglung einbauen. Die P,I und D- Glieder habe ich bereits als Anfangswerte. Als Solltemperatur ist T_set und als Isttemperatur T1 vorerst vorgesehen.

Nun zu den Unklarheiten:
- zunächst zur Verkabelung: Es ist bereits das Wort MOFSET gefallen, aber leider habe ich keinen FET da- kann ich für den Zweck auch einen normalen NTC nutzen?
- Ich bin in der PID- Libaray zwangsläufig auch auf diese Funktion gestoßen:
Code: [Select]
PID(&Input, &Output, &Setpoint, Kp, Ki, Kd, Direction)

Kp, Ki und Kd sind mir noch ein Begriff, Setpoint wird wohl meine Zieltemperatur T_set sein, und INPUT meine Isttemperatur T1? Direction hätte ich auf DIRECT gesetzt... Ist das so korrekt?
- Wie funktioniert das mit dem Output. Muss ich da einen PWM definieren der an den MOFSET drangeklemmt wird und was muss ich dabei beachten...

Ich hoffe das ist nicht zu schwammig und der Sketch nicht zu grusilig...

DANKE für die viele Hilfe bisher!!!
Title: Re: Temperaturregelung mittels Arduino UNO[UPDATE]
Post by: guntherb on Nov 16, 2016, 12:47 pm
Wenn dein PID-Regler vernüftig regeln soll, müssen die delay() raus aus dem Code.

Es ist bereits das Wort MOFSET gefallen, aber leider habe ich keinen FET da- kann ich für den Zweck auch einen normalen NTC nutzen?
Ich verstehe die Frage nicht: MOSFETs und NTC haben nichts miteinander zu tun. ein Mosfet ist ein Leistungsschalter, ein NTC ein temperaturabhängiger Widerstand.

- Wie funktioniert das mit dem Output. Muss ich da einen PWM definieren der an den MOFSET drangeklemmt wird und was muss ich dabei beachten...
Der Output der PID-Lib liefert default einen Wert 0-255, den kannst du direkt als PWM-Wert für dein Stellglied nehmen.

Den MOSFET kannst du so anschliessen (da wo der Motor ist, muss deine Heizung hin): (http://forum.arduino.cc/index.php?action=dlattach;topic=378357.0;attach=154664)