[Arduino] 雲端打卡

NodeMCU + RFID(MFRC522) + Google Apps Script + Google 試算表 + pushingbox = 雲端打卡

在任何地點,連上網路,使用 RFID 卡(高雄的一卡通或是台北的悠遊卡,都可以)刷卡後,卡號直接傳到 Google 試算表。

  • 接線圖
NodeMCU RFID(MFRC522)
D1 RST
D2 SDA
D5 SCK
D6 MISO
D7 MOSI
3V 3.3V
G GND
  • Arduino程式
/*
RFID讀卡機連接NodeMCU的接腳方式
RST = GPIO5(D1)
SDA(SS) = GPIO4(D2)
MOSI = GPIO13(D7)
MISO = GPIO12(D6)
SCK = GPIO14(D5)
GND = GND
3.3V = 3.3V
*/
#include <ESP8266WiFi.h> // <>此為全形,請記得改為半形,後續的部分皆相同
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 5 // 讀卡機的重置腳位
#define SS_PIN 4 // 晶片選擇腳位
const char *ssid = "SSID"; // WIFI名稱
const char *pass = "Password"; // WIFI密碼
MFRC522 mfrc522(SS_PIN, RST_PIN); // 建立MFRC522物件

const char* host = "api.pushingbox.com";
String data;

void setup()
{
   Serial.begin(115200);
   delay(1000);
   Serial.println("RFID reader initial...");
   SPI.begin(); // 初始化SPI BUS
   mfrc522.PCD_Init(); // 初始化MFRC522讀卡機模組
   WiFi.begin(ssid, pass); // 初始化WiFi

   int retries = 0;
   while ((WiFi.status() != WL_CONNECTED) && (retries < 10))
   {
      retries++;
      delay(500);
      Serial.print(".");
   }
   if (WiFi.status() == WL_CONNECTED)
   {
      Serial.println(F("WiFi connected"));
   }
   Serial.println(F("WiFi Ready!"));
   Serial.println(F("============================"));
   Serial.println(F("Scan for Card and print UID:"));
}
void loop()
{
   // 確認是否有新卡片
   if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) // 如果出現新卡片就讀取卡片資料
   {
      delay(100);
      byte *id = mfrc522.uid.uidByte; // 取得卡片的UID
      byte idSize = mfrc522.uid.size; // 取得UID的長度
      Serial.print(F("Card UID:")); // 顯示卡片的UID
      dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
      Serial.println();
      mfrc522.PICC_HaltA(); // 讓卡片進入停止模式
      delay(5000);
      WiFiClient client; const int httpPort = 80;
      if (!client.connect(host, httpPort))
      {
         Serial.println("connection failed");
         return;
      }
      String url = "/pushingbox?";
      url += "devid=";
      url += "v53538826848EAEC";
      url += "&CardNo="+String(data); Serial.print("Requesting URL: ");
      Serial.println(url);
      client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
      unsigned long timeout = millis();
      while (client.available() == 0)
      {
         if (millis() - timeout > 5000)
         {
            Serial.println(">>> Client Timeout !");
            client.stop();
            return;
         }
      }

      while(client.available())
      {
         String readStr = client.readStringUntil('\r');
         Serial.print(readStr);
         Serial.print("Data Sent!");
      }

      Serial.println();
      Serial.println("closing connection");
      data = "";
   }
}

void dump_byte_array(byte *buffer, byte bufferSize)
{
   Serial.println("dump_byte_array ... ");
   for (byte i = 0; i < bufferSize; i++)
   {
      Serial.print(buffer[i] < 0x10 ? " 0" : " ");
      Serial.print(buffer[i], HEX); //10進位DEC;或者使用16進位HEX
      data += String(buffer[i], HEX);
   }
}
  • 結果

