1 Naposledy upravil: ochm (2014-06-15 12:26:00)

Téma: Jednoduché spínačky s možností ručního ovládání

Už je to asi 24hod. co mám své první SDS-MICRO DIN E R1 zapnuté. smile
Napsal jsem svůj první prográmek, čerpajíce i ze zde uvedených návodů a postřehů.
Třeba se někomu bude hodit...

--
Martin

//
// Jednoduche spinaci hodiny pro 3 casova okna, pouze v pracovni dny
// Moznost rucniho trvaleho zapnuti, nebo vypnuti, nebo rizeni programem
// Uprava casu Letni/Zimni
// Nevyuzite RE1 (LED) slouzi jako blikatko - heartbeat :)
//
#define YER  sys[7]
#define MON  sys[6]
#define DAY  sys[5]
#define HRS  sys[8]
#define MIN  sys[9]
#define SEC  sys[10]
#define GMT  sys[26]
#define RELE1 sys[231]  //Jen pro blikatko
#define RELE2 sys[232]  //Ovladani

#define MODE2 sys[140]   // 1=trvale ON, 0=trvale OFF, jine=dle programu
                                        // Mode se da ridit externe http://ipadresa/sdscep?p=0&sys140=2

#define TON 2   //Delka svitu blikatka
#define TOFF 8 //Delka zasnuti blikatka

var lc,zc,dow,con,coff,CAS,PON1,POF1,PON2,POF2,PON3,POF3;

//Uprava lokalniho casu podle datumu (Letni/Zimni)
summer
{
  if (( MON > 3 ) && ( MON < 10 )) { GMT = 2; return; }
  if (( MON < 3 ) || ( MON > 10 )) { GMT = 1; return; }
  if ( MON ==  3 )
  {
    lc = 31 - (( 5 * YER / 4 + 4 ) % 7 );
    if ( DAY >  lc ) { GMT = 2; return; }
    if (( DAY == lc ) && ( HRS >= 2 )) { GMT = 2; }
  }
  if ( MON == 10 )
  {
    zc = 31 - (( 5 * YER / 4 + 1 ) % 7 );
    if ( DAY >  zc ) { GMT = 1; return; }
    if (( DAY == zc ) && ( HRS >= 3 )) { GMT = 1; }
  }
}

blikatko {
  if (con<TON) {con+=1; RELE1=255; return;}
  if (coff<TOFF && con==TON) {coff+=1;RELE1=0; return;}
  if (coff==TOFF) {con=0; coff=0;}
}

ovladani {
  if (MODE2==0) goto vypni;             //trvale OFF dle MODE2
  if (MODE2==1) goto zapni;             //trvale ON dle MODE2
  //Ostatni hodnoty MODE2 se berou jako automat

  if (SEC!=0) goto stav;               //Mimo 0. sec se jen vypise stav

  dow=((sys[4] / 86400) + 4) % 7;      //0=Ne,1=Po...6=So
  if (dow==0 || dow==6) goto vypni;    //Cely vikend je vypnuto

  CAS=HRS*100+MIN;                     //udelame z casu cislo HHMM
  if (CAS>=PON1 && CAS<=POF1) goto zapni;
  if (CAS>=PON2 && CAS<=POF2) goto zapni;
  if (CAS>=PON3 && CAS<=POF3) goto zapni;

  //Pokud neni zadne casove okno splneno (viz vyse), tak vypnout.
  label vypni:
         if (RELE2!=0) {
            echo ('Vypinam rele');
            RELE2=0;
         }
         goto stav;
  label zapni:
        if (RELE2!=255) {
            echo ('Zapinam rele');
            RELE2=255;
         }
         goto stav;
  label stav:
        echoinline (HRS,':',MIN,':',SEC);  //cas
        if (RELE2==0) { echo (' Rele vypnuto.',RELE2); return;}
        if (RELE2==255) { echo (' Rele zapnuto.',RELE2); return;}
}
//##################################################################
init
{
    sys[196]=2;
    sys[197]=2;             // Obe rele ridi SDS-C
    echo('Spinacky');
    PON1=645;  POF1=815;   //ranni okno 6:45-8:15
    PON2=1130; POF2=1300;  //poledni okno
    PON3=1430; POF3=1645;  //odpoledni okno
    MODE2=2;               //Jedeme v auto modu, 1=trvale ON, 0=trvale OFF
}
//##################################################################
main
{
  summer();                 //korekce casu podle aktualniho datumu
  echoclear(0);             //smazeme konzolu
  blikatko();               //blikame protoze zijeme
  ovladani();               //ovlada rele podle casovych oken
}

2

Re: Jednoduché spínačky s možností ručního ovládání

Skvělé spínací hodiny, dobrá inspirace. Trochu jsem si je upravil k obrazu svému. Ovládání RE1 a RE2, s tím že RE1 je ovládáno pevně nastaveným časem přímo v programu a RE2 má pevný čas zapnutí a vypnutí je nastavitelné přes sys.

