duinozone.cz - Arduino a Raspberry fórum

Autor Téma: Ardunino - jako ukazatel fazi mesice  (Přečteno 2060 krát)

Offline Martin

  • Bastlíř začátečník
  • *
  • Příspěvků: 8
Ardunino - jako ukazatel fazi mesice
« kdy: Říjen 28, 2015, 08:35:37 dopoledne »
// ja jsem zkousel  tohle to ale nejni to moc dobry,tolerance jeden den apod. chtelo by to nejakej presnejsi vzorec na vypocet od  "nekoho" kdo se
// vtom vyzna :) a na internetu jsem nic nenasel


// mesic1.ino prepsano z php , 4 zluty diody

Kód: [Vybrat]
#include <Wire.h>
#include <DS1307.h>

int rtc[7];
int year, month, day;
int lunar_phase, faze;

float days_y, days_m, julian, phase;
int led_2 = 2;
int led_3 = 3;
int led_4 = 4;
int led_5 = 5;

void setup()
{
  Serial.begin(9600);
  pinMode(led_2, OUTPUT);
  pinMode(led_3, OUTPUT);
  pinMode(led_4, OUTPUT);
  pinMode(led_5, OUTPUT);
}
  /*
   rtc[0] - vteřiny
   rtc[1] - minuty
   rtc[2] - hodiny
   rtc[3] - den v týdnu
   rtc[4] - den v měsíci
   rtc[5] - měsíc
   rtc[6] - rok
   */
void loop()
{
  RTC.get(rtc,true); 
  char cas[9];
  day = rtc[4];
  // for (day = 1; day <= 30 ; day++){ // pro testovani
  Serial.print(day);
  Serial.print("/");
  month = rtc[5];
  Serial.print(month);
  Serial.print("/");
  year = rtc[6];
  // year = 2014;
  Serial.print(year);
  Serial.print(" faze ");

  if (month < 4)
  {
    year = year - 1;
    month = month + 12;
  }
  days_y = 365.25 * year;
  days_m = 30.42 * month;
  julian = days_y + days_m + day - 694039.09;
  julian = julian / 29.53;
  phase = (int)julian;
  julian = julian - phase;
  phase = round(julian * 8 + 0.5);
  if ( phase == 8 )
  {
    phase = 0;
  }

  faze = (int(phase));
  Serial.print(faze);
  Serial.print(" ");

  switch(faze)
  {
    case 0:
      Serial.println("Nov");
      digitalWrite(led_2, LOW);
      digitalWrite(led_3, LOW);
      digitalWrite(led_4, LOW);
      digitalWrite(led_5, LOW);
      break;
     
    case 1:
      Serial.println("Dorustajici srpek");
      digitalWrite(led_2, HIGH);
      digitalWrite(led_3, LOW);
      digitalWrite(led_4, LOW);
      digitalWrite(led_5, LOW);
      break;
     
    case 2:
      Serial.println("Prvni ctvrt");
      digitalWrite(led_2, HIGH);
      digitalWrite(led_3, HIGH);
      digitalWrite(led_4, LOW);
      digitalWrite(led_5, LOW);
      break;
     
    case 3:
      Serial.println("Dorustajici mesic");
      digitalWrite(led_2, HIGH);
      digitalWrite(led_3, HIGH);
      digitalWrite(led_4, HIGH);
      digitalWrite(led_5, LOW);
      break;
     
    case 4:
      Serial.println("Uplnek");
      digitalWrite(led_2, HIGH);
      digitalWrite(led_3, HIGH);
      digitalWrite(led_4, HIGH);
      digitalWrite(led_5, HIGH);
      break;
     
    case 5:
      Serial.println("Ubyvajici mesic");
      digitalWrite(led_2, LOW);
      digitalWrite(led_3, HIGH);
      digitalWrite(led_4, HIGH);
      digitalWrite(led_5, HIGH);
      break;
     
    case 6:
      Serial.println("Posledni ctvrt");
      digitalWrite(led_2, LOW);
      digitalWrite(led_3, LOW);
      digitalWrite(led_4, HIGH);
      digitalWrite(led_5, HIGH);
      break;
     
    case 7:
      Serial.println("Ubyvajici srpek");
      digitalWrite(led_2, LOW);
      digitalWrite(led_3, LOW);
      digitalWrite(led_4, LOW);
      digitalWrite(led_5, HIGH);
      break;
  }
  delay(600 * 1000);
  // }
}
« Poslední změna: Září 12, 2016, 00:28:00 dopoledne od Yenda »