[日常生活] Podcast 創建及上架

  • 最近跟推友發起了一個讀書會,想說要把讀書會的內容放到 Podcast 平台上,所以研究了一下流程。
  • 首先需要一個放音檔的平台,我選擇了 SoundOn ,就是將讀書會錄音的音檔先放到 SoundOn ,再透過 SoundOn 將資料發佈到其他 Podcast 的平台。
  • SoundOn 已經有串聯一些平台可以自動上架,只要在 SoundOn 的「平台發布」頁籤中,
    平台發布
  • 設定「自動上架」,之後只要上傳新的音檔到 SoundOn ,就會自動同步到「已上架」的平台。按下「自動上架」的按鈕,連結的地方出現網址,按鈕名稱變成「已上架」,就表示已經串連成功,可以到該平台去搜尋看看,不過有的平台會有同步的時間差,需要等一些時間,通常一個小時內就會同步完成。
    自動上架
  • 另外,有些平台需要「手動上架」,也就是需要到這些平台去申請上架的資格。其中審查期最久的是「Google Podcast」,文件上寫需要10天~三週,不過我的審查期是3~4天,在第4天通過審查。
    手動上架
  • 以上步驟做完,就可以在各 Podcast 平台搜尋到自己的節目囉!
  • SounOn 的說明做得很好,如果在填寫資料遇到問題,填寫的欄位下方都會有連結,點下去,就可以連結到說明頁面,很方便。

[日常生活] 台灣俗諺撲克牌的故事

原稿連結:台灣俗諺撲克牌的故事

  從2021年下半年開始有整理台灣俗諺的想法,而且是希望用台文來表達,但是我的台文能力實在不足,於是邀請了夥伴來協助。就這樣俗諺網站就成立起來了。

  過了二三個月,有夥伴提議,「如果有聲音,應該更可以協助學習,畢竟就是看不懂文字才需要學習」。所以提議的夥伴又邀請了更多夥伴加入寫稿及錄音的行列,我們自己寫文稿和錄音,彼此互相看跟聽是否有錯誤的地方。

  2021年底,想紀念這些做過的事情,所以製作了2022年的月曆送給夥伴們。今年想說或許可以一邊玩撲克牌,一邊學習俗諺,也是不錯的概念。於是有了俗諺撲克牌的想法。

  一張撲克牌一句俗諺,因為版面有限,所以僅有俗諺的「台文羅馬字」、「台文漢字」以及「兩個QRCODE」,掃描QRCODE後,可以連結到該句俗諺的網站及 Youtube ,俗諺網站及 Youtube 彼此也有互相連結。我們期望讓學習的方式更多元,也希望透過更多方式降低大家學習的門檻。

  原本想用群眾募資的方式,但考量到募資平台要求的資料,可能需要花費更多時間及成本,所以放棄用群眾募資的方式,改用google表單的方式。

  如果您想支持我們,可以填寫以下表單。雖然有推友提議用捐款的方式贊助我們,不過因為我們是用推廣的心態來做這件事,所以沒有想到這個部分,也感謝有這樣想法的推友,請多幫我們宣傳就好。

表單連結:https://t.co/qYzHvZbcui

[Arduino] 改變ESP8266的鮑率(傳輸速率)

ESP8266預設的傳輸速率是115200,需要先改成9600才有辦法跟Arduino互相溝通。

  • 接線
aduino ESP8266
D4 TX
D5 RX
3.3V EN
3.3V 3.3V
GND GND
  • 程式
    #include <SoftwareSerial.h> // <>改為半形,用全形網頁才能顯示,但是 arduino ide 編譯不過
    SoftwareSerial mySerial(4, 5); // Arduino RX:4, TX:5
    void setup()
    {
      // Open serial communications and wait for port to open:
      Serial.begin(9600);
      Serial.println("Arduino...OK");
      mySerial.begin(115200);
      mySerial.write("AT+UART_DEF=9600,8,1,0,0\r\n");
      delay(1500);
      mySerial.begin(9600);
      Serial.println("ESP8266...OK");
    }
    void loop() // run over and over
    {
      if (mySerial.available())
        Serial.write(mySerial.read());
      if (Serial.available())
        mySerial.write(Serial.read());
    }
    
  • 程式編譯後,上傳到Arduino開發板,上傳完畢後就可以直接在序列埠視窗測試AT指令了。

