archive code for AstroClock
This commit is contained in:
		
							parent
							
								
									06f32aea4e
								
							
						
					
					
						commit
						2f6b0e2d12
					
				
							
								
								
									
										316
									
								
								Firmware/Astroclock.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										316
									
								
								Firmware/Astroclock.ino
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,316 @@
 | 
				
			|||||||
 | 
					#include <Arduino.h>
 | 
				
			||||||
 | 
					#include <TM1637Display.h>
 | 
				
			||||||
 | 
					#include <TinyGPS++.h>
 | 
				
			||||||
 | 
					#include <SoftwareSerial.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//display pins
 | 
				
			||||||
 | 
					#define CLK 8
 | 
				
			||||||
 | 
					#define DIO 9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//varibles to calculate LST
 | 
				
			||||||
 | 
					double M,Y,D,MN,H,S,A,B;
 | 
				
			||||||
 | 
					double LST_hours,LST_degrees;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//define GPS pins and The serial connection to the GPS device
 | 
				
			||||||
 | 
					static const int RXPin = 3, TXPin = 2;
 | 
				
			||||||
 | 
					static const uint32_t GPSBaud = 9600;
 | 
				
			||||||
 | 
					TinyGPSPlus gps;
 | 
				
			||||||
 | 
					SoftwareSerial ss(RXPin, TXPin);
 | 
				
			||||||
 | 
					int gpsOld = gps.time.minute();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//define 7-digit display pins
 | 
				
			||||||
 | 
					TM1637Display display(CLK, DIO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------8x8 matrix display--------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int INTENSITYMIN = 0; // minimum brightness, valid range [0,15]
 | 
				
			||||||
 | 
					int INTENSITYMAX = 8; // maximum brightness, valid range [0,15]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int DIN_PIN = 4;      // data in pin
 | 
				
			||||||
 | 
					int CS_PIN = 5;       // load (CS) pin
 | 
				
			||||||
 | 
					int CLK_PIN = 6;      // clock pin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MAX7219 registers
 | 
				
			||||||
 | 
					byte MAXREG_DECODEMODE = 0x09;
 | 
				
			||||||
 | 
					byte MAXREG_INTENSITY  = 0x0a;
 | 
				
			||||||
 | 
					byte MAXREG_SCANLIMIT  = 0x0b;
 | 
				
			||||||
 | 
					byte MAXREG_SHUTDOWN   = 0x0c;
 | 
				
			||||||
 | 
					byte MAXREG_DISPTEST   = 0x0f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//----------------------Moon phases--------------------------
 | 
				
			||||||
 | 
					unsigned char fullMoon[] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  B00111100,
 | 
				
			||||||
 | 
					  B01111110,
 | 
				
			||||||
 | 
					  B11111111,
 | 
				
			||||||
 | 
					  B11111111,
 | 
				
			||||||
 | 
					  B11111111,
 | 
				
			||||||
 | 
					  B11111111,
 | 
				
			||||||
 | 
					  B01111110,
 | 
				
			||||||
 | 
					  B00111100
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const unsigned char newMoon[] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  B00111100,
 | 
				
			||||||
 | 
					  B01000010,
 | 
				
			||||||
 | 
					  B10000001,
 | 
				
			||||||
 | 
					  B10000001,
 | 
				
			||||||
 | 
					  B10000001,
 | 
				
			||||||
 | 
					  B10000001,
 | 
				
			||||||
 | 
					  B01000010,
 | 
				
			||||||
 | 
					  B00111100
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const unsigned char firstQuarter[] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  B00001100,
 | 
				
			||||||
 | 
					  B00001110,
 | 
				
			||||||
 | 
					  B00001111,
 | 
				
			||||||
 | 
					  B00001111,
 | 
				
			||||||
 | 
					  B00001111,
 | 
				
			||||||
 | 
					  B00001111,
 | 
				
			||||||
 | 
					  B00001110,
 | 
				
			||||||
 | 
					  B00001100
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const unsigned char thirdQuarter[] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  B00110000,
 | 
				
			||||||
 | 
					  B01110000,
 | 
				
			||||||
 | 
					  B11110000,
 | 
				
			||||||
 | 
					  B11110000,
 | 
				
			||||||
 | 
					  B11110000,
 | 
				
			||||||
 | 
					  B11110000,
 | 
				
			||||||
 | 
					  B01110000,
 | 
				
			||||||
 | 
					  B00110000
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const unsigned char waningCrescent[] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  B00111100,
 | 
				
			||||||
 | 
					  B01110000,
 | 
				
			||||||
 | 
					  B11100000,
 | 
				
			||||||
 | 
					  B11100000,
 | 
				
			||||||
 | 
					  B11100000,
 | 
				
			||||||
 | 
					  B11100000,
 | 
				
			||||||
 | 
					  B01110000,
 | 
				
			||||||
 | 
					  B00111100
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const unsigned char waxingCrescent[] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  B00111100,
 | 
				
			||||||
 | 
					  B00001110,
 | 
				
			||||||
 | 
					  B00000111,
 | 
				
			||||||
 | 
					  B00000111,
 | 
				
			||||||
 | 
					  B00000111,
 | 
				
			||||||
 | 
					  B00000111,
 | 
				
			||||||
 | 
					  B00001110,
 | 
				
			||||||
 | 
					  B00111100
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned char waxingGibbous[] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  B00111100,
 | 
				
			||||||
 | 
					  B01011110,
 | 
				
			||||||
 | 
					  B10111111,
 | 
				
			||||||
 | 
					  B10111111,
 | 
				
			||||||
 | 
					  B10111111,
 | 
				
			||||||
 | 
					  B10111111,
 | 
				
			||||||
 | 
					  B01011110,
 | 
				
			||||||
 | 
					  B00111100
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned char waningGibbous[] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  B00111100,
 | 
				
			||||||
 | 
					  B01111010,
 | 
				
			||||||
 | 
					  B11111101,
 | 
				
			||||||
 | 
					  B11111101,
 | 
				
			||||||
 | 
					  B11111101,
 | 
				
			||||||
 | 
					  B11111101,
 | 
				
			||||||
 | 
					  B01111010,
 | 
				
			||||||
 | 
					  B00111100
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------
 | 
				
			||||||
 | 
					void setup() {
 | 
				
			||||||
 | 
					  Serial.begin(115200); //Serial communication
 | 
				
			||||||
 | 
					  ss.begin(GPSBaud); //Serial communication for GPS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pinMode(DIN_PIN, OUTPUT);
 | 
				
			||||||
 | 
					  pinMode(CLK_PIN, OUTPUT);
 | 
				
			||||||
 | 
					  pinMode(CS_PIN, OUTPUT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // initialization of the MAX7219
 | 
				
			||||||
 | 
					  setRegistry(MAXREG_SCANLIMIT, 0x07);
 | 
				
			||||||
 | 
					  setRegistry(MAXREG_DECODEMODE, 0x00);  // using an led matrix (not digits)
 | 
				
			||||||
 | 
					  setRegistry(MAXREG_SHUTDOWN, 0x01);    // not in shutdown mode
 | 
				
			||||||
 | 
					  setRegistry(MAXREG_DISPTEST, 0x00);    // no display test
 | 
				
			||||||
 | 
					  setRegistry(MAXREG_INTENSITY, 0x0f & INTENSITYMAX);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void loop() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  smartDelay(0);
 | 
				
			||||||
 | 
					  display.setBrightness(0x0f);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  if(gps.time.minute()!=gpsOld){
 | 
				
			||||||
 | 
					    LST_time();
 | 
				
			||||||
 | 
					    int rHours =(int) LST_hours;
 | 
				
			||||||
 | 
					    int rMinutes = ((int)floor((LST_hours-rHours)*60));
 | 
				
			||||||
 | 
					    display.clear(); //reset display
 | 
				
			||||||
 | 
					    display.showNumberDecEx(((rHours*100)+rMinutes),0b01000000,true,4,0);
 | 
				
			||||||
 | 
					    int moonAge = ConwayMoon(gps.date.year(),gps.date.month(),gps.date.day());
 | 
				
			||||||
 | 
					    drawMoon(moonAge); //draw the moon to 8x8 display
 | 
				
			||||||
 | 
					    gpsOld = gps.time.minute();
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    //Serial print for debuging
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    Serial.print("UTC: ");
 | 
				
			||||||
 | 
					    Serial.print(gps.time.hour());
 | 
				
			||||||
 | 
					    Serial.print(":");
 | 
				
			||||||
 | 
					    Serial.println(gps.time.minute());
 | 
				
			||||||
 | 
					    Serial.print("Sidereal: ");
 | 
				
			||||||
 | 
					    Serial.println(LST_hours);
 | 
				
			||||||
 | 
					    Serial.print("Moon age: ");
 | 
				
			||||||
 | 
					    Serial.println(moonAge);
 | 
				
			||||||
 | 
					    */  
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//smart delay for GPS
 | 
				
			||||||
 | 
					static void smartDelay(unsigned long ms){
 | 
				
			||||||
 | 
					  unsigned long start = millis();
 | 
				
			||||||
 | 
					  do 
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    while (ss.available())
 | 
				
			||||||
 | 
					      gps.encode(ss.read());
 | 
				
			||||||
 | 
					  } while (millis() - start < ms);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void LST_time(){
 | 
				
			||||||
 | 
					    //Calculates local sidereal time based on this calculation,
 | 
				
			||||||
 | 
					    //http://www.stargazing.net/kepler/altaz.html 
 | 
				
			||||||
 | 
					    M = (double) gps.date.month();
 | 
				
			||||||
 | 
					    Y = (double) gps.date.year();
 | 
				
			||||||
 | 
					    D = (double) gps.date.day();
 | 
				
			||||||
 | 
					    MN = (double) gps.time.minute();
 | 
				
			||||||
 | 
					    H = (double) gps.time.hour();
 | 
				
			||||||
 | 
					    S = (double) gps.time.second();
 | 
				
			||||||
 | 
					    A = (double)(Y-2000)*365.242199;
 | 
				
			||||||
 | 
					    B = (double)(M-1)*30.4368499;
 | 
				
			||||||
 | 
					    double JDN2000=A+B+(D-1)+gps.time.hour()/24;
 | 
				
			||||||
 | 
					    double decimal_time = H+(MN/60)+(S/3600) ;
 | 
				
			||||||
 | 
					    double LST = 100.46 + 0.985647 * JDN2000 + gps.location.lng() + 15*decimal_time;
 | 
				
			||||||
 | 
					    LST_degrees = (LST-(floor(LST/360)*360));
 | 
				
			||||||
 | 
					    LST_hours = LST_degrees/15;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void setRegistry(byte reg, byte value){
 | 
				
			||||||
 | 
					  digitalWrite(CS_PIN, LOW);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  putByte(reg);   // specify register
 | 
				
			||||||
 | 
					  putByte(value); // send data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  digitalWrite(CS_PIN, LOW);
 | 
				
			||||||
 | 
					  digitalWrite(CS_PIN, HIGH);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void putByte(byte data){
 | 
				
			||||||
 | 
					  byte i = 8;
 | 
				
			||||||
 | 
					  byte mask;
 | 
				
			||||||
 | 
					  while (i > 0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    mask = 0x01 << (i - 1);        // get bitmask
 | 
				
			||||||
 | 
					    digitalWrite( CLK_PIN, LOW);   // tick
 | 
				
			||||||
 | 
					    if (data & mask)               // choose bit
 | 
				
			||||||
 | 
					      digitalWrite(DIN_PIN, HIGH); // send 1
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      digitalWrite(DIN_PIN, LOW);  // send 0
 | 
				
			||||||
 | 
					    digitalWrite(CLK_PIN, HIGH);   // tock
 | 
				
			||||||
 | 
					    --i;                           // move to lesser bit
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					int ConwayMoon(int cYear,int cMonth,int cDay){  
 | 
				
			||||||
 | 
					  int s;
 | 
				
			||||||
 | 
					  int yy;
 | 
				
			||||||
 | 
					  int d;
 | 
				
			||||||
 | 
					  s = cYear % 100;
 | 
				
			||||||
 | 
					  s = s % 19;
 | 
				
			||||||
 | 
					  if (s>9){ 
 | 
				
			||||||
 | 
					    s -= 19;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  s = ((s * 11) % 30) + cMonth + cDay;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (cMonth<3){
 | 
				
			||||||
 | 
					    s += 2;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  s = ((int)floor(s-7.8))%30;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(s<0){
 | 
				
			||||||
 | 
					    s = s+30;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					    return s;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					int drawMoon(int s){     
 | 
				
			||||||
 | 
					  //drawing the moon
 | 
				
			||||||
 | 
					  switch (s) {
 | 
				
			||||||
 | 
					    case 0: case 1: case 29:
 | 
				
			||||||
 | 
					      // New moon
 | 
				
			||||||
 | 
					      for (int i = 0; i < 8; i++){
 | 
				
			||||||
 | 
					       setRegistry(i+1,newMoon[i]);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case 2: case 3: case 4: case 5: case 6:
 | 
				
			||||||
 | 
					      // waxing crescent
 | 
				
			||||||
 | 
					      for (int i = 0; i < 8; i++){
 | 
				
			||||||
 | 
					       setRegistry(i+1,waxingCrescent[i]);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case 7: case 8:
 | 
				
			||||||
 | 
					      // first quarter
 | 
				
			||||||
 | 
					      for (int i = 0; i < 8; i++){
 | 
				
			||||||
 | 
					       setRegistry(i+1,firstQuarter[i]);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case 9: case 10: case 11: case 12: case 13:
 | 
				
			||||||
 | 
					      // waxing gibbous
 | 
				
			||||||
 | 
					      for (int i = 0; i < 8; i++){
 | 
				
			||||||
 | 
					       setRegistry(i+1,waxingGibbous[i]);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case 14: case 15: case 16:
 | 
				
			||||||
 | 
					      // full moon
 | 
				
			||||||
 | 
					      for (int i = 0; i < 8; i++){
 | 
				
			||||||
 | 
					       setRegistry(i+1,fullMoon[i]);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case 17: case 18: case 19: case 20: case 21:
 | 
				
			||||||
 | 
					      // waning gibbous
 | 
				
			||||||
 | 
					      for (int i = 0; i < 8; i++){
 | 
				
			||||||
 | 
					       setRegistry(i+1,waningGibbous[i]);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case 22: case 23:
 | 
				
			||||||
 | 
					      // third quarter
 | 
				
			||||||
 | 
					      for (int i = 0; i < 8; i++){
 | 
				
			||||||
 | 
					       setRegistry(i+1,thirdQuarter[i]);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case 24: case 25: case 26: case 27: case 28:
 | 
				
			||||||
 | 
					      // waning crescent
 | 
				
			||||||
 | 
					      for (int i = 0; i < 8; i++){
 | 
				
			||||||
 | 
					       setRegistry(i+1,waningCrescent[i]);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					      // empty moon
 | 
				
			||||||
 | 
					      break;    
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user