ESP32物聯(lián)網(wǎng)智能硬件開發(fā)實戰(zhàn)(李永華版)-課后習(xí)題及答案_第1頁
ESP32物聯(lián)網(wǎng)智能硬件開發(fā)實戰(zhàn)(李永華版)-課后習(xí)題及答案_第2頁
ESP32物聯(lián)網(wǎng)智能硬件開發(fā)實戰(zhàn)(李永華版)-課后習(xí)題及答案_第3頁
ESP32物聯(lián)網(wǎng)智能硬件開發(fā)實戰(zhàn)(李永華版)-課后習(xí)題及答案_第4頁
ESP32物聯(lián)網(wǎng)智能硬件開發(fā)實戰(zhàn)(李永華版)-課后習(xí)題及答案_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

ESP32物聯(lián)網(wǎng)智能硬件開發(fā)實戰(zhàn)習(xí)題及答案

第1章

1.什么是SOC系統(tǒng)?

答案:SystemonChip(SoC),即片上系統(tǒng),是嵌入式系統(tǒng)發(fā)展到高級階段的結(jié)果,技

術(shù)上領(lǐng)先,性能上優(yōu)越。

2.SoC系統(tǒng)設(shè)計包括哪些步驟?

答案:(1)功能設(shè)計;(2)設(shè)計描述和行為驗證;(3)邏輯綜合;(4)門級驗證;(5)

布局和布線。

3.SoC系統(tǒng)的基本組成有哪些?

答案:在SoC系統(tǒng)硬件組成中,包括微處理器CPU,一般采用精簡指令集;存儲器包含

緩存、主存儲器和輔助存儲器;通用設(shè)備接口和I/O接口。在SoC系統(tǒng)軟件組成中,包括中

間層,是設(shè)備驅(qū)動程序和板級支持包:系統(tǒng)層,是實時操作系統(tǒng);應(yīng)用層,是具體的應(yīng)用程

序。

4.SoC系統(tǒng)有哪些基本特點?

答案:內(nèi)核小、專用性、集成化、實時性、多任務(wù)、可測性、長期性、可靠性、可裁剪。

5.ESP32系統(tǒng)主要功能有哪些?

答案:Wi-Fi、藍(lán)牙、CPU和存儲、時鐘和定時器、高級外設(shè)接口、安全機(jī)制。

第2章

1.ESP32系列芯片采用什么結(jié)構(gòu)?兩個CPU名稱及意義是什么?

答:采用兩個哈佛結(jié)構(gòu)XtensaLX6CPU構(gòu)成雙核系統(tǒng)。兩個CPU的名稱分別是“PR0_CPU”

和“APP_CPU"。PRO代表protocol(協(xié)議)”,APP代表“application(應(yīng)用)”。

2.請畫出ESP32系列芯片的系統(tǒng)結(jié)構(gòu)?

3.ESP32系統(tǒng)的地址范圍是什么?

答案:數(shù)據(jù)總線與指令總線分別有4GB(32位)地址空間,從0x0000^0000~0xFFFF_FFFF?

4.請畫圖描述ESP32的WROVER一模組功能?

ESP32-WROVER-E

Antenna

5.ESP32系統(tǒng)提供哪三種級別的復(fù)位方式,每種復(fù)位對數(shù)據(jù)的影響?

答案:分別是CPU復(fù)位、內(nèi)核復(fù)位、系統(tǒng)復(fù)位。所有的復(fù)位都不會影響存儲器中的數(shù)據(jù)。

整個系統(tǒng)的結(jié)構(gòu)以及每種復(fù)位方式如下:CPU復(fù)位,只復(fù)位CPU的所有寄存器。內(nèi)核復(fù)位,

除了RTC,所有數(shù)字寄存器全部復(fù)位,包括CPU、數(shù)字GPIO和外設(shè)。系統(tǒng)復(fù)位,會復(fù)位整個

芯片所有的寄存器,包括RTC。

6.ESP32的時鐘源分別來自那里?

答案:外部晶振、內(nèi)部PLL或震蕩電路。

7.畫圖描述單任務(wù)與多任務(wù)系統(tǒng)區(qū)別?

政代先城便務(wù)

低優(yōu)先級任務(wù)

高優(yōu)先級任務(wù)

大循環(huán)(后臺)

Taskl

Task2-

ere.

JffF

et]中斷(前臺)|

ISR中斷嵌套(前臺)

ISR低優(yōu)先級任務(wù)

Task4

第3章

1.請描述ESP32開發(fā)流程?

2.什么是ESP-IDF?

答案:ESPTDF是樂鑫官方的物聯(lián)網(wǎng)開發(fā)框架,適用于ESP32和ESP32-S系列SoC。它

