5.寫入Google試算表(一)
1.首先先要在Google Drive內安裝Google APPS Script
2.先在搜索列中鍵入Apps Script搜尋 再按 + 連接
3.回到Google雲端硬碟,新增一個Google Apps Script 專案
4.先按左上角替專案命名,然後按確定
5.再程式碼編寫區貼入 下列程式碼,但需要將「你的試算表網址」作替換
程式碼如下:
function doGet(e) {
var params = e.parameter;
var data = params.data;
var SpreadSheet = SpreadsheetApp.openByUrl('你的試算表網址'); //此處填入Google試算表的網址
var Sheet = SpreadSheet.getSheetByName('工作表1'); //此處填入試算表的標籤名稱
var LastRow = Sheet.getLastRow(); //資料上舊下新
//Sheet.insertRowBefore(1); //資料上新下舊
//寫入資料
data = data.split(',');
data.forEach(function(e,i){
Sheet.getRange(LastRow+1, i+1).setValue(e); //(開啟資料上舊下新模式)
//Sheet.getRange(1, i+1).setValue(e); //(開啟資料上新下舊模式)
});
//return ContentService.createTextOutput(1); //接收成功以後回傳"1"(類似Tingspeak)
}
6.新增一個試算表(要自動填入的試算表)
7.複製試算表的網址Url
8.把剛剛貼入的程式碼的這裡換成你的試算表的網址Url
9.接著按發布-->部署為網路應用程式
10.將應用程式設定專案版本,指定信箱,指定授權對象
11.一定要按 核對權限,不然就不用玩惹
12.指定登入帳戶(編輯Google 試算表的權限)
13.按允許
14. 一定要把部署的這個網址給複製下來
複製下來的網址:
https://script.google.com/macros/s/AKfycbyymzTqKiMK68u5gg4TIioFp3ctRdDrqCJ2Dtl4euAkN4IxsXuG/exec
現在你有這個網址以後,
你可以嘗試連接
https://script.google.com/macros/s/AKfycbyymzTqKiMK68u5gg4TIioFp3ctRdDrqCJ2Dtl4euAkN4IxsXuG/exec?data=567,890
因為我們將用GET法傳送數值,所以在複製下的網址後面加入 ?data=567,890,
GET法本身就是透過URL來傳送訊息
15.在網址列貼入上述網址
16.如果你設定沒錯的話,資料應該能進來Google 試算表了
此時先別高興太早,ESP8266要對Google 發出GET請求時常無法正確動作
必須先作轉址的動作(Google對於GET法傳遞資料加密較嚴格)
請先到 https://www.pushingbox.com/index.php 申請一個API
作為Redirect
17.先登入你的Google 帳號 (虛擬登入你的帳號的機器在傳遞資料)
18.先按My Services 然後 Add a service
19.
20.
21.
22,
23.
24.
25.
26.
複製的DevID 為v308773F457B8240
基本上現在只要輸入
http://api.pushingbox.com/pushingbox?devid=v308773F457B8240&data=234,567
就會在試算表中端輸入資料
ESP8266端 (TX)
Arduino端(TX)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);
/////////////////////////////////////////////////////
#define host "192.168.1.254"
//#define host "10.233.95.178"
#define timing 1000 //建議1000毫秒一組數據
/////////////////////////////////////////////////////
unsigned long t1,t2;
int i=0;
String A,B ;
void lcd_disp(String data1,String data2){
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("A=");
lcd.print(data1);
lcd.print(" B=");
lcd.print(data2);
}
void send_host(){
Serial.print("D");
Serial.print(host);
Serial.print("E");
Serial.flush();
}
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.clear();
do{
send_host();
delay(200);
lcd.setCursor(0,1);
lcd.print("waiting...");
}while(!Serial.find("OK"));
lcd.setCursor(0,1);
lcd.print("host ok!");
t1=millis();
}
void loop() {
t2=millis();
if(t2>t1+timing){
A="";
B="";
i++;
A=String(i);
B=String(analogRead(A0));
Serial.print("A");
Serial.print(A);
Serial.print("B");
Serial.print(B);
Serial.print("C");
Serial.flush();
lcd_disp(A,B);
lcd.setCursor(0,1);
lcd.print("Sending Data...");
t1=t2;
}
}
#include <Arduino.h>
#include <ESP8266WiFi.h> // 提供Wi-Fi功能的程式庫
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFiMulti.h>
////////////////////////////
#define SSID "tomorrows"
#define PASSWORD "----"
#define devid "v6275D911F32E961"
////////////////////////////
ESP8266WiFiMulti WiFiMulti;
WiFiServer server(80); // 宣告網站伺服器物件與埠號
const int httpPort = 80;
unsigned long t1,t2;
String cmd, data_A,data_B,host;
int A=0 , B=0 , C=0 , D=0 , E=0;
void data_to_RX(String data3, String data4){
String url = "http://api.pushingbox.com/pushingbox?devid=";
url+=devid;
url+="&data=";
url+=data3;
url+=",";
url+=data4;
// This will send the request to the server
Serial.println(url);
if((WiFiMulti.run() == WL_CONNECTED)) {
HTTPClient http;
http.begin(url);
int httpCode = http.GET();
if(httpCode > 0) {
if(httpCode == HTTP_CODE_OK) {
String payload = http.getString();}
} else {}
http.end(); }}
void rec_cmd(){
cmd="" ;
while(Serial.available()){
char c = Serial.read();
cmd+= c;
delay(10);}
if(cmd.charAt(0)=='A'){
data_A="" , data_B="";
for(int i=0 ; i<cmd.length() ;i++){if(cmd.charAt(i)=='A'){A=i;}}
for(int i=0 ; i<cmd.length() ;i++){if(cmd.charAt(i)=='B'){B=i;}}
for(int i=0 ; i<cmd.length() ;i++){if(cmd.charAt(i)=='C'){C=i;}}
for(int i=A+1 ; i<B ; i++){data_A +=cmd.charAt(i);}
for(int i=B+1 ; i<C ; i++){data_B +=cmd.charAt(i);}
data_to_RX(data_A , data_B);
}
if(cmd.charAt(0)=='D'){
host="";
for(int i=0 ; i<cmd.length() ;i++){if(cmd.charAt(i)=='D'){D=i;}}
for(int i=0 ; i<cmd.length() ;i++){if(cmd.charAt(i)=='E'){E=i;}}
for(int i=D+1 ; i<E ; i++){host +=cmd.charAt(i);}
}
Serial.print("OK");}
void setup() {
Serial.begin(9600);
WiFiMulti.addAP(SSID, PASSWORD);
}
void loop(){
if(Serial.available()){
rec_cmd();}
}