Arduino ja kellon lukeminen

Alla olevalla esimerkkikoodilla onnistuu kellon ym lukeminen ihan ok.

Joko en osannut etsiä, tai sitten yritin väärällä tyylillä, en ymmärtänyt, että miten luetaan esim pelkät tunnit tai pelkät minuutit.

Eikö se nyt kuitenkin ole mahdollista, vai tarviiko ruveta pilkkomaan noita nykyisiä.

Ajan lukeminen…
Serial.println(rtc.getTimeStr());

Yritin lukea minuutit…
Serial.println(rtc.getTimeStr(min));

Ym ym yritystä, ei mene millään jakeluun.

Ei löytynyt oikeen kunnollista esimerkkiä tuosta lukemisesta, tai sitten yritin hakea väärillä sanoilla.

[code]// DS1302_Serial_Easy (C)2010 Henning Karlsen
// web: Electronics - Henning Karlsen
//
// A quick demo of how to use my DS1302-library to
// quickly send time and date information over a serial link
//
// I assume you know how to connect the DS1302.
// DS1302: CE pin → Arduino Digital 2
// I/O pin → Arduino Digital 3
// SCLK pin → Arduino Digital 4

#include <DS1302.h>

// Init the DS1302
DS1302 rtc(2, 3, 4);

void setup()
{
// Set the clock to run-mode, and disable the write protection
rtc.halt(false);
rtc.writeProtect(false);

// Setup Serial connection
Serial.begin(9600);

// The following lines can be commented out to use the values already stored in the DS1302
rtc.setDOW(FRIDAY); // Set Day-of-Week to FRIDAY
rtc.setTime(12, 0, 0); // Set the time to 12:00:00 (24hr format)
rtc.setDate(6, 8, 2010); // Set the date to August 6th, 2010
}

void loop()
{
// Send Day-of-Week
Serial.print(rtc.getDOWStr());
Serial.print(" ");

// Send date
Serial.print(rtc.getDateStr());
Serial.print(" – ");

// Send time
Serial.println(rtc.getTimeStr());

// Wait one second before repeating :slight_smile:
delay (1000);
}[/code]

Kyseessä on varmaankin tämä kirjasto: henningkarlsen.com/electroni … y.php?id=5 ?

Ilmeisesti pitäisi tehdä jotain tälläistä:

[code]#include <DS1302.h>

DS1302 rtc(2, 3, 4);

void setup()
{
rtc.halt(false);
rtc.writeProtect(false);

Serial.begin(9600);

rtc.setDOW(FRIDAY);
rtc.setTime(12, 0, 0);
rtc.setDate(6, 8, 2010);
}

void loop()
{
Time time;
time = rtc.getTime();
Serial.print("Minuutteja: ");
Serial.println(time.min, DEC);
delay (1000);
}[/code]

Eli rtc.getTimeStr() metodin sijaan käytetään rtc.getTime(), joka palauttaa Time tyyppisen olion, josta sitten saa tiedon time.min (vai time->min ? tosin kyseessä ei ilmeisesti ole osoitin. C++:n erityispiirteistä on vähänlaisesti kokemusta). Kannattaa tutkia kirjaston mukana tulevaa DS1302.h tiedostoa.

Pieni primeri tuosta . ja -> käyttäytymisestä.

Koodihan on järjetön. fun funktio ottaa osoittimen fooT tyyppiseen structiin.
Aluksi se dereferensoi, eli ottaa kaman osoittimen päästä * operaattorilla ja tunkee saadun tmp nimiseen fooT muuttujaan.

Sitten tehdään sama kentittäin. . ottaa kentän structista. samoin -> osoittimen päästä.

-> voitaisiin kirjoittaa (*ptr).first notaatiolla, mutta kauhean pitkä ja hankala sulutettu otus. Sulut tarvitaan laskujärjysteksen takia.

Lopuksi tehdään pöljä rekursio ja otetaan tmp nimisestä muuttujasta osoitin.

struct fooT{
  uint8_t first;
  uint8_t second;
};

void fun(struct fooT * ptr){
  struct fooT tmp;
  tmp = * ptr;
  //Sama uudelleen.
  tmp.first = ptr->first;
  tmp.second = ptr->second;
  if(tmp.first){
    fun( & tmp);
  }
}

Tässä erityistapauksessa voidaan arvata, että käytössä on piste, koska rtc esitellään DS1302 tyyppisenä objektina. arvataan siksi, että typedeffillä voi tehdä kaikkea hyvää, pahaa, rumaa ja käsittämätöntä.

Anteeksi ketjun sivuraiteuttaminen. Mutta sait kaiketi hyvän vihjeen miten tuo kannattaa tehdä.

Kiitokset vastauksista, vähän avautu paremmin tuo lukeminen…

Pitää vielä ajan kanssa keskittyä tuohon vuokon versioon…

Siis tuo ei ole mikään versio. Tuo on vain yleistä höpinää pisteen ja nuolen eroista :slight_smile:

Tarkoittanet tomin versiota koodista.