基于C/C++語言提供了SDK,方便用戶在這些平臺上開發(fā)通用應(yīng)用程序。

3.ESPTDF有哪些功能?

ESP-IDF

NetworkProvisioningOTAupgradeLibraryManufactunngUtiifUesCommonNetworkingProtocolsExamples

FieSystemsObjectStoragePOS1XandC++SuwxwtNetworkSecuntyCryptoLtbraiyIDEPlugms

1BluetootrvBluetoothLE|

wm&BluetoomLE

PerpheralsDnversPowerManagementTCP/IPStackBu*lSystem

MeshNetwortcingStack

1

?|BluetoothControner|

RTOSKernelSoCSupportSoftwareBootloaderW?-FiMACLibraryDevetopetTools

4.如何安裝ESP-IDF開發(fā)環(huán)境?

答案:可以通過官方網(wǎng)站下載在線安裝包、帶有集成開發(fā)環(huán)境的離線安裝包以及ESP-

IDF離線安裝包,然后安裝即可。

5.在計算機(jī)上安裝上ESP32開發(fā)板后,如何查看端口?

答案:右擊Windows系統(tǒng)桌面上的“此電腦”,依次單擊“屬性”、"設(shè)備管理器”、

“端口(COM和LPT)”,SiliconLabsCP210xUSBtoUARTBridge,即為ESP32開發(fā)板

所在的端口。

6.ESP-IDF運行一個工程需要哪些步驟?

答案:在命令行下完成如下步驟:⑴輸入idf.pyset-targetesp32,設(shè)置目標(biāo)芯片;

(2)輸入:idf.pymenuconfig,進(jìn)行配置;(3)輸入:idf.pybuild,進(jìn)行編譯;(4)輸

入idf.py-pcomXflash,進(jìn)行燒錄;(5)輸入idf.py-pcomXmonitor,查看結(jié)果。

7.圖示描述一個項目的目錄樹結(jié)構(gòu)?

-myPrqject

-CNfakeLists.txt*-'

-sdkconfig^-1

-components-component1-CMakeLists.txt*-1

-Kconfig*-'

-srcl.o1

-component!-CMakeLists.txt”

-Kconfig^'

-srcl.o1

-include-component2.h-

>main-srcLc+'

-srcl.c^

-builds

8.machine模塊主要包括哪幾個類?

答案:Pin類,控制I/O引腳。Signal類,控制和感應(yīng)外部I/O設(shè)備。UART類,雙工

串行通信總線。SPI類,串行外設(shè)接口總線協(xié)議(主機(jī))。12c類,雙線串行協(xié)議。RTC類,實

時時鐘。定時器類,控制硬件定時器。WDT類,看門狗定時器。

第4章

1.請畫出I0_MUX、RTCI0_MUX和GPI0交換矩陣結(jié)構(gòu)。

SPI,

UART,

PC.I?S,

PWM,

LEDC

andmore

2.電路如圖所示,請使用Eclipse/VScode開發(fā)環(huán)境實現(xiàn),LED亮1秒,滅3秒的程

序功能。

#include<stdio.h>

^include^freertos/FreeRTOS.h?,

ttinclude〃freertos/task.h〃

^include“driver/gpio.h"

^include"sdkconfig.h"

^defineLED18〃定義輸出引腳

voidLED_Task(void*pvParameter)

{

gpio_pad_select_gpio(LED);〃選擇芯片引腳

gpio_set_direction(LED,GPIO_MODE_OUTPUT);〃設(shè)置該引腳為輸出模式

whi1e(1){

gpio_set_level(LED,0);〃電平為低

vTaskDelay(3000/portTICK_PERIOD_MS);〃延遲1S

gpio_set_level(LED,1);〃電平為高

vTaskDelay(1000/portTICK_PERIOD_MS);〃延遲1S

}

}

voidapp_main()〃主函數(shù)

xTaskCreate(&LED_Task,/lED_Task,/,configMINI\lAL_STACK_SIZE,NULL,5,NULL);〃新建一個任務(wù)

)

3.ESP32系統(tǒng)中斷包括那幾部分,畫圖描述中斷矩陣結(jié)構(gòu)?

答案:包括外設(shè)中斷配置寄存器、中斷源、中斷矩陣和中斷輸出寄存器。

PRO.CPUPeripheralInterruptConfigurabonRegister

PRO.CPUNMIIntemjptMask

APP.CPUPeripheralInterruptConfigurationRegister

APP.CPUNMIInterruptMask

PRO.CPUPenplwalInterrupt

PeripheralInterruptSource

InterruptMatrix

