版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Unit6 Keep our city clean– Grammar time (練習(xí)及解析)譯林版(三起)-六年級英語上冊
- 用電事故應(yīng)急預(yù)案(3篇)
- 英語組年度工作總結(jié)
- 網(wǎng)頁開發(fā)合同范本
- 2023屆新高考新教材化學(xué)魯科版一輪限時訓(xùn)練-第8章第26講 弱電解質(zhì)的電離
- 物品遷移合同范本
- 2025年中國速凍食品行業(yè)深度分析、投資前景、趨勢預(yù)測報告(智研咨詢)
- 五年級數(shù)學(xué)上冊 【沖刺奪冠】期末測試卷(二)(含答案)(北師大版)
- 社保借款合同范本
- 五年級數(shù)學(xué)上冊 【提高卷】第五單元提升通關(guān)測試卷 蘇教版(含答案)(蘇教版)
- 某某商會某某專業(yè)委員會管理辦法
- 幼兒園音樂活動的設(shè)計與組織課件
- 碳酸二甲酯安全技術(shù)說明書(msds)
- 黑色漸變文明交通安全出行中學(xué)生交通安全教育課PPT模板
- 第7章散客旅游服務(wù)程序與服務(wù)質(zhì)量《導(dǎo)游業(yè)務(wù)》(第五版)
- 后續(xù)服務(wù)的安排及保證措施
- 學(xué)習(xí)通《古典詩詞鑒賞》習(xí)題(含答案)
- 維吾爾族的傳統(tǒng)文化課件
- 異物管控記錄表
- 內(nèi)蒙古自治區(qū)通遼市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細(xì)及行政區(qū)劃代碼
- 小學(xué)安全課件《按章行路才安全》
評論
0/150
提交評論