Bygga ett nätverk klocka (NCLK) med Microduino-RTC (3 / 3 steg)
Steg 3: Programvara del
Ladda upp program på din Microdino-Core + genom Microduino-FT232R.
----------------------------------
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); HW SPI Com: CS = 10, A0 = 9 (hårdvara stift är SCK = 13 och MOSI = 11)
---teckenstorlek, big|medium|small
#define setFont_L u8g.setFont(u8g_font_7x13)
#define setFont_M u8g.setFont(u8g_font_fixed_v0r)
#define setFont_S u8g.setFont(u8g_font_chikitar)
/*
teckensnitt:
U8G.setFont(u8g_font_7x13)
U8G.setFont(u8g_font_fixed_v0r);
U8G.setFont(u8g_font_chikitar);
U8G.setFont(u8g_font_osb21);
*/
#include < Wire.h >
#include < Rtc_Pcf8563.h >
Rtc_Pcf8563 rtc;
int time_nian, time_yue, time_ri, time_shi, time_fen, time_miao, time_zhou;
#include < EtherCard.h >
#define SECONDS_IN_DAY 86400
#define START_YEAR 1900
#define TIME_ZONE + 8
statisk int days_in_month [] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
statiska byte mymac [] = {
0x00, 0x1A, 0x4B, 0x38, 0x0C, 0x5C};
byte Ethernet::buffer [700];
statiska byte ntpServer [] = {
193,204,114,232}.
statiska byte k = 0;
uint32_t tidsstämpel;
booleska NET_TIME_reply;
#define NET_TIME_INTERVAL 1000
#define TIME_OUT 10000
#define intervall 100000
osignerade långa lastTime = 0, TIME_cache = 0;
Ogiltiga inställningar () {
Serial.BEGIN(57600);
volcdsetup ("belastning nätverk", 0, 15);
Delay(1000);
om (! ether.begin (sizeof Ethernet::buffer, mymac))
Serial.println ("kunde inte komma åt Ethernet controller");
annat
Serial.println ("Ethernet-styrenhet initieras");
om (! ether.dhcpSetup())
{
Serial.println ("kunde inte få konfiguration från DHCP");
volcdsetup ("DHCP-fel", 0, 15);
Delay(1000);
}
annat
{
Serial.println ("DHCP-konfiguration gjort");
volcdsetup ("DHCP lyckas", 0, 15);
Delay(1000);
}
ether.printIp ("IP-adress: \t", ether.myip);
ether.printIp ("Netmask:\t", ether.mymask);
ether.printIp ("Gateway: \t", ether.gwip);
//-------------------------------------------------------
volcdsetup ("last netto tid", 0, 15);
Delay(1000);
NET_TIME_reply = sant;
vonettime();
IF(NET_TIME_reply)
{
volcdsetup "(tid Sync. Fel", 0, 15);
Delay(1000);
}
annat
{
vosettime();
volcdsetup "(tid Sync. Lyckas", 0, 15);
Delay(1000);
}
//-------------------------------------------------------
Serial.println();
}
void loop() {
IF(Millis() - lastTime > intervall)
{
NET_TIME_reply = sant;
vonettime();
IF(!NET_TIME_reply)
{
vosettime();
}
lastTime = millis();
}
volcd();
}
void volcd()
{
U8G.firstPage();
göra {
setFont_M;
U8G.setPrintPos (0, 9);
U8G.Print("Time:");
U8G.Print(RTC.formatDate());
U8G.setPrintPos (0, 20);
U8G.Print(RTC.formatTime());
//-----------------------------------------
U8G.setPrintPos (0, 34);
U8G.Print("Time:");
U8G.Print("20");
U8G.Print(RTC.getYear());
U8G.Print("/");
U8G.Print(RTC.getMonth());
U8G.Print("/");
U8G.Print(RTC.getDay());
U8G.setPrintPos (0, 45);
U8G.Print(RTC.getHour());
U8G.Print(":");
U8G.Print(RTC.getMinute());
U8G.Print(":");
U8G.Print(RTC.getSecond());
Sträng vecka = "";
Switch(RTC.getWeekday())
{
fall 1:
VECKA = "Måndag";
bryta;
fall 2:
VECKA = "Tisdag";
bryta;
fall 3:
VECKA = "Onsdag";
bryta;
fall 4:
VECKA = "Torsdag";
bryta;
fall 5:
VECKA = "Fredag";
bryta;
fall 6:
VECKA = "Lördag";
bryta;
fall 7:
VECKA = "Söndag".
bryta;
}
U8G.setPrintPos (60, 45);
U8G.Print(Week);
setFont_S;
U8G.drawFrame (0, 54,128,10);
U8G.setPrintPos (3, 62).
U8G.Print ("Microduino-RTC v1.0 201307");
}
samtidigt (u8g.nextPage());
}
void vosettime()
{
rtc.initClock(); ställa in en tid till att börja med.
rtc.setDate (time_ri, time_zhou, time_yue, 0, time_nian % 100); dag, veckodag, månad, århundradet (1 = 1900, 0 = 2000), year(0-99)
rtc.setTime (time_shi, time_fen, time_miao); HR, min, SEK
}
void volcdsetup (char * zi, unsigned int x, unsigned int y)
{
U8G.firstPage();
göra {
setFont_L;
U8G.setPrintPos (x, y);
U8G.Print(Zi);
}
samtidigt (u8g.nextPage());
}
void vonettime()
{
uint32_t timeout = millis(); //
medan (NET_TIME_reply == true & & millis() - timeout < TIME_OUT) / /
{
ether.packetLoop(ether.packetReceive());
IF(Millis() - TIME_cache > NET_TIME_INTERVAL) / /
{
ether.ntpRequest (ntpServer, k);
TIME_cache = millis();
NET_TIME_reply = sant; 标记发送
}
om (NET_TIME_reply & & ether.ntpProcessAnswer (& timeStamp, k)) / /
{
printDate (timeStamp + 3600 * TIME_ZONE); //
TIME_cache = millis();
NET_TIME_reply = false; //
}
}
}
Annullera printDate (uint32_t tidsstämpel) {
osignerade långa veckan = (((timeStamp/3600/24)+1)%7);
Serial.Print ("aktuellt datum och tid:");
Serial.println(timeStamp);
unsigned int år = START_YEAR;
While(1) {
uint32_t sekunder.
IF(isLeapYear(Year)) sekunder = SECONDS_IN_DAY * 366;
annat sekunder = SECONDS_IN_DAY * 365;
om (timeStamp > = sekunder) {
timeStamp-= sekunder.
år ++;
}
annan semester.
}
unsigned int månad = 0;
While(1) {
uint32_t sekunder = SECONDS_IN_DAY * days_in_month [månad].
IF(isLeapYear(Year) & & månad == 1) sekunder = SECONDS_IN_DAY * 29;
om (timeStamp > = sekunder) {
timeStamp-= sekunder.
månad ++;
}
annan semester.
}
månad ++;
unsigned int dag = 1;
While(1) {
om (timeStamp > = SECONDS_IN_DAY) {
timeStamp-= SECONDS_IN_DAY;
dagen ++;
}
annan semester.
}
unsigned int timme = tidsstämpel / 3600;
unsigned int minut = (timeStamp - (uint32_t) timme * 3600) / 60;
unsigned int näst = (timeStamp - (uint32_t) timme * 3600) - minut * 60;
Serial.Print ("veckan:");
Serial.println(Week);
IF(Day < 10) Serial.print("0");
Serial.Print(Day);
Serial.Print("/");
IF(Month < 10) Serial.print("0");
Serial.Print(month);
Serial.Print("/");
Serial.println(Year);
IF(Hour < 10) Serial.print("0");
Serial.Print(Hour);
Serial.Print(":");
IF(Minute < 10) Serial.print("0");
Serial.Print(Minute);
Serial.Print(":");
IF(Second < 10) Serial.print("0");
Serial.println(Second);
Serial.println();
time_nian = år.
time_yue = månad.
time_ri = dag;
time_shi = timme;
time_fen = minut.
time_miao = andra.
time_zhou = vecka;
}
booleska isLeapYear (unsigned int år) {
tillbaka (år % 4 == 0 & & (år % 100! = 0 || år % 400 == 0));
}
---------------------------