APP.CPUPonpheralInterrupt

PRO_CPUPenpheralInterruptSourceStatusRegister

-APP:C-P-U-P-ef-lpb-e-ra-lIn-te-n-up-t-So-ur-ce-S-ta-tu-s-Re-gi-st-er?

4.根據(jù)4.2.4節(jié)中,Arduino開發(fā)環(huán)境的中斷程序,實現(xiàn)5次計數(shù),中斷一次的程序功

能。

voidcalIBack(void)

Serial,printf(ZZGPIO4Interrupted'。”);

)

voidsetup()

Serial,begin(115200);〃設(shè)置串口監(jiān)視器波特率

Serial.printlnO;

pinMode(18,OUTPUT);//GPIO18為輸出模式

pinMode(4,INPUT);//GPIO4為輸入模式

attachInterrupt(4,calIBack,RISING);〃上升沿觸發(fā)中斷

intent=0;

voidloop()〃主函數(shù)

Serial,printf(,zcnt:%d\n”,cnt++);〃打印計數(shù)

digitaiWrite(18,ent%5);〃每隔5個計數(shù),打印一次中斷

delay(1000);〃延時1S

//detachinterrupt(4);〃關(guān)閉中斷

)

5.ESP32系統(tǒng)的ADC支持多少個通道?

答案:ADC1(8個通道,連接到GPIO32~39)和ADC2(10個通道,連接到GPIO0、2、

4、12~15,25~27)。

6.請根據(jù)4.3.3節(jié)的MicroPython程序,打印ADC的值和對應(yīng)的電壓。

frommachineimportADC,Pin

fromtimeimportsleep_ms

adc=ADC(Pin(32))#在引腳32實例化ADC(MicroPython只支持在32~39號引腳對ADC實例化)

adc.atten(ADC.ATTN_6DB)

adc.width(ADC.WIDTH」2BIT)#12位分辨率,范圍0-4095

while1:

adc.read()

sleep_ms(1000)#延時

print(adc.readO)#打印ADC的值

printADCValue:〃+str(adc.read()*2200/4096))#打印電壓的值

7.DAC每個通道的輸出模擬電壓計算方式為DACn_OUT=VDD3P3_RTCXPDACn_DAC/256,

其中,VDD3P3_RTC為3.3V,PDACn_DAC從0-255變化,修改4.4.3節(jié)中的示例程序一,基

于VScode打印輸出對應(yīng)的電壓。

#include<stdio.h>

^include<stdlib.h>

^include^freertos/FreeRTOS.h?,

ttinclude〃freertos/task.h〃

^includez,freertos/queue.h〃

^include〃driver/gpio.h〃

^include^driver/adc.h〃

#include〃driver/dac.h〃

#include/zesp_system.h"

#include"esp_adc_cal.h"

voidappjnain(void)

(

uint8_toutput_data=0;〃輸出數(shù)據(jù)變量

esp_err_tr;〃判斷結(jié)果變量

gpio_num_tdac_gpio_num;〃引腳變量

r=dac_pad_get_io_num(DAC_CHANNEL_2,&dac_gpio_num);〃獲取引腳信息

assert(r==ESP_OK);〃正確與否

printffDACchannel%d@GPIO%d.\n",DAC_CHANNEL_2,dac_gpio_num);

dac_output_enable(DAC_CHANNEL_2);〃DAC輸出使能

vTaskDelay(2*portTICK_PERIOD_MS);〃延時

printf("startconversion.\n");

whi1e(1){

dac_output_voltage(DAC_CHANNEL_2,output_data++);〃輸出數(shù)據(jù)

printf(^output-Voltage3.3*output_data/255);

printf(z,output_data%d@GPIO%d.\n\output_data,dac_gpio_num);

vTaskDelay(10);

)

)

8.根據(jù)4.5.3節(jié)的示例一,修改定時器語句err=

esptimer_start_periodic(testphandle,1000*1000);,實現(xiàn)LED的亮9秒滅1秒,

并將信息打印在串口。

ttinclude<stdio.h>

#includez,esp_types.h〃

#include^freertos/FreeRTOS.h,z

/include,zfreertos/task.h〃

^include"freertos/queue.h"

#include/zsoc/timer_group_struct.h"

#include^driver/periph_ctrl.h"

^include*driver/timer.hz/

#include*driver/gpio.h〃

^defineLED2

esp_timer_handle_ttest_phandle=0;

