- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 6 von 6

Thema: wie alarmzeiten o.ä. programmieren?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.05.2005
    Ort
    Hannover
    Alter
    46
    Beiträge
    135

    wie alarmzeiten o.ä. programmieren?

    Anzeige

    Praxistest und DIY Projekte
    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.
    Code:
    {--------------------------------------------------------------}
    { 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.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    05.04.2005
    Beiträge
    66
    Ich versteh dein Problem nicht ganz. :/

    Ohne den Code jetzt angesehen zu haben, zu zählst doch bestimmt irgendwo die Uhrzeit hoch (mind. jede einmal pro Sekunde). Hier könntest du doch einfach ein if einbauen und die aktuelle Zeit mit der gespeicherten Alarmzeit vergleichen?

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.01.2005
    Ort
    Niederdorfelden / Hessen
    Alter
    56
    Beiträge
    368
    Hi ssalbach,

    wenn ich das Program richtig verstanden habe, dann funktioniert es nur von 23:00 bis 23:59 mit dem Nachtprogramm und von 8:00 bis 8:59 mit dem Tagprogramm. Dies sind die einzigen Zeiten, in denen Du mit den If - Befehlen vom Hauptprogramm in die Unterroutinen verzweigst.

    Besser wäre es, das Tagprogramm von Stunde 8 bis incl. Stunde 22 zu starten und den Rest des Tages das Nachtprogramm zu aktivieren. Der If - Befehl in der Hauptroutine müsste dann

    Code:
    If ((hour > 7) and (hour < 23)) then 
      Tagtemperatur
    else
      Nachttemperatur;
    lauten. Von 8:00h bis 22:59 sollte dann die Tagtemperatur aktiv sein, und zu jeder anderen Zeit die Nachttemperatur.

    Ich hoffe, das ich die Syntax eingehalten habe. Pascal benutzt ich nur mit Delphi.

    Grüße Klaus
    Eine verrückte Idee ist besser als keine

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.05.2005
    Ort
    Hannover
    Alter
    46
    Beiträge
    135
    so, bin im e-lab fprum auf die lösunng gekommen
    Es muss heissen If hour = $23
    ich dödel habe das $ nicht geschrieben und der RTC 8583 arbeitete doch ´mit BCD Code

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.01.2005
    Ort
    Niederdorfelden / Hessen
    Alter
    56
    Beiträge
    368
    hi ssalbach,

    im Moment gezweifle ich noch, das Dein Programm auch auserhalb der 8. und 23. Stunde korrekt arbeitet. Hast Du das mit ausgetestet ??

    Gruß Klaus
    Eine verrückte Idee ist besser als keine

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    07.02.2005
    Ort
    im Kreise Offenbach
    Alter
    53
    Beiträge
    71
    also mit dem $ allein sollte Dein Problem eigentlich auch micht gelöst sein,- es sei denn ich interpretiere Dein Programm falsch. Ich komme nämlich zum selben Ergebnis wie:

    Zitat Zitat von Klaus_0168
    ...funktioniert es nur von 23:00 bis 23:59 mit dem Nachtprogramm und von 8:00 bis 8:59 mit dem Tagprogramm. Dies sind die einzigen Zeiten, in denen Du mit den If - Befehlen vom Hauptprogramm in die Unterroutinen verzweigst.
    Gruß David
    Tue Recht und scheue niemanden \/

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test