ssalbach
13.06.2005, 23:14
Ich nutze einen RTC am Mega8 und will damit die Beleuchtung, Bodenheizung etc. von meinem Gewächshaus steuern. Er zeigt mir die Uhrzeit an und er regelt schon die Bodentemp nur halt noch nicht abhängig von der Zeit.
Wie sagt man nun dem Prog das es um 23Uhr auf die Procedure Nachttemperatur wechseln soll und um 8 Uhr morgends wieder auf Tagetemperatur.
Ich schreibe zwar alles in Pascal aber Beispiele in C würden mir sicher auch weiterhelfen, beser wäre natürlich auch in Pascal.
Anbei der derzeitige Stand.
So funzt es nicht.
{--------------------------------------------------------------}
{ Const Declarations }
const einschalttemperatur_tag : Word = 26; //26
abschalttemperatur_tag : Word = 28; //28
einschalttemperatur_nacht : Word = 14; //2
abschalttemperatur_nacht : Word = 16; //28
{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var
a : WORD;
b : BOOLEAN;
seconds, minutes, hours : byte;
second, minute, hour: string[2];
{--------------------------------------------------------------}
{ functions }
procedure InitPorts;
begin
DDRB:= %11111111;
end InitPorts;
Procedure RTC;
BEGIN
I2Cout($50, 2);
second:=I2Cinp($50, Seconds);
I2Cout($50, 3);
minute:=I2Cinp($50, Minutes);
I2Cout($50, 4);
hour:=I2Cinp($50, hours);
second:=bytetohex (seconds);
minute:=bytetohex (minutes);
hour:=bytetohex (hours);
LCDCLR;
LCDxy(1,0);
write (LCDOut,'Aktuelle Zeit');
LCDxy(3,1);
write (LCDOut,hour);
LCDxy(5,1);
write (LCDOut,':');
LCDxy(6,1);
write (LCDOut,minute);
LCDxy(8,1);
write (LCDOut,':');
LCDxy(9,1);
write (LCDOut,second);
mdelay(20);
end;
Procedure Temperatur_messen;
BEGIN
a:= GetAdc ;
a:= a-390;
a:= a * 17;
a:= a div 100;
end;
Procedure Tagestemperatur;
BEGIN
LCDCLR;
LCDxy(2,0);
write (LCDOut, 'Lufttemp:');
LCDXY(12,0);
write (LCDOut ,IntToStr(a));
If a < einschalttemperatur_tag THEN // Wenn Temperatur unter 26°, einschalten.
PortB:=%11111111;
b:= TRUE; // Heitzung 'an' Flag setzen.
endif;
If a >= abschalttemperatur_tag THEN // Wenn Temperatur um 28°, ausschalten.
PortB:=%00000000;
b:= FALSE; // Heitzung 'aus' Flag setzen.
endif;
If b = TRUE THEN
LCDXY(0,1);
write (LCDOut, 'Bodenheizung:an');
ELSE
LCDXY(0,1);
write (LCDOut, 'Bodenheizung:aus');
endif;
mdelay(100);
end;
Procedure Nachttemperatur;
BEGIN
LCDCLR;
LCDxy(2,0);
write (LCDOut, 'Lufttemp:');
LCDXY(12,0);
write (LCDOut ,IntToStr(a));
If a < einschalttemperatur_nacht THEN // Wenn Temperatur unter 26°, einschalten.
PortB:=%11111111;
b:= TRUE; // Heitzung 'an' Flag setzen.
endif;
If a >= abschalttemperatur_nacht THEN // Wenn Temperatur um 28°, ausschalten.
PortB:=%00000000;
b:= FALSE; // Heitzung 'aus' Flag setzen.
endif;
If b = TRUE THEN
LCDXY(0,1);
write (LCDOut, 'Bodenheizung:an');
ELSE
LCDXY(0,1);
write (LCDOut, 'Bodenheizung:aus');
endif;
mdelay(100);
end;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
InitPorts;
EnableInts;
//I2Cout($50, 2, $00); // Sekunden stellen
//I2Cout($50, 3, $05); // Minuten stellen
//I2Cout($50, 4, $20); // Stunden stellen
loop
RTC;
mdelay (1000);
Temperatur_messen;
If hour = 23 THEN
Nachttemperatur;
mdelay(1000);
IF hour = 08 THEN
Tagestemperatur;
mdelay(1000);
ENDIF;
ENDIF;
endloop;
end Tutor01.
Wie sagt man nun dem Prog das es um 23Uhr auf die Procedure Nachttemperatur wechseln soll und um 8 Uhr morgends wieder auf Tagetemperatur.
Ich schreibe zwar alles in Pascal aber Beispiele in C würden mir sicher auch weiterhelfen, beser wäre natürlich auch in Pascal.
Anbei der derzeitige Stand.
So funzt es nicht.
{--------------------------------------------------------------}
{ Const Declarations }
const einschalttemperatur_tag : Word = 26; //26
abschalttemperatur_tag : Word = 28; //28
einschalttemperatur_nacht : Word = 14; //2
abschalttemperatur_nacht : Word = 16; //28
{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var
a : WORD;
b : BOOLEAN;
seconds, minutes, hours : byte;
second, minute, hour: string[2];
{--------------------------------------------------------------}
{ functions }
procedure InitPorts;
begin
DDRB:= %11111111;
end InitPorts;
Procedure RTC;
BEGIN
I2Cout($50, 2);
second:=I2Cinp($50, Seconds);
I2Cout($50, 3);
minute:=I2Cinp($50, Minutes);
I2Cout($50, 4);
hour:=I2Cinp($50, hours);
second:=bytetohex (seconds);
minute:=bytetohex (minutes);
hour:=bytetohex (hours);
LCDCLR;
LCDxy(1,0);
write (LCDOut,'Aktuelle Zeit');
LCDxy(3,1);
write (LCDOut,hour);
LCDxy(5,1);
write (LCDOut,':');
LCDxy(6,1);
write (LCDOut,minute);
LCDxy(8,1);
write (LCDOut,':');
LCDxy(9,1);
write (LCDOut,second);
mdelay(20);
end;
Procedure Temperatur_messen;
BEGIN
a:= GetAdc ;
a:= a-390;
a:= a * 17;
a:= a div 100;
end;
Procedure Tagestemperatur;
BEGIN
LCDCLR;
LCDxy(2,0);
write (LCDOut, 'Lufttemp:');
LCDXY(12,0);
write (LCDOut ,IntToStr(a));
If a < einschalttemperatur_tag THEN // Wenn Temperatur unter 26°, einschalten.
PortB:=%11111111;
b:= TRUE; // Heitzung 'an' Flag setzen.
endif;
If a >= abschalttemperatur_tag THEN // Wenn Temperatur um 28°, ausschalten.
PortB:=%00000000;
b:= FALSE; // Heitzung 'aus' Flag setzen.
endif;
If b = TRUE THEN
LCDXY(0,1);
write (LCDOut, 'Bodenheizung:an');
ELSE
LCDXY(0,1);
write (LCDOut, 'Bodenheizung:aus');
endif;
mdelay(100);
end;
Procedure Nachttemperatur;
BEGIN
LCDCLR;
LCDxy(2,0);
write (LCDOut, 'Lufttemp:');
LCDXY(12,0);
write (LCDOut ,IntToStr(a));
If a < einschalttemperatur_nacht THEN // Wenn Temperatur unter 26°, einschalten.
PortB:=%11111111;
b:= TRUE; // Heitzung 'an' Flag setzen.
endif;
If a >= abschalttemperatur_nacht THEN // Wenn Temperatur um 28°, ausschalten.
PortB:=%00000000;
b:= FALSE; // Heitzung 'aus' Flag setzen.
endif;
If b = TRUE THEN
LCDXY(0,1);
write (LCDOut, 'Bodenheizung:an');
ELSE
LCDXY(0,1);
write (LCDOut, 'Bodenheizung:aus');
endif;
mdelay(100);
end;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
InitPorts;
EnableInts;
//I2Cout($50, 2, $00); // Sekunden stellen
//I2Cout($50, 3, $05); // Minuten stellen
//I2Cout($50, 4, $20); // Stunden stellen
loop
RTC;
mdelay (1000);
Temperatur_messen;
If hour = 23 THEN
Nachttemperatur;
mdelay(1000);
IF hour = 08 THEN
Tagestemperatur;
mdelay(1000);
ENDIF;
ENDIF;
endloop;
end Tutor01.