www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Dnevna ura v navezi z zunanjim RTC

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Peter123
Član
Član



Pridružen-a: Tor 13 Jan 2009 15:34
Prispevkov: 1364
Aktiv.: 7.37
Kraj: Lj.

PrispevekObjavljeno: Pet Avg 29, 2014 11:41 am    Naslov sporočila:  Dnevna ura v navezi z zunanjim RTC Odgovori s citatom

Torej iščem kako realizirati dnevno (24H) uro, ki ne bo imela hibe tegale stavka:
Koda:
 if(alarmSetting == 1 && alarmSecond == now.second() && alarmMinute == now.minute() && alarmHour == now.hour() )


Hiba tega stavka je da preklopi samo v določenem trenutku, ko so pogoji izpolnjeni. Jaz bi pa rad redno preverjal v kakšnem stanju mora biti izhod glede na uro. Zgornji stavek se izvrši 1x dnevno, če na primer MCU izgubi napajanje in ga priklopiš po nastavljeni uri, potem moraš čakati 24H (v najslabšem primeru).

Razmišljal sem v smeri odštevanje trenutne ure od nastavljene ampak je situacija malo bolj komplicirana ...

Tale problem je sigurno že kdo reševal, ima kdo kak link kjer bi tole videl že rešeno?

Ura bo 1x na dan vklopila pin in 1x na dan izklopila

Uporabljam sicer okolje Arduino in zunanji DS1307. Je pa zadeva enaka v Cju?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
miharix
Član
Član



Pridružen-a: Tor 18 Dec 2012 9:59
Prispevkov: 403
Aktiv.: 2.94
Kraj: LJ

PrispevekObjavljeno: Pet Avg 29, 2014 12:10 pm    Naslov sporočila:   Odgovori s citatom

Namesto en if preoblikuj v več ugnezdenih if stavkov.

Njihovo zaporedje/vgnezditev uredi glede na preostalo kodo.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
vpeter
Član
Član



Pridružen-a: Pon 11 Jun 2012 16:05
Prispevkov: 337
Aktiv.: 2.35
Kraj: Maribor okolica

PrispevekObjavljeno: Pet Avg 29, 2014 12:58 pm    Naslov sporočila:   Odgovori s citatom

Uorabi eno spremenljivko,v katero shraniš stanje alarma. Pri preverjanju vklopa in izklopa alarma ne primerjaj samo trenutnega časa ampak interval (ali je trenuten čas znotraj časa za alarm). Če alarm še ni postavljen ga postaviš. Če je že postavljen potem ne narediš nič. V primeru reseta sistema ta spremenljivka stanja alarma ni postavljena, čas je večji kot je zahtevan za alarm in vklopiš alarm ter postaviš spremenljivko. Enako velja za izklop.

Tako nekako. Sem danes malce zmeden...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Peter123
Član
Član



Pridružen-a: Tor 13 Jan 2009 15:34
Prispevkov: 1364
Aktiv.: 7.37
Kraj: Lj.

PrispevekObjavljeno: Pet Avg 29, 2014 1:06 pm    Naslov sporočila:   Odgovori s citatom

Zelo dobrodošli bi bili kaki linki do razlage/primerov.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
miharix
Član
Član



Pridružen-a: Tor 18 Dec 2012 9:59
Prispevkov: 403
Aktiv.: 2.94
Kraj: LJ

PrispevekObjavljeno: Pet Avg 29, 2014 3:18 pm    Naslov sporočila:   Odgovori s citatom

Tvojo eno vrstico kode lahko razbiješ v več if stavkov:

npr:
Koda:

