蛍光表示管プロジェクト NTP連携できたよの話

チャオチャオ!
久しぶりになりましたけれど、Twitter facebook的には適宜報告中でした。
ということで今日は蛍光表示管プロジェクト(今回初めて出してみた)の経過報告をします!

先に表示まで出来ましたっと報告しました。
蛍光表示管を使う話(2017年3月20日)

っと、今回は手っ取り早く、NTPサーバーまで接続出来ました!

いらないソースを入れて、こんな感じ。
# NTPサーバとの接続周りで現在不具合発生中のため。

#include 

#define PIN_a 2
#define PIN_b 3
#define PIN_c 4
#define PIN_d 5
#define PIN_e 6
#define PIN_f 7
#define PIN_g 8
#define PIN_dot 9

#define PIN_q1 A0
#define PIN_q2 A1
#define PIN_q3 A2
#define PIN_q4 A3
#define PIN_q5 A4
#define PIN_q6 A5

long timeZoneOffset = 9 * 3600L;

static byte ntpServer[] = {202, 234, 233, 109};


static byte mymac[] = { 0x74, 0x69, 0x69, 0x2D, 0x30, 0x31 }; //Change this in a unique mac adres for your network

byte Ethernet::buffer[700];

unsigned long unixtime = 0L;
unsigned int timeDelay = 0;
long lastUpdate = 0L;
unsigned long lastNtpAccessTime = 0L;
unsigned long ntpAccessDelay =   5 * 60L;

void setup () {
  Serial.begin(115200);

  pinMode(PIN_a, OUTPUT);
  pinMode(PIN_b, OUTPUT);
  pinMode(PIN_c, OUTPUT);
  pinMode(PIN_d, OUTPUT);
  pinMode(PIN_e, OUTPUT);
  pinMode(PIN_f, OUTPUT);
  pinMode(PIN_g, OUTPUT);
  pinMode(PIN_dot, OUTPUT);

  pinMode(PIN_q6, OUTPUT);
  pinMode(PIN_q5, OUTPUT);
  pinMode(PIN_q4, OUTPUT);
  pinMode(PIN_q3, OUTPUT);
  pinMode(PIN_q2, OUTPUT);
  pinMode(PIN_q1, OUTPUT);

  resetNumber();
  analogWrite(PIN_q1, 0);
  analogWrite(PIN_q2, 0);
  analogWrite(PIN_q3, 0);
  analogWrite(PIN_q4, 0);
  analogWrite(PIN_q5, 0);
  analogWrite(PIN_q6, 0);

  Serial.print("MAC: ");
  for (byte i = 0; i < 6; ++i) {
    Serial.print(mymac[i], HEX);
    if (i < 5)
      Serial.print(':');
  }
  Serial.println();

  int i = 1;
  int DHCP = 0;
  //Try to get dhcp settings 3 times before giving up
  Serial.println("Resolve dhcp ...");

  while ( DHCP == 0 && i < 3) {
    Serial.print("Trying to resolve DHCP attempt nr. ");
    Serial.println(i);
    DHCP = ether.begin(sizeof Ethernet::buffer, mymac);
    delay(1000);
    i++;
  }
  //Serial.println(F("Setting up DHCP"));
  if (!ether.dhcpSetup()) {
    Serial.println(F("DHCP failed"));
  }
  ether.printIp(ether.myip);
  Serial.println();

  unixtime =   getNtpTime();
  lastNtpAccessTime = unixtime;
  Serial.println();

  printTimestamp(unixtime);
  Serial.print('(');
  printTimestamp((lastNtpAccessTime + ntpAccessDelay) );
  Serial.print(')');

}

unsigned long getNtpTime() {
  unsigned long timeFromNTP = unixtime;
  const unsigned long seventy_years = 2208988800UL;
  unsigned long processDelay = millis();
  Serial.print(unixtime);
  Serial.print(" ");

  timeFromNTP = unixtime;

  Serial.print("Server:");
  for (byte i = 0; i < 4; ++i) {
    Serial.print(ntpServer[i], DEC);
    if (i < 3)
      Serial.print('.');
  }
  Serial.println();

  for (int i = 0 ; i < 60 ; i ++) {
    ether.ntpRequest(ntpServer, 123);
    analogWrite(PIN_q2, 0);
    analogWrite(PIN_q3, 0);
    analogWrite(PIN_q4, 0);
    analogWrite(PIN_q5, 0);
    analogWrite(PIN_q6, 0);
    resetNumber();

    if (i % 2 == 0) {
      analogWrite(PIN_q1, 1023);
      digitalWrite(PIN_dot, HIGH);
    } else {
      analogWrite(PIN_q1, 0);
      digitalWrite(PIN_dot, LOW);
    }
    Serial.print(".");
    int length = ether.packetReceive();
    ether.packetLoop(length);
    Serial.print("[");
    Serial.print(length);
    Serial.print("]");
    if ( ether.ntpProcessAnswer(&timeFromNTP, 0)) {
      Serial.print(" : NTP reply received : ");
      Serial.println(timeFromNTP);
      return timeFromNTP;
    }
    delay(500);

  }
  Serial.println("NTP reply failed");
  Serial.println(millis() - processDelay);
  return unixtime + millis() - processDelay;
}


void loop() {

  writeNumber(PIN_q1, getSecound() % 10);
  writeNumber(PIN_q2, getSecound() / 10L);

  writeNumber(PIN_q3, getMinute() % 10);
  writeNumber(PIN_q4, getMinute() / 10L);

  writeNumber(PIN_q5, getHour() % 10);
  writeNumber(PIN_q6, getHour() / 10L);

  if ((millis() - lastUpdate) >= 1000) {
    unixtime += 1;
    lastUpdate = millis();
  }

  if (( unixtime - lastNtpAccessTime) >= ntpAccessDelay) {
    unixtime =   getNtpTime();
    lastNtpAccessTime = unixtime;

    printTimestamp(lastNtpAccessTime);
    Serial.print('(');
    printTimestamp((lastNtpAccessTime + ntpAccessDelay) );
    Serial.print(')');

  }
  delay(5);
}
unsigned long getUnixTime() {
  return unixtime + timeZoneOffset;
}

long getSecound() {
  long secound = getUnixTime()  % 60L ;
  return secound;
}
long getMinute() {
  long minute = (getUnixTime() / 60L) % 60L;
  return minute;
}

long getHour() {
  long hour = ((getUnixTime() / (60L * 60L))) % 24L;
  return hour;
}
void printTimestamp(unsigned long time) {

  Serial.print(((time / (60L * 60L))  + 9) % 24L);
  Serial.print(":");
  Serial.print((time / 60L) % 60L);
  Serial.print(":");
  Serial.print( time  % 60L );
}
void writeNumber(int pin, int num) {

  analogWrite(pin, 1023);
  writeNumber(num);
  delay(1);
  digitalWrite(pin, LOW);
}
void writeNumber(int num) {
  switch (num) {
    case 0 :
      digitalWrite(PIN_a, HIGH);
      digitalWrite(PIN_b, HIGH);
      digitalWrite(PIN_c, HIGH);
      digitalWrite(PIN_d, HIGH);
      digitalWrite(PIN_e, HIGH);
      digitalWrite(PIN_f, HIGH);
      digitalWrite(PIN_g, LOW);
      return ;
    case 1 :
      digitalWrite(PIN_a, LOW);
      digitalWrite(PIN_b, HIGH);
      digitalWrite(PIN_c, HIGH);
      digitalWrite(PIN_d, LOW);
      digitalWrite(PIN_e, LOW);
      digitalWrite(PIN_f, LOW);
      digitalWrite(PIN_g, LOW);
      return ;
    case 2 :
      digitalWrite(PIN_a, HIGH);
      digitalWrite(PIN_b, HIGH);
      digitalWrite(PIN_c, LOW);
      digitalWrite(PIN_d, HIGH);
      digitalWrite(PIN_e, HIGH);
      digitalWrite(PIN_f, LOW);
      digitalWrite(PIN_g, HIGH);
      return ;
    case 3 :
      digitalWrite(PIN_a, HIGH);
      digitalWrite(PIN_b, HIGH);
      digitalWrite(PIN_c, HIGH);
      digitalWrite(PIN_d, HIGH);
      digitalWrite(PIN_e, LOW);
      digitalWrite(PIN_f, LOW);
      digitalWrite(PIN_g, HIGH);
      return ;
    case 4 :
      digitalWrite(PIN_a, LOW);
      digitalWrite(PIN_b, HIGH);
      digitalWrite(PIN_c, HIGH);
      digitalWrite(PIN_d, LOW);
      digitalWrite(PIN_e, LOW);
      digitalWrite(PIN_f, HIGH);
      digitalWrite(PIN_g, HIGH);
      return ;
    case 5 :
      digitalWrite(PIN_a, HIGH);
      digitalWrite(PIN_b, LOW);
      digitalWrite(PIN_c, HIGH);
      digitalWrite(PIN_d, HIGH);
      digitalWrite(PIN_e, LOW);
      digitalWrite(PIN_f, HIGH);
      digitalWrite(PIN_g, HIGH);
      return ;
    case 6 :
      digitalWrite(PIN_a, HIGH);
      digitalWrite(PIN_b, LOW);
      digitalWrite(PIN_c, HIGH);
      digitalWrite(PIN_d, HIGH);
      digitalWrite(PIN_e, HIGH);
      digitalWrite(PIN_f, HIGH);
      digitalWrite(PIN_g, HIGH);
      return ;
    case 7 :
      digitalWrite(PIN_a, HIGH);
      digitalWrite(PIN_b, HIGH);
      digitalWrite(PIN_c, HIGH);
      digitalWrite(PIN_d, LOW);
      digitalWrite(PIN_e, LOW);
      digitalWrite(PIN_f, HIGH);
      digitalWrite(PIN_g, LOW);
      return ;
    case 8 :
      digitalWrite(PIN_a, HIGH);
      digitalWrite(PIN_b, HIGH);
      digitalWrite(PIN_c, HIGH);
      digitalWrite(PIN_d, HIGH);
      digitalWrite(PIN_e, HIGH);
      digitalWrite(PIN_f, HIGH);
      digitalWrite(PIN_g, HIGH);
      return ;

    case 9 :
      digitalWrite(PIN_a, HIGH);
      digitalWrite(PIN_b, HIGH);
      digitalWrite(PIN_c, HIGH);
      digitalWrite(PIN_d, LOW);
      digitalWrite(PIN_e, LOW);
      digitalWrite(PIN_f, HIGH);
      digitalWrite(PIN_g, HIGH);
      return ;
  }

  return ;
}
void resetNumber() {
  digitalWrite(PIN_a, LOW);
  digitalWrite(PIN_b, LOW);
  digitalWrite(PIN_c, LOW);
  digitalWrite(PIN_d, LOW);
  digitalWrite(PIN_e, LOW);
  digitalWrite(PIN_f, LOW);
  digitalWrite(PIN_g, LOW);
}