Newer
Older
timeRequest / timeRequest.ino
/**
 * @file timeRequest.ino
 * @author Pascal Gollor 
 * @date 2017-12-03
 * 
 * use libraries:
 * - MySensors (https://github.com/mysensors/MySensors)
 * - Time (https://github.com/PaulStoffregen/Time)
 */


// ----- definitions -----
#define NANOIO

#define MY_RADIO_NRF24
#define MY_NODE_ID 23
#ifdef NANOIO
  #define MY_RF24_CE_PIN 9
  #define MY_RF24_CS_PIN 10
#endif
#define MY_RF24_CHANNEL 83
#define MY_BAUD_RATE 57600
//#define MY_DEBUG

#define SKETCH_NAME "timeRequest"
#define SKETCH_VERSION "20171203_01"


// ----- includes -----
#include <SPI.h>
#include <MySensors.h>
#include <Time.h>



// ----- functions -----

void presentation()  
{
  sendSketchInfo(SKETCH_NAME, SKETCH_VERSION);
} // presentation


void receiveTime(unsigned long ts)
{
  const unsigned long DEFAULT_TIME = 1357041600; // Jan 1 2013
  
#ifdef MY_DEBUG
  Serial.print('[');
  Serial.print(millis() / 1000);
  Serial.print(F("]: ts: "));
  Serial.println(ts);
#endif

  if (ts > DEFAULT_TIME)
  {
    setTime(ts);
  }
} // receiveTime


#ifdef MY_DEBUG
void receive(const MyMessage &message)
{
  static const char buff[64];
   
  Serial.print('[');
  Serial.print(millis() / 1000);
  Serial.print(F("]: message.type: "));
  Serial.print(message.type);
  Serial.print(F(" - sensor: "));
  Serial.print(message.sensor);
  Serial.print(F(" - sender: "));
  Serial.print(message.sender);
  Serial.print(F(" - destination: "));
  Serial.print(message.destination);
  Serial.print(F(" - msg: "));
  Serial.println(message.getString(buff));
} // receive
#endif


void printDigits(int digits)
{
  // utility function for digital clock display: prints preceding colon and leading 0
  if(digits < 10)
  {
    Serial.print('0');
  }
  Serial.print(digits);
} // printDigits


void printTime()
{
  printDigits(hour());
  Serial.write(':');
  printDigits(minute());
  Serial.write(':');
  printDigits(second());
  Serial.write(' ');
  printDigits(day());
  Serial.write('.');
  printDigits(month());
  Serial.write('.');
  Serial.println(year());
} // printTime


time_t requestSync()
{
  Serial.print('[');
  Serial.print(millis() / 1000);
  Serial.println(F("]: Request time."));
  
  requestTime();
  delay(500); // wait for time receiving
  return 0;
} // requestSync


void before()
{
  Serial.begin(MY_BAUD_RATE);
  Serial.println("");
  Serial.println(F(SKETCH_NAME));
  Serial.print(F("Version: "));
  Serial.println(F(SKETCH_VERSION));
  Serial.flush();
}


void setup()
{
  Serial.print('[');
  Serial.print(millis() / 1000);
  Serial.println(F("]: setup"));
  Serial.flush();

  setSyncProvider(requestSync);
} // setup


void loop()
{
#ifdef MY_DEBUG
  static unsigned long lastRequest = 0;
  unsigned long currentTime = millis();
  if (currentTime - lastRequest >= 10000UL)
  {
    lastRequest = currentTime;
    requestTime();
    printTime();
  }
#else
  static unsigned char lastHour = 0;
  // request time every our
  if (hour() != lastHour || year() == 1970)
  {
    requestSync();
    lastHour = hour();
  }

  printTime();

  sleep(10000UL);
#endif
} // loop