voidtest_timer_periodic_cb(void*arg){〃回調(diào)程序

gpio_set_level(LED,0);〃電平為低

vTaskDelay(1000/portTICK_PERIOD_MS);〃延遲1S

gpio_set_level(LED,1);〃電平為高

vTaskDelay(1000/portTICK_PERIOD_MS);〃延遲1S

printf(^Hello,LED\n");

}

voidappmainO〃主程序入口

{

gpio_pad_select_gpio(LED);〃選擇芯片引腳

gpio_set_direction(LED,GPIO_MODE_OUTPUT);〃設(shè)置該引腳為輸出模式

〃定義一個周期重復(fù)運行的定時器結(jié)構(gòu)體

esp_timer_create_args_ttest_periodic_arg={

.callback=

&test_timer_periodic_cb,〃設(shè)置回調(diào)函數(shù)

.arg=NULL,〃不攜帶參數(shù)

.name="TestPeriodicTimer”〃定時器名字

};

esp_err_terr=esp_timer_create(&test_periodic_arg,&test_p_handle);//倉U建定時器

err=esp_timer_start_periodic(test_p_handle,10000*1000);〃開啟周期定時

if(err-0)〃判斷并打印信息

printfdimerStart:ESP0K!\n");

第5章

i.什么是串口通信?

答案:UART以字符為導(dǎo)向的通用數(shù)據(jù)鏈,可以實現(xiàn)設(shè)備間的通信。異步傳輸?shù)囊馑际?/p>

不需要在發(fā)送數(shù)據(jù)上添加時鐘信息。這也要求發(fā)送端和接收端的速率、停止位、奇偶校驗位

等都必須相同,通信才能成功。首先,一個典型的UART幀開始于一個起始位;其次,是有

效數(shù)據(jù);再次,是奇偶校驗位(可有可無);最后,是停止位。

2.ESP32的串口使用可以分那幾部分?

答案:分為4部分:設(shè)置串口參數(shù),包括波特率、奇偶校驗、數(shù)據(jù)位與停止位等;設(shè)置

串口使用的GPIO引腳;安裝驅(qū)動,為UART分配資源;進(jìn)行串口通信。

3.不使用ESP32默認(rèn)UART,通過REPL控制臺,設(shè)計程序?qū)崿F(xiàn)輸入命令"consoletest”,

輸出“Thisisanexamplestring,ifyoucanreadthis,theexampleisasuccess!",

否則輸出錯誤,并通過默認(rèn)的UART輸出信息。

短接ESP32開發(fā)的TX引腳與GPI05引腳,RX引腳與GPI04引腳,程序如下:

#include<stdio.h>

^include,zfreertos/FreeRTOS.h,z

#include^freertos/task.h〃

#include〃driver/uart.h"

#include〃soc/uart_periph.h〃

^includez,esp_rom_gpio.h"

#include"driver/gpio.h"

#include〃hal/gpio_hal.h"

#include“sdkconfig.h〃

#include"esp_console.h"

^include"linenoise/linenoise.h"

#include<string.h>

^defineDEFAULT_UART_CHANNEL(0)

^defineCONSOLE_UART_CHANNE1.(1-DEFAULT_UART_CHANNEL)

^defineDEFAULT_UART_RX_PIN(3)

#defineDEFAULT_UART_TX_PIN(2)

^defineCONSOLESART_RX_PIN(4)

^defineCONSOLE_UART_TX_PIN(5)

^defineUARTS_BAUD_RATE(115200)

^defineTASK_STACK_SIZE(2048)

^defineREAD_BUF_SIZE(1024)

constchartest_message[]=“Thisisanexamplestring,ifyoucanreadthis,theexampleis

asuccess!

staticvoidconnect_uarts(void)

(

esp_rom_gpio_connect_out_signal(DEFAULT_UART_RX_PIN,UART_PERIPH_SIGNA1.(1,

SOC_UART_TX_PIN_IDX),false,false);

esp_rom_gpio_connect_in_sigoal(DEFAULT_UART_RX_PIN,UART一PERIPH_SIGNAL(0,

SOC_UART_RX_PIN_IDX),false);

esp_rom_gpio_connect_out_signa1(DEFAULT_UART_TX_PIN,UART_PERIPH_SIGNAL(0,

SOC_UART_TX_PIN_IDX),false,false);

esp_rom_gpio_connect_in_signal(DEFAULT_UART_TX_PIN,UART_PERIPH_SIGNAL(1,

SOC_UART_RX_PIN_IDX),false);

)

staticvoiddisconnect_uarts(void)

(

esp_rom_gpio_connect_out_signal(CONSOLE_UART_TX_PIN,UART_PERIPH_SIGNAL(1,

SOC_UART_TX_PIN_IDX),false,false);

esp_rom_gpio_connect_in_signal(CONSOLE_UART_RX_PIN,UART_PERIPH_SIGNAL(1,

SOC_UART_RX_PIN_IDX),false);

staticvoidconfigure_uarts(void)

/*ConfigureparametersofanUARTdriver,

*communicationpinsandinstallthedriver*/

uart_config_tuart_config={

.baud_rate=UARTS_BAUD_RATE,

.data_bits=UART_DATA_8_BITS,

.parity=UART_PARITY_DISABLE,

.stop_bits=UART_STOP_BITS_1,

.flow_ctrl=UART_HW_FLOWCTRL_DISABLE,

.source”Ik=UART_SCLK_APB,

};

ESP_ERROR_CHECK(uart_driver_instal1(DEFAULT_UART_CHANNEL,READ_BUF_SIZE*2,0,0,NULL,

0));

ESP_ERROR_CHECK(uart_param_config(DEFAULT_UART_CHANNEL,&uart_config));

ESP_ERROR_CHECK(uart_set_pin(DEFAULT_UART_CHANNEL,DEFAULT_UART_TX_PIN,

DEFAULT_UART_RX_PIN,

UART_PIN_NO_CHANGE,UART_PIN_NO_CHANGE));

connect_uarts();

}

staticintconsole_test(intargc,char**argv){

printf(繪s\n〃,test_message);

return0;

}

staticvoidsendcommands(void*arg){

staticchardata[READ_BUF_SIZE];

charcommand[]="consoletest\n〃;

intlen=0;

void*substring=NULL;

do{

len=uart_read_bytes(DEFAULT_UART_CHANNEL,data,READ_BUF_SIZE,100/

portTICK_RATE_MS);

}while(len==0);

if(len=="1){

gotoend;

)

len=uart_write_bytes(DEFAUI/rjJARTCHANNEL,command,sizeof(command));

if(len=T){

gotoend;

len=uart_read_bytes(DEFAULT_UART_CHANNEL,data,READ_BUF_SIZE-1,250/

portTICK_RATE_MS);

}while(len==0);

if(len=-1){

gotoend;

)

data[len]=0;

substring=strcasestr(data,test_message);

end:

disconnect_uarts();

printf("Result:%s\n〃,substring==NULL?”Failure":"Success");

vTaskDelete(NULL);

}

voidapp_main(void)

(

esp_console_repl_t*repl=NULL;

esp_console_repl_config_trepl_config=ESP_CONSOLE_REPL_CONFIG_DEFAULT();

rep1_config.prompt="repl

constesp_conso1e_cmd_tcmd={

.command="consoletest”,

.help="Testconsolebysendingamessage”,

.func=&console_test,

};

espconso1e_dev_uart_config_tuart_config={

.channel=CONSOLE_UART_CHANNEL,

.baud_rate=UARTS_BAUD_RATE,

.tx_gpio_num=CONSOLE_UART_TX_PIN,

.rx_gpio_num=CONSOLE_UART_RX_PIN,

);

1inenoiseSetDumbMode(1);

ESP_ERROR_CHECK(esp_console_new_repl_uart(&uart_config,&repl_config,&repl));

configure_uarts();

ESP_ERROR_CHECK(esp_console_cmd_register(&cmd));

xTaskCreate(sendcommands,z,send_commands_task,\TASK_STACK_SIZE,NULL,10,NULL);

ESP_ERROR_CHECK(esp_console_start_repl(repl));

)

4.使用ArduinoIDE在串口輸出“HelloWorld!"及輸出次數(shù),設(shè)計并實現(xiàn)程序。

intcounter:。;〃計數(shù)器

voidsetup(){〃初始化串口

Serial,begin(9600);

)

void1oop(){〃每loop循環(huán)一次,計數(shù)器變量加1

counter=counter+1;〃輸出變量

Serial.print(counter);〃輸出字符

Serial.print(*);〃輸出字符串;

Serial,printin(^HellowWorld!,z);

delay(1000);

}

5.什么是12c通信?

答案:I2C(Inter-IntegratedCircuit)是一種串行、同步、半雙工通信協(xié)議,它允許

在同一總線上同時存在多個主機(jī)和從機(jī)。12c為兩線總線,由SDA線和SCL線構(gòu)成,這些線

設(shè)置為漏極開漏輸出,兩條線都需要上拉電阻。因此,12c總線上可以掛載多個外設(shè),通常

是和一個或多個主機(jī)以及一個或多個從機(jī),主機(jī)通過總線訪問從機(jī)。

6.根據(jù)5.2.4節(jié)ArduinoIDE的12c程序得到的GY-30設(shè)備地址為0x23,請設(shè)計程序

讀取GY-30傳感器的值,并在串口監(jiān)視器打印。

^include〈Wire.h>

^defineADDR0x23

