# Raspberry Pi 4 從0開始
[TOC]
## 前言
> 本文使用 Raspberry Pi 4 Model B 8G 進行以下所有操作
[name=Jung]
<br/>
## 無外接螢幕設定樹莓派
要完成**無外接螢幕設定樹莓派**,有線無線網路都可以,本文示範有線設定
### 所需設備(無線)
* 一台能分享網路的機器(手機也可,樹莓派跟電腦都要連得上)
* 一張 MicroSD 卡 (8GB<=容量<=32)
* 一個 MicroSD 讀卡器
* 一塊 Raspberry Pi 4
* Type-c 電源線 跟 變壓器 (>=10W)
* 一台可連網路的電腦
### 所需設備(有線)
* 有網路孔的環境
* 一台路由器 (最好是沒有設密碼)
* 三條網路線
* 一張 MicroSD 卡 (8GB<=容量<=32)
* 一個 MicroSD 讀卡器
* 一塊 Raspberry Pi 4
* Type-c 電源線 跟 變壓器 (>=10W)
* 一台有網路孔的電腦
### 所需軟體
* [Raspberry Pi Imager](https://www.raspberrypi.com/software/) : 製作映像檔 MicroSD 卡
* [Advanced IP Scanner](https://www.advanced-ip-scanner.com/tw/) : 在區網找 Raspberry Pi 的 IP
* [Putty](https://www.putty.org/) : 用 SSH 與 Raspberry Pi 連接
* [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/) : 完成設定後,連線使用樹莓派圖形化介面
上述軟體安裝過程不另贅述,有需要可自行搜尋
### 前置作業
1. 將網路環境建置,用兩條網路線將路由器分別接上網路孔和電腦
2. 下載安裝設定[所需軟體](https://hackmd.io/e3GQbqMqTAmlHt3EEdg0QQ?both#%E6%89%80%E9%9C%80%E8%BB%9F%E9%AB%94)
3. 確定環境、設備一切正常
### 製作映像檔 MicroSD 卡
1. 本文使用手邊的 **32G** 記憶卡 (>32GB 需格式化成 FAT32 格式)

2. 啟動後,先按**中間**選擇要用的 MicroSD 卡,按**左邊**選擇**擦除**,再按右邊**燒錄**

3. 擦除後,先按**中間**選擇要用的 MicroSD 卡,按**左邊**選擇**預設的OS**

按**齒輪**設置 **開啟SSH** 跟 **username 和 password**

設置無線網路 **SSID** 跟 **password** (想無線連接可做,有線可省略)

設置後按**燒錄**

安裝成功

映像檔 MicroSD 就完成了 !
### 確認 Raspberry Pi 狀態 & IP
1. 將 **映像檔 MicroSD** 插進 **Raspberry Pi**
2. 用網路線連接 **路由器** 跟 **Raspberry Pi**
3. 插上 **Raspberry Pi 電源**
4. 完成上述步驟後,會看到樹莓派**紅燈(電源燈)恆亮**,**綠燈(記憶卡狀態燈)閃爍**
網路孔**橘燈、恆亮綠燈閃爍**,這樣表示一切正常 ([燈號說明](https://yanwei-liu.medium.com/raspberry-pi%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98-%E5%8D%81%E4%BA%94-%E6%A8%B9%E8%8E%93%E6%B4%BEled%E6%8C%87%E7%A4%BA%E7%87%88%E8%AA%AA%E6%98%8E-9f8caf9a244c))
5. 開啟 **Advanced IP Scanner** 或 **路由器管理介面** 找出 **樹莓派 IP**
***「須注意,使用DHCP時,有線和無線可能各分配一個IP
如下圖,有線時 IP = 192.168.0.1;無線時 IP = 192.168.0.9
使用 Putty 跟 VNC Viewer 要確認,否則會 Connection time out」***


### SSH 連線
1. 啟動 **Putty**
2. **Host Name** 請填 **自己的樹莓派 IP**,並使用 **SSH (Port=22)**

3. 按下 **Open**,會看到下圖,並按下 **Accept**

依照前面設定輸入**帳號、密碼**,看到下面代表成功連線

4. 在終端鍵入 **```sudo raspi-config```** 做設定
* 1 System Options > S1 Wireless Lan : TW Taiwn > SSID > passphrase 前面沒設,這裡可以
* 2 Display Options > D5 VNC Resolution : 建議設成 1280x720,解析度太高VNC會卡
* 3 Interface Options > I2 SSH : 已經 enable,可以確認一下
* 3 Interface Options > I3 VNC : 設成 enable,VNC 才能連入
* 5 Localisation Options > L1 Locale : 建議加入en_GB.UTF-8
* 5 Localisation Options > L2 Timezone : 選 Asia > Taipei

設定完按 **Finish**,會問要不要重開機,選**Yes** 之後 Putty 會斷線,就設定成功了

### VNC Viwer
1. 開啟 **VNC Viwer**,**```Ctrl+N```** 建立新連線

2. 照下方圖片勾選設定
* VNC Server : 樹莓派 IP (確定網路連線方式再輸入)
* Name : 名稱 (自己命名)
* 剩下照著勾選


3. 按下 **OK**,會新增一圖示,點擊**圖示**連線

4. 首次連線要**帳號、密碼**,照先前設定輸入,可依需求勾選 **Remember password**

5. ***成功 !!!***

<br/>
## 在樹莓派上安裝 Mosquitto
1. 安裝 Mosquitto
```shell=
sudo apt install mosquitto mosquitto-clients
```
2. 確認安裝版本
```shell=
mosquitto -v
```

```shell=
systemctl status mosquitto
```

***亦可用 start / stop / enable... 來控制***
3. 測試 Mosquitto
```shell=
mosquitto_sub -h localhost -t hello/world
```
***開另一個終端機執行***
```shell=
mosquitto_pub -h localhost -t hello/world -m "TEST"
```


## 在樹莓派上安裝 Node-Red
1. 安裝 Node.js
```shell=
sudo apt-get install nodejs
```
2. 安裝 npm
(Node Package Manager,以 JavaScript 編寫的軟體套件管理系統。)
```shell=
sudo apt-get install npm
```
3. 確認環境版本
```shell=
Jung@raspberrypi:~ $ node -v
v12.22.12
Jung@raspberrypi:~ $ npm -v
7.5.2
```
4. 安裝 Node-Red
```shell=
sudo npm install -g --unsafe-perm node-red
```

5. 啟動 Node-Red
```shell=
node-red
```

6. 成功啟動!!!

<br/>
## ESP32S with MongoDB

* ***Post***



* ***Get***



* ***Setting Functions***


```java=
exports = function({ query, headers, body}, response) {
const newBody = JSON.parse(body.text());
const myPassword = "0909160217";
const password = newBody.password;
const newObject = {
"spo2": newBody.spo2,
"beat": newBody.beat,
"mood": newBody.mood,
}
if(password == myPassword){
const doc = context.service.get("mongodb-atlas").db("myDB").collection("myCollection").insertOne(newObject);
}
else{
return "Not a valiad user";
}
return newObject;
};
```
```java=1
/*exports = function({query, headers, body}, response) {
let date_ob = new Date();
let year = date_ob.getFullYear();
let date = ("0" + date_ob.getDate()).slice(-2);
let month = ("0" + (date_ob.getMonth() + 1)).slice(-2);
let hours = ("0" + date_ob.getHours()).slice(-2);
let minutes = ("0" + date_ob.getMinutes()).slice(-2);
let seconds = ("0" + date_ob.getSeconds()).slice(-2);
console.log(year + "-" + month + "-" + date + " " + hours + ":" + minutes + ":" + seconds);
return 0;
};*/
exports = function({query, headers, body}, response) {
let date_ob = new Date();
let year = date_ob.getFullYear();
let date = ("0" + date_ob.getDate()).slice(-2);
let month = ("0" + (date_ob.getMonth() + 1)).slice(-2);
let hours = ("0" + date_ob.getHours()).slice(-2);
let minutes = ("0" + date_ob.getMinutes()).slice(-2);
let seconds = ("0" + date_ob.getSeconds()).slice(-2);
const newBody = JSON.parse(body.text());
const myPassword = "20030217";
const passwd = newBody.password;
const newObj = {
"spo2": newBody.spo2,
"beat": newBody.beat,
"time": newBody.time,
"timestamp": year + "-" + month + "-" + date + "T" + hours + ":" + minutes + ":" + seconds + "Z",
}
if(passwd == myPassword){
const doc = context.services.get("mongodb-atlas").db("myDB").collection("myCollection").insertOne(newObj);
}
else{
return "Not a valiad user";
}
return newObj;
};
```


```java=
exports = function({ query, headers, body}, response) {
const doc = context.service.get("mongodb-atlas").db("myDB").collection("myCollection").find().sort({_id:-1}).limit(10);
return doc;
};
```
* ***Review & Deploy***


### How to find app service on new MongoDB
1. 在Overview頁面左側找出**Triggers**

2. 在Triggers頁面右側找出**View All Apps**

3. 在Applications頁面下方找出**原來的Application**

4. 便可找出原本的頁面及功能