Offline astromik

  • Pokročilý bastlíř
  • ***
  • Příspěvků: 115
Re:Ardunino - jako ukazatel fazi mesice
« Odpověď #1 kdy: Prosinec 09, 2015, 17:04:12 odpoledne »
Hlavní problém je v tom, že se Měsíc kolem Země pohybuje po elipse, takže nějakou dobu zrychluje a pak zase zpomaluje (viz Keplerovy zákony).
Pro pozorovatele na Zemi tak není každá část fáze stejně dlouhá. Například doba mezi první čtvrtí a úplňkem může být delší, než doba mezi úplňkem a poslední čtvrtí.

Výpočty skutečných fází jsou hodně složité. Počítá se tam i s polohou Slunce.
Na svých stránkách používám toto:

http://astromik.mzf.cz/staryweb/mes-vypocty/mes-akt.php

Přiznám se, že to sám vůbec nechápu. Taky jsem to někde opsal. Funguje to ale docela přesně.

 


Offline Martin

  • Bastlíř začátečník
  • *
  • Příspěvků: 8
Re:Ardunino - jako ukazatel fazi mesice
« Odpověď #2 kdy: Prosinec 26, 2015, 16:41:41 odpoledne »

Hele dekuju urcite se na to podivam, ja sem mel prave asi 3 programy a kazdej ukazoval neco jinyho

Offline astromik

  • Pokročilý bastlíř
  • ***
  • Příspěvků: 115
Re:Ardunino - jako ukazatel fazi mesice
« Odpověď #3 kdy: Prosinec 28, 2015, 18:48:19 odpoledne »
Napadla mě ještě taková věc - nebylo by v tomto případě lepší si ty přesné časy fází vypočítat někde mimo (třeba na 30 let dopředu) a ty výsledky uložit někam do paměti?
V Arduinu by pak byl jen jednoduchý program, který by porovnával aktuální čas v RTC s hodnotami v paměti. A podle toho, mezi kterými záznamy by se aktuální čas nacházel, rozsvěcovaly by se příslušné LED.

