Test the sketch "Wiring Thermocouple Max6675 on ESP8266 12E NodeMCU" of 14Core, and find Adafruit MAX6675 library installed using Library Manager is not compatible with ESP8266.
By replacing max6675.h and max6675.cpp with the ones from SirUli on github, copying other files on the link and commenting out the statements relating display functions, the sketch of 14Core has been compiled and run without fail on NodeMCU Dev Kit 1.0.
Also the serialthermocoupl.pde example sketch runs without fail.
I think the tutorials of 14Core had better specify from where the library they downloaded.
Wiring from 14Core
Output
Sketch
#include <max6675.h>
// #include <Wire.h>
// #include <Adafruit_GFX.h>
// #include <ESP_Adafruit_SSD1306.h>
// #define OLED_RESET 4
int ktcSO = 12;
int ktcCS = 13;
int ktcCLK = 14;
MAX6675 ktc(ktcCLK, ktcCS, ktcSO);
// Adafruit_SSD1306 display(OLED_RESET);
void setup() {
Serial.begin(115200);
Serial.println("Max6675 test");
delay(500);
// display.begin(SSD1306_SWITCHCAPVCC, 0x78>>1);
// display.display();
// delay(2000);
// display.clearDisplay();
}
void loop() {
// basic readout test
//
// display.setTextSize(2);
// display.setTextColor(WHITE);
// display.setCursor(52,10);
// display.print((char)223);
// display.print("C = ");
// display.print(ktc.readCelsius());
// display.print((char)223);
// display.print("\t F = ");
// display.setCursor(52,30);
// display.println(ktc.readFahrenheit());
float DC = ktc.readCelsius();
// Read temperature as Celsius
float DF = ktc.readFahrenheit();
Serial.print("C = ");
Serial.print(ktc.readCelsius());
Serial.print("\t F = ");
Serial.println(ktc.readFahrenheit());
//
delay(1000);
// displayData();
}
void displayData(){
// display.setTextSize(1);
// display.setCursor(5,1);
// display.println("14CORE|THERMOCOUPLE");
// display.setTextSize(2);
// display.setTextColor(WHITE);
// display.setCursor(18,20);
// display.print((char)248);
// display.print("C:");
// display.print(ktc.readCelsius());
// display.setCursor(18,40);
// display.print((char)248);
// display.print("F:");
// display.println(ktc.readFahrenheit());
// display.display();
// display.clearDisplay();
}
Showing posts with label Library. Show all posts
Showing posts with label Library. Show all posts
2016/07/31
2014/06/22
Arduino Color LCD Shield Keypad Adjustable DS1307 Real Time Clock Using Time.h Library
The ColorLCDShield.h library comes with an example sketch ChronoLCD_Color which sets the time at compile stage and time cannot be adjusted. By reading time from DS1307, the sketch can get correct time after power interruption. By modifying the setTime(), time can be adjusted and restored to DS1307 real time clock. No re-compilation is needed any more.
Boards
1. Arduino Uno R3
2. cheaphousetek RTC Shield
3. Color LCD Shield
Photo
Sketch
/*
ChronoLCD Color - An example sketch for the Color LCD Shield Library
by: Jim Lindblom
SparkFun Electronics
date: 6/23/11
license: CC-BY SA 3.0 - Creative commons share-alike 3.0
use this code however you'd like, just keep this license and
attribute. Let me know if you make hugely, awesome, great changes.
This sketch draws an analog and digital clock on the Color LCD
Shield. You can also use the on-board buttons to set the hours
and minutes.
Use the defines at the top of the code to set the initial time.
You can also adjust the size and color of the clock.
To set the time, first hit S3. Then use S1 and S2 to adjust the
hours and minutes respsectively. Hit S3 to start the clock
back up.
This example code should give you a good idea of how to use
the setCircle, setLine, and setStr functions of the Color LCD
Shield Library.
*/
// Modified by Befun Hung on Jun. 22, 2014
// 1) Sync time with DS1307 real time clock
// 2) Use onboard keypad to adjust DS1307 time parameter
// Press S1 get into adjustment mode,
// Press S2 to adjust or
// Press S3 to select which parameter to be adjusted with default to hour
// Press S1 to save parameters to DS1307
// 3) Show date and weekday
// 4) Minor adjustment of analog clock
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
#include <ColorLCDShield.h>
char *dayOfWeek[] = {"", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
time_t t;
int displayAtSecond;
#define CLOCK_RADIUS 41 // radius of clock face
#define CLOCK_CENTER 50 // If you adjust the radius, you'll probably want to adjust this
#define H_LENGTH 23 // length of hour hand
#define M_LENGTH 33 // length of minute hand
#define S_LENGTH 37 // length of second hand
#define BACKGROUND BLACK // room for growth, adjust the background color according to daylight
#define C_COLOR RED // This is the color of the clock face, and digital clock
#define H_COLOR BLUE // hour hand color
#define M_COLOR GREEN // minute hand color
#define S_COLOR YELLOW // second hand color
LCDShield lcd;
int years, months, days;
int hours, minutes, seconds;
int buttonPins[3] = {3, 4, 5};
void setup()
{
/* Set up the button pins as inputs, set pull-up resistor */
for (int i=0; i<3; i++)
{
pinMode(buttonPins[i], INPUT);
digitalWrite(buttonPins[i], HIGH);
}
/* Initialize the LCD, set the contrast, clear the screen */
lcd.init(PHILIPS);
lcd.contrast(-63);
lcd.clear(BACKGROUND);
setSyncProvider(RTC.get); // the function to get the time from the RTC
}
void loop()
{
t = now();
years = year(t);
months = month(t);
days = day(t);
hours = hour(t);
minutes = minute(t);
seconds = second(t);
if (!digitalRead(buttonPins[2]))
setTime(); // If S3 was pressed, go set the time
if (displayAtSecond != second(t)) {
drawClock(); // Draw the clock face, this includes 12, 3, 6, 9
displayAnalogTime(hours, minutes, seconds); // Draw the clock hands
displayDateDayOfWeek(years, months, days);
displayDigitalTime(hours, minutes, seconds); // Draw the digital clock text
displayAtSecond = second(t);
}
}
/*
setTime uses on-shield switches S1, S2, and S3 to set the time
pressing S3 will exit the function. S1 increases hours, S2
increases seconds.
*/
void setTime()
{
int setVariable = 3, checkStatus = 0;
/* Reset the clock */
years = year(t);
months = month(t);
days = day(t);
hours = hour(t);
minutes = minute(t);
seconds = second(t);
/* Draw the clock, so we can see the new time */
drawClock();
displayAnalogTime(hours, minutes, seconds);
displayDateDayOfWeek(years, months, days);
displayDigitalTime(hours, minutes, seconds);
while (!digitalRead(buttonPins[2]))
; // wait till they let go of S1
/* We'll run around this loop until S3 is pressed again */
while(digitalRead(buttonPins[2]))
{
/* If S1 is pressed, we'll update the hours */
if (!digitalRead(buttonPins[0]))
{
delay(100);
setVariable = (setVariable + 1) % 6; // Select year, month, day, hour, minute, second to change, default is year
/* and update the clock, so we can see it */
drawClock();
displayAnalogTime(hours, minutes, seconds);
displayDateDayOfWeek(years, months, days);
displayDigitalTime(hours, minutes, seconds);
}
if (!digitalRead(buttonPins[1]))
{
delay(100);
switch (setVariable) {
case 0:{
years = ((years + 1) % 100) + 2000;
break;
}
case 1:{
months = (months % 12) + 1;
break;
}
case 2:{
days = (days % 31) + 1;
break;
}
case 3:{
hours = (hours + 1) % 24;
break;
}
case 4:{
minutes = (minutes + 1) % 60;
break;
}
case 5:{
seconds = (seconds + 1) % 60;
break;
}
}
// minutes++; // Increase minutes by 1
// if (minutes >= 60)
// minutes = 0; // If minutes is 60, set it back to 0
/* and update the clock, so we can see it */
drawClock();
displayAnalogTime(hours, minutes, seconds);
displayDateDayOfWeek(years, months, days);
displayDigitalTime(hours, minutes, seconds);
}
}
/* Once S3 is pressed, we'll exit, but not until it's released */
while(!digitalRead(buttonPins[2]))
;
if ((months == 1 || months == 3 || months == 5 || months == 7 || months == 8 || months == 10 || months == 12) && days <= 31) checkStatus = 1;
if ((months == 4 || months == 6 || months == 9 || months == 11) && days <=30) checkStatus = 1;
if ((months == 2 && (years % 4) == 0) && days <= 29) checkStatus = 1;
if ((months == 2 && (years % 4) != 0) && days <= 28) checkStatus = 1;
if (checkStatus) {
setTime(hours, minutes, seconds, days, months, years);
RTC.set(now());
}
}
/*
displayDateDayOfWeek() takes in values for years, months, days.
It'll print the date, day of week, in digital format, on the
bottom of the screen.
*/
void displayDateDayOfWeek(int y, int m, int d)
{
char dateChar[12];
sprintf(dateChar, "%.4d-%.2d-%.2d ", y, m, d);
/* Print the time on the clock */
lcd.setStr(dateChar, 90, 10,
C_COLOR, BACKGROUND);
lcd.setStr(dayOfWeek[weekday()], 90, 98,
C_COLOR, BACKGROUND);
}
/*
displayDigitalTime() takes in values for hours, minutes and
seconds. It'll print the time, in digital format, on the
bottom of the screen.
*/
void displayDigitalTime(int h, int m, int s)
{
char timeChar[10]; // adjust the number of characters to avoid odd display
sprintf(timeChar, "%.2d:%.2d:%.2d", h, m, s);
/* Print the time on the clock */
lcd.setStr(timeChar, 105, 26, C_COLOR, BACKGROUND);
}
/*
drawClock() simply draws the outer circle of the clock, and '12',
'3', '6', and '9'. Room for growth here, if you want to customize
your clock. Maybe add dashe marks, or even all 12 digits.
*/
void drawClock()
{
/* Draw the circle */
lcd.setCircle(CLOCK_CENTER, 66, CLOCK_RADIUS, C_COLOR);
/* Print 12, 3, 6, 9, a lot of arbitrary values are used here
for the coordinates. Just used trial and error to get them
into a nice position. */
lcd.setStr("12", CLOCK_CENTER - CLOCK_RADIUS, 66-9, C_COLOR, BACKGROUND);
lcd.setStr("3", CLOCK_CENTER - 9, 66 + CLOCK_RADIUS - 12, C_COLOR, BACKGROUND);
lcd.setStr("6", CLOCK_CENTER + CLOCK_RADIUS - 18, 66-4, C_COLOR, BACKGROUND);
lcd.setStr("9", CLOCK_CENTER - 9, 66 - CLOCK_RADIUS + 4, C_COLOR, BACKGROUND);
}
/*
displayAnalogTime() draws the three clock hands in their proper
position. Room for growth here, I'd like to make the clock hands
arrow shaped, or at least thicker and more visible.
*/
void displayAnalogTime(int h, int m, int s)
{
double midHours; // this will be used to slightly adjust the hour hand
static int hx, hy, mx, my, sx, sy;
/* Adjust time to shift display 90 degrees ccw
this will turn the clock the same direction as text */
h -= 3;
m -= 15;
s -= 15;
if (h <= 0)
h += 12;
if (m < 0)
m += 60;
if (s < 0)
s += 60;
/* Delete old lines: */
lcd.setLine(CLOCK_CENTER, 66, CLOCK_CENTER+sx, 66+sy, BACKGROUND); // delete second hand
lcd.setLine(CLOCK_CENTER, 66, CLOCK_CENTER+mx, 66+my, BACKGROUND); // delete minute hand
lcd.setLine(CLOCK_CENTER, 66, CLOCK_CENTER+hx, 66+hy, BACKGROUND); // delete hour hand
/* Calculate and draw new lines: */
s = map(s, 0, 60, 0, 360); // map the 0-60, to "360 degrees"
sx = S_LENGTH * sin(3.14 * ((double) s)/180); // woo trig!
sy = S_LENGTH * cos(3.14 * ((double) s)/180); // woo trig!
lcd.setLine(CLOCK_CENTER, 66, CLOCK_CENTER+sx, 66+sy, S_COLOR); // print second hand
m = map(m, 0, 60, 0, 360); // map the 0-60, to "360 degrees"
mx = M_LENGTH * sin(3.14 * ((double) m)/180); // woo trig!
my = M_LENGTH * cos(3.14 * ((double) m)/180); // woo trig!
lcd.setLine(CLOCK_CENTER, 66, CLOCK_CENTER+mx, 66+my, M_COLOR); // print minute hand
midHours = minutes/12; // midHours is used to set the hours hand to middling levels between whole hours
h *= 5; // Get hours and midhours to the same scale
h += midHours; // add hours and midhours
h = map(h, 0, 60, 0, 360); // map the 0-60, to "360 degrees"
hx = H_LENGTH * sin(3.14 * ((double) h)/180); // woo trig!
hy = H_LENGTH * cos(3.14 * ((double) h)/180); // woo trig!
lcd.setLine(CLOCK_CENTER, 66, CLOCK_CENTER+hx, 66+hy, H_COLOR); // print hour hand
}
Boards
1. Arduino Uno R3
2. cheaphousetek RTC Shield
3. Color LCD Shield
Photo
Sketch
/*
ChronoLCD Color - An example sketch for the Color LCD Shield Library
by: Jim Lindblom
SparkFun Electronics
date: 6/23/11
license: CC-BY SA 3.0 - Creative commons share-alike 3.0
use this code however you'd like, just keep this license and
attribute. Let me know if you make hugely, awesome, great changes.
This sketch draws an analog and digital clock on the Color LCD
Shield. You can also use the on-board buttons to set the hours
and minutes.
Use the defines at the top of the code to set the initial time.
You can also adjust the size and color of the clock.
To set the time, first hit S3. Then use S1 and S2 to adjust the
hours and minutes respsectively. Hit S3 to start the clock
back up.
This example code should give you a good idea of how to use
the setCircle, setLine, and setStr functions of the Color LCD
Shield Library.
*/
// Modified by Befun Hung on Jun. 22, 2014
// 1) Sync time with DS1307 real time clock
// 2) Use onboard keypad to adjust DS1307 time parameter
// Press S1 get into adjustment mode,
// Press S2 to adjust or
// Press S3 to select which parameter to be adjusted with default to hour
// Press S1 to save parameters to DS1307
// 3) Show date and weekday
// 4) Minor adjustment of analog clock
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
#include <ColorLCDShield.h>
char *dayOfWeek[] = {"", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
time_t t;
int displayAtSecond;
#define CLOCK_RADIUS 41 // radius of clock face
#define CLOCK_CENTER 50 // If you adjust the radius, you'll probably want to adjust this
#define H_LENGTH 23 // length of hour hand
#define M_LENGTH 33 // length of minute hand
#define S_LENGTH 37 // length of second hand
#define BACKGROUND BLACK // room for growth, adjust the background color according to daylight
#define C_COLOR RED // This is the color of the clock face, and digital clock
#define H_COLOR BLUE // hour hand color
#define M_COLOR GREEN // minute hand color
#define S_COLOR YELLOW // second hand color
LCDShield lcd;
int years, months, days;
int hours, minutes, seconds;
int buttonPins[3] = {3, 4, 5};
void setup()
{
/* Set up the button pins as inputs, set pull-up resistor */
for (int i=0; i<3; i++)
{
pinMode(buttonPins[i], INPUT);
digitalWrite(buttonPins[i], HIGH);
}
/* Initialize the LCD, set the contrast, clear the screen */
lcd.init(PHILIPS);
lcd.contrast(-63);
lcd.clear(BACKGROUND);
setSyncProvider(RTC.get); // the function to get the time from the RTC
}
void loop()
{
t = now();
years = year(t);
months = month(t);
days = day(t);
hours = hour(t);
minutes = minute(t);
seconds = second(t);
if (!digitalRead(buttonPins[2]))
setTime(); // If S3 was pressed, go set the time
if (displayAtSecond != second(t)) {
drawClock(); // Draw the clock face, this includes 12, 3, 6, 9
displayAnalogTime(hours, minutes, seconds); // Draw the clock hands
displayDateDayOfWeek(years, months, days);
displayDigitalTime(hours, minutes, seconds); // Draw the digital clock text
displayAtSecond = second(t);
}
}
/*
setTime uses on-shield switches S1, S2, and S3 to set the time
pressing S3 will exit the function. S1 increases hours, S2
increases seconds.
*/
void setTime()
{
int setVariable = 3, checkStatus = 0;
/* Reset the clock */
years = year(t);
months = month(t);
days = day(t);
hours = hour(t);
minutes = minute(t);
seconds = second(t);
/* Draw the clock, so we can see the new time */
drawClock();
displayAnalogTime(hours, minutes, seconds);
displayDateDayOfWeek(years, months, days);
displayDigitalTime(hours, minutes, seconds);
while (!digitalRead(buttonPins[2]))
; // wait till they let go of S1
/* We'll run around this loop until S3 is pressed again */
while(digitalRead(buttonPins[2]))
{
/* If S1 is pressed, we'll update the hours */
if (!digitalRead(buttonPins[0]))
{
delay(100);
setVariable = (setVariable + 1) % 6; // Select year, month, day, hour, minute, second to change, default is year
/* and update the clock, so we can see it */
drawClock();
displayAnalogTime(hours, minutes, seconds);
displayDateDayOfWeek(years, months, days);
displayDigitalTime(hours, minutes, seconds);
}
if (!digitalRead(buttonPins[1]))
{
delay(100);
switch (setVariable) {
case 0:{
years = ((years + 1) % 100) + 2000;
break;
}
case 1:{
months = (months % 12) + 1;
break;
}
case 2:{
days = (days % 31) + 1;
break;
}
case 3:{
hours = (hours + 1) % 24;
break;
}
case 4:{
minutes = (minutes + 1) % 60;
break;
}
case 5:{
seconds = (seconds + 1) % 60;
break;
}
}
// minutes++; // Increase minutes by 1
// if (minutes >= 60)
// minutes = 0; // If minutes is 60, set it back to 0
/* and update the clock, so we can see it */
drawClock();
displayAnalogTime(hours, minutes, seconds);
displayDateDayOfWeek(years, months, days);
displayDigitalTime(hours, minutes, seconds);
}
}
/* Once S3 is pressed, we'll exit, but not until it's released */
while(!digitalRead(buttonPins[2]))
;
if ((months == 1 || months == 3 || months == 5 || months == 7 || months == 8 || months == 10 || months == 12) && days <= 31) checkStatus = 1;
if ((months == 4 || months == 6 || months == 9 || months == 11) && days <=30) checkStatus = 1;
if ((months == 2 && (years % 4) == 0) && days <= 29) checkStatus = 1;
if ((months == 2 && (years % 4) != 0) && days <= 28) checkStatus = 1;
if (checkStatus) {
setTime(hours, minutes, seconds, days, months, years);
RTC.set(now());
}
}
/*
displayDateDayOfWeek() takes in values for years, months, days.
It'll print the date, day of week, in digital format, on the
bottom of the screen.
*/
void displayDateDayOfWeek(int y, int m, int d)
{
char dateChar[12];
sprintf(dateChar, "%.4d-%.2d-%.2d ", y, m, d);
/* Print the time on the clock */
lcd.setStr(dateChar, 90, 10,
C_COLOR, BACKGROUND);
lcd.setStr(dayOfWeek[weekday()], 90, 98,
C_COLOR, BACKGROUND);
}
/*
displayDigitalTime() takes in values for hours, minutes and
seconds. It'll print the time, in digital format, on the
bottom of the screen.
*/
void displayDigitalTime(int h, int m, int s)
{
char timeChar[10]; // adjust the number of characters to avoid odd display
sprintf(timeChar, "%.2d:%.2d:%.2d", h, m, s);
/* Print the time on the clock */
lcd.setStr(timeChar, 105, 26, C_COLOR, BACKGROUND);
}
/*
drawClock() simply draws the outer circle of the clock, and '12',
'3', '6', and '9'. Room for growth here, if you want to customize
your clock. Maybe add dashe marks, or even all 12 digits.
*/
void drawClock()
{
/* Draw the circle */
lcd.setCircle(CLOCK_CENTER, 66, CLOCK_RADIUS, C_COLOR);
/* Print 12, 3, 6, 9, a lot of arbitrary values are used here
for the coordinates. Just used trial and error to get them
into a nice position. */
lcd.setStr("12", CLOCK_CENTER - CLOCK_RADIUS, 66-9, C_COLOR, BACKGROUND);
lcd.setStr("3", CLOCK_CENTER - 9, 66 + CLOCK_RADIUS - 12, C_COLOR, BACKGROUND);
lcd.setStr("6", CLOCK_CENTER + CLOCK_RADIUS - 18, 66-4, C_COLOR, BACKGROUND);
lcd.setStr("9", CLOCK_CENTER - 9, 66 - CLOCK_RADIUS + 4, C_COLOR, BACKGROUND);
}
/*
displayAnalogTime() draws the three clock hands in their proper
position. Room for growth here, I'd like to make the clock hands
arrow shaped, or at least thicker and more visible.
*/
void displayAnalogTime(int h, int m, int s)
{
double midHours; // this will be used to slightly adjust the hour hand
static int hx, hy, mx, my, sx, sy;
/* Adjust time to shift display 90 degrees ccw
this will turn the clock the same direction as text */
h -= 3;
m -= 15;
s -= 15;
if (h <= 0)
h += 12;
if (m < 0)
m += 60;
if (s < 0)
s += 60;
/* Delete old lines: */
lcd.setLine(CLOCK_CENTER, 66, CLOCK_CENTER+sx, 66+sy, BACKGROUND); // delete second hand
lcd.setLine(CLOCK_CENTER, 66, CLOCK_CENTER+mx, 66+my, BACKGROUND); // delete minute hand
lcd.setLine(CLOCK_CENTER, 66, CLOCK_CENTER+hx, 66+hy, BACKGROUND); // delete hour hand
/* Calculate and draw new lines: */
s = map(s, 0, 60, 0, 360); // map the 0-60, to "360 degrees"
sx = S_LENGTH * sin(3.14 * ((double) s)/180); // woo trig!
sy = S_LENGTH * cos(3.14 * ((double) s)/180); // woo trig!
lcd.setLine(CLOCK_CENTER, 66, CLOCK_CENTER+sx, 66+sy, S_COLOR); // print second hand
m = map(m, 0, 60, 0, 360); // map the 0-60, to "360 degrees"
mx = M_LENGTH * sin(3.14 * ((double) m)/180); // woo trig!
my = M_LENGTH * cos(3.14 * ((double) m)/180); // woo trig!
lcd.setLine(CLOCK_CENTER, 66, CLOCK_CENTER+mx, 66+my, M_COLOR); // print minute hand
midHours = minutes/12; // midHours is used to set the hours hand to middling levels between whole hours
h *= 5; // Get hours and midhours to the same scale
h += midHours; // add hours and midhours
h = map(h, 0, 60, 0, 360); // map the 0-60, to "360 degrees"
hx = H_LENGTH * sin(3.14 * ((double) h)/180); // woo trig!
hy = H_LENGTH * cos(3.14 * ((double) h)/180); // woo trig!
lcd.setLine(CLOCK_CENTER, 66, CLOCK_CENTER+hx, 66+hy, H_COLOR); // print hour hand
}
Labels:
Adjust,
Adjustable,
Arduino,
Color,
DS1307,
Freeduino,
Keypad,
LCD,
Library,
Real Time Clock,
RTC,
Shield,
Time Library,
Time.h
2013/08/21
NTP Server Synchronized DS1307 RTC Analog Data Logger
This sketch combine analog sensor data logger on Aug. 15, 2013 and NTP server synchronized DS1307 RTC using TimeAlarm library on Aug. 17, 2013.
The shetch use fixed IP, so DHCP server is not needed in the local area network.
Because the RTC is synchronized with NTP server, so the data logger keeps the time within 5 seconds. The NTP sync may fail sometimes depending on the network conditions.
Sketch
/*
* NTPSynchronizedAnalogDataLogger.ino
*
* This sketch calls alarm functions at 7:30 am and at 7:30 pm (19:30)
* and sync DS1307, Arduino system time
*
* At startup the system time read from DS1307, then both sync with NTP
*/
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <TimeAlarms.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <SD.h>
#define analogSensorStart 3 // sensor connect to A3
#define analogSensorEnd 3 // sensor connect to A3
// Enter a MAC address for your controller bellow.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[] = {192, 168, 1, 177};
unsigned int localPort = 8888; // local port to listen for UDP packets
IPAddress timeServer(140, 112, 2, 188); // ntp2.ntu.edu.tw NTP server
const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[NTP_PACKET_SIZE]; // buffer to hold incoming and outgoing packets
// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
// timeZoneOffset = (Time Zone) * 3600L eg. (+8) * 3600L = 28800L for Taipei, Taiwan
const long timeZoneOffset = 28800L;
// sync to NTP server every "ntpSyncTime" seconds, set to 1 hour or more to be reasonable
unsigned long ntpSyncTime = 21600;
// adjust the sync latency with computer NTP client in seconds
unsigned int syncLatency = 2;
// sd card variables
File file; // test file
const uint8_t SD_CS = 4; // SD chip select
String file_name = ""; // file name should not prefix with "prefix_word"
char fn[] = "MMDDHHMM.CSV";
int i=0;
int displayAtSecond = 0;
time_t t;
//------------------------------------------------------------------------------
// call back for file timestamps
void dateTime(uint16_t* date, uint16_t* time) {
time_t timeStamp = now();
// return date using FAT_DATE macro to format fields
*date = FAT_DATE(year(timeStamp), month(timeStamp), day(timeStamp));
// return time using FAT_TIME macro to format fields
*time = FAT_TIME(hour(timeStamp), minute(timeStamp), second(timeStamp));
}
//------------------------------------------------------------------------------
void setup()
{
Serial.begin(9600);
Wire.begin();
setSyncProvider(RTC.get); // the function to get the time from the RTC
if (timeStatus() != timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");
// set date time callback function
SdFile::dateTimeCallback(dateTime);
// display RTC time
Serial.print(year());
Serial.print('-');
Serial.print(month());
Serial.print('-');
Serial.print(day());
Serial.print(' ');
Serial.print(hour());
Serial.print(':');
Serial.print(minute());
Serial.print(':');
Serial.print(second());
Serial.println(" --- RTC Time");
// create the alarms
Alarm.alarmRepeat(7,30,0, ntpSyncDS1307); // 7:30am every day
Alarm.alarmRepeat(19,30,0, ntpSyncDS1307); // 7:30pm every day
// start Ethernet and UDP
Ethernet.begin(mac, ip);
Udp.begin(localPort);
// Serial.println("connect to ntp server");
ntpSyncDS1307();
// process file name string
t = now();
if (month(t) < 10) {
file_name = String(file_name + '0' + String(month(t), DEC));
}
else {
file_name = String(file_name +String(month(t), DEC));
}
if (day(t) < 10) {
file_name = String(file_name + '0' + String(day(t), DEC));
}
else {
file_name = String(file_name +String(day(t), DEC));
}
if (hour(t) < 10) {
file_name = String(file_name + '0' + String(hour(t), DEC));
}
else {
file_name = String(file_name +String(hour(t), DEC));
}
if (minute(t) < 10) {
file_name = String(file_name + '0' + String(minute(t), DEC));
}
else {
file_name = String(file_name +String(minute(t), DEC));
}
file_name = String(file_name + ".CSV");
for (i=0;i<=file_name.length();i++) {
fn[i] = file_name.charAt(i);
}
Serial.print("File Name: ");
Serial.println(fn);
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);
if (!SD.begin(SD_CS)) {
Serial.println("SD failed");
// while(1);
}
}
void loop(){
t = now();
if (displayAtSecond != second(t)) {
analogSensorDataLogger();
displayAtSecond = second(t);
}
Alarm.delay(100); // wait 1/10 second between cycles
}
// functions to be called when an alarm triggers:
void ntpSyncDS1307() {
sendNTPpacket(timeServer); // send an NTP packet to a time server
// wait to see if a replay is available
delay(1000);
if (Udp.parsePacket()) {
// We've received a packet, read the data from it
Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer
// the timstamp starts at byte 40 of the received packet and is four bytes,
// or two words, long. First, extract the two words:
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// combine the four bytes (two words) into a long integer
// this is NTP time (seconds since Jan 1 1900)
unsigned long secsSince1900 = highWord << 16 | lowWord;
// now convert NTP time into everyday time:
// Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
const unsigned long seventyYears = 2208988800L;
// substract seventy years:
unsigned long epoch = secsSince1900 - seventyYears + timeZoneOffset + syncLatency;
setTime(epoch);
RTC.set(epoch);
// output time and "Sync OK" message every sync
Serial.print(year());
Serial.print('-');
Serial.print(month());
Serial.print('-');
Serial.print(day());
Serial.print(' ');
Serial.print(hour());
Serial.print(':');
Serial.print(minute());
Serial.print(':');
Serial.print(second());
Serial.print(' ');
Serial.println("Sync OK");
}
}
// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address) {
// set all bytes in the buffer to 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
packetBuffer[0] = 0b11100011; // LI, Version, Mode
packetBuffer[1] = 0; // Stratum, or type of clodk
packetBuffer[2] = 6; // Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123);
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}
void analogSensorDataLogger() {
String data_string = "";
data_string = String(year(t), DEC);
data_string += "/";
if (month(t) < 10) {
data_string = String(data_string + '0' + String(month(t), DEC));
}
else {
data_string = String(data_string +String(month(t), DEC));
}
data_string += "/";
if (day(t) < 10) {
data_string = String(data_string + '0' + String(day(t), DEC));
}
else {
data_string = String(data_string +String(day(t), DEC));
}
data_string += " ";
if (hour(t) < 10) {
data_string = String(data_string + '0' + String(hour(t), DEC));
}
else {
data_string = String(data_string +String(hour(t), DEC));
}
data_string += ":";
if (minute(t) < 10) {
data_string = String(data_string + '0' + String(minute(t), DEC));
}
else {
data_string = String(data_string +String(minute(t), DEC));
}
data_string += ":";
if (second(t) < 10) {
data_string = String(data_string + '0' + String(second(t), DEC));
}
else {
data_string = String(data_string +String(second(t), DEC));
}
data_string += ",";
//read sensor value from A0-A3 and append to the string
for (int analogPin = analogSensorStart; analogPin <= analogSensorEnd; analogPin++)
{
int sensor = analogRead(analogPin);
data_string += String(sensor);
if (analogPin < analogSensorEnd) {
data_string += ",";
}
}
file = SD.open(fn, FILE_WRITE);
if (file) {
file.println(data_string);
file.close();
Serial.println(data_string);
}
else {
Serial.print("error opening ");
Serial.println(fn);
}
}
Labels:
Analog,
Arduino,
Data,
Datalogger,
DS1307,
Freeduino,
Library,
LM35,
Logger,
MicroSD,
NTP,
Real Time Clock,
RTC,
SD,
sync,
Synchronize,
Temperature,
Time,
TimeAlarms.h
2013/08/04
NTP Server Synchronized LCD Keypad Adjustable Clock With Temperature Using Time.h Library
This sketch extend from post on Aug. 01, 2013 by adding synchronizing with NTP server.The Uno will synchronize with NTP server every 6 hours and override the time adjusted by using LCD shield keypad. An alternative to synchronize at certain time is to use Alarm.alarmRepeat() function in <TimAlarms.h>. The latency is about 2 seconds in my case, adjust the latency according your Internet connection condition. The binary sketch size is 19,614 bytes.
Requirements:
1. Arduino Uno R3
2. RTC (DS1307) Sensor Shield
3. W5100 Ethernet Shield
4. LCD Keypad Shield
5. LM35 Temperature Sensor Breakout
Usage
1. Use <RIGHT> keypad to enter set mode.
2. Use <RIGHT> to navigate on parameter to be modified.
3. Use <UP> to set value of the aimed parameter.
4. Use <DOWN> to set value of the aimed parameter.
5. Use <SELECT> to save date and time to RTC.
6. Use <LEFT> to leave set mode.
Schetch
/*
* TimeRTC.pde
* example code illustrating Time library with Real Time Clock.
* the sketch works on Arduino IDE 1.05
* 1) modified by Befun Hung on Jul. 28, 2013
* changing the sequence to year, month, day, hour, minute, second
* adding the day of week
* almost same function as sketch on May 1, 2012
* 2) modified by Befun Hung on Jul. 29, 2013
* change display device to LCD Shield
* adding temperature readout from LM35
* the sketch does not contain delay() in the loop section
* 3) modified by Befun Hung on Jul. 31, 2013
* divide digitalClockDisplay() into dateDisplay(), weekdayDisplay(), timeDisplay() and temperatureDisplay()
* use time_t t to store the value of now()
* 4) modified by Befun Hung on Aug. 04, 2013
* adding ntpSyncDS1307() to synchronize DS1307 real time clock with NTP server
*/
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7);
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
char *dayOfWeek[] = {"", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
int lcdKey = 0;
int adcKeyIn = 0;
time_t t;
int potPin = 3; // change potPin value to 0, 1, 2 for A0, A1, A2 respectly
float temperature = 0;
int displayAtSecond;
// Enter a MAC address for your controller bellow.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
unsigned int localPort = 8888; // local port to listen for UDP packets
IPAddress timeServer(140, 112, 2, 188); // ntp2.ntu.edu.tw NTP server
const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[NTP_PACKET_SIZE]; // buffer to hold incoming and outgoing packets
// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
// timeZoneOffset = (Time Zone) * 3600L eg. (+8) * 3600L = 28800L for Taipei, Taiwan
const long timeZoneOffset = 28800L;
// sync to NTP server every "ntpSyncTime" seconds, set to 1 hour or more to be reasonable
unsigned long ntpSyncTime = 21600;
// keep track of how long ago we updated the NTP server
unsigned long ntpLastUpdate = 0;
// adjust the sync latency with computer NTP client in seconds
unsigned int syncLatency = 2;
void setup() {
lcd.begin(16,2);
lcd.print("*cheaphousetek*");
lcd.setCursor(0,1);
setSyncProvider(RTC.get); // the function to get the time from the RTC
if(timeStatus()!= timeSet)
lcd.print("Unable to sync");
else
lcd.print("Sync system time ");
displayAtSecond = second();
delay(2000);
lcd.clear();
// start Ethernet and UDP
if (Ethernet.begin(mac) == 0) {
lcd.setCursor(0,1);
lcd.print("DHCP failed");
for (;;);
}
Udp.begin(localPort);
}
void loop()
{
if ((now() - ntpLastUpdate) >= ntpSyncTime) {
ntpSyncDS1307();
}
// for reading keypad stroke to set the date and time once the RIGHT is pressed
t = now();
lcdKey = readLCDButton();
if (lcdKey == btnRIGHT) {
keypadSetDateTime();
}
// for LCD shield to disp date, day of the week, time and temperature once a second
if (displayAtSecond != second(t)) {
digitalClockDisplay();
displayAtSecond = second(t);
}
}
int readLCDButton() {
adcKeyIn = analogRead(0);
delay(200);
// read the value from the sensor
// my buttons when read are centered at these values: 0, 144, 329, 504, 741
// we add approx 50 to those values and check to see if we are close
if (adcKeyIn > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
if (adcKeyIn < 73) return btnRIGHT;
if (adcKeyIn < 237) return btnUP;
if (adcKeyIn < 415) return btnDOWN;
if (adcKeyIn < 623) return btnLEFT;
if (adcKeyIn < 882) return btnSELECT;
return btnNONE; // when all others fail, return this...
}
void digitalClockDisplay(){
// digital clock display of the time
dateDisplay();
weekdayDisplay();
timeDisplay();
temperatureDisplay();
}
void dateDisplay() {
lcd.setCursor(0,0);
lcd.print(year(t));
lcd.print('-');
if (month(t) < 10) {
lcd.print('0');
}
lcd.print(month(t));
lcd.print('-');
if (day(t) < 10) {
lcd.print('0');
}
lcd.print(day(t));
// lcd.print(' ');
}
void weekdayDisplay() {
lcd.setCursor(11,0);
lcd.print(dayOfWeek[weekday()]);
}
void timeDisplay() {
lcd.setCursor(0,1);
if (hour(t) < 10) {
lcd.print('0');
}
lcd.print(hour(t));
lcd.print(':');
if (minute(t) < 10) {
lcd.print('0');
}
lcd.print(minute(t));
lcd.print(':');
if (second(t) < 10) {
lcd.print('0');
}
lcd.print(second(t));
// lcd.print(' ');
}
void temperatureDisplay() {
int span = 10;
long aRead = 0;
unsigned long temp;
for (int i=0;i<span;i++) {
aRead = aRead + analogRead(potPin);
}
temperature = (aRead / span * 500.0 / 1024.0); // for other analog sensor change the constants
printTenths(long (temperature * 10));
lcd.setCursor(14,1);
lcd.print(char(223));
// lcd.setCursor(15,1);
lcd.print('C');
}
void printTenths(long value) {
// prints a value of 123 as 12.3
lcd.setCursor(10,1);
lcd.print(value / 10);
lcd.setCursor(12,1);
lcd.print('.');
lcd.setCursor(13,1);
lcd.print(value % 10);
}
void keypadSetDateTime() {
int setYear=year(t), setMonth=month(t), setDay=day(t), setHour=hour(t), setMinute=minute(t), setSecond=second(t);
int setVariable=0, checkStatus=0;
dateDisplay();
timeDisplay();
while(true) {
lcdKey = readLCDButton();
switch(lcdKey) {
case btnNONE:
{
lcd.blink();
if (setVariable == 0) lcd.setCursor(3,0);
if (setVariable == 1) lcd.setCursor(6,0);
if (setVariable == 2) lcd.setCursor(9,0);
if (setVariable == 3) lcd.setCursor(1,1);
if (setVariable == 4) lcd.setCursor(4,1);
if (setVariable == 5) lcd.setCursor(7,1);
break;
}
case btnRIGHT:
{
setVariable = (setVariable + 1) % 6;
break;
}
case btnLEFT:
{
lcd.noBlink();
lcd.clear();
return;
}
case btnUP:
{
if (setVariable == 0) {
setYear = ((setYear + 1) % 100) + 2000;
lcd.setCursor(0,0);
lcd.print(setYear);
}
if (setVariable == 1) {
setMonth = (setMonth % 12) + 1;
lcd.setCursor(5,0);
if (setMonth < 10) {
lcd.print('0');
lcd.print(setMonth);
}
else {
lcd.print(setMonth);
}
}
if (setVariable == 2) {
setDay = (setDay % 31) + 1;
lcd.setCursor(8,0);
if (setDay < 10) {
lcd.print('0');
lcd.print(setDay);
}
else {
lcd.print(setDay);
}
}
if (setVariable == 3) {
setHour = (setHour + 1) % 24;
lcd.setCursor(0,1);
if (setHour < 10) {
lcd.print('0');
lcd.print(setHour);
}
else {
lcd.print(setHour);
}
}
if (setVariable == 4) {
setMinute = (setMinute + 1) % 60;
lcd.setCursor(3,1);
if (setMinute < 10) {
lcd.print('0');
lcd.print(setMinute);
}
else {
lcd.print(setMinute);
}
}
if (setVariable == 5) {
setSecond = (setSecond + 1) % 60;
lcd.setCursor(6,1);
if (setSecond < 10) {
lcd.print('0');
lcd.print(setSecond);
}
else {
lcd.print(setSecond);
}
}
break;
}
case btnDOWN:
{
if (setVariable == 0) {
setYear = ((setYear - 1) % 100) + 2000;
lcd.setCursor(0,0);
lcd.print(setYear);
}
if (setVariable == 1) {
setMonth = ((setMonth - 1) % 12);
if (setMonth == 0) {
setMonth = setMonth + 12;
}
lcd.setCursor(5,0);
if (setMonth < 10) {
lcd.print('0');
lcd.print(setMonth);
}
else {
lcd.print(setMonth);
}
}
if (setVariable == 2) {
setDay = ((setDay - 1) % 31);
if (setDay == 0) {
setDay = setDay + 31;
}
lcd.setCursor(8,0);
if (setDay < 10) {
lcd.print('0');
lcd.print(setDay);
}
else {
lcd.print(setDay);
}
}
if (setVariable == 3) {
setHour = (setHour - 1 + 24) % 24;
lcd.setCursor(0,1);
if (setHour < 10) {
lcd.print('0');
lcd.print(setHour);
}
else {
lcd.print(setHour);
}
}
if (setVariable == 4) {
setMinute = (setMinute - 1 + 60) % 60;
lcd.setCursor(3,1);
if (setMinute < 10) {
lcd.print('0');
lcd.print(setMinute);
}
else {
lcd.print(setMinute);
}
}
if (setVariable == 5) {
setSecond = (setSecond - 1 + 60) % 60;
lcd.setCursor(6,1);
if (setSecond < 10) {
lcd.print('0');
lcd.print(setSecond);
}
else {
lcd.print(setSecond);
}
}
break;
}
case btnSELECT:
{
if ((setMonth == 1 || setMonth == 3 || setMonth == 5 || setMonth == 7 || setMonth == 8 || setMonth == 10 || setMonth == 12) && setDay <= 31) checkStatus = 1;
if ((setMonth == 4 || setMonth == 6 || setMonth == 9 || setMonth == 11) && setDay <=30) checkStatus = 1;
if ((setMonth == 2 && (setYear % 4) == 0) && setDay <= 29) checkStatus = 1;
if ((setMonth == 2 && (setYear % 4) != 0) && setDay <= 28) checkStatus = 1;
if (checkStatus) {
setTime(setHour, setMinute, setSecond, setDay, setMonth, setYear);
RTC.set(now());
}
break;
}
}
}
}
void ntpSyncDS1307() {
sendNTPpacket(timeServer); // send an NTP packet to a time server
// wait to see if a replay is available
delay(1000);
if (Udp.parsePacket()) {
// We've received a packet, read the data from it
Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer
// the timstamp starts at byte 40 of the received packet and is four bytes,
// or two words, long. First, extract the two words:
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// combine the four bytes (two words) into a long integer
// this is NTP time (seconds since Jan 1 1900)
unsigned long secsSince1900 = highWord << 16 | lowWord;
// now convert NTP time into everyday time:
// Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
const unsigned long seventyYears = 2208988800L;
// substract seventy years:
unsigned long epoch = secsSince1900 - seventyYears + timeZoneOffset + syncLatency;
setTime(epoch);
RTC.set(epoch);
ntpLastUpdate = now();
}
}
// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address) {
// set all bytes in the buffer to 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
packetBuffer[0] = 0b11100011; // LI, Version, Mode
packetBuffer[1] = 0; // Stratum, or type of clodk
packetBuffer[2] = 6; // Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123);
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}
Requirements:
1. Arduino Uno R3
2. RTC (DS1307) Sensor Shield
3. W5100 Ethernet Shield
4. LCD Keypad Shield
5. LM35 Temperature Sensor Breakout
Usage
1. Use <RIGHT> keypad to enter set mode.
2. Use <RIGHT> to navigate on parameter to be modified.
3. Use <UP> to set value of the aimed parameter.
4. Use <DOWN> to set value of the aimed parameter.
5. Use <SELECT> to save date and time to RTC.
6. Use <LEFT> to leave set mode.
Schetch
/*
* TimeRTC.pde
* example code illustrating Time library with Real Time Clock.
* the sketch works on Arduino IDE 1.05
* 1) modified by Befun Hung on Jul. 28, 2013
* changing the sequence to year, month, day, hour, minute, second
* adding the day of week
* almost same function as sketch on May 1, 2012
* 2) modified by Befun Hung on Jul. 29, 2013
* change display device to LCD Shield
* adding temperature readout from LM35
* the sketch does not contain delay() in the loop section
* 3) modified by Befun Hung on Jul. 31, 2013
* divide digitalClockDisplay() into dateDisplay(), weekdayDisplay(), timeDisplay() and temperatureDisplay()
* use time_t t to store the value of now()
* 4) modified by Befun Hung on Aug. 04, 2013
* adding ntpSyncDS1307() to synchronize DS1307 real time clock with NTP server
*/
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7);
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
char *dayOfWeek[] = {"", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
int lcdKey = 0;
int adcKeyIn = 0;
time_t t;
int potPin = 3; // change potPin value to 0, 1, 2 for A0, A1, A2 respectly
float temperature = 0;
int displayAtSecond;
// Enter a MAC address for your controller bellow.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
unsigned int localPort = 8888; // local port to listen for UDP packets
IPAddress timeServer(140, 112, 2, 188); // ntp2.ntu.edu.tw NTP server
const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[NTP_PACKET_SIZE]; // buffer to hold incoming and outgoing packets
// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
// timeZoneOffset = (Time Zone) * 3600L eg. (+8) * 3600L = 28800L for Taipei, Taiwan
const long timeZoneOffset = 28800L;
// sync to NTP server every "ntpSyncTime" seconds, set to 1 hour or more to be reasonable
unsigned long ntpSyncTime = 21600;
// keep track of how long ago we updated the NTP server
unsigned long ntpLastUpdate = 0;
// adjust the sync latency with computer NTP client in seconds
unsigned int syncLatency = 2;
void setup() {
lcd.begin(16,2);
lcd.print("*cheaphousetek*");
lcd.setCursor(0,1);
setSyncProvider(RTC.get); // the function to get the time from the RTC
if(timeStatus()!= timeSet)
lcd.print("Unable to sync");
else
lcd.print("Sync system time ");
displayAtSecond = second();
delay(2000);
lcd.clear();
// start Ethernet and UDP
if (Ethernet.begin(mac) == 0) {
lcd.setCursor(0,1);
lcd.print("DHCP failed");
for (;;);
}
Udp.begin(localPort);
}
void loop()
{
if ((now() - ntpLastUpdate) >= ntpSyncTime) {
ntpSyncDS1307();
}
// for reading keypad stroke to set the date and time once the RIGHT is pressed
t = now();
lcdKey = readLCDButton();
if (lcdKey == btnRIGHT) {
keypadSetDateTime();
}
// for LCD shield to disp date, day of the week, time and temperature once a second
if (displayAtSecond != second(t)) {
digitalClockDisplay();
displayAtSecond = second(t);
}
}
int readLCDButton() {
adcKeyIn = analogRead(0);
delay(200);
// read the value from the sensor
// my buttons when read are centered at these values: 0, 144, 329, 504, 741
// we add approx 50 to those values and check to see if we are close
if (adcKeyIn > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
if (adcKeyIn < 73) return btnRIGHT;
if (adcKeyIn < 237) return btnUP;
if (adcKeyIn < 415) return btnDOWN;
if (adcKeyIn < 623) return btnLEFT;
if (adcKeyIn < 882) return btnSELECT;
return btnNONE; // when all others fail, return this...
}
void digitalClockDisplay(){
// digital clock display of the time
dateDisplay();
weekdayDisplay();
timeDisplay();
temperatureDisplay();
}
void dateDisplay() {
lcd.setCursor(0,0);
lcd.print(year(t));
lcd.print('-');
if (month(t) < 10) {
lcd.print('0');
}
lcd.print(month(t));
lcd.print('-');
if (day(t) < 10) {
lcd.print('0');
}
lcd.print(day(t));
// lcd.print(' ');
}
void weekdayDisplay() {
lcd.setCursor(11,0);
lcd.print(dayOfWeek[weekday()]);
}
void timeDisplay() {
lcd.setCursor(0,1);
if (hour(t) < 10) {
lcd.print('0');
}
lcd.print(hour(t));
lcd.print(':');
if (minute(t) < 10) {
lcd.print('0');
}
lcd.print(minute(t));
lcd.print(':');
if (second(t) < 10) {
lcd.print('0');
}
lcd.print(second(t));
// lcd.print(' ');
}
void temperatureDisplay() {
int span = 10;
long aRead = 0;
unsigned long temp;
for (int i=0;i<span;i++) {
aRead = aRead + analogRead(potPin);
}
temperature = (aRead / span * 500.0 / 1024.0); // for other analog sensor change the constants
printTenths(long (temperature * 10));
lcd.setCursor(14,1);
lcd.print(char(223));
// lcd.setCursor(15,1);
lcd.print('C');
}
void printTenths(long value) {
// prints a value of 123 as 12.3
lcd.setCursor(10,1);
lcd.print(value / 10);
lcd.setCursor(12,1);
lcd.print('.');
lcd.setCursor(13,1);
lcd.print(value % 10);
}
void keypadSetDateTime() {
int setYear=year(t), setMonth=month(t), setDay=day(t), setHour=hour(t), setMinute=minute(t), setSecond=second(t);
int setVariable=0, checkStatus=0;
dateDisplay();
timeDisplay();
while(true) {
lcdKey = readLCDButton();
switch(lcdKey) {
case btnNONE:
{
lcd.blink();
if (setVariable == 0) lcd.setCursor(3,0);
if (setVariable == 1) lcd.setCursor(6,0);
if (setVariable == 2) lcd.setCursor(9,0);
if (setVariable == 3) lcd.setCursor(1,1);
if (setVariable == 4) lcd.setCursor(4,1);
if (setVariable == 5) lcd.setCursor(7,1);
break;
}
case btnRIGHT:
{
setVariable = (setVariable + 1) % 6;
break;
}
case btnLEFT:
{
lcd.noBlink();
lcd.clear();
return;
}
case btnUP:
{
if (setVariable == 0) {
setYear = ((setYear + 1) % 100) + 2000;
lcd.setCursor(0,0);
lcd.print(setYear);
}
if (setVariable == 1) {
setMonth = (setMonth % 12) + 1;
lcd.setCursor(5,0);
if (setMonth < 10) {
lcd.print('0');
lcd.print(setMonth);
}
else {
lcd.print(setMonth);
}
}
if (setVariable == 2) {
setDay = (setDay % 31) + 1;
lcd.setCursor(8,0);
if (setDay < 10) {
lcd.print('0');
lcd.print(setDay);
}
else {
lcd.print(setDay);
}
}
if (setVariable == 3) {
setHour = (setHour + 1) % 24;
lcd.setCursor(0,1);
if (setHour < 10) {
lcd.print('0');
lcd.print(setHour);
}
else {
lcd.print(setHour);
}
}
if (setVariable == 4) {
setMinute = (setMinute + 1) % 60;
lcd.setCursor(3,1);
if (setMinute < 10) {
lcd.print('0');
lcd.print(setMinute);
}
else {
lcd.print(setMinute);
}
}
if (setVariable == 5) {
setSecond = (setSecond + 1) % 60;
lcd.setCursor(6,1);
if (setSecond < 10) {
lcd.print('0');
lcd.print(setSecond);
}
else {
lcd.print(setSecond);
}
}
break;
}
case btnDOWN:
{
if (setVariable == 0) {
setYear = ((setYear - 1) % 100) + 2000;
lcd.setCursor(0,0);
lcd.print(setYear);
}
if (setVariable == 1) {
setMonth = ((setMonth - 1) % 12);
if (setMonth == 0) {
setMonth = setMonth + 12;
}
lcd.setCursor(5,0);
if (setMonth < 10) {
lcd.print('0');
lcd.print(setMonth);
}
else {
lcd.print(setMonth);
}
}
if (setVariable == 2) {
setDay = ((setDay - 1) % 31);
if (setDay == 0) {
setDay = setDay + 31;
}
lcd.setCursor(8,0);
if (setDay < 10) {
lcd.print('0');
lcd.print(setDay);
}
else {
lcd.print(setDay);
}
}
if (setVariable == 3) {
setHour = (setHour - 1 + 24) % 24;
lcd.setCursor(0,1);
if (setHour < 10) {
lcd.print('0');
lcd.print(setHour);
}
else {
lcd.print(setHour);
}
}
if (setVariable == 4) {
setMinute = (setMinute - 1 + 60) % 60;
lcd.setCursor(3,1);
if (setMinute < 10) {
lcd.print('0');
lcd.print(setMinute);
}
else {
lcd.print(setMinute);
}
}
if (setVariable == 5) {
setSecond = (setSecond - 1 + 60) % 60;
lcd.setCursor(6,1);
if (setSecond < 10) {
lcd.print('0');
lcd.print(setSecond);
}
else {
lcd.print(setSecond);
}
}
break;
}
case btnSELECT:
{
if ((setMonth == 1 || setMonth == 3 || setMonth == 5 || setMonth == 7 || setMonth == 8 || setMonth == 10 || setMonth == 12) && setDay <= 31) checkStatus = 1;
if ((setMonth == 4 || setMonth == 6 || setMonth == 9 || setMonth == 11) && setDay <=30) checkStatus = 1;
if ((setMonth == 2 && (setYear % 4) == 0) && setDay <= 29) checkStatus = 1;
if ((setMonth == 2 && (setYear % 4) != 0) && setDay <= 28) checkStatus = 1;
if (checkStatus) {
setTime(setHour, setMinute, setSecond, setDay, setMonth, setYear);
RTC.set(now());
}
break;
}
}
}
}
void ntpSyncDS1307() {
sendNTPpacket(timeServer); // send an NTP packet to a time server
// wait to see if a replay is available
delay(1000);
if (Udp.parsePacket()) {
// We've received a packet, read the data from it
Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer
// the timstamp starts at byte 40 of the received packet and is four bytes,
// or two words, long. First, extract the two words:
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// combine the four bytes (two words) into a long integer
// this is NTP time (seconds since Jan 1 1900)
unsigned long secsSince1900 = highWord << 16 | lowWord;
// now convert NTP time into everyday time:
// Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
const unsigned long seventyYears = 2208988800L;
// substract seventy years:
unsigned long epoch = secsSince1900 - seventyYears + timeZoneOffset + syncLatency;
setTime(epoch);
RTC.set(epoch);
ntpLastUpdate = now();
}
}
// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address) {
// set all bytes in the buffer to 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
packetBuffer[0] = 0b11100011; // LI, Version, Mode
packetBuffer[1] = 0; // Stratum, or type of clodk
packetBuffer[2] = 6; // Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123);
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}
Labels:
Adjust,
Adjustable,
Arduino,
Clock,
Freeduino,
Keypad,
LCD,
Library,
LM35,
NTP,
Real Time Clock,
RTC,
Sensor,
Server,
Shield,
Synchronize,
Synchronized,
Synchronizing,
Temperature,
Time.h
2013/07/28
Display Date and Time In Arduino Serial Monitor Using Time.h
First, Download Time.h from the following link.
http://playground.arduino.cc/uploads/Code/Time.zip
Read usage of Time.h library.
http://playground.arduino.cc/Code/time
The function is almost same as the sketch post on May 1, 2012, except adding displaying the day of week.
Pins Used
Analog pins 4.and 5 are used for I2C protocol implemented by Maxim DS1307.
Serial Monitor Output
Sketch
/*
* TimeRTC.pde
* example code illustrating Time library with Real Time Clock.
* the sketch works on Arduino IDE 1.05
* modified by Befun Horng on Jul. 28, 2013
* changing the sequence to year, month, day, hour, minute, second
* adding the day of week
* almost same function as sketch on May 1, 2012
*/
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
char *dayOfWeek[] = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
void setup() {
Serial.begin(9600);
setSyncProvider(RTC.get); // the function to get the time from the RTC
if(timeStatus()!= timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");
}
void loop()
{
digitalClockDisplay();
delay(1000);
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(year());
Serial.print("-");
if (month() < 10) {
Serial.print('0');
}
Serial.print(month());
Serial.print("-");
if (day() < 10) {
Serial.print('0');
}
Serial.print(day());
Serial.print(" ");
Serial.print(dayOfWeek[weekday()]);
Serial.print(' ');
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.print(second());
Serial.println();
}
http://playground.arduino.cc/uploads/Code/Time.zip
Read usage of Time.h library.
http://playground.arduino.cc/Code/time
The function is almost same as the sketch post on May 1, 2012, except adding displaying the day of week.
Pins Used
Analog pins 4.and 5 are used for I2C protocol implemented by Maxim DS1307.
Serial Monitor Output
Sketch
/*
* TimeRTC.pde
* example code illustrating Time library with Real Time Clock.
* the sketch works on Arduino IDE 1.05
* modified by Befun Horng on Jul. 28, 2013
* changing the sequence to year, month, day, hour, minute, second
* adding the day of week
* almost same function as sketch on May 1, 2012
*/
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
char *dayOfWeek[] = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
void setup() {
Serial.begin(9600);
setSyncProvider(RTC.get); // the function to get the time from the RTC
if(timeStatus()!= timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");
}
void loop()
{
digitalClockDisplay();
delay(1000);
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(year());
Serial.print("-");
if (month() < 10) {
Serial.print('0');
}
Serial.print(month());
Serial.print("-");
if (day() < 10) {
Serial.print('0');
}
Serial.print(day());
Serial.print(" ");
Serial.print(dayOfWeek[weekday()]);
Serial.print(' ');
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.print(second());
Serial.println();
}
Labels:
Arduino,
Date,
DS1307,
Freeduino,
Library,
Real Time Clock,
RTC,
Time,
Time Library,
Time.h
Subscribe to:
Posts (Atom)



