close

繼續上一篇~~~

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函式,可以取的全球大多股市的資料,台灣部分只能取得上市資料,官方雖說是即時的,但是實測約10~15分鐘才會更新一次,如果只是輕度看盤的還可以適用,若是要即時交易的可能就不適用了~~

話不多說先把自己選定的股票製作成表格,這邊分享我製作的資料表,其實不難,跟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試算表 =股票機 (三)

 

arrow
arrow
    創作者介紹
    創作者 terrywu5 的頭像
    terrywu5

    IoT 智慧生活的異想世界

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