Fixed RTC and Ethernet drivers, with NTP
This commit is contained in:
72
lib/ETH/ETH_Driver.cpp
Normal file
72
lib/ETH/ETH_Driver.cpp
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
#include "ETH_Driver.h"
|
||||||
|
|
||||||
|
namespace drivers
|
||||||
|
{
|
||||||
|
|
||||||
|
Ethernet::Ethernet(const std::string hostname) : m_hostname(hostname), m_connected(false), m_localIP(IPAddress()), m_udp(NetworkUDP()), m_timeClient(m_udp)
|
||||||
|
{
|
||||||
|
SPI.begin(ETH_SPI_SCK, ETH_SPI_MISO, ETH_SPI_MOSI);
|
||||||
|
ETH.begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_CS, ETH_PHY_IRQ, ETH_PHY_RST, SPI);
|
||||||
|
|
||||||
|
m_timeClient = std::move(NTPClient(m_udp, "pool.ntp.org", 0, 3600)); // NTP server, time offset in seconds, update interval
|
||||||
|
m_timeClient.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
Ethernet::~Ethernet()
|
||||||
|
{
|
||||||
|
m_timeClient.end();
|
||||||
|
ETH.end();
|
||||||
|
SPI.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool Ethernet::getNtpTime(time_t &time)
|
||||||
|
{
|
||||||
|
if (m_connected && m_timeClient.update())
|
||||||
|
{
|
||||||
|
time = m_timeClient.getEpochTime();
|
||||||
|
LOG_DEBUG("Epoch Time:", (long)time);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool Ethernet::isConnected()
|
||||||
|
{
|
||||||
|
return m_connected;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ethernet::onEvent(arduino_event_id_t event, arduino_event_info_t info)
|
||||||
|
{
|
||||||
|
switch (event)
|
||||||
|
{
|
||||||
|
case ARDUINO_EVENT_ETH_START:
|
||||||
|
ETH.setHostname("waveshare-esp32s3");
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_CONNECTED:
|
||||||
|
LOG_INFO("ETH Connected");
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_GOT_IP:
|
||||||
|
m_localIP = ETH.localIP();
|
||||||
|
LOG_INFO("ETH ", esp_netif_get_desc(info.got_ip.esp_netif), " Got IP:", m_localIP.toString().c_str());
|
||||||
|
LOG_INFO("ETH ", esp_netif_get_desc(info.got_ip.esp_netif), " Gateway:", ETH.gatewayIP().toString().c_str());
|
||||||
|
LOG_INFO("ETH ", esp_netif_get_desc(info.got_ip.esp_netif), " Netmask:", ETH.subnetMask().toString().c_str());
|
||||||
|
m_connected = true;
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_LOST_IP:
|
||||||
|
LOG_INFO("ETH Lost IP");
|
||||||
|
m_connected = false;
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_DISCONNECTED:
|
||||||
|
LOG_INFO("ETH Disconnected");
|
||||||
|
m_connected = false;
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_STOP:
|
||||||
|
LOG_INFO("ETH Stopped");
|
||||||
|
m_connected = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
46
lib/ETH/ETH_Driver.h
Normal file
46
lib/ETH/ETH_Driver.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <DebugLog.h>
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <Network.h>
|
||||||
|
#include <NTPClient.h>
|
||||||
|
#include <ETH.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
|
||||||
|
// PHY defines hardware related
|
||||||
|
#ifndef ETH_PHY_TYPE
|
||||||
|
#define ETH_PHY_TYPE ETH_PHY_W5500
|
||||||
|
#define ETH_PHY_ADDR 1
|
||||||
|
#define ETH_PHY_CS 16
|
||||||
|
#define ETH_PHY_IRQ 12
|
||||||
|
#define ETH_PHY_RST 39
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// SPI pins
|
||||||
|
#define ETH_SPI_SCK 15
|
||||||
|
#define ETH_SPI_MISO 14
|
||||||
|
#define ETH_SPI_MOSI 13
|
||||||
|
|
||||||
|
namespace drivers
|
||||||
|
{
|
||||||
|
|
||||||
|
class Ethernet
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
Ethernet(const std::string hostname);
|
||||||
|
~Ethernet();
|
||||||
|
|
||||||
|
void onEvent(arduino_event_id_t event, arduino_event_info_t info);
|
||||||
|
const bool isConnected();
|
||||||
|
const bool getNtpTime(time_t &time);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const std::string m_hostname;
|
||||||
|
bool m_connected;
|
||||||
|
NetworkUDP m_udp;
|
||||||
|
IPAddress m_localIP;
|
||||||
|
NTPClient m_timeClient;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
@@ -157,12 +157,27 @@ namespace drivers
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string PCF85063::getTimeStr() {
|
const std::string PCF85063::getTimeStr()
|
||||||
|
{
|
||||||
datetime_t dt;
|
datetime_t dt;
|
||||||
readDatetime(dt);
|
readDatetime(dt);
|
||||||
return datetime2str(dt);
|
return datetime2str(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PCF85063::datetime_t PCF85063::fromEpoch(time_t currentTime)
|
||||||
|
{
|
||||||
|
PCF85063::datetime_t tm;
|
||||||
|
struct tm *localTime = std::localtime(¤tTime);
|
||||||
|
tm.year = localTime->tm_year + 1900;
|
||||||
|
tm.month = localTime->tm_mon + 1;
|
||||||
|
tm.day = localTime->tm_mday;
|
||||||
|
tm.dotw = localTime->tm_wday;
|
||||||
|
tm.hour = localTime->tm_hour;
|
||||||
|
tm.minute = localTime->tm_min;
|
||||||
|
tm.second = localTime->tm_sec;
|
||||||
|
return tm;
|
||||||
|
}
|
||||||
|
|
||||||
const std::string PCF85063::datetime2str(datetime_t &datetime)
|
const std::string PCF85063::datetime2str(datetime_t &datetime)
|
||||||
{
|
{
|
||||||
tm dtime;
|
tm dtime;
|
||||||
@@ -171,7 +186,7 @@ namespace drivers
|
|||||||
dtime.tm_hour = datetime.hour;
|
dtime.tm_hour = datetime.hour;
|
||||||
dtime.tm_wday = datetime.dotw;
|
dtime.tm_wday = datetime.dotw;
|
||||||
dtime.tm_mday = datetime.day;
|
dtime.tm_mday = datetime.day;
|
||||||
dtime.tm_mon = datetime.month;
|
dtime.tm_mon = datetime.month - 1;
|
||||||
dtime.tm_year = datetime.year - 1900; // time offset in structure according cpp reference
|
dtime.tm_year = datetime.year - 1900; // time offset in structure according cpp reference
|
||||||
return std::string(std::asctime(&dtime));
|
return std::string(std::asctime(&dtime));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -130,10 +130,12 @@ namespace drivers
|
|||||||
const bool readAlarm(datetime_t &time);
|
const bool readAlarm(datetime_t &time);
|
||||||
const bool getAlarmFlag(uint8_t &flags);
|
const bool getAlarmFlag(uint8_t &flags);
|
||||||
|
|
||||||
|
const std::string datetime2str(datetime_t &datetime);
|
||||||
const std::string getTimeStr();
|
const std::string getTimeStr();
|
||||||
|
|
||||||
|
static PCF85063::datetime_t fromEpoch(time_t currentTime);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const std::string datetime2str(datetime_t &datetime);
|
|
||||||
const uint8_t decToBcd(const int val);
|
const uint8_t decToBcd(const int val);
|
||||||
const int bcdToDec(const uint8_t val);
|
const int bcdToDec(const uint8_t val);
|
||||||
};
|
};
|
||||||
|
|||||||
41
src/main.cpp
41
src/main.cpp
@@ -6,15 +6,11 @@
|
|||||||
#include <RS485_Driver.h>
|
#include <RS485_Driver.h>
|
||||||
#include <TCA9554PWR_Driver.h>
|
#include <TCA9554PWR_Driver.h>
|
||||||
#include <PCF85063_Driver.h>
|
#include <PCF85063_Driver.h>
|
||||||
|
#include <ETH_Driver.h>
|
||||||
#include <ETH.h>
|
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
/////////////// GLOBALS ///////////////
|
/////////////// GLOBALS ///////////////
|
||||||
uint16_t k(0);
|
|
||||||
bool v(true);
|
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
Serial.begin(9600);
|
Serial.begin(9600);
|
||||||
@@ -33,7 +29,22 @@ void loop()
|
|||||||
auto relays = drivers::TCA9554PWR(i2c, TCA9554_ADDRESS);
|
auto relays = drivers::TCA9554PWR(i2c, TCA9554_ADDRESS);
|
||||||
auto bus = drivers::MODBUS(9600, SERIAL_8N1);
|
auto bus = drivers::MODBUS(9600, SERIAL_8N1);
|
||||||
auto rtc = drivers::PCF85063(i2c, PCF85063_ADDRESS);
|
auto rtc = drivers::PCF85063(i2c, PCF85063_ADDRESS);
|
||||||
|
auto eth = drivers::Ethernet("waveshare-test");
|
||||||
|
|
||||||
|
Network.onEvent([ð](arduino_event_id_t event, arduino_event_info_t info)
|
||||||
|
{ eth.onEvent(event, info); });
|
||||||
|
|
||||||
|
while (!eth.isConnected())
|
||||||
|
{
|
||||||
|
LOG_WARN("Waiting for Ethernet");
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set RTC time at startup
|
||||||
|
time_t ntpTime;
|
||||||
|
drivers::PCF85063::datetime_t dt;
|
||||||
|
eth.getNtpTime(ntpTime);
|
||||||
|
rtc.setDatetime(drivers::PCF85063::fromEpoch(ntpTime));
|
||||||
|
|
||||||
////////////////////////////////////////
|
////////////////////////////////////////
|
||||||
///////// MAIN LOOP INSIDE LOOP ////////
|
///////// MAIN LOOP INSIDE LOOP ////////
|
||||||
@@ -45,11 +56,11 @@ void loop()
|
|||||||
std::vector<uint16_t> results;
|
std::vector<uint16_t> results;
|
||||||
std::vector<bool> values;
|
std::vector<bool> values;
|
||||||
|
|
||||||
drivers::PCF85063::datetime_t dt;
|
eth.getNtpTime(ntpTime);
|
||||||
rtc.readDatetime(dt);
|
dt = drivers::PCF85063::fromEpoch(ntpTime);
|
||||||
|
LOG_INFO("Netwrok Datetime", rtc.datetime2str(dt).c_str());
|
||||||
LOG_INFO("Current Datetime", rtc.getTimeStr().c_str());
|
LOG_INFO("Current Datetime", rtc.getTimeStr().c_str());
|
||||||
|
|
||||||
|
|
||||||
if (bus.readHoldingRegisters(tempBoardAddr, baseRegister, 8, results))
|
if (bus.readHoldingRegisters(tempBoardAddr, baseRegister, 8, results))
|
||||||
{
|
{
|
||||||
for (auto i(0); i < results.size(); i++)
|
for (auto i(0); i < results.size(); i++)
|
||||||
@@ -58,20 +69,8 @@ void loop()
|
|||||||
}
|
}
|
||||||
results.clear();
|
results.clear();
|
||||||
}
|
}
|
||||||
delay(5000);
|
|
||||||
|
|
||||||
LOG_INFO("\n\n====>Write Status 1");
|
delay(100);
|
||||||
bus.writeCoils(relayBoardAddr, 0x00, {true, false, true, false, true, false, true, false});
|
|
||||||
bus.readCoils(relayBoardAddr, 0x00, 8, values);
|
|
||||||
printBool("====>Status 1", values);
|
|
||||||
|
|
||||||
delay(5000);
|
|
||||||
LOG_INFO("\n\n====>Write Status 2");
|
|
||||||
bus.writeCoils(relayBoardAddr, 0x00, {false, true, false, true, false, true, false, true});
|
|
||||||
bus.readCoils(relayBoardAddr, 0x00, 8, values);
|
|
||||||
printBool("====>Status 2", values);
|
|
||||||
|
|
||||||
delay(5000);
|
|
||||||
LOG_INFO("\n\n====>Read Inputs");
|
LOG_INFO("\n\n====>Read Inputs");
|
||||||
bus.readInputs(relayBoardAddr, 0x00, 8, values);
|
bus.readInputs(relayBoardAddr, 0x00, 8, values);
|
||||||
printBool("====>Inputs", values);
|
printBool("====>Inputs", values);
|
||||||
|
|||||||
Reference in New Issue
Block a user