Temperaturregelung Verbesserung?

OP #2551737
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
Angehängte Dateien:
#2553015
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
OP #2553024
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren