Created
October 1, 2012 16:26
-
-
Save anonymous/3812825 to your computer and use it in GitHub Desktop.
Real Time Clock and SD demo on Winode and Nanode
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This program exercises the MCP94710 Real Time Clock and the microSD card | |
// This Version to Run on Nanode RF or WiNode hardware | |
// It sets and reads the time and date back from the RTC | |
// It sets Alarm 1 and Alarm 2 on the RTC and acts on them accordingly | |
// It writes a 64 character message to the SRAM - which it pronts out on forst power up - and on every alarm | |
#include <SD.h> | |
#include <Wire.h> | |
#include <math.h> | |
static int payload; | |
int old; | |
int hours = 0 ; | |
int mins = 0 ; | |
int secs = 0 ; | |
unsigned long time_now = 0 ; | |
int alarm1; | |
int alarm2; | |
char RAM_message[64] = "The Quick Brown Foxy Leapt over the Lazy Dog whilst he snoozed"; | |
char out_string[64]; | |
//Set by default for the SD Card Library | |
//MOSI = Pin 11 | |
//MISO = Pin 12 | |
//SCLK = PIN 13 | |
//We always need to set the CS Pin | |
int CS_pin = 4; | |
//int pow_pin = 8; | |
void setup() | |
{ | |
Serial.begin(9600); | |
Wire.begin(); | |
pinMode(5, OUTPUT); | |
pinMode(6, OUTPUT); | |
Serial.print("Navitrino Lite V1.0 "); | |
print_message(); // print out the 64 Character messsage from NV SRAM | |
// Writing to SRAM from 0x20 to 0x5F | |
for (int i = 0; i<63; i++) | |
{ | |
WriteRTCByte(i+0x20,RAM_message[i]); // Write the message to SRAM | |
} | |
/* | |
WriteRTCByte(0,0); //STOP RTC | |
WriteRTCByte(1,0x11); //MINUTE=54 | |
WriteRTCByte(2,0x17); //HOUR=12 | |
WriteRTCByte(3,0x09); //DAY=1(MONDAY) AND VBAT=1 | |
WriteRTCByte(4,0x01); //DATE=01 | |
WriteRTCByte(5,0x10); //MONTH=10 | |
WriteRTCByte(6,0x12); //YEAR=12 | |
WriteRTCByte(0,0x80); //START RTC, SECOND=00 | |
delay(100); | |
*/ | |
set_alarm_1(); | |
WriteRTCByte(7,0x30); //Set both alarms active | |
Serial.println("RTC Initialised"); | |
get_time(); | |
Serial.print(" "); | |
print_date(); | |
Serial.println(); | |
Serial.println("Initializing Card"); | |
//CS Pin is an output | |
pinMode(CS_pin, OUTPUT); | |
if (!SD.begin(CS_pin)) | |
{ | |
Serial.println("Card Failure"); | |
return; | |
} | |
Serial.println("Card Ready"); | |
digitalWrite(5,HIGH); | |
digitalWrite(6,HIGH); | |
} | |
void loop() | |
{ | |
get_time(); | |
read_alarm_1(); | |
read_alarm_2(); | |
Serial.print(" "); | |
Serial.print(alarm1); | |
Serial.print(" "); | |
Serial.print(alarm2); | |
Serial.print(" "); | |
digitalWrite (5, !alarm1); | |
digitalWrite (6, !alarm1); // set the Red LED to show the alarm status | |
if (alarm1>>0) { alarm1_handler(); } | |
if (alarm2>>0) { WriteRTCByte(0x14,0x01); } // Cancel the alarm | |
int temp0 = analogRead(0); | |
int temp1 = analogRead(1); | |
int temp2 = analogRead(2); | |
int temp3 = analogRead(3); | |
String dataString = String(temp0) ; | |
// String dataString = String(temp0) + ", " + String(temp1) + ", " + String(temp2) + ", " + String(temp3); | |
// String dataString = String(temp0); | |
//Open a file to write to | |
//Only one file can be open at a time | |
digitalWrite(5,LOW); | |
File dataFile = SD.open("log1.txt", FILE_WRITE); | |
if (dataFile) | |
{ | |
dataFile.println(dataString); | |
dataFile.close(); | |
Serial.println(dataString); | |
} | |
else | |
{ | |
Serial.println("Couldn't open log file"); | |
} | |
digitalWrite(5,HIGH); | |
delay(5000); | |
} | |
//****************************************************************************************************** | |
// Misc Routines | |
unsigned char ReadRTCByte(const unsigned char adr){ | |
unsigned char data; | |
// Serial.print("*"); | |
Wire.beginTransmission(0x6f); | |
Wire.write(adr); | |
Wire.endTransmission(); | |
Wire.requestFrom(0x6f,1); | |
while (Wire.available()) data=Wire.read(); | |
return data; | |
} | |
void WriteRTCByte(const unsigned char adr, const unsigned char data){ | |
Wire.beginTransmission(0x6f); | |
Wire.write(adr); | |
Wire.write(data); | |
Wire.endTransmission(); | |
} | |
void DisplayRTCData(const unsigned char adr, const unsigned char validbits){ | |
unsigned char data; | |
data=ReadRTCByte(adr); | |
data=data & 0xff>>(8-validbits); | |
if (data<10) Serial.print("0"); //leading zero | |
Serial.print(data,HEX); | |
} | |
void get_time(){ | |
unsigned char data; | |
data = ReadRTCByte(2); | |
hours = (data & 0x0f) + 10 *( (data & 0x30)/16); | |
data = ReadRTCByte(1); | |
mins = (data & 0x0f) + 10 *( (data & 0x70)/16); | |
data = ReadRTCByte(0); | |
secs = (data & 0x0f) + 10 *( (data & 0x70)/16); | |
Serial.print(hours); | |
Serial.print(":"); | |
if (mins<10) Serial.print("0"); //leading zero | |
Serial.print(mins); | |
Serial.print(":"); | |
if (secs<10) Serial.print("0"); //leading zero | |
Serial.print(secs); | |
} | |
// Print out the RTC | |
void print_time(){ | |
DisplayRTCData(2,6); | |
Serial.print(":"); | |
DisplayRTCData(1,7); | |
Serial.print(":"); | |
DisplayRTCData(0,7); | |
Serial.print(" "); | |
} | |
void print_date(){ | |
DisplayRTCData(4,6); | |
Serial.print("/"); | |
DisplayRTCData(5,5); | |
Serial.print("/"); | |
Serial.print("20"); //year beginning with 20xx | |
DisplayRTCData(6,8); | |
} | |
void set_alarm_1() | |
{ | |
WriteRTCByte(0x0A,0x00); //SECS=00 | |
WriteRTCByte(0x0B,0x45); //MINUTE=45 | |
WriteRTCByte(0x0C,0x14); //HOUR=12 | |
WriteRTCByte(0x0D,0x01); //DAY=1(MONDAY) AND Match = seconds | |
WriteRTCByte(0x0E,0x01); //DATE=01 | |
WriteRTCByte(0x0F,0x10); //MONTH=10 | |
} | |
void set_alarm_2() | |
{ | |
WriteRTCByte(0x11,0x00); //SECS=00 | |
WriteRTCByte(0x12,0x43); //MINUTE=54 | |
WriteRTCByte(0x13,0x13); //HOUR=12 | |
WriteRTCByte(0x14,0x01); //DAY=1(MONDAY) AND Match = seconds | |
WriteRTCByte(0x15,0x01); //DATE=01 | |
WriteRTCByte(0x16,0x10); //MONTH=10 | |
} | |
void read_alarm_1() | |
{ | |
int data = ReadRTCByte(0x0D); | |
alarm1 = (data & 0x08); | |
} | |
void read_alarm_2() | |
{ | |
int data = ReadRTCByte(0x14); | |
alarm2 = (data & 0x08); | |
} | |
void alarm1_handler() { | |
WriteRTCByte(0x0D,0x01); // Clear the alarm flag | |
// Write the RAM message | |
for (int i = 0; i<=63; i++) | |
{ | |
int data=ReadRTCByte(i+0x20); | |
out_string[i] = data ; | |
} | |
Serial.print(out_string); // Print out the SRAM message | |
Serial.println(" "); | |
} // Cancel the alarm | |
void print_message() { | |
// Write the RAM message | |
for (int i = 0; i<=63; i++) | |
{ | |
int data=ReadRTCByte(i+0x20); | |
out_string[i] = data ; | |
} | |
Serial.print(out_string); // Print out the SRAM message | |
Serial.println(" "); | |
} | |
//********************************************************************************************************* | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment