# ESP32學習
---
> 1.IO例題
> 2.LCD模組
> 3.ESP32連上WIFI
> 4.抓取網路資料至ESP32
設定額外開發管理員:
https://github.com/espressif/arduino-esp32/releases/download/2.0.4/package_esp32_dev_index.json
![](https://i.imgur.com/v8VmdBh.png =80%x)
PIO 34,35,36,39:Input only(不能作為輸出腳位)
GPIO 0,6,7,8,9,10,11:系統用,勿使用(淺灰色標示)
GPIO 18:重開機
1. DHT11不可以用GPIO 5、26
2. GPIO 12, 2燒錄時不可接任何裝置,請空接,燒錄完成後,再接回,否則會上傳失敗。
3.WiFi啟動後,2,4,12,13,14,15,25,26,27僅能數位讀取,不可類比
### IO例題:
簡單控制RGB LED模組。
```cpp=
const byte Red = 4;
const byte Green = 16;
const byte Blue = 17; //const 確保往後程式不會修改到
char data; //擷取資料
void setup() {
pinMode(Red,OUTPUT);
pinMode(Green,OUTPUT);
pinMode(Blue,OUTPUT);
Serial.begin(9600);
}
void loop() {
if(Serial.available()){
data = Serial.read();
if(data == '1'){
digitalWrite(Blue,LOW);
digitalWrite(Red,HIGH);
delay(500);
digitalWrite(Red,LOW);
digitalWrite(Green,HIGH);
delay(500);
digitalWrite(Green,LOW);
digitalWrite(Blue,HIGH);
delay(500); }
else {
digitalWrite(Blue,LOW);
digitalWrite(Green,LOW);
digitalWrite(Red,LOW); }
}
}
```
*結果:*
![](https://i.imgur.com/WEC2G4v.jpg =60%x)
---
### LCD模組:
使用電腦發送訊號啟動LED,並結合LED狀態顯示當下Red、Green、Blue的狀態。
```cpp=
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
//LCD接腳SDA SCL
const byte Red = 4;
const byte Green = 16;
const byte Blue = 17; //const 確保往後程式不會修改到
char data; //擷取資料
void setup() {
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.setCursor(0,0);//第一字元開始位置
lcd.print("waiting.....");
lcd.backlight();
pinMode(Red,OUTPUT);
pinMode(Green,OUTPUT);
pinMode(Blue,OUTPUT);
Serial.begin(9600);
}
void loop() {
if(Serial.available()){
data = Serial.read();
if(data == '1'){
lcd.setCursor(0,0);//第一字元開始位置
lcd.clear();
Serial.println("紅");
digitalWrite(Blue,LOW);
digitalWrite(Red,HIGH);
lcd.setCursor(0,0);//第一字元開始位置
lcd.print("Red open");
delay(600);
Serial.println("綠");
digitalWrite(Red,LOW);
digitalWrite(Green,HIGH);
lcd.setCursor(0,0);//第一字元開始位置
lcd.print("Green open");
delay(600);
Serial.println("藍");
digitalWrite(Green,LOW);
digitalWrite(Blue,HIGH);
lcd.setCursor(0,0);//第一字元開始位置
lcd.print("Blue open");
delay(600);
Serial.println("空");
digitalWrite(Blue,LOW);
digitalWrite(Green,LOW);
digitalWrite(Red,LOW);
lcd.setCursor(0,0);//第一字元開始位置
lcd.print("waiting....."); }
else {
digitalWrite(Blue,LOW);
digitalWrite(Green,LOW);
digitalWrite(Red,LOW);
lcd.setCursor(0,0);//第一字元開始位置
lcd.print("waiting....."); }
}
}
```
*結果:*
![](https://i.imgur.com/Ki2tnEk.jpg =60%x)
---
### ESP32連上WIFI:
學習網址:https://crazymaker.com.tw/esp32-connect-to-wifi-network/
| <font color="#f00">語法</font> | <font color="#f00">WIFI模式</font> | <font color="#f00">功能</font> |
|:------------------------------:| :-----------------: | :---------------------------------------------------------------------------------: |
| <font color="#090">WiFi.mode(WIFI_AP)</font> | Access Point (AP) | ESP32可以讓其他設備透過wifi接入(就像家裡的wifi基地台,可供手機連線)。 |
| <font color="#090">WiFi.mode(WIFI_STA)</font> | Station(STA) | 無線終端模式,也就是讓ESP32可以連接上其他的熱點(就像手機一樣,可以連上家裡wifi)。 |
| <font color="#090">WiFi.mode(WIFI_AP_STA)</font> | AP+STA | 將ESP32設置成兩個模式並存。 |
<font color="#090">WiFi.mode(WIFI_OFF)</font>;|OFF|關閉wifi|
檔案資料夾:WIFI_ESP32。
```cpp=
#include<WiFi.h>
const char ssid[]="Ray's Galaxy A52s 5G"; //修改為你家的WiFi網路名稱
const char pwd[]="xadr7782"; //修改為你家的WiFi密碼
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA); //設置WiFi模式
WiFi.begin(ssid,pwd);
Serial.print("WiFi connecting");
//當WiFi連線時會回傳WL_CONNECTED,因此跳出迴圈時代表已成功連線
while(WiFi.status()!=WL_CONNECTED){
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.print("IP位址:");
Serial.println(WiFi.localIP()); //讀取IP位址
Serial.print("WiFi RSSI:");
Serial.println(WiFi.RSSI()); //讀取WiFi強度
}
void loop() {
}
```
*結果:*
![](https://i.imgur.com/jZRFJm1.png)
---
# ESP32與NODE-RED結合
利用NODE-RED的Dashboard做出一個有按鈕的頁面,透過按紐我們可以啟動LED並在'LED'狀態欄裡顯示當下狀態。
*Dashboard頁面:*
![](https://i.imgur.com/IMdrbGb.png =80%x)
*按下後 STM32與LCD:*
![](https://i.imgur.com/HQ3rHld.jpg =60%x)
---
---