6.NTP Clock
非常容易上手的函式庫
ESP8266 Code 如下
#include <NTPClient.h>
// change next line to use with another board/shield
#include <ESP8266WiFi.h>
//#include <WiFi.h> // for WiFi shield
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
#include <WiFiUdp.h>
const char *ssid = "SSID";
const char *password = "PASSWORD";
int GMT = 8;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
void setup(){
Serial.begin(115200);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
timeClient.begin();
}
void loop() {
timeClient.update();
String hours = String(timeClient.getHours() + GMT);
String minutes = String(timeClient.getMinutes());
String seconds = String(timeClient.getSeconds());
String times = hours + ":" + minutes + ":" + seconds;
Serial.println(times);
delay(1000);
}
#include <NTPtimeESP.h>
#define DEBUG_ON
NTPtime NTPch("time.stdtime.gov.tw"); // Choose server pool as required
char *ssid = "SSID"; // Set you WiFi SSID
char *password = "Password"; // Set you WiFi password
strDateTime dateTime;
String actualHour;
String actualMinute;
String actualsecond;
String actualyear;
String actualMonth;
String actualday;
String actualdayofWeek;
char *week[]={"","Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println("Booted");
Serial.println("Connecting to Wi-Fi");
WiFi.mode(WIFI_STA);
WiFi.begin (ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("WiFi connected");
}
void loop() {
// first parameter: Time zone in floating point (for India); second parameter: 1 for European summer time; 2 for US daylight saving time; 0 for no DST adjustment; (contributed by viewwer, not tested by me)
dateTime = NTPch.getNTPtime(8.0, 1);
// check dateTime.valid before using the returned time
// Use "setSendInterval" or "setRecvTimeout" if required
if(dateTime.valid){
actualHour = String(dateTime.hour);
if(dateTime.minute<10){
actualMinute = "0" + String(dateTime.minute);
}else{
actualMinute = String(dateTime.minute);
}
if(dateTime.second<10){
actualsecond ="0" + String(dateTime.second);
}else{
actualsecond =String(dateTime.second);
}
actualyear = String(dateTime.year);
actualMonth = String(dateTime.month);
actualday = String(dateTime.day);
actualdayofWeek = String(dateTime.dayofWeek);
Serial.println(actualyear + "/" + actualMonth + "/" + actualday + "--" + week[dateTime.dayofWeek]);
Serial.println(actualHour + ":" + actualMinute + ":" + actualsecond);
}
}
簡易型RTC時鐘
環保署 空氣品質
新北市 三重 編號:1
苗栗縣 三義 編號:2
新北市 土城 編號:3
臺北市 士林 編號:4
臺北市 大同 編號:5
臺中市 大里 編號:6
桃園市 大園 編號:7
高雄市 大寮 編號:8
高雄市 小港 編號:9
臺北市 中山 編號:10
桃園市 中壢 編號:11
高雄市 仁武 編號:12
雲林縣 斗六 編號:13
宜蘭縣 冬山 編號:14
臺北市 古亭 編號:15
高雄市 左營 編號:16
桃園市 平鎮 編號:17
新北市 永和 編號:18
臺南市 安南 編號:19
嘉義縣 朴子 編號:20
新北市 汐止 編號:21
南投縣 竹山 編號:22
新竹縣 竹東 編號:23
臺中市 西屯 編號:24
臺中市 沙鹿 編號:25
宜蘭縣 宜蘭 編號:26
臺中市 忠明 編號:27
新北市 林口 編號:28
高雄市 林園 編號:29
新北市 板橋 編號:30
臺北市 松山 編號:31
花蓮縣 花蓮 編號:32
金門縣 金門 編號:33
高雄市 前金 編號:34
高雄市 前鎮 編號:35
南投縣 南投 編號:36
屏東縣 屏東 編號:37
屏東縣 恆春 編號:38
高雄市 美濃 編號:39
苗栗縣 苗栗 編號:40
南投縣 埔里 編號:41
桃園市 桃園 編號:42
澎湖縣 馬公 編號:43
連江縣 馬祖 編號:44
基隆市 基隆 編號:45
雲林縣 崙背 編號:46
新北市 淡水 編號:47
雲林縣 麥寮 編號:48
新北市 富貴角 編號:49
高雄市 復興 編號:50
新竹縣 湖口 編號:51
臺南市 善化 編號:52
新北市 菜寮 編號:53
臺北市 陽明 編號:54
新竹市 新竹 編號:55
新北市 新店 編號:56
新北市 新莊 編號:57
嘉義縣 新港 編號:58
臺南市 新營 編號:59
高雄市 楠梓 編號:60
新北市 萬里 編號:61
臺北市 萬華 編號:62
嘉義市 嘉義 編號:63
彰化縣 彰化 編號:64
雲林縣 臺西 編號:65
臺東縣 臺東 編號:66
臺南市 臺南 編號:67
高雄市 鳳山 編號:68
屏東縣 潮州 編號:69
彰化縣 線西 編號:70
高雄市 橋頭 編號:71
苗栗縣 頭份 編號:72
桃園市 龍潭 編號:73
臺中市 豐原 編號:74
臺東縣 關山 編號:75
桃園市 觀音 編號:76
Ver 1.0 顯示日期時間
#include <NTPtimeESP.h>
#define DEBUG_ON
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, 1);
NTPtime NTPch("time.stdtime.gov.tw"); // Choose server pool as required
char *ssid = "SSID"; // Set you WiFi SSID
char *password = "PASSWORD"; // Set you WiFi password
strDateTime dateTime;
String actualHour;
String actualMinute;
String actualsecond;
String actualyear;
String actualMonth;
String actualday;
String actualdayofWeek;
char *week[]={"","Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println("Booted");
Serial.println("Connecting to Wi-Fi");
Wire.begin(0, 2);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
WiFi.mode(WIFI_STA);
WiFi.begin (ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("WiFi connected");
}
void loop() {
// first parameter: Time zone in floating point (for India); second parameter: 1 for European summer time; 2 for US daylight saving time; 0 for no DST adjustment; (contributed by viewwer, not tested by me)
dateTime = NTPch.getNTPtime(8.0, 1);
// check dateTime.valid before using the returned time
// Use "setSendInterval" or "setRecvTimeout" if required
if(dateTime.valid){
actualHour = String(dateTime.hour);
if(dateTime.minute<10){
actualMinute = "0" + String(dateTime.minute);
}else{
actualMinute = String(dateTime.minute);
}
if(dateTime.second<10){
actualsecond ="0" + String(dateTime.second);
}else{
actualsecond =String(dateTime.second);
}
actualyear = String(dateTime.year);
actualMonth = String(dateTime.month);
actualday = String(dateTime.day);
actualdayofWeek = String(dateTime.dayofWeek);
display.clearDisplay();
display.setTextSize(2); // Normal 1:1 pixel scale
display.setTextColor(WHITE); // Draw white text
display.setCursor(5,0); // Start at top-left corner
display.println(actualyear + "/" + actualMonth + "/" + actualday);
display.setCursor(50,25);
display.println(week[dateTime.dayofWeek]);
display.setCursor(20,50);
display.println(actualHour + ":" + actualMinute + ":" + actualsecond);
display.display();
}
}
ver2.0 加上溫溼度爬蟲
#include "ESP8266WiFi.h"
#include "ArduinoJson.h"
#include <NTPtimeESP.h>
#define DEBUG_ON
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, 1);
NTPtime NTPch("time.stdtime.gov.tw");
void get_Weather(); // Function 原型
bool showWeather(char *json);
// ===== Wifi setup =====
const char *ssid = "填入你的SSID";
const char *password = "填入你的PASSWORD";
// ===== setup =====
const char *host = "opendata.cwb.gov.tw";
const char *dataid = "O-A0003-001";
const char *locationName = "板橋";
const char *privateKey = "填入你申請的氣象局API-KEY";
// ===== Variable Number setup =====
static char respBuf[4096];
float data,temp,pres,humd;
unsigned long prevTime,t1,t2;
String actualHour;
String actualMinute;
String actualsecond;
String actualyear;
String actualMonth;
String actualday;
String actualdayofWeek;
char *week[]={"","Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
strDateTime dateTime;
int i=0,limit;
void setup() {
Serial.begin(115200);
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
Wire.begin(0, 2);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED){
delay(200);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void loop(){
t1 = millis();
do{get_time();}while(millis()<t1+7000);
get_Weather();
display.clearDisplay();
display.setTextSize(2); // Normal 1:1 pixel scale
display.setTextColor(WHITE); // Draw white text
display.setCursor(0,0); // Start at top-left corner
display.print("TEMP=");
display.println(temp,1);
display.setCursor(0,21);
display.print("HUMD=");
display.print(int((humd)*100));
display.print(" %");
display.setCursor(0,42);
display.print(pres,1);
display.print(" hPa");
display.display();
delay(3000);
}
void get_Weather(){
Serial.print("Connecting to ");
Serial.println(host);
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {return;}
// Create a URI for the request
String url = "/api/v1/rest/datastore/";
url += dataid;
url += "?Authorization=";
url += privateKey;
url += "&locationName=";
url += locationName;
url += "&elementName=";
url += "TEMP";
url += "&elementName=";
url += "HUMD";
url += "&elementName=";
url += "PRES";
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
client.flush();
int respLen = 0;
bool skip_headers = true;
while (client.connected() || client.available()){
if (skip_headers) {
String aLine = client.readStringUntil('\n');
//Serial.print("aLine=");
//Serial.println(aLine);
if (aLine.length() <= 1) {skip_headers = false;}
}else{
int bytesIn;
bytesIn = client.read((uint8_t *)&respBuf[respLen], sizeof(respBuf) - respLen);
//Serial.print("bytesIn=");
//Serial.println(bytesIn);
if (bytesIn > 0) {respLen += bytesIn;
if (respLen > sizeof(respBuf)){respLen = sizeof(respBuf);}
}else if (bytesIn < 0){Serial.println(F("read error "));}
}
delay(1);
}
Serial.println("closing connection");
client.stop();
if (respLen >= sizeof(respBuf)){Serial.print(F("respBuf overflow "));return;}
respBuf[respLen++] = '\0';
//Serial.print("respBuf=");
//Serial.println(respBuf);
showWeather(respBuf);
}
bool showWeather(char *json){
StaticJsonBuffer<6400> jsonBuffer;
char *jsonstart = strchr(json, '{');
json = jsonstart;
JsonObject& root = jsonBuffer.parseObject(json);
if (!root.success()) { }
int stationId = root["records"]["location"][0]["stationId"];
temp = root["records"]["location"][0]["weatherElement"][0]["elementValue"];
humd = root["records"]["location"][0]["weatherElement"][1]["elementValue"];
pres = root["records"]["location"][0]["weatherElement"][2]["elementValue"];
}
void get_time(){
// first parameter: Time zone in floating point (for India); second parameter: 1 for European summer time; 2 for US daylight saving time; 0 for no DST adjustment; (contributed by viewwer, not tested by me)
dateTime = NTPch.getNTPtime(8.0, 1);
// check dateTime.valid before using the returned time
// Use "setSendInterval" or "setRecvTimeout" if required
if(dateTime.valid){
actualHour = String(dateTime.hour);
if(dateTime.minute<10){
actualMinute = "0" + String(dateTime.minute);
}else{
actualMinute = String(dateTime.minute);
}
if(dateTime.second<10){
actualsecond ="0" + String(dateTime.second);
}else{
actualsecond =String(dateTime.second);
}
actualyear = String(dateTime.year);
actualMonth = String(dateTime.month);
actualday = String(dateTime.day);
actualdayofWeek = String(dateTime.dayofWeek);
if(i==0){limit = int(dateTime.second); }i++;
display.clearDisplay();
display.setTextSize(2); // Normal 1:1 pixel scale
display.setTextColor(WHITE); // Draw white text
display.setCursor(5,0); // Start at top-left corner
display.println(actualyear + "/" + actualMonth + "/" + actualday);
display.setCursor(50,25);
display.println(week[dateTime.dayofWeek]);
display.setCursor(20,50);
display.println(actualHour + ":" + actualMinute + ":" + actualsecond);
display.display();
}
}
ver 3.0 NTP + 溫度 + 濕度 + 氣壓 + AQI + PM10 + PM2.5
#include "ESP8266WiFi.h"
#include "ArduinoJson.h"
#include <NTPtimeESP.h>
#define DEBUG_ON
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, 1);
NTPtime NTPch("time.stdtime.gov.tw");
void get_Weather(); // Function 原型
bool showWeather(char *json);
// ===== Wifi setup =====
const char *ssid = "SSID";
const char *password = "PASSWORD";
// ===== setup =====
const char *host = "opendata.cwb.gov.tw";
const char *dataid = "O-A0003-001";
const char *locationName = "板橋";
const char *privateKey = "你申請的中央氣象局API-KEY";
// ===== Variable Number setup =====
static char respBuf[4096];
float data,temp,pres,humd;
unsigned long prevTime,t1,t2;
String actualHour;
String actualMinute;
String actualsecond;
String actualyear;
String actualMonth;
String actualday;
String actualdayofWeek;
char *week[]={"","Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
strDateTime dateTime;
int i=0,limit,aqi,pm10,pm25;
void setup() {
Serial.begin(115200);
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
Wire.begin(0, 2);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED){
delay(200);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void loop(){
t1 = millis();
do{get_time();}while(millis()<t1+5000);
get_Weather();
display.clearDisplay();
display.setTextSize(2); // Normal 1:1 pixel scale
display.setTextColor(WHITE); // Draw white text
display.setCursor(0,0); // Start at top-left corner
display.print("TEMP=");
display.println(temp,1);
display.setCursor(0,21);
display.print("HUMD=");
display.print(int((humd)*100));
display.print(" %");
display.setCursor(0,42);
display.print(pres,1);
display.print(" hPa");
display.display();
delay(3000);
t1 = millis();
do{get_time();}while(millis()<t1+5000);
get_Air();
display.clearDisplay();
display.setTextSize(2); // Normal 1:1 pixel scale
display.setTextColor(WHITE); // Draw white text
display.setCursor(0,0); // Start at top-left corner
display.print("AQI= ");
display.println(aqi);
display.setCursor(0,21);
if(aqi>0&&aqi<=50){
display.setTextSize(2);
display.print("Good");
}else if(aqi>50&&aqi<=100){
display.setTextSize(2);
display.print("Normal");
}else if(aqi>100&&aqi<=150){
display.setTextSize(2);
display.print("Unhealthy for Sensitive Groups");
}else if(aqi>150&&aqi<=200){
display.setTextSize(2);
display.print("Unhealthy");
}else if(aqi>200&&aqi<=300){
display.setTextSize(2);
display.print("Very Unhealthy");
}else if(aqi>300){
display.setTextSize(2);
display.print("Hazardous");
}
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.print("PM10= ");
display.print(pm10);
display.setCursor(0,21);
display.print("PM2.5= ");
display.print(pm25);
display.display();
delay(2000);
}
void get_Weather(){
Serial.print("Connecting to ");
Serial.println(host);
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {return;}
// Create a URI for the request
String url = "/api/v1/rest/datastore/";
url += dataid;
url += "?Authorization=";
url += privateKey;
url += "&locationName=";
url += locationName;
url += "&elementName=";
url += "TEMP";
url += "&elementName=";
url += "HUMD";
url += "&elementName=";
url += "PRES";
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
client.flush();
int respLen = 0;
bool skip_headers = true;
while (client.connected() || client.available()){
if (skip_headers) {
String aLine = client.readStringUntil('\n');
//Serial.print("aLine=");
//Serial.println(aLine);
if (aLine.length() <= 1) {skip_headers = false;}
}else{
int bytesIn;
bytesIn = client.read((uint8_t *)&respBuf[respLen], sizeof(respBuf) - respLen);
//Serial.print("bytesIn=");
//Serial.println(bytesIn);
if (bytesIn > 0) {respLen += bytesIn;
if (respLen > sizeof(respBuf)){respLen = sizeof(respBuf);}
}else if (bytesIn < 0){Serial.println(F("read error "));}
}
delay(1);
}
Serial.println("closing connection");
client.stop();
if (respLen >= sizeof(respBuf)){Serial.print(F("respBuf overflow "));return;}
respBuf[respLen++] = '\0';
//Serial.print("respBuf=");
//Serial.println(respBuf);
showWeather(respBuf);
}
void get_Air(){
WiFiClient client;
const int httpPort = 80;
if (!client.connect("opendata.epa.gov.tw", httpPort)) { Serial.println("Connection failed");return;}
// Create a URI for the request
String url = "/ws/Data/AQI/?$orderby=SiteName&$skip=30&$top=1&format=json";
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + "opendata.epa.gov.tw" + "\r\n" +
"Connection: close\r\n\r\n");
client.flush();
int respLen = 0;
bool skip_headers = true;
while (client.connected() || client.available()){
if (skip_headers) {
String aLine = client.readStringUntil('\n');
//Serial.print("aLine=");
//Serial.println(aLine);
if (aLine.length() <= 1) {skip_headers = false;}
}else{
int bytesIn;
bytesIn = client.read((uint8_t *)&respBuf[respLen], sizeof(respBuf) - respLen);
//Serial.print("bytesIn=");
//Serial.println(bytesIn);
if (bytesIn > 0) {respLen += bytesIn;
if (respLen > sizeof(respBuf)){respLen = sizeof(respBuf);}
}else if (bytesIn < 0){Serial.println(F("read error "));}
}
delay(1);
}
Serial.println("closing connection");
client.stop();
if (respLen >= sizeof(respBuf)){Serial.print(F("respBuf overflow "));return;}
respBuf[respLen++] = '\0';
Serial.print("respBuf=");
Serial.println(respBuf);
showAir(respBuf);
}
bool showWeather(char *json){
StaticJsonBuffer<6400> jsonBuffer;
char *jsonstart = strchr(json, '{');
json = jsonstart;
JsonObject& root = jsonBuffer.parseObject(json);
if (!root.success()) { }
int stationId = root["records"]["location"][0]["stationId"];
temp = root["records"]["location"][0]["weatherElement"][0]["elementValue"];
humd = root["records"]["location"][0]["weatherElement"][1]["elementValue"];
pres = root["records"]["location"][0]["weatherElement"][2]["elementValue"];
}
bool showAir(char *json){
StaticJsonBuffer<6400> jsonBuffer;
char *jsonstart = strchr(json, '{');
json = jsonstart;
JsonObject& root = jsonBuffer.parseObject(json);
if (!root.success()) { }
aqi = int(root["AQI"]);
pm10 = int(root["PM10"]);
pm25 = int(root["PM2.5"]);
}
void get_time(){
// first parameter: Time zone in floating point (for India); second parameter: 1 for European summer time; 2 for US daylight saving time; 0 for no DST adjustment; (contributed by viewwer, not tested by me)
dateTime = NTPch.getNTPtime(8.0, 1);
// check dateTime.valid before using the returned time
// Use "setSendInterval" or "setRecvTimeout" if required
if(dateTime.valid){
actualHour = String(dateTime.hour);
if(dateTime.minute<10){
actualMinute = "0" + String(dateTime.minute);
}else{
actualMinute = String(dateTime.minute);
}
if(dateTime.second<10){
actualsecond ="0" + String(dateTime.second);
}else{
actualsecond =String(dateTime.second);
}
actualyear = String(dateTime.year);
actualMonth = String(dateTime.month);
actualday = String(dateTime.day);
actualdayofWeek = String(dateTime.dayofWeek);
if(i==0){limit = int(dateTime.second); }i++;
display.clearDisplay();
display.setTextSize(2); // Normal 1:1 pixel scale
display.setTextColor(WHITE); // Draw white text
display.setCursor(5,0); // Start at top-left corner
display.println(actualyear + "/" + actualMonth + "/" + actualday);
display.setCursor(50,25);
display.println(week[dateTime.dayofWeek]);
display.setCursor(20,50);
display.println(actualHour + ":" + actualMinute + ":" + actualsecond);
display.display();
}
}