[WordPress] 解決將兩個小-(dash)符號變成一個大-符號的問題

以下內容以「Twenty Seventeen的佈景主題」為例。

  • 進入控制台的「外觀」–>「佈景主題編輯器」
  • 再選擇畫面右邊的「佈景主題檔案」–>「佈景主題函式庫(functions.php)」
  • 到檔案最下面加入以下三行程式(可以根據需求加入程式)
    remove_filter( 'the_title', 'wptexturize' ); // 標題
    remove_filter( 'the_content', 'wptexturize' ); // 內容(內文)
    remove_filter( 'the_excerpt', 'wptexturize' ); // 標籤
  • 再回到前台就可以看到結果了。目前僅測試Twenty Seventeen的佈景主題,所以不確定其他佈景主題是否也可以適用這個方法。

[生活日常] 唐鳳-我所看待的自由與未來一書心得

這本書在今年2月份看完第一次
(這不是唐鳳寫的書,是別人寫唐鳳的書)。

如果有參與社群活動的人可能會對這本書很多地方(或是說對唐鳳很多想法)很有共鳴(或感受)。
看到書中描述唐鳳參與社群活動時,讓我想起以前參與技術論壇,在論壇裡問問題或回答問題的情形,當時也曾和一群該論壇的版主共聚在MSN聊天、討論技術。
看到書中描述唐鳳對技術分享的熱情,也讓我想起以前參與Maker活動的情形。我一直認為Maker就是對「動手做」有熱情,不管做的是什麼。
當然這本書不只讓我聯想起以前的事,還讓我看到、學到許多唐鳳的觀念。
這是一本讓我看了,會想再看一次的書。
這是一本讓我看了,會想推薦的書。
或許是因為某些點,提醒了我—「做事的初衷」,「找回最初的熱情」。
或是提醒了我—「改變一點觀念」,「改變一些做法」。
以下節錄我自己看了有感的內容:
  • g0v的名言,「你就是那個沒有人」。
    大多數人是用說服對方的方式,如果可以像唐鳳一樣,深入對方的立場,了解對方的考量。或許可以減少很多的誤解,但不是人人是唐鳳,試試看從自身做起囉!
  • 唐鳳的思考訓練。
    在第一個環節,我們通常只會做到思考自己為何這樣想,比較少去思考到別人為何會那樣想及原因。
而如果沒有關懷的思考,就更不可能在討論時會顧慮到別人的感受。
我想就是這樣的思考訓練,讓唐鳳可以在協同合作做到「由零和(一方贏表示另一方輸)變成共好(或稱雙贏,雙方都贏)」。
唐鳳的思考訓練
  • 唐鳳:「每個人都與眾不同,與眾相同是幻覺。」
    所以做自己,不用跟風追流行。

[Node-RED] 安裝 MQTT 伺服器

