我用的 ESP32 DEVKIT V1引腳圖
pinMode(pin, mode)
作用:設置一個引腳(pin)作為GPIO時的I/O模式。
參數:
pin:引腳編號
mode:GPIO的I/O模式,取值有3種
INPUT :作為數字輸入
OUTPUT :作為數字輸出
INPUT_PULLUP:作為數字輸入,且使能引腳的內部上拉電阻
注意:
a、引腳作為PWM輸出時,無需先前使用pinMode配置其模式,因為PWM本身就代表了輸出的意思。且官方庫原始碼中可以發現,它已經幫我們配置為輸出了。
b、模擬引腳也可以作為數字引腳使用,完全OK。這在數字引腳不夠用的情況下非常有用。
2、GPIO數字輸出digitalWrite(pin,value)
作用:設置一個數字輸出引腳的輸出電平值,HIGH或者LOW。
參數:
pin:引腳編號。此引腳必須在之前使用pinMode設置為OUTPUT模式。
value:2個值
LOW:輸出低電平
HIGH:輸出高電平
3、GPIO數字輸入int digitalRead(pin)
作用:讀取一個數字輸入引腳的電平值。
返回:HIGH(高電平)或者LOW(低電平)。
參數:
pin:引腳編號。
示例 : 按鍵控制燈亮滅void setup(){ pinMode(2,OUTPUT); pinMode(0,INPUT_PULLUP);}void loop(){ if(digitalRead(0)) { while(digitalRead(0)); digitalWrite(2,!digitalRead(2)); }}4、GPIO模擬輸入:analogRead(pin)注意 : 模擬輸入是通過PWM實現的, 所以不需要初始化PIN
analogRead(4)5. 模擬信號輸入解析度: analogSetWidth(bit);bit的值範圍90~511100~1023110~204712(默認)0~40956. 模擬信號輸出 (基於LEDC)LEDC是基於PWM調製實現模擬輸出的.
6.1 設置通道 ledcSetup(channel,freq,bit_num)
與arduino uno主板不同, ESP32的PWM模擬是一個個通道 共16個, 通道可以映射到引腳上. 引腳就可以輸出PWM信號了.參數:
channel : LEDC的PWM通道參數,可選0~15freq : 10Hz到40MHz , 但較高的頻率精確度低bit_num: 佔空比解析度(可選1~16), 比如bit_num=8 則範圍 0~2的8次方 , 也就是0~255推薦的配置:
頻率位深過渡的可用步驟1220赫茲16655362441赫茲15327684882赫茲14163849765Hz13819219531赫茲124096ledcSetup(1,1200,16);6.2 通道與引腳映射 ledcAttachPin(pin,channel)ledcAttachPin(5,1);注意: 一個通道可以同時映射多個引腳
6.3 取消引腳的PWM映射 ledcDetachPin(pin)ledcDetachPin(5);6.4 向指定通道寫入佔空比 ledcWrite(channel,duty)例: 呼吸燈
bool add_status = true;void setup(){ pinMode(2,OUTPUT); ledcSetup(2,1200,8); ledcAttachPin(2,2);}void loop(){ for(int i = 0 ; i<256; i++) { if(add_status) { ledcWrite(2,i); } else { ledcWrite(2,256-i); } delay(5); } add_status = !add_status;}例子, 全彩呼吸燈#include <Arduino.h>#define LED_R 27#define LED_G 33#define LED_B 32void setup(){ Serial.begin(115200); ledcSetup(1, 1200, 8); ledcSetup(2, 1200, 8); ledcSetup(3, 1200, 8); ledcAttachPin(LED_R, 1); ledcAttachPin(LED_G, 2); ledcAttachPin(LED_B, 3); ledcWrite(1, 255); ledcWrite(2, 255); ledcWrite(3, 255);}void loop(){ for (int i = 0; i < 510; i++) { if (i >= 0 && i < 255) ledcWrite(1, 255 - i); if (i >= 255 && i < 510) ledcWrite(1, i - 255); if (i >= 0 && i < 170) ledcWrite(2, 85 + i); if (i >= 170 && i < 425) ledcWrite(2, 425 - i); if (i >= 425 && i < 510) ledcWrite(2, i - 425); if (i >= 0 && i < 85) ledcWrite(3, 85 - i); if (i >= 85 && i < 340) ledcWrite(3, i - 85); if (i >= 340 && i < 510) ledcWrite(3, 595 - i); delay(10); }}6.5 向指定通道輸出指定頻率的音符信號 ledcWriteTone(channel, freq)6.6 向指定通道輸出指定的音符和音階 ledcWriteNote(channel,note,octava)參數
note : 音符 可選(NOTE_C, NOTE_Cs, NOTE_D, NOTE_Eb, NOTE_C......)octava : 音階 , 可選0~77. 模擬信號輸出函數 (基於DAC)ESP32提供了兩個DAC通道, 對應引腳25 , 26. 精度為8位.
dacWrite(pin,value);
void setup(){}void loop(){ for(int i = 0 ; i<256; i++) { dacWrite(25,i); delay(10); }}二、串口列印 UARTESP32共有3個UART埠, 其中UART1用於Flash讀/寫.
串口名Arduino名TXRXUART0Serialpin1pin3UART1Serial1pin10pin9UART2Serial2pin17pin161、串口初始化Serial.begin(speed, config)
參數:speed:波特率,一般取值9600,115200等。config:設置數據位、校驗位和停止位。默認SERIAL_8N1表示8個數據位,無校驗位,1個停止位。返回值:無。2、關閉串口Serial.end()
描述:禁止串口傳輸。此時串口Rx和Tx可以作為數字IO引腳使用。原型:Serial.end()參數:無。返回值:無。3、串口列印Serial.print()
描述:串口輸出數據,寫入字符數據到串口。原型:Serial.print(val)Serial.print(val, format)參數:val:列印的值,任意數據類型。config:輸出的數據格式。BIN(二進位)、OCT(八進位)、DEC(十進位)、HEX(十六進位)。對於浮點數,此參數指定要使用的小數位數。4、串口輸出數據並換行 println() 和 printf()Serial.println()
描述:串口輸出數據並換行。原型:Serial.println(val)Serial.println(val, format)參數:val:列印的值,任意數據類型。config:輸出的數據格式。返回值:返回寫入的字節數。附: 常用格式字符及轉義字符字符說明%o八進位整數輸出%d十進位整數輸出%x十六進位整數輸出%f浮點輸出,默認6位小數%c單字符輸出%s字符串輸出\n換行\r回車\tTab制表符5、將二進位數寫入串口
Serial.printf()Serial.write()
描述
6、判斷串口緩衝區的狀態
將二進位數據寫入串行埠。該數據以字節或一系列字節的形式發送;要發送代表數字數字的字符,請改用print()函數。
句法
*Serial*.write(val)
*Serial*.write(str)
*Serial*.write(buf, len)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
val:要作為單個字節發送的值。
str:作為一系列字節發送的字符串。
buf:要作為一系列字節發送的數組。
len:要從數組發送的字節數。
退貨
write()將返回寫入的字節數,儘管讀取該數字是可選的。資料類型:size_t。Serial.available()
描述:判斷串口緩衝區的狀態,返回從串口緩衝區讀取的字節數。原型:Serial.available()參數:無。返回值:可讀取的字節數。7、讀取串口數據Serial.read()
原型:Serial.read()參數:無。返回值:返回串口緩存中第一個可讀字節,當沒有可讀數據時返回-1,整數類型。
描述:讀取串口數據,一次讀一個字符,讀完後刪除已讀數據。#include<stdio.h>#include<stdlib.h>char rev;void setup() { Serial.begin(115200);}void loop() { if(Serial.available()) { rev=Serial.read(); Serial.print("rev="); Serial.println(rev); }}Serial.readBytes()
描述:從串口讀取指定長度的字符到緩存數組。原型:Serial.readBytes(buffer, length)參數:buffer:緩存變量。length:設定的讀取長度。返回值:返回存入緩存的字符數。
Serial.readString()
描述
Serial.readString()從串行緩衝區讀取字符到字符串。如果超時,該函數將終止。
Serial.readString()從Stream實用程序類繼承。
句法
*Serial*.readString()
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
返回值
一個String從串行讀緩衝器
Serial.readStringUntil()
描述
readStringUntil()從串行緩衝區讀取字符到字符串。如果超時,該函數將終止(請參見setTimeout())。
Serial.readStringUntil()從Stream實用程序類繼承。
句法
*Serial*.readStringUntil(terminator)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
terminator:要搜索的字符。允許的數據類型:char。
返回值
String從串行緩衝區的整個讀取,直到終止符注意和警告
終止符將從串行緩衝區中丟棄。Serial.find()
描述
Serial.findUntil()
Serial.find()從串行緩衝區讀取數據,直到找到目標為止。true如果找到目標,函數將返回false超時。
Serial.find()從流實用程序類繼承。
句法
*Serial*.find(target)
*Serial*.find(target, length)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
target:要搜索的字符串。允許的數據類型:char。
length:目標的長度。允許的數據類型:size_t。
返回值
資料類型:bool。描述
Serial.parseFloat()
Serial.findUntil() 從串行緩衝區讀取數據,直到找到給定長度的目標字符串或終止符字符串。
如果找到目標字符串,則該函數返回true;如果超時,則返回false。
Serial.findUntil()從Stream實用程序類繼承。
句法
*Serial*.findUntil(target, terminal)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
target:要搜索的字符串。允許的數據類型:char。
terminal:搜索中的終端字符串。允許的數據類型:char。
返回值
資料類型:bool。描述
SKIP_ALL:掃描流中的浮點數時,除負號,小數點或數字以外的所有字符都將被忽略。這是默認模式。SKIP_NONE:任何內容都不會被跳過,除非第一個等待的字符有效,否則流不會被觸摸。SKIP_WHITESPACE:僅跳過制表符,空格,換行符和回車符。
Serial.parseFloat()從串行緩衝區返回第一個有效的浮點數。parseFloat()以不是浮點數的第一個字符終止。如果超時,該函數將終止(請參見Serial.setTimeout())。
Serial.parseFloat()從Stream實用程序類繼承。
句法
*Serial*.parseFloat()
*Serial*.parseFloat(lookahead)
*Serial*.parseFloat(lookahead, ignore)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
lookahead:用於在流中向前查詢浮點數的模式。允許的數據類型:LookaheadMode。允許lookahead值:
ignore:用於跳過搜索中指示的字符。例如,用於跳過數千個分頻器。允許的數據類型:char
返回值:
類型:float。Serial.parseInt()描述
如果沒有讀取到可配置的超時值的字符,或者讀取了非數字,則分析停止。如果在發生超時(請參見Serial.setTimeout())時未讀取到有效數字,則返回0;否則返回0。
在輸入的序列中查找下一個有效整數。如果超時,該函數將終止(請參見Serial.setTimeout())。
Serial.parseInt()從Stream實用程序類繼承。
尤其是:句法
SKIP_ALL:掃描流中的整數時,將忽略數字或減號以外的所有字符。這是默認模式。SKIP_NONE:任何內容都不會被跳過,除非第一個等待的字符有效,否則流不會被觸摸。SKIP_WHITESPACE:僅跳過制表符,空格,換行符和回車符。
*Serial*.parseInt()
*Serial*.parseInt(lookahead)
*Serial*.parseInt(lookahead, ignore)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
lookahead:用於在流中向前搜索整數的模式。允許的數據類型:LookaheadMode。允許lookahead值:ignore:用於跳過搜索中指示的字符。例如,用於跳過數千個分頻器。允許的數據類型:char
8.判斷串口是否就緒** Serial
返回值
下一個有效整數。資料類型:long。描述
指示指定的串行埠是否已就緒。
在具有本地USB的板上if (Serial)(或if(SerialUSB)在Due上)指示USB CDC串行連接是否打開。對於所有其他板卡和非USB CDC埠,這將始終返回true。
這是在Arduino IDE 1.0.1中引入的。
句法
if (Serial) while (!Serial) 等等
參量
沒有
返回值
如果指定的串行埠可用,則返回true。如果在準備就緒之前查詢Leonardo的USB CDC串行連接,則僅返回false。類型:bool。
9、設置串口超時**Serial.setTimeout()描述
Serial.setTimeout()設置等待串行數據的最大毫秒數。默認值為1000毫秒。
Serial.setTimeout()從Stream實用程序類繼承。
句法
*Serial*.setTimeout(time)
參量
*Serial*:串行埠對象。請參閱「 串行」主頁上每個板的可用串行埠列表。
time:超時時間(以毫秒為單位)。允許的數據類型:long。
退貨
沒有注意和警告
*Serial*.find()*Serial*.findUntil()*Serial*.parseInt()*Serial*.parseFloat()*Serial*.readBytes()*Serial*.readBytesUntil()*Serial*.readString()*Serial*.readStringUntil()
使用通過*Serial*.setTimeout()以下方式設置的超時值的串行函數:也可以看看
void setup() { //Initialize serial and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB }}void loop() { //proceed normally}/* Serial 串口通訊實驗*/int incomedate = 0;void setup() { Serial.begin(9600); //設置串口波特率9600 Serial.println(78, BIN);// "1001110" Serial.println(78, OCT);// "116" Serial.println(78, DEC);// "78" Serial.println(78, HEX);// "4E" Serial.println(1.23456, 0);// "1" Serial.println(1.23456, 2);// "1.23" Serial.println(1.23456, 4);// "1.2346" Serial.println('N');// "N" Serial.println("Hello world.");// "Hello world."}void loop() { if (Serial.available() > 0)//串口接收到數據 { incomedate = Serial.read();//獲取串口接收到的數據 if (incomedate == 'H') { Serial.println("Good Job!"); } } delay(1000);}使用的串口Serial其實是HardwareSerial類的實例化,實例化過程中傳入了串口號,實現過程如下: