#include <Arduino.h>
#include <swRTC.h>
// avr-libc library includes
//http://arduinodiy.wordpress.com/2012/02/28/timer-interrupts/
#include <avr/io.h>
#include <avr/interrupt.h>
/*
Programma di test per provare la libreria swRTC e il modo di campionare ogni 5 minuti
a partire da 00. Il campionamento avviene via interrupt e quindi contemporaneamente si
gestisce un menu.
Aggiungiamo il settaggio della data e dell'ora.
Aggiungiamo lo start e stop dell'acquisizione
*/
//***************
//http://www.velocityreviews.com/forums/t316565-convert-__date__-to-unsigned-int.html
//read corrections!!!!!!
//http://lists.gnu.org/archive/html/avr-gcc-list/2009-01/msg00159.html
#define YEAR ((((__DATE__ [7] - '0') * 10 + (__DATE__ [8] - '0')) * 10 \
+ (__DATE__ [9] - '0')) * 10 + (__DATE__ [10] - '0'))
/* Month: 0 - 11 */
#define MONTH (__DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? 0 : 5) \
: __DATE__ [2] == 'b' ? 1 \
: __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 2 : 3) \
: __DATE__ [2] == 'y' ? 4 \
: __DATE__ [2] == 'l' ? 6 \
: __DATE__ [2] == 'g' ? 7 \
: __DATE__ [2] == 'p' ? 8 \
: __DATE__ [2] == 't' ? 9 \
: __DATE__ [2] == 'v' ? 10 : 11)
#define DAY ((__DATE__ [4] == ' ' ? 0 : __DATE__ [4] - '0') * 10 \
+ (__DATE__ [5] - '0'))
//*******************
#define INLENGTH 5 //Needed for input with termination
#define INTERMINATOR 13 //Needed for input with termination
char inString[INLENGTH+1]; //Needed for input with termination
int inCount; //Needed for input with termination
#define LEDPIN 13
int ore,minuti,secondi;
//String MyString;
char Stringa2[2];
swRTC rtc;
boolean AcqDone = false; //It's time to acquisition!
boolean InAcq = false; //If true=Acquisition is made during intterrupt
char comm;
void GetCharFromSerial(){
Serial.flush(); //flush all previous received and transmitted data
inCount = 0;
do
{
while (!Serial.available()); // wait for input
inString[inCount] = Serial.read(); // get it
//++inCount;
if (inString [inCount] == INTERMINATOR) break;
} while(++inCount < INLENGTH);
inString[inCount] = 0; // null terminate the string
//ch=inString;
Serial.print("Ricevuto->");
Serial.println(inString);
comm=inString[0];
}
void GetTime(){
Serial.println("Get Time");
Serial.print(rtc.getHours(), DEC);
Serial.print(":");
Serial.print(rtc.getMinutes(), DEC);
Serial.print(":");
Serial.print(rtc.getSeconds(), DEC);
Serial.print(" -- ");
Serial.print(rtc.getDay(), DEC);
Serial.print("/");
Serial.print(rtc.getMonth(), DEC);
Serial.print("/");
Serial.println(rtc.getYear(), DEC);
}
void SetTime(){
Serial.println("Set Time");
//digitalWrite(13, LOW);
Serial.print("Year");
GetCharFromSerial();
ore=atoi(inString); //Use the same variables for Year..
Serial.print("Month");
GetCharFromSerial();
minuti=atoi(inString);
Serial.print("Day");
GetCharFromSerial();
secondi=atoi(inString);
rtc.stopRTC();
rtc.setDate(ore,minuti,secondi);
rtc.startRTC();
Serial.print("Hour");
GetCharFromSerial();
ore=atoi(inString); //Use the same variables for Year..
Serial.print("Minutes");
GetCharFromSerial();
minuti=atoi(inString);
Serial.print("Seconds");
GetCharFromSerial();
secondi=atoi(inString);
rtc.stopRTC();
rtc.setTime(ore, minuti, secondi);
rtc.startRTC();
Serial.print("RTC changed->");
GetTime();
}
void StartAcq(){
Serial.println("Start Acquisition");
if (InAcq==true) return;
// initialize Timer1
cli(); // disable global interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0;
// enable Timer1 overflow interrupt:
TIMSK1 = (1 << TOIE1);
// Set CS10 bit so timer runs at clock speed:
TCCR1B |= (1 << CS10);
TCCR2B &= ~(1 << CS11);
TCCR1B |= (1 << CS12);
//Serial.println(TCCR1B);
// enable global interrupts:
sei();
InAcq=true;
}
void Download(){
Serial.println("Download Data");
}
void StopAcq(){
Serial.println("Stop Acquisition");
cli(); // disable global interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0;
sei();
InAcq=false;
}
void PrintMenu(){
Serial.println("1 Start Acquisition");
Serial.println("3 Stop Acquisition");
Serial.println("8 Info");
Serial.println("T Get Time");
Serial.println("t Set Time");
Serial.println("--------------------");
Serial.println("Type the number and press enter");
}
void ParseMenu(char Stringa){
Serial.println("Parse Menu");
switch (Stringa) {
case '1':
StartAcq();
break;
case '2':
Download();
break;
case '3':
StopAcq();
break;
case '8':
Serial.print("Acquisition->");
Serial.println(InAcq,DEC);
break;
case 'T':
GetTime();
break;
case 't':
SetTime();
break;
default:
Serial.print("Command Unknown! ->");
Serial.println(Stringa,HEX);
}
}
void setup()
{
Serial.begin(9600);
// initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards:
pinMode(13, OUTPUT);
//Initialize swRTC
rtc.stopRTC();
//rtc.setClockWithTimestamp(__TIMESTAMP__);
rtc.setDate(DAY,MONTH+1,YEAR);
//MyString=__TIMESTAMP__;
Stringa2[0]=__TIMESTAMP__[11];
Stringa2[1]=__TIMESTAMP__[12];
Stringa2[2]=0;
ore = atoi(Stringa2);
Stringa2[0]=__TIMESTAMP__[14];
Stringa2[1]=__TIMESTAMP__[15];
minuti = atoi(Stringa2);
Stringa2[0]=__TIMESTAMP__[17];
Stringa2[1]=__TIMESTAMP__[18];
secondi = atoi(Stringa2);
/*
Serial.print(ore);
Serial.print(":");
Serial.print(minuti);
Serial.print(":");
Serial.println(secondi);
*/
rtc.setTime(ore, minuti, secondi);
rtc.startRTC();
GetTime();
// initialize Timer1
cli(); // disable global interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0;
// enable Timer1 overflow interrupt:
TIMSK1 = (1 << TOIE1);
// Set CS10 bit so timer runs at clock speed:
TCCR1B |= (1 << CS10);
TCCR2B &= ~(1 << CS11);
TCCR1B |= (1 << CS12);
//Serial.println(TCCR1B);
// enable global interrupts:
sei();
InAcq=true;
}
void loop()
{
PrintMenu();
GetCharFromSerial();
ParseMenu(comm);
//Serial.println(__TIMESTAMP__);
}
ISR(TIMER1_OVF_vect)
{
digitalWrite(LEDPIN, !digitalRead(LEDPIN));
if (rtc.getMinutes()%5==0) { //Se il resto è zero i minuti finiscono per zero o 5
if (AcqDone==false){ //Siccome il controllo viene fatto ogni 30 secondi evita
GetTime(); //che la routine scatti 2 volte ad es a 05 e 35 secondi
//Serial.println(); //usando la boolean AcqDone
AcqDone=true;
}
/*
else {
Serial.println(AcqDone);
*/
}
else
{
AcqDone=false;
}
}