#define YER  sys[7]
#define MON  sys[6]
#define DAY  sys[5]
#define HRS  sys[8]
#define MIN  sys[9]
#define SEC  sys[10]
#define GMT  sys[26]
#define RELE1 sys[231]  //RE1
#define RELE2 sys[232]  //RE2

#define MODE2 sys[140]   // 1=trvale ON, 0=trvale OFF, jine=dle programu
                                    
#define MODE22 sys[141]   // 1=trvale ON, 0=trvale OFF, jine=dle programu
                                       
#define UVOFF sys[142]    // definice času vypnutí RE2
                                  

var lc,zc,dow,con,coff,CAS,PON1,POF1,PON2,POF2,PON3,POF3,PON21;
init
{
 sys[196]=2;
    sys[197]=2;             // Obe rele ridi SDS-C
    echo('Spinacky');
    PON1=700;  POF1=830;   //ranni okno 7:00-8:30
    PON2=1130; POF2=1230;  //poledni okno
    PON3=1600; POF3=2300;  //poledni okno
     MODE2=2;               //Jedeme v auto modu, 1=trvale ON, 0=trvale OFF
     UVOFF=800;              //Nastavení defalutní hodnoty vypnutí UV lampy
    PON21=600;     //ranni okno 7:00-8:30
       MODE22=2;               //Jedeme v auto modu, 1=trvale ON, 0=trvale OFF
    
 }
summer
{
  if (( MON > 3 ) && ( MON < 10 )) { GMT = 2; return; }
  if (( MON < 3 ) || ( MON > 10 )) { GMT = 1; return; }
  if ( MON ==  3 )
  {
    lc = 31 - (( 5 * YER / 4 + 4 ) % 7 );
    if ( DAY >  lc ) { GMT = 2; return; }
    if (( DAY == lc ) && ( HRS >= 2 )) { GMT = 2; }
  }
  if ( MON == 10 )
  {
    zc = 31 - (( 5 * YER / 4 + 1 ) % 7 );
    if ( DAY >  zc ) { GMT = 1; return; }
    if (( DAY == zc ) && ( HRS >= 3 )) { GMT = 1; }
  }
}

ovladani {
  if (MODE2==0) goto vypni;             //trvale OFF dle MODE2
  if (MODE2==1) goto zapni;             //trvale ON dle MODE2
  //Ostatni hodnoty MODE2 se berou jako automat

  if (SEC!=0) goto stav;               //Mimo 0. sec se jen vypise stav

  dow=((sys[4] / 86400) + 4) % 7;      //0=Ne,1=Po...6=So


  CAS=HRS*100+MIN;                     //udelame z casu cislo HHMM
  if (CAS>=PON1 && CAS<=POF1) goto zapni;
  if (CAS>=PON2 && CAS<=POF2) goto zapni;
  if (CAS>=PON3 && CAS<=POF3) goto zapni;

  //Pokud neni zadne casove okno splneno (viz vyse), tak vypnout.
  label vypni:
         if (RELE1!=0) {
            echo ('Vypinam rele1');
            RELE1=0;
         }
         goto stav;
  label zapni:
        if (RELE1!=255) {
            echo ('Zapinam rele1');
            RELE1=255;
         }
         goto stav;
  label stav:
        echoinline (HRS,':',MIN,':',SEC);  //cas
        if (RELE1==0) { echo (' Rele1 vypnuto.',RELE1); return;}
        if (RELE1==255) { echo (' Rele1 zapnuto.',RELE1); return;}
}

ovladani2 {
  if (MODE22==0) goto vypni2;             //trvale OFF dle MODE2
  if (MODE22==1) goto zapni2;             //trvale ON dle MODE2
  //Ostatni hodnoty MODE22 se berou jako automat

  if (SEC!=5) goto stav2;               //Mimo 0. sec se jen vypise stav

  if (CAS>=PON21 && CAS<=UVOFF) goto zapni2;

  //Pokud neni zadne casove okno splneno (viz vyse), tak vypnout.
  label vypni2:
         if (RELE2!=0) {
            echo ('Vypinam rele2');
            RELE2=0;
         }
         goto stav2;
  label zapni2:
        if (RELE2!=255) {
            echo ('Zapinam rele2');
            RELE2=255;
         }
         goto stav2;
  label stav2:
        echoinline (HRS,':',MIN,':',SEC);  //cas
        if (RELE2==0) { echo (' Rele2 vypnuto.',RELE2); return;}
        if (RELE2==255) { echo (' Rele2 zapnuto.',RELE2); return;}
}
main
{
 summer();                 //korekce casu podle aktualniho datumu
  echoclear(0);             //smazeme konzolu
  ovladani();               //ovlada rele podle casovych oken
  ovladani2();               //ovlada rele podle casovych oken
 //
}