if(alarmSetting == 1){
   if (alarmSecond == now.second()){
      if(alarmMinute == now.minute()){
         if (alarmHour == now.hour()){
      }
   }
}


Ne vem kaj ti pomeni spremenljivka alarmSetting če to pomeni v kolikor je alarm vklopljen nato bi razporedil tako:

Koda:

 if(alarmMinute == now.minute()){
     if(alarmSetting == 1){
      if (alarmHour == now.hour()){
         if (alarmSecond == now.second()){       
              vklopi_pin1()
      }
   }
}


Če prav predvidevam kako kodo imaš bi pol to moglo preverjat če je alarm vklopljen vsakih 60min.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3638
Aktiv.: 17.11

PrispevekObjavljeno: Pet Avg 29, 2014 5:44 pm    Naslov sporočila:   Odgovori s citatom

Če ne boš za več kot 2 uri zamudil predvidenega trenutka vklopa, se bo izhod še vklopil.
Če boš ujel pravo uro, a zamudil pravo minuto, se bo izhod vklopil.
Če boš ujel pravo uro in prave minute, a zamudil pravo sekundo, se bo izhod vklopil.

Če ne boš ničesar zamudil, ampak bo MCU sam v miru prilezel do točno nastavljenega trenutka, se bo izhod vklopil do sekunde natančno ob predvidenem trenutku.

Enako kolobocijo lahko narediš še za izklop, samo pazi, da se ne bodo intervali ur prekrivali.

Koda:

void vklopiIzhodA()
{
  if(izhod==1)
  {
    goto vklopiIzhodAv;  // VEN!!!  Sploh treba naprej preverjati, saj je izhod že vklopljen
  }
  if(alarmSetting == 1)  // Če je alarm nastavljen ...
  {
// trenutna ura je večja od ure za vklop izhoda  // ampak ne preveč večja
   if ((now.hour() > alarmHour) && (now.hour() < (alarmHour+3)))
   {
    digitalWrite(izhod, HIGH); // Vseeno vklopimo izhod, čeprav smo točno uro že zamudili, a še nismo prepozni
    goto vklopiIzhodAv;  // VEN!!!  Sploh treba naprej preverjati, saj je izhod že vklopljen
   }
// trenutna ura je prava, preverimo še minute, ali bomo prepozno vklopili
    if(now.hour() == alarmHour)
    {
      if(now.minute() > alarmMinute)
      {
        digitalWrite(izhod, HIGH); // Vseeno vklopimo izhod, čeprav smo točne minute že zamudili, a še nismo prepozni
        goto vklopiIzhodAv;  // VEN!!!  Sploh treba naprej preverjati, saj je izhod že vklopljen
      }
// trenutne minute so prave, morda ujamemo prave sekunde
      if(alarmMinute == now.minute())
      {
        if( now.second() > alarmSecond)
        {
          digitalWrite(izhod, HIGH); // Vseeno vklopimo izhod, čeprav smo točne sekunde že zamudili
          goto vklopiIzhodAv;  // VEN!!!  Sploh treba naprej preverjati, saj je izhod že vklopljen
        }
        if(now.second() == alarmSecond)
        {
          digitalWrite(izhod, HIGH); // Ob točni uri in točnih minutah smo ujeli še točne sekunde, zato lahko končno v miru vklopimo izhod
        }
      }
    }
  }
vklopiIzhodAv:  // VEN !!!
  now.hour(); // nekaj mora biti tukaj, da lahko postavimo oznako vklopiIzhodAv:
}
 


Če bo celotno dogajanje po 22h uri zvečer, boš moral malo prilagoditi pogoje okrog
(now.hour() < (alarmHour+3)), da ne bo ura že 0:-- ali 1:-- .

Dodano:
Koda:
   if (((now.hour() > alarmHour) && (now.hour() < (alarmHour+3))) || ((now.hour()+24 < alarmHour+3)))
S temle preslikaš trenutno uro za 24ur naprej. Če je zdajUra+24 še vedno manjša od alarmUre+3, bo vklopilo izhod.
Primer: alarmUra=23 in zdajUra=1 (=25), zato vklopi izhod.



Dodano2:
narediš funkcijo
Koda:
 void vrniSekunde (long int a, long int b, long int c)
{
  a= a * 3600; // ure * 3600
  b= b * 60; // minute * 60
  c= c + b; // dodam sekunde od minut
  c= c + a; // nato še sekunde od ur
  return c;
}

nato jo kličeš s parametri
  zdaj = vrniSekunde(now.hour(), now.minute(), nov.second());
  alarm = vrniSekunde(alarmHour, alarmMinute, alarmSecond);
if ((zdaj > alarm) && (zdaj < (alarm + 10800)) || ((zdaj + 81000) < (alarm + 10800)))
{
  digitalWrite(izhod, HIGH);
}
else
{
  digitalWrite(izhod, LOW);
}
zdaj in alarm morata iti do 165000, torej več kot 16 bitov nepredznačen int. Izhod bo aktiven največ 3 ure od nastavljenega alarma. Če boš vklopil 2h55 kasneje, boš ujel le še 5 minut.

Lahko pa ga v tem obdobju samo vklopiš in ga potem z drugim števcem držiš aktivnega 3 ure.


Dodano3:
Če ne rabiš do sekunde točno, narediš funkcijo vrniMinute. Takrat zadostujejo 16 bitne spremenljivke a, b, zdaj ter alarm. In malo bolj poredkoma lahko vse skupaj preverjaš.

Malo sem se potrudil, ker moram ravno naslednji teden (ko dobim 1307) narediti natanko enako funkcijo. Ob nastavljenem alarmu se mora vklopiti izhod za eno uro in pol. Če v tem času ne dobi potrditve (vhod iz stikala), izklopi izhod, sicer ga ohrani. Zadostuje pa minutna točnost. V tipe spremenljivk se pa še nisem zakopal, ker trenutno še shajam z boolean, char, byte, včasih pa dam kar int. Ja, vem, no, ... Doslej je šlo.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Peter123
Član
Član



Pridružen-a: Tor 13 Jan 2009 15:34
Prispevkov: 1364
Aktiv.: 7.37
Kraj: Lj.

PrispevekObjavljeno: Ned Avg 31, 2014 11:39 am    Naslov sporočila:   Odgovori s citatom

@igo
Tvoj predlog o seštevanju ur in minut se mi zdi še najbolj enostaven.
S tem načinom imaš delo samo z primerjanjem 2 številk.

Preklop se vrši glede na to koliko pogosto kličeš funkcijo.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Peter123
Član
Član



Pridružen-a: Tor 13 Jan 2009 15:34
Prispevkov: 1364
Aktiv.: 7.37
Kraj: Lj.

PrispevekObjavljeno: Pon Sep 01, 2014 8:30 am    Naslov sporočila:   Odgovori s citatom

Tole sem spisal in preizkusil - deluje:
Koda:

byte setura;
byte setmin;
byte seturaoff;
byte setminoff;
int sestevekcas = 0;
int sestevekseton = 0;
int sesteveksetoff =0;

      sestevekcas = (tm.Hour * 8) + tm.Minute;  // Seštejem minute z minutami od ur.
      sestevekseton = (setura * 8) + setmin;
      sesteveksetoff = (seturaoff * 8) + setminoff;
     
      if (sestevekcas >= sestevekseton && sestevekcas < sesteveksetoff )
      {
        digitalWrite(Izhod1, HIGH);
      }
       
      if (sestevekcas >= sesteveksetoff)
      {
        digitalWrite(Izhod1, LOW);
      }


Zadevo bi se vsekakor dalo še optimirat. Ideja pa deluje.
Pomislek: rešitev predvideva vklop pred izklopom v istih 24h! Vklop mora biti pred izklopom (časovno).
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 47 dni


Powered by phpBB © 2001, 2005 phpBB Group