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 

Arduino RTC ura

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



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.87
Kraj: Dobrepolje

PrispevekObjavljeno: Ned Jan 21, 2024 6:31 pm    Naslov sporočila:  Arduino RTC ura Odgovori s citatom

Hi

Imam RTC uro Ds1307 na Arduino plati za pisanje podatkov na SD kartico.

Rad bi, da se podatki zapisujejo na SD kartico vsakih 5 minut in to takrat ko je RTC ura (now.minute) 0, 5, 10, 15,.... in tako naprej za celo uro.

Podatke pa mora zapisati samo enkrat.

Priložena koda deluje, da pa bi to delalo celo uro pa bi moral vse to ponoviti 12 krat.

Ali kdo ve kakšen bolj eleganten zapis, da bi zmanjšal kodo. Prosim za kakšen namig.


Lp,



Koda:


// RTC ura =  DS1307
 
DateTime now = rtc.now();

if ((now.minute()== 5) && ((now.second()<= 1))){
 
    Serial.print("Pulz_1: ");
    Serial.println(Pulz_1);   
    Serial.print("Pulz_2: ");
    Serial.println(Pulz_2);   
 }

Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
rafaellsi
Član
Član



Pridružen-a: Ned 11 Sep 2011 18:54
Prispevkov: 478
Aktiv.: 3.10
Kraj: Radovljica

PrispevekObjavljeno: Ned Jan 21, 2024 6:39 pm    Naslov sporočila:   Odgovori s citatom

Koda:
 ...
