Close

Podmínka IF s D3231

Úvodní stránka Fórum Hardware Arduino Podmínka IF s D3231

Označeno štítky: 

Aktuálně je na stránce zobrazeno 6 příspěvků - 1. až 6. (celkem z 6)
  • Autor
    Příspěvky
  • #6384
    LMXLuke
    Účastník

    Ahoj, pořídil jsem si časový obvod D3231 a chtěl bych pomocí něj řídit serva na oknech. Mělo by to fungovat pomocí IF, ale nevím, jak porovnávat aktuální čas a den v týdnu z obvodu s časem a dnem v týdnu v podmínce. Nevíte někdo jak na to? 🙂

    #6386
    posjirka
    Účastník

    tak ti asi nikdo neodpoví. Zkus nahodit jednoduchý příklad co to má dělat a k tomu dej svůj kod, kam až ses dostal. Určitě ti pak můžeme pomoci. Jinak dostaneš pouze hordu odkazů bez jakékoliv myšlenky.

    #6394
    LMXLuke
    Účastník

    To je právě ten problém, Já jsem v podstatě na začátku. našel jsem na netu nějaký kód, kterým můžu zapsat do obvodu a pak číst datum a čas. Ale potřebuju z toho obvodu času přečíst den v týdnu, hodinu a minutu a pak to použít v IFu. Když tak ten kód sem můžu dát a někdo mi vysvětlete kde se čtou tyhle hodnoty a kam se zapíšou, s kterou proměnnou můžu pracovat v podmínce. Já to v tom kódu prostě nevidím. Dál jsem taky zjistil, že zřejmě ten obvod, co jsem koupil, je vadný. Dám příklad: Zapíšu do něj 12:30 a pak čtu jestli tam je správnej čas, všechno běží jak má. Ve 12:35 odpojim arduino z usb abych zjistil jestli obvod tiká i na baterce. Ve 12:40 ho znovu připojím, znovu nahraju program do arduina, tentokrát ale BEZ zapisovací části a čtu, ale obvod začne znovu tikat od chvíle 12:35, tedy od chvíle odpojení, tudíž na baterce netiká, nebo nevím

    #include "Wire.h"
    #define DS3231_I2C_ADDRESS 0x68
    // Convert normal decimal numbers to binary coded decimal
    byte decToBcd(byte val)
    {
      return( (val/10*16) + (val%10) );
    }
    // Convert binary coded decimal to normal decimal numbers
    byte bcdToDec(byte val)
    {
      return( (val/16*10) + (val%16) );
    }
    void setup()
    {
      Wire.begin();
      Serial.begin(9600);
      // set the initial time here:
      // DS3231 seconds, minutes, hours, day, date, month, year
      // setDS3231time(30,42,21,4,26,11,14);
    }
    
    void readDS3231time(byte *second,
    byte *minute,
    byte *hour,
    byte *dayOfWeek,
    byte *dayOfMonth,
    byte *month,
    byte *year)
    {
      Wire.beginTransmission(DS3231_I2C_ADDRESS);
      Wire.write(0); // set DS3231 register pointer to 00h
      Wire.endTransmission();
      Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
      // request seven bytes of data from DS3231 starting from register 00h
      *second = bcdToDec(Wire.read() & 0x7f);
      *minute = bcdToDec(Wire.read());
      *hour = bcdToDec(Wire.read() & 0x3f);
      *dayOfWeek = bcdToDec(Wire.read());
      *dayOfMonth = bcdToDec(Wire.read());
      *month = bcdToDec(Wire.read());
      *year = bcdToDec(Wire.read());
    }
    void displayTime()
    {
      byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
      // retrieve data from DS3231
      readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
      &year);
      // send it to the serial monitor
      Serial.print(hour, DEC);
      // convert the byte variable to a decimal number when displayed
      Serial.print(":");
      if (minute<10)
      {
        Serial.print("0");
      }
      Serial.print(minute, DEC);
      Serial.print(":");
      if (second<10)
      {
        Serial.print("0");
      }
      Serial.print(second, DEC);
      Serial.print(" ");
      Serial.print(dayOfMonth, DEC);
      Serial.print("/");
      Serial.print(month, DEC);
      Serial.print("/");
      Serial.print(year, DEC);
      Serial.print(" Day of week: ");
      switch(dayOfWeek){
      case 1:
        Serial.println("Sunday");
        break;
      case 2:
        Serial.println("Monday");
        break;
      case 3:
        Serial.println("Tuesday");
        break;
      case 4:
        Serial.println("Wednesday");
        break;
      case 5:
        Serial.println("Thursday");
        break;
      case 6:
        Serial.println("Friday");
        break;
      case 7:
        Serial.println("Saturday");
        break;
      }
    }
    void loop()
    {
      displayTime(); // display the real-time clock data on the Serial Monitor,
      delay(1000); // every second
    }
    #6411
    posjirka
    Účastník

    Koukám, že jsi použil tutorial odtud :

    Tutoriál – užívání hodin reálného času DS1307 a DS3231 s Arduinem


    Je to v pořádku, člověk se musí učit na něčem vyzkoušeném. Na mě je to zbytečně komplikované. Doporučoval bych použít tuto knihovnu + exampl:
    https://github.com/JChristensen/DS3232RTC/blob/master/examples/TimeRTC/TimeRTC.ino
    Ten kod se ti zpřehlední a bude pro tebe možná srozumitelnější. k jednotlivým informacím se dostáváš pomocí předdefinovaných funkcím. Např pro aktuální minutu použiješ :
    int AktualniMinuta = minute();
    Knihovna používá kombinaci sznchronizovaného času z RTC +knihovnu arduina Time pro přístup k aktuálnímu času.

    To s odopjením modulu od arduina: možná bych zkusil odpojit baterii a dát tam jinou.

    Pro nastavení zapnutí/vypnutí bych tě odkázal na forum, kde jsem něco podobného už řešil:
    http://duinozone.cz/index.php?topic=611.0

    #6455
    rob.brno
    Účastník

    Nebo můžeš použít knihovnu time, která interpretuje čas a datum jako jedno číslo typu long a udává počet sekund tuším od 1.1.1970 0:0:0
    Má v sobě i funkce na převod z tohoto formátu na datum a čas i nazpět. Porovnával bys pak vlastně jen dvě long čísla s „vymaskovanýma“ vteřinama nebo i minutama.

    #6474
    posjirka
    Účastník

    ve výsledku, napiš nám co přesně má tvůj program dělat a podíváme se na to, nebo tě aspon nasměrujeme. někdy je vhodné použít podmínku „if“ pro přesný čas, nekdy pro časový usek …
    možná ti trochu pomůžu příspěvkem z trochu jiného tématu, ale výsledk je podobný.
    http://arduino.sk/viewtopic.php?f=4&t=152&sid=48998740df66b243127485c0f35cd739

    případně tady máš příklad budíku:
    http://arduino.sk/viewtopic.php?f=3&t=209&sid=48998740df66b243127485c0f35cd739

Aktuálně je na stránce zobrazeno 6 příspěvků - 1. až 6. (celkem z 6)
  • Pro reakci na toto téma se musíte přihlásit.