繼續上一篇

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); 
}


成果如下

oled1.png

oled2.png

oled3.png

oled4.png


接下來要開始測試如取得股票即時資訊,早期一些免費的API現在都沒辦法用了,在網路上學到一招,可以用google 試算表,用Googlefinance函式,可以取的全球大多股市的資料,台灣部分只能取得上市資料,官方雖說是即時的,但是實測約1015分鐘才會更新一次,如果只是輕度看盤的還可以適用,若是要即時交易的可能就不適用了

話不多說先把自己選定的股票製作成表格,這邊分享我製作的資料表,其實不難,跟Excel一樣,Googlefinance的語法可以參考:Googlefinance說明

我製作的表格:Stock1試算表

excel.png

打開試算表,先建立副本,編輯你想要看的股票代號,記得看一下Googlefinance的規則,台股的代號要加TPE:xxxx,目前只支援上市股票,輸入上櫃或其他的是沒有資料喔

股票的名稱自己輸入中文,現價、漲跌幅套用公式即可,若還有要看的資料自己可以加上去,注意目前資料只有取 A E 欄 5個欄位,若要增加要調整參數,後續會提到

sub01.png

網址列會長這樣,紅色部分就是你的試算表ID,這個後續程式會用到

https://docs.google.com/spreadsheets/d/1xg57IUvFGvAyc1qG8stjbvJEvn6m2eQrQHffq4EmLy8/edit#gid=0


接下來要處理 Google Script,打開 Google Driver 雲端硬碟,按新增 -> Google App Script

script01.png

會看到新增專案的畫面

script02.png

接下來把下面的程式碼貼上去,

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;
}

script03.png

選擇 ->發布

script04.png

接下來一連串驗證,依照圖示操作即可

script05.png

script06.png

script07.png

script08.png

script09.png

 

script10.png

最後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 就是取第幾列,把網址貼在瀏覽器網址列,執行應該會跑出這樣的結果:

result02.png

如果是,恭喜你成功了!如果沒有,表示一定是某個環節出問題了,需要在試試

補充說明:

在Google Script 程式碼第61行

var sh1 = sh.getRange(1, 1, 1, 5).getValues()[0];

excel02.png

這是代表試算表的表頭這一列,若要增加取值的項目把5這個數字改成你要的欄位數字,例如你要取到F欄,就改成6吧

程式碼第53行,變數number 是指取值第幾列,依據你的試算表大小,記得61行如果有修改,53行 5這個數字也要修改喔,要不然會取不到值。

var sh4 = sh.getRange(number, 1, number, 5).getValues();

excel03.png

關於更詳細 Google Script + Google 試算表取值部分可以參考這篇文章:

使用 NodeMCU 以及 Google script 寫入&讀取 Google sheets 資料

好了就先到這,需要去補腦一下,下一篇要開始來寫 Arduino 程式碼的部分了

ESP8266 一次就上手 / Google Script + Google試算表 =股票機 (三)

 

文章標籤
全站熱搜
創作者介紹
創作者 terrywu5 的頭像
terrywu5

IoT 智慧生活的異想世界

terrywu5 發表在 痞客邦 留言(0) 人氣(996)