繼續上一篇~~~
ESP8266 一次就上手 / Google Script + Google試算表 =股票機 (一)
我們已經完成了NTP 時間的同步,但是發現一個問題,Adafruit 的OLED函式庫對於中文處理很麻煩,需要一個字一個字轉成圖檔,於是在爬文後找到 u8g2這個函式庫可以自訂中文字庫。
u8g2 函式庫:https://github.com/olikraus/u8g2
有興趣的可以參考這篇文章
[Arduino技巧]使用u8g2函式庫建立自訂字庫,讓OLED顯示中文
把自己常用的中文字製作成字庫後就可以來測試一下了!
#include "Arduino.h"
#include "U8g2lib.h"
#ifdef U8X8_HAVE_HW_SPI
#include "SPI.h"
#endif
#ifdef U8X8_HAVE_HW_I2C
#include "Wire.h"
#endif
//選擇對應使用的OLED
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ 16, /* clock=*/ 5, /* data=*/ 4); // pin remapping with ESP8266 HW I2C
void setup() {
Serial.begin(115200);
u8g2.begin();
u8g2.enableUTF8Print();//使用UTF8文字功能(中文)
}
void loop(){
//選了一首李白的詩來測試一下
String msg ="故人西辭黃鶴樓;煙花三月下揚州;孤凡遠影碧空盡;唯見長江天際流"; //顯示文字
int poz; //位置
String temps;//顯示臨時的字串
String mark = (";");//字串分隔的符號
do //分段顯示中文字
{
poz = msg.indexOf(mark);
if(poz != -1)
{
temps=msg.substring(0,poz);
msg = msg.substring(poz+mark.length(), msg.length());
}
else
{
if(msg.length() > 0)
temps=msg;
}
Serial.println(temps);
u8g2.clearBuffer();
u8g2.setCursor(0, 24);
u8g2.setFont(u8g2_font_unifont_t_chinese1);//選擇自訂中文字庫
u8g2.println(temps);
u8g2.sendBuffer();
temps="";
delay(2000);
}
while(poz >=0);
}
成果如下~
接下來要開始測試如取得股票即時資訊,早期一些免費的API現在都沒辦法用了,在網路上學到一招,可以用google 試算表,用Googlefinance函式,可以取的全球大多股市的資料,台灣部分只能取得上市資料,官方雖說是即時的,但是實測約10~15分鐘才會更新一次,如果只是輕度看盤的還可以適用,若是要即時交易的可能就不適用了~~
話不多說先把自己選定的股票製作成表格,這邊分享我製作的資料表,其實不難,跟Excel一樣,Googlefinance的語法可以參考:Googlefinance說明
我製作的表格:Stock1試算表
打開試算表,先建立副本,編輯你想要看的股票代號,記得看一下Googlefinance的規則,台股的代號要加TPE:xxxx,目前只支援上市股票,輸入上櫃或其他的是沒有資料喔~~
股票的名稱自己輸入中文,現價、漲跌幅套用公式即可,若還有要看的資料自己可以加上去,注意目前資料只有取 A ~ E 欄 5個欄位,若要增加要調整參數,後續會提到~
網址列會長這樣,紅色部分就是你的試算表ID,這個後續程式會用到
https://docs.google.com/spreadsheets/d/1xg57IUvFGvAyc1qG8stjbvJEvn6m2eQrQHffq4EmLy8/edit#gid=0
接下來要處理 Google Script,打開 Google Driver 雲端硬碟,按新增 -> Google App Script
會看到新增專案的畫面
接下來把下面的程式碼貼上去,
function doGet(request) {
var output = ContentService.createTextOutput(),
data = {},
id = request.parameters.id,
number = request.parameters.number,
ss = SpreadsheetApp.openById(id);
sheet = "Sheet1";
data.records = readData_(ss, sheet, number);
///////////////////////////////////////////////////////////////////
var callback = request.parameters.callback;
if (callback === undefined) {
output.setContent(JSON.stringify(data));
} else {
output.setContent(callback + "(" + JSON.stringify(data) + ")");
}
output.setMimeType(ContentService.MimeType.JSON);
return output;
}
function readData_(ss, sheetname, number, properties) {
if (typeof properties == "undefined") {
properties = getHeaderRow_(ss, sheetname);
properties = properties.map(function(p) { return p.replace(/\s+/g, '_'); });
}
///////////////////////////////////////////////////////////
var rows = getDataRows_(ss, sheetname, number),
data = [];
for (var r = 0, l = 1; r < l; r++) {
var row = rows[r],
record = {};
for (var p in properties) {
record[properties[p]] = row[p];
}
data.push(record);
}
return data;
}
function getDataRows_(ss, sheetname, number) {
var sh = ss.getSheetByName(sheetname);
var sh4 = sh.getRange(number, 1, number, 5).getValues();
return sh4;
}
function getHeaderRow_(ss, sheetname) {
var sh = ss.getSheetByName(sheetname);
var sh1 = sh.getRange(1, 1, 1, 5).getValues()[0];
return sh1;
}
選擇 ->發布
接下來一連串驗證,依照圖示操作即可
最後copy這一段網址,藍色部分就是 Script 的 ID,後續寫程式用得到
https://script.google.com/macros/s/AKfycbwidXMINj6yN5A00ApWDDXcnkUOiHVTGUPpIeZmW_pFEeC40DO2/exec
好了!到這裡測試一下,把Google Script + Google Sheet 的 ID 組合一下,
https://script.google.com/macros/s/AKfycbwidXMINj6yN5A00ApWDDXcnkUOiHVTGUPpIeZmW_pFEeC40DO2/exec?id=1xg57IUvFGvAyc1qG8stjbvJEvn6m2eQrQHffq4EmLy8&number=3
藍色部分是 Google Script ID,紅色部分是Google Sheet的 ID,number 就是取第幾列,把網址貼在瀏覽器網址列,執行應該會跑出這樣的結果:
如果是,恭喜你成功了!如果沒有,表示一定是某個環節出問題了,需要在試試~~
補充說明:
在Google Script 程式碼第61行
var sh1 = sh.getRange(1, 1, 1, 5).getValues()[0];
這是代表試算表的表頭這一列,若要增加取值的項目把5這個數字改成你要的欄位數字,例如你要取到F欄,就改成6吧~
程式碼第53行,變數number 是指取值第幾列,依據你的試算表大小,記得61行如果有修改,53行 5這個數字也要修改喔,要不然會取不到值。
var sh4 = sh.getRange(number, 1, number, 5).getValues();
關於更詳細 Google Script + Google 試算表取值部分可以參考這篇文章:
使用 NodeMCU 以及 Google script 寫入&讀取 Google sheets 資料
好了~就先到這,需要去補腦一下,下一篇要開始來寫 Arduino 程式碼的部分了~
ESP8266 一次就上手 / Google Script + Google試算表 =股票機 (三)
留言列表