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