|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.87 Kraj: Dobrepolje
|
Objavljeno: Ned Jan 21, 2024 6:31 pm Naslov sporočila: Arduino RTC ura |
|
|
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 |
|
|
rafaellsi Član
Pridružen-a: Ned 11 Sep 2011 18:54 Prispevkov: 478 Aktiv.: 3.10 Kraj: Radovljica
|
Objavljeno: Ned Jan 21, 2024 6:39 pm Naslov sporočila: |
|
|
Koda: |
...
if ((now.minute() % 5 == 0) && ((now.second()<= 1))) {
...
remainder = dividend % divisor; |
|
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.87 Kraj: Dobrepolje
|
Objavljeno: Ned Jan 21, 2024 6:58 pm Naslov sporočila: |
|
|
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 |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.87 Kraj: Dobrepolje
|
Objavljeno: Sre Jan 24, 2024 5:14 pm Naslov sporočila: |
|
|
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 |
|
|
eddie Član
Pridružen-a: Sre 10 Dec 2003 21:02 Prispevkov: 706 Aktiv.: 3.16 Kraj: Severna primorska
|
Objavljeno: Sre Jan 24, 2024 9:50 pm Naslov sporočila: |
|
|
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 |
|
|
rafaellsi Član
Pridružen-a: Ned 11 Sep 2011 18:54 Prispevkov: 478 Aktiv.: 3.10 Kraj: Radovljica
|
Objavljeno: Čet Jan 25, 2024 9:17 am Naslov sporočila: |
|
|
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 |
|
|
RGorazd Član
Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1713 Aktiv.: 7.66 Kraj: Ig
|
Objavljeno: Čet Jan 25, 2024 9:27 am Naslov sporočila: |
|
|
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 |
|
|
bubm7 Član
Pridružen-a: Pon 29 Okt 2012 18:10 Prispevkov: 15 Aktiv.: 0.11 Kraj: Ljubljana
|
Objavljeno: Čet Jan 25, 2024 10:49 am Naslov sporočila: |
|
|
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 |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.87 Kraj: Dobrepolje
|
Objavljeno: Čet Jan 25, 2024 10:30 pm Naslov sporočila: |
|
|
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 |
|
|
RGorazd Član
Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1713 Aktiv.: 7.66 Kraj: Ig
|
Objavljeno: Pet Jan 26, 2024 8:21 am Naslov sporočila: |
|
|
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 |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.87 Kraj: Dobrepolje
|
Objavljeno: Pet Jan 26, 2024 1:45 pm Naslov sporočila: |
|
|
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 |
|
|
RGorazd Član
Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1713 Aktiv.: 7.66 Kraj: Ig
|
Objavljeno: Pet Jan 26, 2024 9:07 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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
|