Mosquitto 是開放原始碼的 MQTT 伺服器,可在 Windows、macOS、Linux 等作業系統上安裝執行,安裝程式可到 Mosquitto 官網 ( http://mosquitto.org/download ) 直接下載安裝。

  1. 我使用的是 Windows X64 系統,安裝後可以在「服務」中找到「mosquitto 服務」。
    在服務中找到mosquitto
  2. 按滑鼠右鍵,選擇「啟動」,來啟動該服務。服務啟動後,在「狀態」的欄位會顯示「執行中」。
    啟動MQTT
  3. MQTT 伺服器啟動後,會使用網路的「1883」通訊埠進行通訊。
  4. Windows 的防火牆預設是沒有開通 1883 埠,所以本機以外的通訊設備無法和 Mosquitto 伺服器連線。所以需要開通防火牆的 1883 埠。
  5. 測試MQTT伺服器是否正常運作:以管理者身分開啟兩個「終端機命令視窗」,並進入 mosquitto 資料夾。
    測試MQTT
  6. 在其中一個終端機命令視窗輸入「mosquitto_sub -t topicTest」模擬訂閱「topicTest」主題。
  7. 在另一個終端機命令視窗輸入「mosquitto_pub -h 127.0.0.1 -p 1883 -t topicTest -m “Hello World!!!”」。此時,在第一個終端機命令視窗(訂閱者)的畫面上,會出現(收到)發布者傳來的訊息。
    訂閱者收到訊息
  8. 如果要查詢 mosquitto 的指令,可在終端機命令視窗上輸入「mosquitto –help」。
  9. 用 Node-RED 測試 MQTT,開啟 Node-RED 後,使用「節點管理」安裝「MQTT」。
    安裝MQTT節點
  10. 安裝 MQTT 節點後,會在 Node-RED 左邊的節點清單「網絡」下找到「mqtt in」及「mqtt out」。
    MQTT節點
  11. 依序「mqtt in」、「debug」、「inject」、「mqtt out」等節點拖拉到流程視窗上。
  12. 編輯「mqtt in」,點擊下圖藍色框的鉛筆,可以進入進階的屬性設定。
    編輯mqtt in
  13. 在「連接」的頁面上,服務端輸入「node-red@localhost」,埠輸入「1883」。
    進階屬性設定_連接
  14. 在「消息」的頁面上,在「連接時發送的消息」選項上,主題輸入「topicTest」,內容輸入「Hi, Node-RED」,QoS 選擇「2」,最後點擊右上角的「更新」,回到上一層的屬性設定。
    QoS 若為 0 表示:最多傳一次。
    QoS 若為 1 表示:至少傳一次。
    QoS 若為 2 表示:確實傳一次。
    進階屬性_消息
  15. 「mqtt in」進階屬性設定完後如下圖:
    mqtt in 完整屬性
  16. 編輯「inject」屬性,msg.payload 輸入「再次發訊息」(也可以輸入任何您想輸入的訊息),如下圖:
    inject 屬性
  17. 編輯「mqtt out」,如下圖:
    mqtt out 屬性
  18. 最後將「mqtt in 」節點與「debug」節點連結起來,將「inject」節點與「mqtt out」節點連結起來。點擊「部署」按鈕,「mqtt in 」節點及「mqtt out」節點下方出現「已連接」,表示 MQTT 伺服器連線成功。
    MQTT連線成功
  19. 連線成功後,在 debug 視窗會出現「Hi, Node-RED, 123」,如果按下「inject」前面的方塊,則會出現「再次發訊息」(或是您輸入的訊息內容)。
    debug視窗的訊息

[Node-RED] dashboard儀表板

  1. 安裝dashboard。
    安裝dashboard01
  2. 切換到「安裝」的頁面,再輸入「dashboard」查詢,找到「node-red-dashboard」後,點擊「安裝」。
    安裝dashboard02
  3. 點擊安裝後,會出現下圖,繼續點擊「安裝」。(如果有興趣也可以點擊「打開節點資訊」,來看要安裝的節點資訊)
    安裝dashboard03
  4. 安裝完畢後,剛剛安裝的前顯示「安裝」的文字,就被改成「已安裝」,然後點擊「關閉」來關閉節點管理的視窗
    安裝dashboard04
  5. 安裝完節點後,就可以在左邊的節點清單找到剛剛安裝的「dashboard」。
    安裝dashboard05
  6. 測試 dashboard,在左邊的節點清單找到「共通」下的「inject」,並將這個節點拖曳到流程畫面中,如下圖:
    dashboard01
  7. 在「時間戳」節點上,連續點擊滑鼠左鍵二下,設定該節點屬性如下圖:
    dashboard02
  8. 在左邊的節點清單找到「功能」下的「function」,並將這個節點拖曳到流程畫面中,如下圖:
    dashboard03
  9. 在「函數」節點上,連續點擊滑鼠左鍵二下,設定該節點屬性如下圖:
    步驟3的函數內容:
    msg.payload = Math.random();
    return msg;
    dashboard04
  10. 在左邊的節點清單找到「dashboard」下的「chart」,並將這個節點拖曳到流程畫面中,如下圖:
    dashboard05
  11. 在「chart」節點上,連續點擊滑鼠左鍵二下,設定該節點屬性如下圖:
    dashboard06
    步驟1的設定內容如下圖:
    dashboard07
  12. 以上設定完成後,將所有節點連接起來。
    dashboard08
  13. 最後,部署流程。
    dashboard09
  14. 部署成功後,開啟瀏覽器,輸入網址「http://127.0.0.1:1880/ui/」,即可看到每秒產生一個亂數的折線圖。
    dashboard10
  15. 如果要使用儀表板,其設定跟折線圖一樣,設定後再重新部署。
    dashboard11
  16. 回到瀏覽器,可以看到折線圖及儀表板。
    dashboard12

[Node-RED] 建立Hello World網頁

學習新的技術,第一步都要會的 Hello World 。

  1. 在 Node-RED 設計畫面的左邊節點清單中找到「網絡」下的「http in」,將他拖曳到流程畫面中,如下圖:
    建立HelloWorld01
  2. 設定該節點屬性,步驟1:在「http in」這個節點,將滑鼠左鍵點擊二下出現該節點的屬性內容;步驟2:「請求方式」選擇「GET」;步驟3:「URL」輸入「/hello」;步驟4:點選「完成」。
    建立HelloWorld02
  3. 接來,在左邊節點清單中找到「功能」下的「template」,將他拖曳到流程畫面中,如下圖:
    建立HelloWorld03
  4. 設定該節點屬性,步驟1:在「模板」這個節點,將滑鼠左鍵點擊二下出現該節點的屬性內容;步驟2:「名稱」輸入「hello」;步驟3:「語法高亮」選擇「HTML」;
    步驟4:「模板」輸入以下內容(此為html語法)
    <!DOCTYPE html>
    <html>
    <head>
    <title>Hello World</title>
    </head>
    <body>
    Hello World!!!
    </body>
    </html>
    步驟5:點選「完成」。
    建立HelloWorld04
  5. 接著,在左邊節點清單中找到「網路」下的「http response」,將他拖曳到流程畫面中,如下圖:
    建立HelloWorld05
  6. 接著,以拖拉的方式(在前一個節點最右端的圓圈處,按著滑鼠左鍵不放,拖拉到下一個節點最左端的圓圈處,再放掉滑鼠左鍵),依序將每個節點連結起來。
    建立HelloWorld06
  7. 最後,部署該流程,點擊視窗右上角的「部署」按鈕,即可完成部署。
    建立HelloWorld07
  8. 開啟瀏覽器,在網址列輸入:「http://127.0.0.1:1880/hello」,即可在瀏覽器看到 Hello World!!!
    建立HelloWorld08

[Node-RED] 安裝

  • 因為 Node-RED 是由 Node.js 設計的物聯網(IoT) 視覺程式設計環境,所以安裝 Node-RED 之前,要先安裝 Node.js。
  • 下載 Node.js (https://nodejs.org/zh-tw/download/)
    Nodejs下載
  • 選擇適合電腦的作業系統,我是使用 Windows 64bit 作業系統,所以就下載 Windows 64bit 安裝包版本。
  • 下載後安裝好 Node.js,在程式集中找到剛剛安裝好的「Node.js」,展開後,再點擊「Node.js command prompt」
    Node.js command prompt
  • 出現命令列視窗
    命令列視窗
  • 開始安裝 Node-RED,在命令列視窗輸入「npm install -g –unsafe-perm node-red」
    安裝Node-RED
  • 安裝完 Node-RED 後,會出現如下的畫面:
    安裝Node-RED完成
  • 執行 Node-RED ,在「Node.js command prompt」開啟的命令列視窗,輸入「node-red」按下「Enter」,出現如下圖畫面(出現 http://127.0.0.1:1880/),表示 Node-RED 執行成功。
    執行Node-RED

在瀏覽器輸入「http://127.0.0.1:1880/」,就可以看到 Node-RED 的編輯環境。
Node-RED環境