Tady je takový jednoduchý nástřel bez obsluhy RTC obvodu a LED, ze kterého by mělo být jasné, co jsem měl na mysli (příklad je připravený jen pro rok 2016, ale dat se tam vejde mnohem víc - desítky let).
Data všech fází Měsíce až do roku 2050 jsou tady ( http://www.astromik.org/forum/faze.xls ). Stačí nakopírovat ten poslední sloupec z Excelu do zdrojáku a upravit celkový počet záznamů ve smyčce FOR.
POZOR, časy jsou v UTC, takže by RTC obvod měl být také nastaven na UTC. Jinak by bylo třeba ještě složitě přepočítávat UTC na SEČ a SELČ.

Kód: [Vybrat]

#include <avr/pgmspace.h>  // dulezite kvuli ulozeni casu jednotlivych fazi do FLASH pameti, misto do RAM


 // Zaznamy z Excelu s casy jednotlivych fazi Mesice od zacatku roku 2016 az do ...... (podle dostupne FLASH pameti)
 // Ukladaji se do PROGMEM (FLASH), takze nezabiraji zadny prostor v RAM
 // Cislo udava pocet minut od pulnoci 1.1.2016
 // Kvuli spravnemu indexovani je nutne, aby prvni zaznam (zaznam s indexem 0) byl "Last Quarter"

const PROGMEM  long cas_faze[] = {
  1770,     //   2016 Jan 02 05:30 (UTC)  - Last Quarter
  13050,    //   2016 Jan 10 01:30 (UTC)  - New Moon
  23006,    //   2016 Jan 16 23:26 (UTC)  - First Quarter
  33226,    //   2016 Jan 24 01:46 (UTC)  - Full Moon
  44848,    //   2016 Feb 01 03:28 (UTC)  - Last Quarter
  55599,    //   2016 Feb 08 14:39 (UTC)  - New Moon
  65266,    //   2016 Feb 15 07:46 (UTC)  - First Quarter
  75980,    //   2016 Feb 22 18:20 (UTC)  - Full Moon
  87791,    //   2016 Mar 01 23:11 (UTC)  - Last Quarter
  98034,    //   2016 Mar 09 01:54 (UTC)  - New Moon
  107583,   //   2016 Mar 15 17:03 (UTC)  - First Quarter
  118801,   //   2016 Mar 23 12:01 (UTC)  - Full Moon
  130517,   //   2016 Mar 31 15:17 (UTC)  - Last Quarter
  140364,   //   2016 Apr 07 11:24 (UTC)  - New Moon
  149999,   //   2016 Apr 14 03:59 (UTC)  - First Quarter
  161604,   //   2016 Apr 22 05:24 (UTC)  - Full Moon
  173009,   //   2016 Apr 30 03:29 (UTC)  - Last Quarter
  182609,   //   2016 May 06 19:29 (UTC)  - New Moon
  192542,   //   2016 May 13 17:02 (UTC)  - First Quarter
  204314,   //   2016 May 21 21:14 (UTC)  - Full Moon
  215292,   //   2016 May 29 12:12 (UTC)  - Last Quarter
  224820,   //   2016 Jun 05 03:00 (UTC)  - New Moon
  235210,   //   2016 Jun 12 08:10 (UTC)  - First Quarter
  246902,   //   2016 Jun 20 11:02 (UTC)  - Full Moon
  257419,   //   2016 Jun 27 18:19 (UTC)  - Last Quarter
  267061,   //   2016 Jul 04 11:01 (UTC)  - New Moon
  277972,   //   2016 Jul 12 00:52 (UTC)  - First Quarter
  289376,   //   2016 Jul 19 22:56 (UTC)  - Full Moon
  299460,   //   2016 Jul 26 23:00 (UTC)  - Last Quarter
  309404,   //   2016 Aug 02 20:44 (UTC)  - New Moon
  320781,   //   2016 Aug 10 18:21 (UTC)  - First Quarter
  331766,   //   2016 Aug 18 09:26 (UTC)  - Full Moon
  341501,   //   2016 Aug 25 03:41 (UTC)  - Last Quarter
  351903,   //   2016 Sep 01 09:03 (UTC)  - New Moon
  363589,   //   2016 Sep 09 11:49 (UTC)  - First Quarter
  374105,   //   2016 Sep 16 19:05 (UTC)  - Full Moon
  383636,   //   2016 Sep 23 09:56 (UTC)  - Last Quarter
  394571,   //   2016 Oct 01 00:11 (UTC)  - New Moon
  406353,   //   2016 Oct 09 04:33 (UTC)  - First Quarter
  416423,   //   2016 Oct 16 04:23 (UTC)  - Full Moon
  425954,   //   2016 Oct 22 19:14 (UTC)  - Last Quarter
  437378,   //   2016 Oct 30 17:38 (UTC)  - New Moon
  449031,   //   2016 Nov 07 19:51 (UTC)  - First Quarter
  458752,   //   2016 Nov 14 13:52 (UTC)  - Full Moon
  468513,   //   2016 Nov 21 08:33 (UTC)  - Last Quarter
  480258,   //   2016 Nov 29 12:18 (UTC)  - New Moon
  491583,   //   2016 Dec 07 09:03 (UTC)  - First Quarter
  501125,   //   2016 Dec 14 00:05 (UTC)  - Full Moon
  511316,   //   2016 Dec 21 01:56 (UTC)  - Last Quarter
  523133,   //   2016 Dec 29 06:53 (UTC)  - New Moon
  533987,   //   2017 Jan 05 19:47 (UTC)  - First Quarter
  };


void setup()
  {
    Serial.begin(9600);
  }   


void loop()
  {
   byte typ_faze;  // jeden ze ctyr typu Mesicni faze (posledni ctvrt, nov, prvni ctvrt , uplnek)

//===============
    // tady je treba zjistit z RTC aktualni cas a prepocitat ho na pocet minut, ktere uz uplynuly od pulnoci 1.1.2016
    long cas_v_minutach = 50000;       // pro testy to tady nastavuju rucne
//===============

   for (int i = 0; i < 51; i++)  // postupne se prochazi vsechny hodnoty casu v poli (51 je pocet vsech zaznamu v poli)
     {

       long cas_z_FLASH = pgm_read_dword(cas_faze + i); // pomoci PROGMEM se z FLASH pameti nacte ulozena hodnota z pole s indexem [i]
       
       if (cas_z_FLASH == cas_v_minutach) // Pokud je aktualni cas (v RTC) stejny, jako nektera hodnota v poli, znamena to, ze prave nastala nektera ze 4 fazi
                                               // tenhle stav bude ale trvat pouze 1 minutu
         {
           typ_faze = i % 4;  // v datech se pravidelne stridaji posledni ctvrt, nov, prvni ctvrt a uplnek

           if (typ_faze == 0) Serial.println ("Prave je posledni ctvrt.");
           if (typ_faze == 1) Serial.println ("Prave je nov.");
           if (typ_faze == 2) Serial.println ("Prave je prvni ctvrt.");
           if (typ_faze == 3) Serial.println ("Prave je uplnek.");
           break;  // predcasne ukonceni smycky for
         } 

       
       if (cas_z_FLASH > cas_v_minutach) // nalezeni nejblizsiho pristiho casu, kdy nastane nejaka faze Mesice
         {
           typ_faze = i % 4;  // v datech se pravidelne stridaji posledni ctvrt, nov, prvni ctvrt a uplnek

           if (typ_faze == 0) Serial.println ("Nejblizsi pristi faze bude posledni ctvrt - ted Mesic couva z uplnku.");
           if (typ_faze == 1) Serial.println ("Nejblizsi pristi faze bude nov - ted Mesic couva z posledni ctvrti.");
           if (typ_faze == 2) Serial.println ("Nejblizsi pristi faze bude prvni ctvrt - ted Mesic dorusta z novu.");
           if (typ_faze == 3) Serial.println ("Nejblizsi pristi faze bude uplnek - ted Mesic dorusta z prvni ctvrti.");
                       
           Serial.print ("Tato faze nastane za ");
           Serial.print ((cas_z_FLASH - cas_v_minutach) / 60.0);
           Serial.println (" hodin.\n");
           
           break;   // predcasne ukonceni smycky for
         } 
     }

   delay(60000);  // minutu se nebude nic delat
 
 
  }




« Poslední změna: Prosinec 28, 2015, 18:57:24 odpoledne od astromik »

Offline astromik

  • Pokročilý bastlíř
  • ***
  • Příspěvků: 115
Re:Ardunino - jako ukazatel fazi mesice
« Odpověď #4 kdy: Leden 23, 2016, 18:15:41 odpoledne »
Tak jak jsi pokročil s tím ukazatelem fází Měsíce?

Já jsem se do toho taky pustil a mám HOTOVO!

Zkusil jsem to tím mým způsobem - bez matematického počítání, pouze porovnáváním časů v připravené "databázi" měsíčních fází.

Vylepšil jsem to na 8 LED pro zobrazení fáze.
Taky jsem přidal 2 LED na zobrazení informace o zatmění Měsíce (rozeznává to 3 druhy zatmění - polostínové, částečné a úplné).
Dál jsem podobným způsobem přidělal i signalizaci zatmění Slunce (taky to rozeznává 3 druhy zatmění - pod 15%, mezi 15 a 65% a nad 65%)

Nastavování datumu a času v RTC je prováděno přes USB sériovou linku (pomocí PC).

Zatmění Měsíce se zobrazuje od okamžiku první čtvrti až do jedné hodiny po úplňku.
Podobně se zatmění Slunce zobrazuje od okamžiku poslední čtvrti až do jedné hodiny po novu. 

Přesné fáze (nov, 1.čtvrť, úplněk a poslední čtvrť) se zobrazují pouze +/- 30 minut od času, kdy k té fázi dojde.
Zbylé časy "mezifází" jsou matematicky přepočítávány. 


Zdroják je tady:
  http://www.astromik.org/raspi/mesic/mesic.ino


Do excelovské tabulky s časy jednotlivých fází Měsíce jsem přidal i ta zatmění (platí jen pro ČR):
  http://www.astromik.org/raspi/mesic/faze+zatmeni.xls

A pro pochopení trochu složitějšího způsobu rozdělení Měsíce na 8 oblastí snad pomůže tenhle dokument:
  http://www.astromik.org/raspi/mesic/useky.xls