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時鐘

NTPClient 函式庫

NTPtimeESP 函式庫

NTPtimeESP 函式庫

SSD1360 LCD 函式庫

GFX 函式庫

NTPtimeESP 函式庫

SSD1360 LCD 函式庫

GFX 函式庫

環保署 空氣品質

新北市 三重 編號: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();

}

}