2017年12月15日 星期五

MongoDB 筆記 (三) : update / replace

要改野, 最直接就更係諗到 update 喇, 不過 update 同 insert 一樣, 都有幾款, 另外仲有個 replaceOne.


  • db.collection.update()
  • db.collection.updateOne()
  • db.collection.updateMany()
  • db.collection.replaceOne()

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>
   }
)
update 真係要好小心, 就咁睇好簡單, 比個 query 佢 update 就得.
比如話, 要將 Super169 既身高改為 167, 好直接會咁寫吧:

db.user.update({id:"Super169"},{height:167})
咁你就出事了.....之後 Super169 既 document 就咁無左, 得番 一份 {heigth:167} 既 document.
因為佢既 update, by default 係去 replace 成張 document.

要做到想要既 update, 就要加多個 $set 既 operator:

db.user.update({id:"Super169"},{$set: {height:167}})
真係幾危險架, 因為一張 document, 入面可以裝住成大抽野, 一下就無左, 真係唔知點算.

MongoDB 筆記 (二) : find



find() - 應該係最常用既 method 了

query:  一個 JSON object 去比 condition
projection: Define 個  output 既 file list

講都唔易, 用例子最實際, 全部用 user collection 去玩:

1) 搵哂全部人:
  • db.uesr.find()
2) 搵個 id 係 Super169 既:
  • db.user.find({id : "Super169"})
3) 搵個 height 大於 160 既:
  • db.user.find({height : { $gt : 160 }}) 
