Podmínka IF s D3231
Úvodní stránka › Fórum › Hardware › Arduino › Podmínka IF s D3231
Označeno štítky: D3231
- Toto téma obsahuje celkem 5 odpovědí. Do diskuze (3 diskutující) se naposledy zapojil uživatel posjirka a poslední změna proběhla před 8 roky a 6 měsíci.
-
AutorPříspěvky
-
19.3.2016 v 12:55 #6384LMXLukeÚč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? 🙂
19.3.2016 v 18:37 #6386posjirkaÚčastníktak 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.
20.3.2016 v 15:20 #6394LMXLukeÚčastníkTo 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 }
20.3.2016 v 19:44 #6411posjirkaÚčastníkKouká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.025.3.2016 v 14:10 #6455rob.brnoÚčastníkNebo 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.27.3.2016 v 23:21 #6474posjirkaÚčastníkve 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=48998740df66b243127485c0f35cd739případně tady máš příklad budíku:
http://arduino.sk/viewtopic.php?f=3&t=209&sid=48998740df66b243127485c0f35cd739 -
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.