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
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.
>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
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
Der Display kann als Array von Buchstben betrachtet werden, die schreibt man mit einem Timer raus. Irgendwelche Eingaben wirken auf das Array.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.