voidsetup(){

Serial,begin(9600);

while(ISerial){

)

Wire,begin();

Wire,beginTransmission(ADDR);

Wire.write(ObOOOOOOOl);

Wire.endTransmission();

)

voidloop(){

intval=0;

Wire,beginTransmission(ADDR);

Wire.write(ObOOOOOl11);

Wire.endTransmission();

Wire,beginTransmission(ADDR);

Wire.write(0b00100000);

Wire.endTransmissionO;

delay(120);

Wire,requestFrom(ADDR,2);

for(val=0;Wire,available()>=1;){

charc=Wire,read();

//Serial.println(c,HEX);

val=(val?8)+(c&OxFF);

}

val=val/1.2;

Serial,print("BRIGHTNESS:〃);

Serial,print(val);

Serial.println(〃lux〃);

delay(100);

)

6.什么是I2S?其通信需要哪些功能引腳?

答案:I2$(InterTCSound)總線是飛利浦公司為數(shù)字音頻設(shè)備之間的音頻數(shù)據(jù)傳輸而

制定的一種總線標(biāo)準(zhǔn),該總線專責(zé)于音頻設(shè)備之間的數(shù)據(jù)傳輸,廣泛應(yīng)用于各種多媒體系統(tǒng)。

12s采用了獨立的導(dǎo)線傳輸時鐘與數(shù)據(jù)信號的設(shè)計,通過將數(shù)據(jù)和時鐘信號分離,避免

了因時差誘發(fā)的失真,解決了音頻抖動問題。標(biāo)準(zhǔn)的12s總線電纜是由3根串行導(dǎo)線組成

的:1根是時分多路復(fù)用(簡稱TDM)數(shù)據(jù)線;1根是字選擇線;1根是時鐘線。

7.使用Arduin。IDE,采用INMP441麥克風(fēng),使用“I2S_PHILIPS_M0DE”模式,輸出

采樣值并在串口繪圖器上打印結(jié)果。

引腳連線如下:*GND-GND,3.3V-3.3V,WS-25(ESP32),CLK-5(ESP32),SD-26(ESP32).

程序?qū)崿F(xiàn)如下:

^include<I2S.h>