4) 搵個 height 大於 150 但又不超過 165 既:
    • db.user.find({height : { $gt : 150, $lte : 165 }})
    5) 搵個 weight 最少 50, 而 height 不超過 150:
        • db.user.find({ $and: [{weight : {$gte:50}}, {height : { $lte : 150 }}]})
        6) 搵 Super167 同 Super169:
            • db.user.find({ id : { $in : ["Super167","Super169"] }})
            7) 搵 ..... 咁多野搵, 自己試下喇.  黎黎去去, 都係 $and, $or, $gt, $lt, .... 呢D野, 試多D就得.

                仲有個好好玩既, 在 find(...) 之後, 加個 .pretty(), 就會 return format 左既 JSON object.

                例如:

                • db.user.find({id : "Super169"}).pretty()


                不過, 純粹自己 check 果陣易睇, program 入面就無謂浪費了.



                MongoDB 筆記 (一) : insert

                識搵野唔識入野都無用, MongoDB 入野, 有幾個方法:


                • db.collection.insert()
                • db.collection.insertOne()
                • db.collection.insertMany()

                db.collection.insert(
                   <document or array of documents>,
                   {
                     writeConcern: <document>,
                     ordered: <boolean>
                   }
                )
                可以用黎加一份 document (可以睇成係一隻 JSON record), 或者成個 array 既 documents

                例如:
                • db.sample.insert({user:"Super169"})
                • db.sample.insert([{user:"Super167"},{user:"Super168"},{user:"Super169"}])


                writeConcern 比較複雜, 我自己都唔係好明, 有興趣自己睇喇, 平時我都唔用(應該係唔識用).


                db.collection.insertOne(
                   <document>,
                   {
                      writeConcern: <document>
                   }
                )
                唔駛多講, 只可以 insert 一份 document, 唔可以成個 array 比佢.

                例如:
                • db.sample.insertOne({user:"Super169"})

                db.collection.insertMany(
                   [ <document 1> , <document 2>, ... ],
                   {
                      writeConcern: <document>,
                      ordered: <boolean>
                   }
                )
                同 insertOne 對著幹, 只可以成個 array 比佢, 唔可以單獨一份 document.
                不過, 個 array 入面可以只係得一份 document....甚至無野.

                例如:
                • db.sample.insertMany([{user:"Super167"},{user:"Super168"},{user:"Super169"}])


                insert, insertOne 同 insertMany 有乜分別?

                無事無幹, 對個 collection 而言, 係無分別既, 你可以用哂 insert 唔駛煩.
                不過, 佢地既 return object 就有 D 唔同, 你要做 error handling, 就要識分.

                例如:

                • db.sample.insert({user:"Super169"})
                WriteResult({ "nInserted" : 1 })
                • db.sample.insertOne({user:"Super169"}) 
                {        "acknowledged" : true,        "insertedId" : ObjectId("5901a950276033a2cfe79009")}

                • db.sample.insert([{user:"Super167"},{user:"Super168"},{user:"Super169"}])
                BulkWriteResult({
                        "writeErrors" : [ ],
                        "writeConcernErrors" : [ ],
                        "nInserted" : 3,
                        "nUpserted" : 0,
                        "nMatched" : 0,
                        "nModified" : 0,
                        "nRemoved" : 0,
                        "upserted" : [ ]
                })
                • db.sample.insertMany([{user:"Super167"},{user:"Super168"},{user:"Super169"}])
                {
                        "acknowledged" : true,
                        "insertedIds" : [
                                ObjectId("5901a9e9276033a2cfe7900d"),
                                ObjectId("5901a9e9276033a2cfe7900e"),
                                ObjectId("5901a9e9276033a2cfe7900f")
                        ]
                }
                至於用邊個, 睇下你自己想點了.  insert 完想攞番個 key 去再做野, 就用 insertOne 或者 insertMany, 否則, insert 完知道得唔得就夠, 用 insert 就可以了.


                MongoDB 筆記 (序)

                學新野, 當然要記低 D 重點, 不斷重溫, 直到入哂腦..

                MongoDB 同以往用開既 SQL Server 其實真係好唔同, 好多野唔可以用 relational database 去諗.
                要慢慢改變自己諗野既方式, 而且, 我都唔係好肯定, 自己學到既有無錯, 仲要慢慢研究.

                有乜野想查, 最直接就係去官網睇  MONGODB MANUAL


                首先, 有幾個重要指令, 有用得黎有應該唔會常用:

                • show dbs -  顯示 server 上有既 db 
                • use <db> - 同 SQL server 一樣, 轉去指定既 db
                • show collections - 顯示 現在的 db 上的 collection 
                • db.<collection>.drop() - 成個 collection 剷走佢
                • db.stats() - 睇下 db 既資料
                • db.<collection>.status() - 睇下 collection 既資料
                以上都同 data 無乜大關係, 一般我地最常做既, 不外乎 insert, retrieve, update, delete:


                2017年5月17日 星期三

                NodeMCU

                買左 ESP8266, 一直都係當 Arduino 用, 但好多人講到 NodeMCU 好好, 又手痕試下.
                先至聲明, 我本身乜都唔識架, 睇完唔好信哂....

                1) 首你, 根據你塊板, 要裝左 USB-TTF 芯片既 driver (例如 CH34X, CP210X,...).
                    我自己用開 CH34X 既 (勝左夠 cheap), 一直裝左

                2) 下載 ESPlorder, 自己部機要有 JAVA SE7 或以上至用到.
                     下網地點: https://esp8266.ru/esplorer/#download

                3)   爆開個 zip, 執行 ESPlorer.bat, 就會見到差唔多既畫面 (depend on ESPlorer 既版本).

                選好個 port (例如我係 port 29) 同埋 baudrate (比如 115200), 就可以試下 [Open] 去連線了.

                弊.....連唔到既?

                更係喇, 你都未裝 NodeMCU 去塊 ESP8266 度.

                4) 去舊雲度 build 左個 firmware 先.  https://nodemcu-build.com/
                    由於每個 modules 都要食位既, 所以自己按需要執你既野.  今次執漏左唔緊要, 隨時上黎再執過再 flash 一次就得.


                     填好自己既 email. 就可以 轆去底,  [Start your build], 之後就等 email.

                5)  之後會收到一個標題係 "NodeMCU custom build started" 既  email, 即係話收到 request 做緊野.   等多陣, 就會有個標題係 "NodeMCU custom build finished" 既 email, 即係攪掂.  要等幾耐?  唔駛好耐, 幾分鐘就得.
                     入面會有條 link, 比你 download 個 firmware, 一個係 float 一個係 integer, 同埋會講比你聽, 你選左乜野.
                記住, 24小時內要去 download, 如果唔係....咪再 build 過囉.

                6) 有 firmware 又點, 你都要識得 flash 入去至得架.
                     首先 make sure 你部機網左 python, 同埋 pip, 直接行  pip install esptool


                記住, 如果有 proxy 既就先行左至可以 download 到野:

                  set HTTP_PROXY=http://<user>:<pwd>@<server>:<port>
                  set HTTPS_PROXY=http://<user>:<pwd>@<server>:<port>

                Install 完 esptool, 你就可以直接執行 esptool.py 了 (佢放左入 python 既 executables folder)

                7) 刷 firmware:

                  esptool.py --port <serial-port-of-ESP8266> write_flash -fm <mode> 0x00000 <nodemcu-firmware>.bin

                mode is qio for 512 kByte modules and dio for >=4 MByte modules (qio might work as well, YMMV).

                例如:

                  esptool.py --port com29 write_flash -fm dio 0x00000 nodemcu-master-10-modules-2017-05-18-02-57-33-integer.bin

                之後就等佢 flash 喇:


                攪掂, 可以去試了.

                8) 再 [Open] 多次睇下:
                仲係咁既?  唔係呀嘛.



                唔知係咪有 D 野唔同左, 一開始佢認唔到個 Firmware, 又或者個 firmware 唔識 response.
                只要你是旦叫佢 send D 野, 等佢比 reply 就得.
                雖然你唔可以 "Send to ESP", 不過, 好在個 ESPlorer 左右唔夾既, 左邊一定要 connect 左至比你 send, 右邊可以未 connect 到就去 check.  所以, 你只要 check 下個 Heap 就得了.

                唔髮理果句,
                Can't autodetect firmware, because proper answer not received (may be unknown firmware).
                Please, reset module or continue.

                希望將來可以一按個 open, 自己 send D野去 check (可能家陣都有, 不過唔夾), 就可以認到了.

                9) 開到之後, 就可以試下係咪行到 lua script 了, 慣性整句 Hello World 就收工喇:
                左邊輸入  print("Hello World!")  然後按  [Send to ESP], 之後右邊就出番 Hello World!, 攪掂.





                2017年5月15日 星期一

                ESP32

                都唔知關唔關事了, 見 ESP32 比 ESP8266 更強勁, 就買左粒黎玩下.

                我買既, 只係 cheap cheap 既  Goouuu-esp32 版本.

                Goouuu-esp32
                底版既針腳: 

                Pin Mapping 呢樣最緊要知


                Arduino IDE 開發 ESP-32, 由於仲未有 registry 直接下載安裝, 只可以手動:

                1) 去 arduino.cc 下載並安裝 Arduino IDE 

                2) 安裝 Python 2.7

                3) 去 github 既 espressif arduino-esp32 下載 [Clone or download] -> [Download Zip]

                用 installer 既可以跟 Windows 教學, 如果用 Zip 爆 Arduino IDE 既, 就要自己黎了.

                4) 將 espressif arduino-esp32 個 master zip 爆去  Arduino IDE 既 folder 下面.  可以在 hardware 之下, 先開個 espressif 既 folder, 再加個 esp32, 然後爆哂入去.
                比如我個 Arduino IDE 爆左去 "E:\Arduino\IDE\arduino-1.8.2" 果度, 咁個 esp32 既 master zip 入面既野就放 E:\Arduino\IDE\arduino-1.8.2\hardware\espressif\esp32 (唔要 zip file  arduino-esp32-master 果層)

                5) 開 command prompt 走去 esp32 下面既 tools folder
                6) 如果有  proxy 既就先設定:
                    SET HTTP_PROXY=http://<user>:<passwod>@server:port
                    SET HTTPS_PROXY=http://<user>:<passwod>@server:port
                7) 之後執行 get.exe, 如果成功會見到咁既 message:

                8) 跟住開  Arduino IDE, 去睇下 Tools->Board 入面, 應該加左 ESP32 Arduino 既 board 了, 咁就可以選番你塊版, 準備開始 program 了.




                2017年3月22日 星期三

                2017 又再 IoT: NodeJs + Mosquitto + MongoDB 簡單測試

                好喇, 已經裝左 mosquitto, MongoDB 同埋 nodejs, 家陣仲係唔知發生乜事.
                不過, 先做個簡單測試, 睇下 work 唔 work 先.

                1) mosquitto - 可以用 chrome apps: MQTTLENS, 又或者 mqtt_spy

                2) mongoDB - 可以起左 server 後 執行 mongo.exe 直接連上 MongoDB

                3) 裝先行到  node 或者 npm 都應該得掛.
                    再唔係可以試下呢個 script, 用 node example.js 去行, 佢會起左個 web server.
                    用 browser 開 localhost:3000 應該見到句 Hello Work 就係得了.

                const http = require('http');
                const hostname = '127.0.0.1';
                const port = 3000;
                
                const server = http.createServer((req, res) => {
                  res.statusCode = 200;
                  res.setHeader('Content-Type', 'text/plain');
                  res.end('Hello World\n');
                });
                
                server.listen(port, hostname, () => { 
                  console.log(`Server running at http://${hostname}:${port}/`);
                });
                
                 4) 最後, 更係要試下 3 件野係咪夾得埋黎用, 如果唔係, 裝黎托咩.
                     可以做個簡單既測試:

                • 用 nodejs 起個 process
                • 睇住 mosquitto 既 message
                • 收到想要既 message 就儲入 MongoDB
                    是旦搵個 folder, 安裝 nodejs 定所需既野.  今次只係要 mqtt 同 mongdb
                    比如開個新 folder, E:\Node\Tester, 然後走去 E:\Node\Tester 行呢句野:
                npm install mqtt mongdb
                    佢就會裝左 mqtt 同 mongdb 既 package 去 E:\Node\Tester\node_modules
                    之後就開個 text file 叫 example.js copy 呢堆野入去:

                consoleLog('MQTT MongoDB Tester Started');
                var mqtt=require('mqtt');
                var mongodb=require('mongodb'); 
                var mongodbClient=mongodb.MongoClient; 
                var mongodbURI='mongodb://localhost/data';
                var deviceRoot='mqtt/demo/';
                var collection,client; 
                 
                mongodbClient.connect(mongodbURI, setupCollection);
                 
                var connInfo = {
                  host: 'localhost',
                  port: 1883,
                  clientId: 'guest169'
                }
                 
                function strNow() {
                  return (new Date()).toISOString().replace('T',' ').replace('Z','');
                }
                
                function consoleLog(msg) {
                  console.log(strNow() + ' : ' + msg);
                }
                
                function setupCollection(err,db) { 
                  if(err) throw err;
                  collection=db.collection('mqtt_demo');
                  client=mqtt.connect(connInfo)
                  client.subscribe(deviceRoot + '#')
                  client.on('message', insertEvent);
                }
                
                function insertEvent(topic,payload) { 
                  var now = strNow();
                  var key=topic.replace(deviceRoot,'');
                  console.log('%s : [%s] - %s', now, key, payload);
                  collection.update( 
                    { _id:key },
                    { $push: { events: { event: { value:payload, when:new Date() } } } },
                    { upsert:true },
                    function(err,docs) {
                      if(err) { consoleLog('#### Insert fail'); }
                    }
                  )
                }
                

                    然後行 node example.js 就可以了.
                    之後, 用  mqtt_spy 或者  MQTTLENS 去 publish, 個 topic 如果開頭係  "mqtt/demo/" 就會接收, 然後放入 MongoDB.  只要走去 MongoDB, use data, 再 show collections, 應該會見到 mqtt_demo 既, 然後再db.mqtt_demo.find(), 就會見到收左乜野了.




                2017年3月21日 星期二

                2017 又再 IoT: node.js, npm

                明明講緊 IoT, 關個 node.js 乜事.

                原因為小弟懶, 發覺好多免費 package 好似幾好用 (例如 Node-RED), 不過就要先裝 node.js 用 npm 去裝.

                無計, 老人家唔想做大多野, 有免費野就唔好浪費, 裝就裝喇.

                1. 下載軟件:  https://nodejs.org/en/download/
                  原來在 https://nodejs.org/en/  已經有 v7.7.3 可以試, 但 download page 係  v6.10.0 LTS.
                2. 安裝軟件:  Windows 軟件, 就咁  click 個 msi 等佢裝.
                  裝完就會去左:   C:\Program Files\nodejs
                3. 裝完之後, 佢會自動加左入 path, 可以直接在 command prompt 行 node 同 npm
                4. 執行 node <filename> 就可以用黎行 nodejs 既 script 了.  例如下面呢個:
                  執行之後會起左個 web server, 用 browser 去 http://localhost:3000 會出句 Hello World.
                const http = require('http');
                const hostname = '127.0.0.1';
                const port = 3000;
                
                const server = http.createServer((req, res) => {
                  res.statusCode = 200;
                  res.setHeader('Content-Type', 'text/plain');
                  res.end('Hello World\n');
                });
                
                server.listen(port, hostname, () => { 
                  console.log(`Server running at http://${hostname}:${port}/`);
                });
                

                1. 跟 nodejs 6.10.0 黎既 npm 係 4.4.1 版本, 可以用黎裝你需要既 modules.
                  安裝既方法:  npm install <module list>
                2. 比如話裝個 mqtt, 就可以做個好簡單既 mqtt monitor 去睇住 mosquitto 收左D 乜

                consoleLog('MQTT Monitor Started');
                var mqtt=require('mqtt');
                var data;
                var connInfo = {
                  host: 'localhost',
                  port: 1883,
                  clientId: 'mqtt_receiver'
                }
                
                client=mqtt.connect(connInfo);
                client.subscribe('#');
                client.on('message', receiveMessageEvent);
                
                function strNow() {
                  return (new Date()).toISOString().replace('T',' ').replace('Z','');
                }
                
                function consoleLog(msg) {
                  console.log(strNow() + ' : ' + msg);
                }
                
                function receiveMessageEvent(topic, payload) {
                  console.log('%s : [%s] - %s', strNow(), topic, payload);
                }
                

                1. 之後好多野我都仲研究緊

                2017 又再 IoT: Database - MongoDB

                今天玩大佢, 唔用人地既 service, 自己黎料.  咁就更係要有個 DB 喇.

                近期吹 BigData, NoSQL 之類既野, MongoDB 又吹到好似好勁.  反正唔駛錢就試下喇.

                基本要求, 暫時只係話 XP 唔 support, 之後既都得, 今次先用 Windows 7 x64 試試.

                1) 下載軟件:  https://www.mongodb.com/download-center#community
                    唔知有幾多分別, 先玩住隻 Community Server, 64bit with SSL Support

                2) 安裝軟件: Windows 軟件最簡單, 直接 click 個 msi 就得.
                    Setup type 選 [Complete] 裝完會去左
                    C:\Program Files\MongoDB\Server\{version}
                   (注意: 行 msi 就裝 3.4.2, {version} 會用 3.4 而唔係 3.4.2, 自已執生.)

                3) 起 Server... 仲研究緊, 好似去到邊個 folder, 下面開定個 data\db, 就咁行 mongod.exe 比埋個 dbpath 佢就得, 當然要 full path 去行喇. 例如:

                "C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe" --dbpath E:\my.Files\IoT\MongoDB\data

                (注意, 條 path 係指到去 data, 唔駛指落 db, 呢個仲唔係好知點解.)

                起到既話, 佢會出句 "waiting for connecitons on port xxxx". 咁就行緊喇.




                4) 識起最緊要識得收, shtudown 就開令一個 command prompt, 行呢句:

                "C:\Program Files\MongoDB\Server\3.4\bin\mongo.exe" admin --eval "db.shutdownServer()"

                2017年3月1日 星期三

                2017 又再 IoT: MQTT Broker - mosquitto

                pat pat 痕就更係要攪下 伺服 至得.
                今次就決定試下唔用人地既 broker, 自己黎料, 攪得幾多得幾多.

                初步諗住用 mosquitto, 其實我都唔知係乜, 一隻蚊, 做得D乜.



                For installation on a new machine, don't trust the readme file that you just need the 3 DLLs........

                Dependencies:

                libeay32.dll ssleay32.dll from OpenSSL:
                Installed version:  Win32 OpenSSL v1.0.2k Light   (note: the new version does not contain these dll files)
                Installed location: C:\OpenSSL-Win32  (the required dll files can be found here also)
                In fact, it is not only need these two files, so don't just copy the files from other machine, you need to install the OpenSSL-Win32 as there has some other files required also.
                               
                pthreadVC2.dll from pthreads
                Installed version: pthreads-w32-2-9-1-release.zip
                Unzip the file, and the dll can be found in Pre-built.2\dll\x64 & Pre-built.2\dll\x86.
                It must use the one in Pre-built.2\dll\x86.

                So, all required DLL can be found as below,
                DLL file
                Source
                Date modified
                Size
                libeay32.dll
                OpenSSL
                2017-01-26 07:25:34
                1.20 MB (1,265,664 bytes)
                ssleay32.dll
                OpenSSL
                2017-01-26 07:25:42
                268 KB (274.944 bytes)
                pthreadVC2.dll
                pthreads
                2012-05-27 01:36:06
                54.5 KBB (55,808 bytes)


                The above 3 DLLs has been mentioned in mosquitto's website, and the readme file after installation.  You may proceed the installation if you are a developer.  But you will hit the error if you just install on a new PC, because it has not mentioned that, Microsoft Visual C++ Runtime is also required.

                Download the latest version from: https://www.microsoft.com/en-us/download/details.aspx?id=53587

                * Must install vc_redist.x86.exe even you are running a 64bit windows.

                Before installation of mosquito, copy the above three files to C:\Widnows\System32
                Then execute the  mosquitto-1.4.11-install-win32.exe  (Check the “Service” to install)
                Installed location: C:\Program Files (x86)\mosquitto
                New service added:  Mosquitto Broker
                Try to start the service (it should be installed as Automatic, which will be started after restart windows).

                Test the mosquito installation by using Chrome application: MQTTLENS
                Subscribe for topic: # (i.e. all topics)
                Publish any message; it should be shown under Subscriptions.

                Other testing tools:





                2017 又再 IoT: 裝備篇 - ESP8266 + Usart-GPU

                首先, 諗下今次點玩.

                (1) MCU
                第一件事, 搵左 硬件先,  D1 好似唔係咁 stable, 唔知點解好容易出  wdt reset.

                買左塊 NodeMcu Lua WIFI V3 , 強國野, 佢叫乜就乜, V3 就 V3 喇.


                官網 簡單到無人有, 想 check 下 pin assignment 都唔得.
                自己上網搵下每個版本既資料, V3 最大好處, 係有 USB 直出既 5V pin.





                其他舊版本, 可以參考一下:

                V2





                V0.9/V1





                注意: 家陣 I2C 既 Wire 庫, 係唔支援 Slave mode 既, 只可以做 master.
                所以, 如果有兩塊 nodeMCU, 係唔可以用 I2C 通訊既.

                不過, 因為 IO 唔係咁多,  又搵唔到靚仔又易睇既 I2C 彩屏, 準備用 Usart-GPU 做 display.
                但係 Usart-GPU 果D要用 5V 電....諗諗下, 可能用番 D1, 又或者買塊 MeWos D1 R2 V2.1.


                用番 D1, 佢 D 針腳真難估, D1 R1 同 D1 R2 又唔同哂, 真係要小心D試清楚至開始.
                唔知點解, TX1 總係怪怪地.

                注意:
                - 如果要用 Interrupt 既話, ESP8266 只係可以用  FALLING, RISING 同 CHANGE.
                  千萬唔好用 LOW 或者 HIGH, 會無反應的.


                ESP8266 既針腳, 玩玩下, 直接用粒 chip 駁電仲好玩:




                (2) Display
                呢樣其實唔係必然既, 24小時行既野, 邊得閒睇住.  不過, 一旦出事, 無個顯示就唔知發生乜事.
                最後都係決定加個 display.  上面都講左, 為左省 IO 線, 諗住用 Usart-GPU 既 display, 仲痕痕地想試下用 touch mon.   諗住自己做埋省電功能, 5分鐘無人掂就關 mon, 再 touch 佢就開番.


                不過...可能會捉蟲, 萬一死左, 個 mon 又 off 左....touch 佢都唔會開番, 又係無用.  唉..心大心細.




                2017 又再 IoT

                三年前第一次聽見 IoT, 好似幾好玩, 就用 塊 Arduino Mega2560 加幾個 sensor, 再用 yeelink 做左個測試系統:



                (終極版係多左 D 設備, 不過好似無再影相, 就用張第一代既相算了, 反正都唔係介紹佢.)

                玩左一年左右, 都唔知有乜好玩, 諗唔到乜野新意, 就自動摺埋左.
                收集左一年既數據, 唔知有乜用.

                事隔一年多, 世界變左好多.  之前仲係用 W5100 插線既網路, 果時 ESP8266 仲係用串口連接 Arduino 既網絡卡, 今時今日, 因為 ESP8266 仲快過 Arduino, 已經獨立了.  加上有人 port 左套 Arduino 落去 (或者叫左 Arduino IDE 支援埋 獨立既 ESP8266), 要做無線網路都好易....係超易至真.

                背脊對落既地方有少少痕, 之前入左塊 D1 都無認真試過, 攞番出黎玩.
                發覺已經可以直接裝 driver, 而且簡單易用, 又心思思想試下.
                再上 io.adafruit.com  測試下, 又幾方便喎....就 pat pat 痕再玩番下.

                雖然 , 今時今日, 已經通街都係免費 broken, 有哂靚仔 UI.
                但係既然三年前都玩過, 再玩番都係無新意, 今次再痕 D, 自己起埋個 server 玩.
                希望....唔會衰喇.

                其實自己都唔知有乜選擇, 要裝幾多至夠, 不過, 一向貪玩既性格, 玩左先算.
                老人家玩野, 玩得幾多日就幾多日,.....