if ((now.minute() % 5 == 0) && ((now.second()<= 1))) {
...

remainder = dividend % divisor;
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.87
Kraj: Dobrepolje

PrispevekObjavljeno: Ned Jan 21, 2024 6:58 pm    Naslov sporočila:   Odgovori s citatom

rafaellsi je napisal/a:
Koda:
 ...
if ((now.minute() % 5 == 0) && ((now.second()<= 1))) {
...

remainder = dividend % divisor;



Vsaka čast, to jaz ne bi nikoli pogruntal.



Ali namesto 5 min lahko na enak način uporabim interval 15 minut?

LP,
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.87
Kraj: Dobrepolje

PrispevekObjavljeno: Sre Jan 24, 2024 5:14 pm    Naslov sporočila:   Odgovori s citatom

Hi

Zakaj ta koda ne deluje, ko se minute postavijo na nič (0), ko so minute 15, 30, 45 pa deluje, izvede zahtevano operacijo.

Če bi kdo vedel v čem je problem.

lp,

Koda:


 ...
if ((now.minute() % 15 == 0) && ((now.second()<= 1))) {
...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
eddie
Član
Član



Pridružen-a: Sre 10 Dec 2003 21:02
Prispevkov: 706
Aktiv.: 3.16
Kraj: Severna primorska

PrispevekObjavljeno: Sre Jan 24, 2024 9:50 pm    Naslov sporočila:   Odgovori s citatom

Tole:
Koda:
now.minute() % 15 == 0


bi z besedami pomenilo "ko je ostanek pri deljenju minut s 15 enak 0"

Torej je pogoj izpolnjen pri minutah: 15, 30, 45...

Deljenje z 0 je pa koliko?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
rafaellsi
Član
Član



Pridružen-a: Ned 11 Sep 2011 18:54
Prispevkov: 478
Aktiv.: 3.10
Kraj: Radovljica

PrispevekObjavljeno: Čet Jan 25, 2024 9:17 am    Naslov sporočila:   Odgovori s citatom

Načeloma bi moralo delovati. To je deljenje s 15 in ne z 0, tako da to ne bi smela biti težava. Ali je drugi pogoj izpolnjen?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1713
Aktiv.: 7.66
Kraj: Ig

PrispevekObjavljeno: Čet Jan 25, 2024 9:27 am    Naslov sporočila:   Odgovori s citatom

Tudi 0/15 da ostanek 0, tako da tale poogoj je izpolnjen, težava bo verjetno v drugem pogoju. Mislim, da bi:

Koda:
if ((now.minute() % 5 == 0) && ((now.second()<= 1))) {


moral napraviti tako:

Koda:
if ((now.minute() % 5 == 0) && ((now.second()== 1))) {
writeFlag = true;



in tam kjer pišeš na SD gledaš tale writeFlag, ki ga pobrišeš takoj po tem, ko si zapisal na SD, tako boš zapisal samo 1x, sklepam da pisanje na SD vzame nekaj ms, tako da v 1s imaš lahko tudi 100 zapisov, kar ne bo v redu. Pa tudi tale moj zapis ima bug, saj bo dokler ne bo pretekla 1s flag ponovno postavil, tako da moraš narediti še en mehanizem, ki bo 1s onemogočal ponovno postavitev flega.

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
bubm7
Član
Član



Pridružen-a: Pon 29 Okt 2012 18:10
Prispevkov: 15
Aktiv.: 0.11
Kraj: Ljubljana

PrispevekObjavljeno: Čet Jan 25, 2024 10:49 am    Naslov sporočila:   Odgovori s citatom

Ponavadi si v takih primerih zapomnimo trenutek zadnjega pisanja:

Koda:
DateTime last_write;
.
.
last_write = rtc.now();


in potem ne pišemo, če je npr.
Koda:
now - last_write < 120


Ne vem pa, če arduinotov DateTime omogoča enostavno odštevanje (in če je rezultat v sekundah).
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.87
Kraj: Dobrepolje

PrispevekObjavljeno: Čet Jan 25, 2024 10:30 pm    Naslov sporočila:   Odgovori s citatom

RGorazd je napisal/a:
Tudi 0/15 da ostanek 0, tako da tale poogoj je izpolnjen, težava bo verjetno v drugem pogoju. Mislim, da bi:

Koda:
if ((now.minute() % 5 == 0) && ((now.second()<= 1))) {


moral napraviti tako:

Koda:
if ((now.minute() % 5 == 0) && ((now.second()== 1))) {
writeFlag = true;






Tudi ta varianta == 1, ne deluje. Res mi je čudno 15, 30, 45, deluje, ko pa pride na 00 pa gre dalje.

Mogoče sem pa kje v programu kaj zašuštral, da zamudi ta čas???

Ta if stavek je v void Loop rutini.



Zafrknjeno je to, da moram čakat eno uro, da vidim, če deluje. Ne vem kako bi to lahko
simuliral, da nebi bilo čakanja.

Imam pa še en problem z SD kartico, če jo vzamem ven med delovanjem in jo čez čas zopet vstavim v ohišje, ne zapisuje več podatkov na kartico.


Ne vem pa kako bi to napisal v daljši obliki, da bi se to dogajalo vsakih 15 minut.
Mogoče kakšen namig, hvala.



lp,
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1713
Aktiv.: 7.66
Kraj: Ig

PrispevekObjavljeno: Pet Jan 26, 2024 8:21 am    Naslov sporočila:   Odgovori s citatom

Koda:

#include <stdio.h>
#include <stdint.h> //uint16_t

int main()
{
   uint16_t min;
   
   for(min = 0; min <= 59; min++) {
       printf("Minuta: %i\t Pisi na sd: %s\r\n", min, min % 15 ==0 ? "Da" : "Ne");
   }

    return 0;
}


Če boš zgornje vrstice pognal v nekem online C kompajlerjum npr:
https://www.onlinegdb.com/online_c_compiler

Boš dobil naslednji rezultat:

    Minuta: 0 Pisi na sd: Da
    Minuta: 1 Pisi na sd: Ne
    Minuta: 2 Pisi na sd: Ne
    Minuta: 3 Pisi na sd: Ne
    Minuta: 4 Pisi na sd: Ne
    Minuta: 5 Pisi na sd: Ne
    Minuta: 6 Pisi na sd: Ne
    Minuta: 7 Pisi na sd: Ne
    Minuta: 8 Pisi na sd: Ne
    Minuta: 9 Pisi na sd: Ne
    Minuta: 10 Pisi na sd: Ne
    Minuta: 11 Pisi na sd: Ne
    Minuta: 12 Pisi na sd: Ne
    Minuta: 13 Pisi na sd: Ne
    Minuta: 14 Pisi na sd: Ne
    Minuta: 15 Pisi na sd: Da
    Minuta: 16 Pisi na sd: Ne
    Minuta: 17 Pisi na sd: Ne
    Minuta: 18 Pisi na sd: Ne
    Minuta: 19 Pisi na sd: Ne
    Minuta: 20 Pisi na sd: Ne
    Minuta: 21 Pisi na sd: Ne
    Minuta: 22 Pisi na sd: Ne
    Minuta: 23 Pisi na sd: Ne
    Minuta: 24 Pisi na sd: Ne
    Minuta: 25 Pisi na sd: Ne
    Minuta: 26 Pisi na sd: Ne
    Minuta: 27 Pisi na sd: Ne
    Minuta: 28 Pisi na sd: Ne
    Minuta: 29 Pisi na sd: Ne
    Minuta: 30 Pisi na sd: Da
    Minuta: 31 Pisi na sd: Ne
    Minuta: 32 Pisi na sd: Ne
    Minuta: 33 Pisi na sd: Ne
    Minuta: 34 Pisi na sd: Ne
    Minuta: 35 Pisi na sd: Ne
    Minuta: 36 Pisi na sd: Ne
    Minuta: 37 Pisi na sd: Ne
    Minuta: 38 Pisi na sd: Ne
    Minuta: 39 Pisi na sd: Ne
    Minuta: 40 Pisi na sd: Ne
    Minuta: 41 Pisi na sd: Ne
    Minuta: 42 Pisi na sd: Ne
    Minuta: 43 Pisi na sd: Ne
    Minuta: 44 Pisi na sd: Ne
    Minuta: 45 Pisi na sd: Da
    Minuta: 46 Pisi na sd: Ne
    Minuta: 47 Pisi na sd: Ne
    Minuta: 48 Pisi na sd: Ne
    Minuta: 49 Pisi na sd: Ne
    Minuta: 50 Pisi na sd: Ne
    Minuta: 51 Pisi na sd: Ne
    Minuta: 52 Pisi na sd: Ne
    Minuta: 53 Pisi na sd: Ne
    Minuta: 54 Pisi na sd: Ne
    Minuta: 55 Pisi na sd: Ne
    Minuta: 56 Pisi na sd: Ne
    Minuta: 57 Pisi na sd: Ne
    Minuta: 58 Pisi na sd: Ne
    Minuta: 59 Pisi na sd: Ne


Tako da koda bi morala delati, se pravi 0/15 deluje in prav tako bi moralo zapisati na SD.

Kar se pa same SD kartice tiče, le ta je inicializirana na začetku tvoje kode, najbrž. In če jo boš med delovanjem vzel ven, jo boš moral reinicializirati. Drugače ne bo več delalo.

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.87
Kraj: Dobrepolje

PrispevekObjavljeno: Pet Jan 26, 2024 1:45 pm    Naslov sporočila:   Odgovori s citatom

RGorazd je napisal/a:




Tako da koda bi morala delati, se pravi 0/15 deluje in prav tako bi moralo zapisati na SD.

Kar se pa same SD kartice tiče, le ta je inicializirana na začetku tvoje kode, najbrž. In če jo boš med delovanjem vzel ven, jo boš moral reinicializirati. Drugače ne bo več delalo.


Zakaj pri meni preskoči 00, nevem, rad bi vedel kje je feler?

Citiram:


jo boš moral reinicializirati. Drugače ne bo več delalo.



Kako pa to narediš in kje v kodi?


Kako skočiti iz spodnje kode, v drug podprogram npr. Zapis_na SD(); ko se konča oziroma poteče čas?


Koda:

// --------------- 4. četrtina ure ---------------------------
if ((now.minute()>= 45) && ((now.minute()<= 59))){
 

Poraba_B1 = float(Pulz_1) / float(1000); 
Poraba_kw_B1 = float(Pulz_K1) / float(1000) / float(0.25);

Poraba_B2 = float(Pulz_2) / float(1000);
Poraba_kw_B2 = float(Pulz_K2) / float(1000) / float(0.25);


  lcd.init();
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("B1: ");
  lcd.setCursor(3,0);
  lcd.print(Pulz_1);

  lcd.setCursor(8,0);
  lcd.print("B2: ");
  lcd.setCursor(11,0);
  lcd.print(Pulz_2);


Remotexy_handler();
     
 } 



Nisem pripel celotne code, zaradi preglednosti. Če bi lahko to napravil bi bil zgornji problem rešen. Ko se izvede ta del kode skoči program na začetek in prične izvajati 1.četrtino ure, ki je identična tej. Skok bi bil potreben zato, da ponastavi neke spremenljivke in podatke zapiše na SD.


lp,
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1713
Aktiv.: 7.66
Kraj: Ig

PrispevekObjavljeno: Pet Jan 26, 2024 9:07 pm    Naslov sporočila:   Odgovori s citatom

Nevem,

ne poznam najbolj arduino okolja, ampak najverjetneje imaš nekje nek handler. npr

Sdcard sd;

sd.begin(morda še na katerih pinih se nahaja)...

to je tvoja inicializacija hardvera. Verjetno imaš kako sd.h knjižnico, poglej vanjo, če je spisan handler za izmet sd kartice.

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Č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: 96 dni


Powered by phpBB © 2001, 2005 phpBB Group