Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   381 / 839
(#) mateatek válasza tbarath hozzászólására (») Szept 15, 2017 /
 
Mire leírtad ezt a hozzászólást, már rájöttem én is. Magyarán az enyém 255-tel azért nem jó, mert 65280-nál már túlcsordul az "egész" számlálója. Pedig illik egy teljes integer típusú változót beleírni a 2 byte-ba. 255-tel ez nem teljesül. 256-tal igen. De akkor nem csak az osztásban kell a 255-öt 256-ra módosítani, hanem a modulonál is.
Bocs, de az előbbi gyors "félválaszod" kissé megvezetett.
(#) tbarath válasza mateatek hozzászólására (») Szept 15, 2017 /
 
Igen, bocs, siettem és nem fejtettem ki bőven először.
De igen, a 255-tel osztás nem jó, mert lassú ("aritmetikai" osztás, nem bitshift), és csökkenti a memória kihasználható méretét (ami nem feltétlenül baj).

Szóval ha byte-okra szedsz szét nagyobb egész értéket, akkor 256 (2^8)-tal kell osztanod, illetve annak 256*256-tal, 256*256*256-tal (2^16, 2^24), stb.
(#) Kovidivi válasza mateatek hozzászólására (») Szept 16, 2017 /
 
Alsó: valtozo&0xff, felső: valtozo&0xff00, ezt el kell tolni jobbra 8-cal, és akkor 8biten elfér: (valtozo&0xff00)>>8. Nem kell gondolkodni, hogy 255 vagy 256.
A hozzászólás módosítva: Szept 16, 2017
(#) Kari55 hozzászólása Szept 16, 2017 /
 
Sziasztok.
Összeállítottam ezt az kapcsolást, és az lenne a kérdésem, hogy mit kellene átírni/hozzáírni az alábbi programban, a téli/nyári időszámítás automatikus átállítása érdekében?

A programozáshoz nagyon kezdő vagyok.

Köszönöm előre is.

  1. // include the library code:
  2. #include <LiquidCrystal.h>
  3. #include <Wire.h>
  4. #define DS3231_I2C_ADDRESS 104
  5. // initialize the library with the numbers of the interface pins
  6. LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
  7. // variables
  8. int  seconds, minutes, hours, day, date, month, year;
  9. String weekDay;
  10. void setup()
  11. {
  12.   Wire.begin();
  13.   // set up the LCD's number of columns and rows:
  14.   lcd.begin(16, 2);
  15.   // to set hour and date use the following steps
  16.   // 1.- Uncomment the instruction
  17.   // 2.- Set time and date
  18.   // 3.- Upload the sketch
  19.   // 4.- Comment and upload again to prevent a reset time
  20.   //setDate(year (0-99), month (1-12), date (0-31), day (1-7), hours (0-23), minutes (0-59), seconds (0-59))
  21.   //setDate(17, 8, 27, 7, 9, 23, 00);
  22. }
  23.  
  24. void loop()
  25. {
  26.   lcd.clear();
  27.   // get date from DS3231
  28.   getDate();
  29.   // display time and date
  30.   lcd.setCursor(1, 1);
  31.   lcd.print(weekDay);
  32.   lcd.print(" ");
  33.   lcd.print("20");
  34.   lcd.print(year);
  35.   lcd.print("-");
  36.   if (month < 10)
  37.     lcd.print("0");
  38.   lcd.print(month);
  39.   lcd.print("-");
  40.   if (date < 10)
  41.     lcd.print("0");
  42.   lcd.print(date);
  43.   lcd.setCursor(4, 0);
  44.   lcd.print(hours);
  45.   lcd.print(":");
  46.   if (minutes < 10)
  47.     lcd.print("0");
  48.   lcd.print(minutes);
  49.   lcd.print(":");
  50.   if (seconds < 10)
  51.     lcd.print("0");
  52.   lcd.print(seconds);
  53.   delay(1000);
  54.  
  55. }
  56.  
  57. void getDate()
  58. {
  59.   // Send request to DS3231 to receive the date
  60.   Wire.beginTransmission(DS3231_I2C_ADDRESS);
  61.   Wire.write(0x00);  // start at register 00h (seconds)
  62.   Wire.endTransmission();
  63.   Wire.requestFrom(DS3231_I2C_ADDRESS, 7);   // Request 7 bytes (00h - 006h)
  64.  
  65.   while (Wire.available())
  66.   {
  67.     seconds = Wire.read();
  68.     minutes = Wire.read();
  69.     hours = Wire.read();
  70.     day = Wire.read();
  71.     date = Wire.read();
  72.     month = Wire.read();
  73.     year = Wire.read();
  74.  
  75.     // convert BCD to decimal
  76.     seconds = (((seconds >> 4) * 10) + (seconds & B00001111));
  77.     minutes = (((minutes >> 4) * 10) + (minutes & B00001111));
  78.     hours = ((((hours & B00110000) >> 4) * 10) + (hours & B00001111));
  79.     day = (day & B00000111);
  80.     month = ((((month & B00010000) >> 4) * 10) + (month & B00001111));
  81.     date = ((((date & B00110000) >> 4) * 10) + (date & B00001111));
  82.     year = (((year >> 4) * 10) + (year & B00001111));
  83.   }
  84.   switch (day)  {
  85.     case 1:
  86.       weekDay = "H";
  87.       break;
  88.     case 2:
  89.       weekDay = "K";
  90.       break;
  91.     case 3:
  92.       weekDay = "Sze";
  93.       break;
  94.     case 4:
  95.       weekDay = "Cs";
  96.       break;
  97.     case 5:
  98.       weekDay = "P";
  99.       break;
  100.     case 6:
  101.       weekDay = "Szo";
  102.       break;
  103.     case 7:
  104.       weekDay = "Vas";
  105.       break;
  106.  
  107.     default: break;
  108.   }
  109.  
  110.  
  111. }
  112.  
  113. void setDate(byte seconds, byte minutes, byte hours, byte day, byte date, byte month, byte year)
  114. {
  115.   // convert DEC to BCD
  116.   seconds = (seconds % 10) + ((seconds / 10) << 4);
  117.   minutes = (minutes % 10) + ((minutes / 10) << 4);
  118.   hours = (hours % 10) + ((hours / 10) << 4);
  119.   date = (date % 10) + ((date / 10) << 4);
  120.   month = (month % 10) + ((month / 10) << 4);
  121.   year = (year % 10) + ((year / 10) << 4);
  122.  
  123.   Wire.beginTransmission(DS3231_I2C_ADDRESS);
  124.   Wire.write(0x00);
  125.   Wire.write(year);
  126.   Wire.write(month);
  127.   Wire.write(date);
  128.   Wire.write(day);
  129.   Wire.write(hours);
  130.   Wire.write(minutes);
  131.   Wire.write(seconds);
  132.   Wire.endTransmission();
  133.  
  134. }
(#) Bakman válasza Kari55 hozzászólására (») Szept 16, 2017 /
 
A programnyelvet nem ismerem, de annyit tudok mondani, hogy alapvetően sok dolgot. Első lépésként az évszám alapján meg kell határozni a nyári időszámítás kezdetét és végét. Ha az aktuális idő e kettő között van, akkor az aktuális időhöz hozzá kell adni egy órát. Ha a hozzáadással ugrik a nap, akkor ahhoz is. Ha a hozzáadással ugrik a hónap, akkor ahhoz is. Utóbbihoz azt is kell tudni, hogy hány nap van az adott hónapban.
(#) Kari55 válasza Bakman hozzászólására (») Szept 16, 2017 /
 
Ez ennyire bonyolult?
Azt hittem elég csak annyi, hogy ha a mounth >10 és a day > 31, akkor hour + 1 vagy -1.
Nagyvonalakban így gondoltam, buta fejjel

De úgy látom nem így működik.
(#) tbarath válasza Kari55 hozzászólására (») Szept 16, 2017 /
 
Tuti van olyan lib, ami kezeli. Keress rá az "arduino rtc daylight saving" kifejezésre
(#) Kari55 válasza tbarath hozzászólására (») Szept 16, 2017 /
 
Szia, köszi, már nézegetem/tanulmányozom a leírásokat.
(#) Bakman válasza Kari55 hozzászólására (») Szept 16, 2017 /
 
Gondold végig. Augusztus 31. 23:55. Ha itt hozzáadsz egy órát, pár dolog változik.
(#) Kari55 válasza Bakman hozzászólására (») Szept 16, 2017 /
 
Igen közbe találtam Ezt az oldalt, most tanulmányozom.
(#) kissi válasza Bakman hozzászólására (») Szept 16, 2017 /
 
Szia!

Most az volt a kérdés, hogy mikor kell az órát előre, ill. visszaállítani 1 órával ? Akkor nem kell hozzá ilyen bonyolult algoritmus... !
(#) tbarath válasza kissi hozzászólására (») Szept 16, 2017 /
 
Pedig de, ha algoritmikusan nézed, akkor ez ilyen...
(#) berkesandor hozzászólása Szept 17, 2017 /
 
Ezt a könyvtárat használom, arduino altatásra:
Bővebben: Link
Konkrétan ezt a parancssort:
  1. LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);


Sajnos nem jövök , rá mivel tudnám az arduinot, visszahozni az altatásból, hogy minden működjön rajta. Örülnék minden segítségnek.
(#) vargham válasza berkesandor hozzászólására (») Szept 17, 2017 /
 
> Sajnos nem jövök , rá mivel tudnám az arduinot, visszahozni az altatásból
Ha így küldöd el aludni, akkor 8 másodperc után felébred, és minden működik. Te milyen hibát tapasztalsz?
(#) berkesandor válasza vargham hozzászólására (») Szept 17, 2017 /
 
SIM800 interruptja szakítja meg az alvó módot. Ébredés után a soros kommunikáció nem működik rendesen, random karakterek jönnek a sim modultól.
(#) vargham válasza berkesandor hozzászólására (») Szept 17, 2017 /
 
Nekem eddig mindig működött a soros port ébresztés után.

Kérdések

1: Miért nem SLEEP_FOREVER-t használsz, ha interruptra akarsz ébredni?
2: A SIM800 hová van kötve? Hard vagy soft serial?
(#) Brian88 válasza Kari55 hozzászólására (») Szept 17, 2017 /
 
Szia

Szökőévre ez kell:

  1. day1 += (year1 - 1970) * 365; // days from 1970 to the whole past year
  2.     day1 += (year1 - 1969) >> 2;  // plus one day per leap year
  3.     day1 += daysInPrevMonths; // plus days for previous months this year
  4.     if (daysInPrevMonths >= 59  // if we are past February
  5.         && ((year1 & 3) == 0))  // and this is a leap year
  6.       day1 += 1;      // add one day
  7.     // Remove today, add hours, minutes and seconds this month
  8.     time = (((day1-1ul) * 24 + hour1) * 60 + minute1) * 60 + second1;


Téli/nyári időszámításra:
  1. boolean DST()
  2.     {
  3.         //January, february, and december are out.
  4.         if (month() < 3 || month() > 11) { return false; }
  5.         //April to October are in
  6.         if (month() > 3 && month() < 11) { return true; }
  7.         int previousSunday = day() - weekday();
  8.         //In march, we are DST if our previous sunday was on or after the 8th.
  9.         if (month() == 3) { return previousSunday >= 8; }
  10.         //In november we must be before the first sunday to be dst.
  11.         //That means the previous sunday must be before the 1st.
  12.         return previousSunday <= 0;
  13.     }
A hozzászólás módosítva: Szept 17, 2017
(#) kissi válasza tbarath hozzászólására (») Szept 17, 2017 /
 
Idézet:
„Első lépésként az évszám alapján meg kell határozni a nyári időszámítás kezdetét és végét.”

Például mi köze van a téli-nyári időszámításhoz az évszámnak ?
(#) berkesandor válasza vargham hozzászólására (») Szept 17, 2017 /
 
A loop-ban csak az altatás van, meg két változó figyelés, ezért használom a SLEEP_8S-t (persze nem biztos hogy jó), 8s alvás , utána vizsgálat.
SIM800 D4-D5 ről megy.
(#) Kari55 válasza Brian88 hozzászólására (») Szept 17, 2017 /
 
Szia, köszi
Ezt hova kell beírni a programba? a void setup részbe?(Téli/nyári időszámítás)
(#) tbarath válasza kissi hozzászólására (») Szept 17, 2017 /
 
Minden évben máskor kezdődik és máskor van vége. Tudom, hogy ez algoritmikus, de én inkább lefoglalnék 32 byte-ot ami azt tartalmazná, hogy idén és a következő 15 évben mikor állunk át és mikor vissza. (Igazából elég lenne a fele is ha jól emlékszek.)
RTC modulos témáról van szó, szóval a múltat tudni nem annyira fontos, a jövőre nézve pedig a 15 évvel bőven túllövöm bármilyen cucc élettartamát, amit egy ilyen hobbi cuccnál becsülni lehet.
(#) tbarath válasza Brian88 hozzászólására (») Szept 17, 2017 /
 
Mindkét algoritmus hibás.
A szökőévesnél nem veszi figyelembe, hogy minden 100-zal osztható év nem szökőév, de minden 400-al osztható mégis az. Mondjuk ez a következő 82 évben nem fog problémát jelenteni, szóval igazából lényegtelen.

A DST téma pedig sokféleképpen van kitalálva, itthon március utolsó vasárnapján 2 órakor állítjuk 1 órával előbbre, és október utolsó vasárnapján 3 órakor vissza 1 órával. A fenti DST() fv. nagyon nem így működik, mármint az EU-ban, mert lehet hogy az usákban jó (kivéve pár államot).
(#) kissi válasza tbarath hozzászólására (») Szept 17, 2017 /
 
Mit értesz azalatt, hogy minden évben máskor kezdődik és máskor van vége ? Mindig március utolsó vasárnapja a nyári időszámítás kezdete és október utolsó vasárnapja a télié ( az átállítás 2, ill. 3 óra hajnalban) !

szerk.: most látom, hogy ezt le is írtad Brian88 hozzászólására. Akkor mi a probléma, ezt kell megvalósítani ( azt kell meghatározni, hogy melyik az utolsó vasárnap, ez nem nagy ördöngősség) ?!!
A hozzászólás módosítva: Szept 17, 2017
(#) Bakman válasza kissi hozzászólására (») Szept 17, 2017 /
 
Azt érti ez alatt, hogy minden évben más-más dátumra esik az óraátállítás. Pl. január 5. nem mindig vasárnap.
(#) kissi válasza Bakman hozzászólására (») Szept 17, 2017 / 1
 
A január 5 nem is érdekel minket !
Azt kell megnézni, hogy melyik a megfelelő hónap utolsó vasárnapja: az, amelyik vasárnap után már nincs 7 nap a hónapból! Ez nem bonyolult !
(#) Kovidivi válasza kissi hozzászólására (») Szept 17, 2017 /
 
Határozd meg kérlek, hogy 2021. Május elseje milyen nap. Ez már komplikált. Nézni kell hozzá a szökőévet is, mert február 29-cel eltolódnak a napok. Ne írj ilyet, hogy nem bonyolult, ha nem is látod át a probléma nagyságát!
(#) tbarath válasza kissi hozzászólására (») Szept 17, 2017 /
 
Nem bonyolult, de nem is olyan egyszerű. Én tuti nem szórakoznék ezzel, ha lenne néhány szabad byte-om adatnak
(#) Bakman válasza kissi hozzászólására (») Szept 17, 2017 /
 
Oda van írva, példa. Példaként hoztam fel a dolgot hogy megértsd, nem fix dátumra esik az óraátállítás. Itt a remek alkalom arra, hogy megírd az algoritmust, páran biztosan kíváncsiak rá.
(#) tbarath válasza Kovidivi hozzászólására (») Szept 17, 2017 /
 
Ha van day of week függvényed, akkor egyszerű, nem csak a május 1, hanem az utolsó vasárnapos téma vizsgálata is. Ha nincs, akkor azt is meg kell írnod.
(#) kissi válasza Kovidivi hozzászólására (») Szept 17, 2017 /
 
Lehet, hogy nem vagyok képben, de akkor Te sem, mert én kifejezetten az óraállításra írtam, amit írtam ( direkt rákérdeztem, hogy ez-e a probléma!), ott meg nem érdekel, hogy 2021.május 1. milyen napra esik !
A hozzászólás módosítva: Szept 17, 2017
Következő: »»   381 / 839
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem