From 0a27d58b2f222c6a832dd3e990c0ff50c30fe6d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniele=20Vigan=C3=B2?= Date: Wed, 3 Jun 2020 14:52:19 +0200 Subject: [PATCH] Enable NTP updates on Arduino --- arduino/eeprom_prog/eeprom_prog.ino | 2 +- arduino/tempLightSensor/tempLightSensor.ino | 84 ++++++++++++++------- docker/ntpd/chrony.conf | 1 + 3 files changed, 57 insertions(+), 30 deletions(-) diff --git a/arduino/eeprom_prog/eeprom_prog.ino b/arduino/eeprom_prog/eeprom_prog.ino index 2efacbf..6923565 100644 --- a/arduino/eeprom_prog/eeprom_prog.ino +++ b/arduino/eeprom_prog/eeprom_prog.ino @@ -9,7 +9,7 @@ const char serial[] = "abcd1234"; struct netConfig { IPAddress address; - int port; + unsigned int port; }; netConfig config = { diff --git a/arduino/tempLightSensor/tempLightSensor.ino b/arduino/tempLightSensor/tempLightSensor.ino index 6d9c1e3..3eafe5d 100644 --- a/arduino/tempLightSensor/tempLightSensor.ino +++ b/arduino/tempLightSensor/tempLightSensor.ino @@ -1,23 +1,31 @@ #include #include +#include +#include #include #define DEBUG_TO_SERIAL 1 +#define USE_INTERNAL_NTP 0 // use default ntp server or the internal one #define AREF_VOLTAGE 3.3 -const String serverName = "sensor.server.domain"; +// const String serverName = "sensor.server.domain"; -const size_t capacity = JSON_OBJECT_SIZE(1) + 2*JSON_OBJECT_SIZE(6); -DynamicJsonDocument doc(capacity); -JsonObject payload = doc.createNestedObject("payload"); +const size_t capacity = JSON_OBJECT_SIZE(2) + 2 * JSON_OBJECT_SIZE(3) + 110; + +DynamicJsonDocument json(capacity); +JsonObject payload = json.createNestedObject("payload"); JsonObject temp = payload.createNestedObject("temperature"); +unsigned int counter = 0; int tempPin = A0; int photocellPin = A1; +EthernetUDP ntpUDP; +NTPClient timeClient(ntpUDP); + struct netConfig { IPAddress address; - int port; + unsigned int port; }; netConfig config; @@ -26,37 +34,32 @@ const int postDelay = 10 * 1000; void setup(void) { Serial.begin(9600); - + analogReference(EXTERNAL); byte mac[6]; char serial[9]; - + int eeAddress = 0; EEPROM.get(eeAddress, mac); eeAddress += sizeof(mac); EEPROM.get(eeAddress, serial); eeAddress += sizeof(serial); - - Serial.println("Initialize Ethernet with DHCP:"); + if (Ethernet.begin(mac) == 0) { - Serial.println("Failed to configure Ethernet using DHCP"); if (Ethernet.hardwareStatus() == EthernetNoHardware) { - Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :("); - } else if (Ethernet.linkStatus() == LinkOFF) { - Serial.println("Ethernet cable is not connected."); + Serial.println("ERROR: ethernet shield was not found."); } - // no point in carrying on, so do nothing forevermore: while (true) { delay(1); } } EEPROM.get(eeAddress, config); - + Serial.print("IoT #"); Serial.print(serial); - Serial.println(" started at address:"); + Serial.println(" at address:"); Serial.println(Ethernet.localIP()); Serial.println(); Serial.println("Connecting to:"); @@ -64,43 +67,66 @@ void setup(void) { Serial.print(":"); Serial.println(config.port); - doc["device"] = serial; // FIXME - payload["id"] = serverName; +#if USE_INTERNAL_NTP + timeClient.setPoolServerIP(config.address); +#endif + timeClient.begin(); + timeClient.update(); + +#if DEBUG_TO_SERIAL + Serial.println("DEBUG: clock updated via NTP."); +#endif + + json["device"] = 1; // FIXME + // payload["id"] = serverName; } void loop(void) { - - int photocellReading = analogRead(photocellPin); - int tempReading = analogRead(tempPin); + + unsigned int photocellReading = analogRead(photocellPin); + unsigned int tempReading = analogRead(tempPin); float tempVoltage = tempReading * AREF_VOLTAGE / 1024.0; float tempC = (tempVoltage - 0.5) * 100 ; + json["time"] = timeClient.getEpochTime(); payload["light"] = photocellReading; temp["celsius"] = tempC; temp["raw"] = tempReading; temp["volts"] = tempVoltage; - + if (EthernetClient client = client.connect(config.address, config.port)) { client.print("POST "); client.print(URL); client.println(" HTTP/1.1"); client.print("Host: "); - printAddr(config.address, &client); + client.print(config.address); client.print(":"); client.println(config.port); client.println("Content-Type: application/json"); client.print("Content-Length: "); - client.println(measureJsonPretty(doc)); + client.println(measureJsonPretty(json)); client.println("Connection: close"); client.println(); - serializeJson(doc, client); + serializeJson(json, client); client.stop(); - - #if DEBUG_TO_SERIAL - serializeJsonPretty(doc, Serial); - #endif + +#if DEBUG_TO_SERIAL + Serial.println("DEBUG: >>>"); + serializeJsonPretty(json, Serial); + Serial.println("\n<<<"); +#endif + } + + if (counter == 6 * 120) { // Update clock every 6 times * 10 sec * 120 minutes = 2 hrs + timeClient.update(); + counter = 0; +#if DEBUG_TO_SERIAL + Serial.println("DEBUG: clock updated via NTP."); +#endif + } else { + counter++; } delay(postDelay); diff --git a/docker/ntpd/chrony.conf b/docker/ntpd/chrony.conf index 80b99ca..c02db03 100644 --- a/docker/ntpd/chrony.conf +++ b/docker/ntpd/chrony.conf @@ -1,3 +1,4 @@ pool pool.ntp.org iburst initstepslew 10 pool.ntp.org driftfile /var/lib/chrony/chrony.drift +allow all