voidsetup(){

Serial.begin(115200);

while(ISerial){

)

if(!I2S.begin(I2S_PHILIPSJIODE,8000,32)){

Serial,printIn(^FailedtoinitializeI2S!");

while(1);

)

)

voidloop(){

intsample=I2S.read();

if(sample&&sample!=-1&&sample!=1){

Serial.printIn(sample);

)

}

8.什么是SPI?有什么優(yōu)缺點?

答案:SPI是串行外設(shè)接口(SerialPeripheralInterface)的縮寫,是Motorola公司

推出的一種同步串行接口技術(shù),是一種高速的、全雙工、同步的通信總線。SPI優(yōu)點是支持

全雙工通信、通信簡單、數(shù)據(jù)傳輸速率快;缺點是沒有指定的流控制,沒有應(yīng)答機(jī)制確認(rèn)是

否接收到數(shù)據(jù),所以跟12c總線協(xié)議比較,在數(shù)據(jù)、可靠性上有一定的缺陷。

9.根據(jù)ssdl306.py文件,編寫程序,使用12c引腳的OLED設(shè)備,實現(xiàn)信息顯示。

frommachineimportSoftI2C,Pin

fromssdl306importSSD1306_I2C

i2c=SoftI2C(scl=Pin(19),sda=Pin(23))#使用19和23引腳

oled=SSD1306_I2C(128,64,i2c,addr=0x3C)#創(chuàng)建OLED對象,addr地址根據(jù)具體設(shè)備

oled.textCHelloWorld',0,20)#在屏幕(0,20)坐標(biāo)上顯示文字“HelloWorld”

oled.show()#刷新屏幕

第6章

1.ESP32WiFi連網(wǎng)功能支持配置哪三種模式?

答案:站點模式(即STA模式或WiFi客戶端模式),此時ESP32連接到接入點(AP)或者

路由器。AP模式(即Soft-AP模式或接入點模式),也就是ESP32作為路由器,此時站點連

接到ESP32.AP-STA共存模式(ESP32既是接入點,同時又作為站點連接到另外一個接入點)。

2.在ESP-IDF開發(fā)框架中,將ESP32開發(fā)板設(shè)置為AP模式,SSID為“MyESP32",密

碼為“123456789",如何修改AP示例程序?

將sdkconfig文件中修改如下字段

C0NFIG_EXAMPLE_WIFI_SSID=z,MyESP32”

C0NFIG_EXAMPLE_WIFI_PASSW0RD=,,123456789,z

3.在ArduinoIDE中,實現(xiàn)AP模式,SSID為“MyESP32”,密碼為“123456789”,

并在串口打印相關(guān)信息。

#include<Arduino.h>

^include"WiFi.h"

voidsetup()

(

Serial,begin(115200);

WiFi.softAP(〃MyESP32〃,“123456789〃);〃設(shè)置AP參數(shù),名稱和密碼

}

voidloop()

(

Serial,print(〃主機(jī)名:");

Serial.printIn(WiFi.softAPgetHostname());

Serial,print(〃主機(jī)IP:*);

Serial,printIn(WiFi.softAPIP());

Serial,print("主機(jī)IPV6:*);

Serial.printIn(WiFi.softAPIPv6());

Serial,print(“主機(jī)SSID:");

Serial,printin(WiFi.SSID());

Serial,print("主機(jī)mac地址:");

Serial.println(WiFi.softAPmacAddress());

Serial,print(〃主機(jī)連接個數(shù):”);

Serial.printIn(WiFi,softAPgetStationNum());

Serial,print(〃主機(jī)狀態(tài):〃);

Serial.println(WiFi.status());

delay(1000);

)

4.使用microPython開發(fā)環(huán)境,實現(xiàn)ESP32作為站點連接WiFi時密碼的動態(tài)輸入功

能?

importnetwork

\mporttime

defdo_connect(essid,password):

>>>

根據(jù)給定的eddid和password連接wifi

:paramessid:wifisid

:parampassword:password

:return:None

,,,

ifessid=Noneoressid='':

raiseBaseException(,essidcannotbenull')

ifpassword==Noneorpassword

raiseBaseException(Jpasswordcannotbenull')

sta_if=network.WLAN(network.STA_IF)

ifnotsta_if.active():

print("setstaactive")

sta_if.active(True)

ifnotsta_if.isconnectedO:

print(Jconnectingtonetwork...,)

staif.connect(essid,password)

retry_times=30

whilenotsta_if.isconnectedOandretry_times>0:

printCwaitamomentiwilltry%sitems,please"%retry_times)

time,sleep⑵

retry_times-=1

print(*networkconfig/,sta_if.ifconfigO)

defdisconnect():

,,>

斷開網(wǎng)絡(luò)連接

:return:None

,,,

staif=network.WLAN(network.STAIF)

ifsta_if.isconnectedO:

sta_if.disconnect()

print(Jthenetworkhadbeendisconnect')

if_name_=="_main_":

essid=inputCpleaseinputyouressid/)

password=input(*pleaseinputyourpassword:1)

do_connect(essid,password)

whi1eTrue:

exit=input(XpressQtoexit:")

ifexit=='Q':

disconnect()

break

5.在ESP-IDF開發(fā)中,TCP服務(wù)器和客戶端通信,需要哪些步驟?

TCP是面向連接的可靠服務(wù),服務(wù)器端的步驟:(1)創(chuàng)建套接字socket。;(2)綁定套

接字到一個IP地址和一個端口上,bindO;(3)將套接字設(shè)置為監(jiān)聽模步等待連接請求,

listen。;(4)請求到來后,接收連接請求,返回一個新的對應(yīng)于此次連接的套接字,accept。;

(5)用返回的套接字和客戶端進(jìn)行通信,send()/recv();(6)關(guān)閉套接字,close。。

客戶端的步驟:(1)創(chuàng)建套接字,socket();(2)向服務(wù)器端發(fā)出連接請求,connect();

(3)與服務(wù)器端進(jìn)行通信,sendO/recvO;(4)關(guān)閉套接字,close。。

6.使用MicroPython開發(fā)一個TCP服務(wù)器,使用網(wǎng)絡(luò)調(diào)試助手作為TCP客戶端,控制

ESP32開發(fā)板上GPI022引腳上LED的亮滅。

#ESP32上運行相關(guān)代碼

importnetwork

importsocket

importtime

frommachineimportPin#導(dǎo)入Pin模塊

fromutimeimportsleep_ms#導(dǎo)入延時函數(shù)

SSID二〃〃

PASSWORD二〃〃

port=10000

wlan=None

1istenSocket=None

defled(control_cmd):

LED=Pin(22,Pin.OUT)#構(gòu)建LED對象,GPIO22輸出

ifcontrol_cmd==T:

LED.value(1)#點亮LED

elifcontrol_cmd==〃0”:

LED.value(0)#熄滅LED

defconnectWifi(ssid,passwd):

globalwlan

wlan=network.WLAN(network.STA_IF)

wlan.active(True)

wlan.disconnect()

wlan.connect(ssid,passwd)

while(wlan.ifconfigO[0]=*0.0.0.O'):

time,sleep(l)

returnTrue

try:

connectWifi(SSID,PASSWORD)

ip=wlan.ifconfigO[0]

listenSocket=socket,socket()

1istenSocket.bind((ip,port))

listenSocket.listen(l)

listenSocket.setsockopt(socket.SOLSOCKET,socket.SOREUSEADDR,1)

print("*"*90)

print("TCP服務(wù)器開啟,IP:%sPORT:%s'%(ip,port))

print(〃*〃*90)

whileTrue:

prinl(〃等待消息接收...〃)

conn,addr=1istenSocket.accept()

print(〃連接自…”,addr)

whileTrue:

data=conn,recv(1024)

if(len(data)==0):

print(〃接收完成.....〃)

conn,close()

break

message_content=data,decode()

led(message_content)

print(",\033[0;36;32m接收消息內(nèi)容:[%s]\033[Om,z%message_content)

ret=conn,send(data)

except:

if(listenSocket):

listenSocket.close()

wlan.disconnect()

wlan.active(False)

7.簡述UDP通信的過程。

答案:服務(wù)器端步驟:(1)使用函數(shù)socket。,生成套接字文件描述符;(2)通過Socket

結(jié)構(gòu)設(shè)置服務(wù)器端地址和監(jiān)聽端口;(3)使用bind。函數(shù)綁定監(jiān)聽端口,將套接字文件描

述符和地址類型變量進(jìn)行綁定;(4)接收客戶端的數(shù)據(jù),使用recvfromO函數(shù)接收客戶端

的網(wǎng)絡(luò)數(shù)據(jù);(5)向客戶端發(fā)送數(shù)據(jù),使用sendtoO函數(shù)向服務(wù)器端主機(jī)發(fā)送數(shù)據(jù);(6)關(guān)

閉套接字,使用close。函數(shù)釋放資源。

客戶端步驟:(1)使用socket。,生成套接字文件描述符;(2)通過Socket結(jié)構(gòu)設(shè)置

服務(wù)器端地址和監(jiān)聽端口;(3)向服務(wù)器端發(fā)送數(shù)據(jù),sendtoO;(4)接收服務(wù)器端的數(shù)據(jù),

recvfrom0;(5)關(guān)閉套接字,close()?

8.使用ArduinoIDE構(gòu)建UDP客戶端,實現(xiàn)周期性向UDP服務(wù)器發(fā)送消息。

〃參考ArduinoIDE的示例,文件/示例/ESP32AsyncUDP/AsyncUDPClient

^include"WiFi,h”

^include“AsyncUDP.h〃

constchar*ssid=〃***********";〃修改SSID

constchar*password=〃***********〃;〃修改密碼

AsyncUDPudp;

voidsetup()

(

Serial.begin(115200);

WiFi,mode(WIFLSTA);

WiFi.begin(ssid,password);

if(WiFi,waitForConnectResult()!=WL_CONNECTED){

Serial.printlnC^WiFiFailed");

whi1e(1){

delay(1000);

)

)

if(udp.connect(IPAddress(192,168,1,100),1234)){〃修改目標(biāo)服務(wù)器

Serial.printin("UDPconnected'7);

udp.onPacket([](AsjrncUDPPacketpacket){

Serial,printCUDPPacketType:");

Serial,print(packet.isBroadcast()?,,Broadcast//:packet.isMulticast()?〃Multicast":"Unicast");

Serial,print(^,From:");

Serial,print(packet.remotelPO);

Serial,print(〃:");

Serial,print(packet.remotePort());

Serial,printTo:");

Serial,print(packet,localIP());

Serial,print(〃:“);

Serial,print(packet.localPort());

Serial,printLength:〃);

Serial,print(packet,length());

Serial,print(,z,Data:");

Serial,write(packet.dataO,packet,length());

Serial,printIn();

//replytotheclient

packet,printf(''Got%ubytesofdata”,packet,length());

});

//Sendunicast

udp.print("HelloServer!");

}

}

void1oop()

{

delay(1000);

//Sendbroadcastonport1234

udp.broadcastTo("Anyonehere?”,1234);

}

第7章

1.簡述應(yīng)用層協(xié)議層次結(jié)構(gòu)。

2.HTTP請求/響應(yīng)的步驟:

答案:(1)建立TCP連接。(2)客戶端向服務(wù)器端發(fā)送請求。(3)客戶端發(fā)送請求頭信

息。(4)服務(wù)器端應(yīng)答。(5)服務(wù)器端響應(yīng)頭信息。(6)服務(wù)器端向客戶端發(fā)送數(shù)據(jù)。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論