Forum: Mikrocontroller und Digitale Elektronik Temperaturregelung Verbesserung?


von Robin F. (gehacktes)


Angehängte Dateien:

Lesenswert?

Hallo Forum,

ich bin derzeit dabei mir eine Temperaturregelung zu Programmieren und 
zu Bauen.
Ich habe dieses Projekt mit einem Arduino Duemilanove verwirklicht.
Für die Temperaturmessung habe ich ein KTY81-120 verwendet. Diesen lese 
ich aus und gebe ihn auf ein LC-Display aus. Über 2 Taster kann ich die 
gewünschte Temperatur einstellen.
Die Soll Temperatur lässt sich bisher nur sehr langsam einstellen.
Darum möchte ich das Programm in Unterprogramme teilen, kürzen oder noch 
verändern, sodass das Programm schneller abgearbeitet werden kann!

Da ich noch Anfänger bin bräuchte ich ein paar Tipps, wie man das am 
besten und einfachsten macht.

Hier das Programm:
#include <LiquidCrystal.h>
LiquidCrystal lcd ( 12, 11, 5 , 4, 3, 2 );
const int Taster  = 7;    // Soll Temperatur ++
const int Taster1 = 8;    // Soll Temperatur --
int Heizer  = 13;
int Heizer1 = 10;
double Wert  = 0;         // Wert = Fließkommazahl
int State = 0;

void setup()
{
  pinMode ( Heizer,OUTPUT );
  pinMode ( Heizer1,OUTPUT );
  pinMode ( Taster, INPUT );
  pinMode ( Taster1, INPUT );

  // benutzte Ausgänge einmal auf 0 bzw. 1 setzen
  digitalWrite ( Heizer,LOW );
  digitalWrite ( Heizer1,LOW );
  digitalWrite ( Taster, HIGH );
  digitalWrite ( Taster1, HIGH );

  lcd.begin ( 16,2 );
}

// Funktion zum auslesen der Temperatur
 float kty ( unsigned int port )
 {
         float temp              = 82;
// ADCSRA Register zurücksetzen
         ADCSRA = 0x00;
// ADC aktivieren und Teiler auf 128 setzen
         ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
// MDMUX Register zurücksetzen
         ADMUX = 0x00;
// AVCC mit externen Kondensator am AREF Pin
         ADMUX = (1<<REFS0);
// Zuweisen des Kanals des Multiplexers
         ADMUX |= port;
// schleife zum Auslesen der Spannung
         for ( int i=0; i<=63; i++ )
         {
                 ADCSRA|=(1<<ADSC);
                 while (ADCSRA & (1<<ADSC));
                 temp += (ADCL + ADCH*256);
         }

         // Umrechnen in Temperatur
         temp /= 101;
         temp -= 154; // auf Fluke angepasst !!!
  return (temp);
 }

 void loop ()
 {
  // Aufruf der Funktion um die Temperatur auszulesen
  float read_temp = kty(0);
  // Temperatureinstellung hoch zählen
  if ( digitalRead ( Taster ) == LOW )
    {
    Wert += 0.1f; // zählt in 0,1'ner schritten hoch
    lcd.clear();
    lcd.print ( "Soll: " );
    lcd.print ( Wert );
    lcd.print(0xDF,BYTE);
    lcd.print ( "C" );
    // Entprellung
    while ( digitalRead ( Taster ) == LOW ) {}
    delay ( 50 );
    }
   // Temperatureinstellung runter zählen
   if ( digitalRead ( Taster1 ) == LOW )
    {
    Wert -= 0.1f; // zaehlt in 0,1'ner schritten runter
    lcd.clear ();
    lcd.print ( "Soll: " );
    lcd.print ( Wert );
    lcd.print(0xDF,BYTE);  // ° Zeichen
    lcd.print ( "C");
    // Entprellung
    while ( digitalRead ( Taster1 ) == LOW ) {}
    delay ( 50 );
    }

    //Temperatur Uebertragung
        lcd.setCursor(0, 1);
        lcd.print ( "Ist: " );
        lcd.print ( read_temp );
        lcd.print(0xDF,BYTE);
        lcd.print ( "C" );
          //Wenn Temperatur kleiner als read_temp ist, dann Heizer 
deaktivieren
          if ( read_temp > Wert )
          {
            lcd.print ( " deak" );
            digitalWrite ( Heizer, LOW );
            digitalWrite ( Heizer1,LOW );
          }
            //Wenn Temperatur groeßer als read_temp ist, dann Heizer 
aktivieren
            if ( read_temp < Wert )
            {
              lcd.print ( " akt" );
              digitalWrite ( Heizer, HIGH );
              digitalWrite ( Heizer1,HIGH );
            }
      delay ( 1000 );
 }

Ich habe das Programm auch nochmal in den Anhang gepackt.

Ich hoffe Ihr könnt mir helfen.

Mfg gehacktes

von Robin F. (gehacktes)


Lesenswert?

Kann mir keiner helfen? Ich möchte das Programm so vereinfacht haben, 
sodass die Programmteile schneller ablaufen können.

Danke schonmal für evtl. Hilfe.

von Purzel H. (hacky)


Lesenswert?

>delay ( 1000 );
>delay ( 50 );

Schmeiss solchen Muell raus. Nimm einen Timer.

Dann entkopple den display von der Eingabe. Ich wuerd den Display 2 mal 
pro sekunde ausgeben.

Und entkopple die Regelung von der eingabe. Mach die Regelung so oft ein 
Satz neuer Messwerte vorliegt, auch ein paar mal pro sekunde, zB per 
Timer

von Robin F. (gehacktes)


Lesenswert?

Okay danke erstmal dafür.

Mit dem Timer krieg ich denke hin aber mit der Entkopplung des Displays 
von der Eingabe da habe ich so meine Schwierigkeiten irgendwie hab ich 
da ne Denkblockade wie ich das machen muss. Aber da werde ich gleich 
nochmal schauen und dann das Ergebnis Posten.

Mfg

von Purzel H. (hacky)


Lesenswert?

Der Display kann als Array von Buchstben betrachtet werden, die schreibt 
man mit einem Timer raus. Irgendwelche Eingaben wirken auf das Array.

von Robin F. (gehacktes)


Lesenswert?

Ich muss das mit dem Timer und den ganzen Sachen nochmal durch lesen. 
Hab das noch nicht verstanden! Ich werde mich morgen nochmal melden, 
wenn ich das Verständnis des Timer Interrupts habe.

Einen schönen Abend wünsch ich :)

Mfg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.