基于STM32F103将采集的温度-湿度值通过串口输出,用OLED屏显示自己的学号和姓名以及显示AHT20的温度和湿度,滑动显示长字符
文章目錄
- 一、實(shí)驗(yàn)內(nèi)容及實(shí)驗(yàn)器材
- (一)、實(shí)驗(yàn)內(nèi)容
- (二)、實(shí)驗(yàn)器材
- 二、基于STM32F103將采集的溫度-濕度值通過串口輸出
- (一)、I2C總線通信協(xié)議
- (二)、串口輸出采集的溫度-濕度值
- 三、用OLED屏顯示自己的學(xué)號(hào)和姓名以及顯示AHT20的溫度和濕度,滑動(dòng)顯示長字符
- SPI協(xié)議
- (一)、用OLED屏顯示自己的學(xué)號(hào)和姓名
- (二)、用OLED屏顯示AHT20的溫度和濕度
- (三)、用OLED屏滑動(dòng)顯示長字符
- 四、總結(jié)
- 五、參考文獻(xiàn)
一、實(shí)驗(yàn)內(nèi)容及實(shí)驗(yàn)器材
(一)、實(shí)驗(yàn)內(nèi)容
(二)、實(shí)驗(yàn)器材
STM32F103 開發(fā)板
AHT20 芯片(溫濕度數(shù)據(jù)采集)
AHT20 芯片的具體信息及參考代碼參考官網(wǎng)介紹,鏈接:
http://www.aosong.com/class-36.html
USB 轉(zhuǎn) TTL 模塊
杜邦線若干
PC 機(jī)(Win10)
0.96寸OLED顯示屏模塊
2. 軟件工具:
keil 5 MDK
串口調(diào)試助手
燒錄軟件 mcuisp
二、基于STM32F103將采集的溫度-濕度值通過串口輸出
(一)、I2C總線通信協(xié)議
1、I2C 協(xié)議簡介
I2C 通訊協(xié)議 (Inter - Integrated Circuit) 是由 Phiilps公司開發(fā)的,由于它引腳少,硬件實(shí)現(xiàn)簡單, 可擴(kuò)展性強(qiáng),不需要 USART、CAN 等通訊協(xié)議的外部收發(fā)設(shè)備,現(xiàn)在被廣泛地使用在系統(tǒng)內(nèi)多個(gè)集成電路 (IC) 間的通訊。
2、I2C 物理層
(1) 它是一個(gè)支持設(shè)備的總線。“總線”指多個(gè)設(shè)備共用的信號(hào)線。在一個(gè) I2C 通訊總線中,可 連接多個(gè) I2C通訊設(shè)備,支持多個(gè)通訊主機(jī)及多個(gè)通訊從機(jī)。
(2) 一個(gè) I2C 總線只使用兩條總線線路,一條雙向串行數(shù)據(jù)線 (SDA) ,一條串行時(shí)鐘線(SCL)。 數(shù)據(jù)線即用來表示數(shù)據(jù),時(shí)鐘線用于數(shù)據(jù)收發(fā)同步。
(3)每個(gè)連接到總線的設(shè)備都有一個(gè)獨(dú)立的地址,主機(jī)可以利用這個(gè)地址進(jìn)行不同設(shè)備之間的 訪問。
(4) 總線通過上拉電阻接到電源。當(dāng) I2C設(shè)備空閑時(shí),會(huì)輸出高阻態(tài),而當(dāng)所有設(shè)備都空閑,都輸出高阻態(tài)時(shí),由上拉電阻把總線拉成高電平。
(5)多個(gè)主機(jī)同時(shí)使用總線時(shí),為了防止數(shù)據(jù)沖突,會(huì)利用仲裁方式?jīng)Q定由哪個(gè)設(shè)備占用總線。
(6) 具有三種傳輸模式:標(biāo)準(zhǔn)模式傳輸速率為100kbit/s ,快速模式為400kbit/s ,高速模式下可達(dá)3.4Mbit/s,但目前大多 I 2C 設(shè)備尚不支持高速模式。
(7) 連接到相同總線的 IC 數(shù)量受到總線的最大電容 400pF 限制。
3、協(xié)議層
I2C的協(xié)議定義了通訊的起始和停止信號(hào)、數(shù)據(jù)有效性、響應(yīng)、仲裁、時(shí)鐘同步和地址廣播等環(huán)節(jié)。
4、I2C的兩種方式——硬件I2C和軟件I2C
①硬件I2C
直接利用 STM32 芯片中的硬件 I2C 外設(shè)。
硬件I2C的使用只要配置好對(duì)應(yīng)的寄存器,外設(shè)就會(huì)產(chǎn)生標(biāo)準(zhǔn)串口協(xié)議的時(shí)序。在初始化好 I2C 外設(shè)后,只需要把某寄存器位置 1,此時(shí)外設(shè)就會(huì)控制對(duì)應(yīng)的 SCL及 SDA 線自動(dòng)產(chǎn)生 I2C 起始信號(hào),不需要內(nèi)核直接控制引腳的電平。
②軟件I2C
直接使用。
CPU 內(nèi)核按照 I2C 協(xié)議的要求控制GPIO 輸出高低電平,從而模擬I2C。 軟件I2C的使用 需要在控制產(chǎn)生 I2C 的起始信號(hào)時(shí),控制作為 SCL 線的 GPIO引腳輸出高電平,然后控制作為 SDA 線的 GPIO 引腳在此期間完成由高電平至低電平的切換,最后再控制SCL線切換為低電平,這樣就輸出了一個(gè)標(biāo)準(zhǔn)的 I2C 起始信號(hào)。
③兩者的差別
硬件 I2C 直接使用外設(shè)來控制引腳,可以減輕 CPU 的負(fù)擔(dān)。不過使用硬件I2C 時(shí)必須使用某些固定的引腳作為 SCL 和 SDA,軟件模擬 I2C 則可以使用任意 GPIO引腳,相對(duì)比較靈活。對(duì)于硬件I2C用法比較復(fù)雜,軟件I2C的流程更清楚一些。如果要詳細(xì)了解I2C的協(xié)議,使用軟件I2C可能更好的理解這個(gè)過程。在使用I2C過程,硬件I2C可能通信更加快,更加穩(wěn)定。
(二)、串口輸出采集的溫度-濕度值
1 .代碼編寫
在野火提供的示例代碼中,打開一個(gè)只包含固件庫的空項(xiàng)目。向工程中添加相關(guān)代碼,添加代碼的具體內(nèi)容請(qǐng)參考下面鏈接:
https://blog.csdn.net/hhhhhh277523/article/details/111397514
具體的工程項(xiàng)目包下載 鏈接:https://pan.baidu.com/s/1-uYzWATsvkOYRmazolQAzA
提取碼:4xva
2 .部分代碼分析
AHT20 芯片的初始化
AHT20 芯片讀取并保存數(shù)據(jù)
//沒有CRC校驗(yàn),直接讀取AHT20的溫度和濕度數(shù)據(jù) void AHT20_Read_CTdata(u32 *ct) {volatile u8 Byte_1th=0,Byte_2th=0,Byte_3th=0;volatile u8 Byte_4th=0,Byte_5th=0,Byte_6th=0;u32 RetuData = 0;u16 cnt = 0,flag;AHT20_SendAC();//向AHT20發(fā)送AC命令delay_ms(80); //大約延時(shí)80mswhile(((AHT20_Read_Status()&0x80)==0x80))//直到狀態(tài)bit[7]為0,表示為空閑狀態(tài),若為1,表示忙狀態(tài){delay_ms(1);if(cnt++>=100) break;}IIC_Start();IIC_Send_Byte(0x71);flag=IIC_Wait_Ack();Byte_1th = IIC_Read_Byte(flag);//狀態(tài)字Byte_2th = IIC_Read_Byte(flag);//濕度,發(fā)送ACK(繼續(xù)發(fā)送)Byte_3th = IIC_Read_Byte(flag);//濕度Byte_4th = IIC_Read_Byte(flag);//濕度/溫度Byte_5th = IIC_Read_Byte(flag);//溫度Byte_6th = IIC_Read_Byte(!flag);//溫度,發(fā)送NACK(停止發(fā)送) IIC_Stop();//保存得到的數(shù)據(jù)到RetuData中RetuData = (RetuData|Byte_2th)<<8; RetuData = (RetuData|Byte_3th)<<8;RetuData = (RetuData|Byte_4th);RetuData =RetuData >>4;ct[0] = RetuData;//濕度RetuData = 0;RetuData = (RetuData|Byte_4th)<<8;RetuData = (RetuData|Byte_5th)<<8;RetuData = (RetuData|Byte_6th);RetuData = RetuData&0x0fffff;ct[1] =RetuData; //溫度 }main.c 函數(shù)
#include "led.h" #include "usart.h" #include "temhum.h"int main(void) { u32 CT_data[2]={0};volatile float hum=0,tem=0; delay_init(); //延時(shí)函數(shù)初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)uart_init(115200); //串口初始化為115200LED_Init(); //LED端口初始化temphum_init(); //ATH20初始化 while(1){AHT20_Read_CTdata(CT_data); //不經(jīng)過CRC校驗(yàn),直接讀取AHT20的溫度和濕度數(shù)據(jù) hum = CT_data[0]*100*10/1024/1024; //計(jì)算得到濕度值(放大了10倍)tem = CT_data[1]*200*10/1024/1024-500;//計(jì)算得到溫度值(放大了10倍)printf("濕度:%.1f%%\r\n",(hum/10));printf("溫度:%.1f度\r\n",(tem/10));printf("\r\n");//延時(shí)2s,LED閃爍提示串口發(fā)送狀態(tài)LED=0;delay_ms(1000);LED=1;delay_ms(1000);} }3 .編譯調(diào)試后生成hex文件,然后燒錄進(jìn)STM32,具體燒錄過程請(qǐng)參考:
https://blog.csdn.net/lengyuefeng212/article/details/104178386
4 .串口結(jié)果顯示
打開串口助手,實(shí)驗(yàn)結(jié)果如下:
如圖所示,用手握住傳感器即可看到其溫度得到了明顯升高,環(huán)境濕度改變后同樣濕度也有了變化。
三、用OLED屏顯示自己的學(xué)號(hào)和姓名以及顯示AHT20的溫度和濕度,滑動(dòng)顯示長字符
SPI協(xié)議
1、簡介
SPI協(xié)議是由摩托羅拉公司提出的通訊協(xié)議(SerialPeripheralInterface),即串行外圍設(shè)備接口,是 一種高速全雙工的通信總線。它被廣泛地使用在 ADC、LCD 等設(shè)備與 MCU 間,要求通訊速率 較高的場(chǎng)合。
2、SPI物理層
SPI通訊使用3條總線及片選線,3條總線分別為SCK、MOSI、MISO,片選線為SS,它們的作 用介紹如下:
(1) SS*(*SlaveSelect):從設(shè)備選擇信號(hào)線,常稱為片選信號(hào)線,也稱為NSS、CS,以下用NSS 表示。當(dāng)有多個(gè) SPI 從設(shè)備與 SPI 主機(jī)相連時(shí),設(shè)備的其它信號(hào)線 SCK、MOSI 及 MISO 同時(shí)并聯(lián)到相同的SPI總線上,即無論有多少個(gè)從設(shè)備,都共同只使用這3條總線;而每 個(gè)從設(shè)備都有獨(dú)立的這一條NSS信號(hào)線,本信號(hào)線獨(dú)占主機(jī)的一個(gè)引腳,即有多少個(gè)從設(shè) 備,就有多少條片選信號(hào)線。I2C協(xié)議中通過設(shè)備地址來尋址、選中總線上的某個(gè)設(shè)備并與 其進(jìn)行通訊;而SPI協(xié)議中沒有設(shè)備地址,它使用NSS信號(hào)線來尋址,當(dāng)主機(jī)要選擇從設(shè) 備時(shí),把該從設(shè)備的NSS信號(hào)線設(shè)置為低電平,該從設(shè)備即被選中,即片選有效,接著主 機(jī)開始與被選中的從設(shè)備進(jìn)行SPI通訊。所以SPI通訊以NSS線置低電平為開始信號(hào),以 NSS線被拉高作為結(jié)束信號(hào)。
(2) SCK(SerialClock):時(shí)鐘信號(hào)線,用于通訊數(shù)據(jù)同步。它由通訊主機(jī)產(chǎn)生,決定了通訊的速 率,不同的設(shè)備支持的最高時(shí)鐘頻率不一樣,如STM32的SPI時(shí)鐘頻率最大為fpclk/2,兩 個(gè)設(shè)備之間通訊時(shí),通訊速率受限于低速設(shè)備。
(3) MOSI(MasterOutput,SlaveInput):主設(shè)備輸出/從設(shè)備輸入引腳。主機(jī)的數(shù)據(jù)從這條信號(hào)線 輸出,從機(jī)由這條信號(hào)線讀入主機(jī)發(fā)送的數(shù)據(jù),即這條線上數(shù)據(jù)的方向?yàn)橹鳈C(jī)到從機(jī)。
(4) MISO(MasterInput,,SlaveOutput):主設(shè)備輸入/從設(shè)備輸出引腳。主機(jī)從這條信線讀入數(shù)據(jù), 從機(jī)的數(shù)據(jù)由這條信號(hào)線輸出到主機(jī),即在這條線上數(shù)據(jù)的方向?yàn)閺臋C(jī)到主機(jī)。
3、協(xié)議層
與I2C的類似,SPI協(xié)議定義了通訊的起始和停止信號(hào)、數(shù)據(jù)有效性、時(shí)鐘同步等環(huán)節(jié)。
這是一個(gè)主機(jī)的通訊時(shí)序。NSS、SCK、MOSI 信號(hào)都由主機(jī)控制產(chǎn)生,而 MISO 的信號(hào)由從機(jī) 產(chǎn)生,主機(jī)通過該信號(hào)線讀取從機(jī)的數(shù)據(jù)。MOSI與MISO的信號(hào)只在NSS為低電平的時(shí)候才有 效,在SCK的每個(gè)時(shí)鐘周期MOSI和MISO傳輸一位數(shù)據(jù)。
4、STM32的SPI特性及架構(gòu)
STM32的SPI外設(shè)可用作通訊的主機(jī)及從機(jī),支持最高的SCK時(shí)鐘頻率為fpclk/2(STM32F103型 號(hào)的芯片默認(rèn)f:sub:pclk1為72MHz,fpclk2 為36MHz),完全支持SPI協(xié)議的4種模式,數(shù)據(jù)幀長 度可設(shè)置為8位或16位,可設(shè)置數(shù)據(jù)MSB先行或LSB先行。它還支持雙線全雙工(前面小節(jié)說 明的都是這種模式)、雙線單向以及單線模式。其中雙線單向模式可以同時(shí)使用MOSI及MISO數(shù) 據(jù)線向一個(gè)方向傳輸數(shù)據(jù),可以加快一倍的傳輸速度。而單線模式則可以減少硬件接線,當(dāng)然這 樣速率會(huì)受到影響。
(一)、用OLED屏顯示自己的學(xué)號(hào)和姓名
1.漢字點(diǎn)陣字模
利用取模軟件將需要顯示的文字用十六進(jìn)制表示出來,需要用到的取模軟件:PCtoLCD2002
打開PCtoLCD2002,軟件初始設(shè)置如下:
在文字輸入?yún)^(qū)輸入目標(biāo)文字,點(diǎn)擊生成字模,得到字模碼組
注:將文字進(jìn)行了“左旋90度”、“垂直翻轉(zhuǎn)”,這樣在 OLED 屏上顯示的文字才是正向的,這是因?yàn)?OLED 豎屏顯示的原因。
2.演示程序
需要下載 0.96 寸 OLED 顯示屏廠家給出的 Demo 程序。
程序下載鏈接:
http://www.lcdwiki.com/res/Program/OLED/0.96inch/SPI_SSD1306_MSP096X_V1.0/0.96inch_SPI_OLED_Module_SSD1306_MSP096X_V1.0.zip
3.修改代碼
下載資料包之后打開其中的“0.96inch_SPI_OLED_Module_SSD1306_MSP096X_V1.0\1-Demo\Demo_STM32\0.96inch_OLED_Demo_STM32F103RCT6_Software_4-wire_SPI”。
注意:我用的開發(fā)板是 STM32F103C8T6 芯片,所以這里我用的是這個(gè)文件里的代碼,如果不一樣,請(qǐng)選擇與自己平臺(tái)相同的實(shí)例文件。
1)添加字模
打開上面下載的工程文件“0.96inch_OLED_Demo_STM32F103RCT6_Software_4-wire_SPI\PROJECT\OLED.uvprojx”,打開 gui.c 下的 oledfont.h 頭文件,將 cfont16[] 數(shù)組內(nèi)的內(nèi)容修改成自己的中文文字點(diǎn)陣即可。
2)修改顯示函數(shù)
將 test.c 里 void TEST_MainPage(void) 函數(shù)中的語句注釋掉,添加自己的執(zhí)行語句。
函數(shù)說明:
① GUI_ShowString() 函數(shù)各參數(shù)分別對(duì)應(yīng): X 坐標(biāo)、Y 坐標(biāo)、字符串(ASCLL碼中的)、bit(表示字符顯示格式,這里我用的 16 ,和漢字一樣高)、顯示樣式(1:白字黑底;0:黑字白底)。
② GUI_ShowChinese()
函數(shù)各參數(shù)分別對(duì)應(yīng): X 坐標(biāo)、Y 坐標(biāo)、漢字點(diǎn)陣大小(這里使用的是 16×16 的,參數(shù)應(yīng)該是16)、要顯示的漢字、顯示樣式(1:白字黑底;0:黑字白底)。
3)修改主函數(shù)
將 main.c 代碼中的 while 函數(shù)里除 TEST_MainPage(); 語句以外的語句全注釋掉,如下:
4 .編譯調(diào)試后生成hex文件,然后燒錄進(jìn)STM32,具體燒錄過程請(qǐng)參考:
https://blog.csdn.net/lengyuefeng212/article/details/104178386
5 .STM32F103 開發(fā)板與 OLED 模塊連接
6 .運(yùn)行結(jié)果如下:
(二)、用OLED屏顯示AHT20的溫度和濕度
1 .添加字模
跟上述方法一樣,獲取需要顯示的字的字模后,向 gui.c 下的 oledfont.h 頭文件里的 cfont16[] 數(shù)組內(nèi)的添加中文文字點(diǎn)陣即可。我這里添加了“當(dāng)、前、溫、濕、度”這 5 個(gè)字的點(diǎn)陣。
2 .修改代碼
1)移植 AHT20 溫濕度采集代碼
從上文使用的工程文件里面移植下面 4 個(gè)文件:
bsp_i2c.h、bsp_i2c.c、
sys.h(移植后更改了名稱為 AHT20_sys.h,不然會(huì)重名)、
sys.c(移植后更改了名稱為 AHT20_sys.c,不然會(huì)重名);
并將bsp_i2c.c文件中的串口發(fā)送改為 OLED 顯示 void Show_OLED(void) 即可。
具體移植過程和修改可以參考這篇博客:
https://blog.csdn.net/ssj925319/article/details/111588662?spm=1001.2014.3001.5506
void Show_OLED(void) {GUI_ShowCHinese(28,10,16,"當(dāng)前溫濕度",1);GUI_ShowCHinese(20,32,16,"溫度:",1);GUI_ShowString(60,32,strTemp1,16,1);GUI_ShowString(68,32,strTemp2,16,1);GUI_ShowString(76,32,".",16,1);GUI_ShowString(84,32,strTemp3,16,1);GUI_ShowCHinese(92,32,16,"℃",1);GUI_ShowCHinese(20,48,16,"濕度:",1);GUI_ShowString(60,48,strHumi1,16,1);GUI_ShowString(68,48,strHumi2,16,1);GUI_ShowString(76,48,".",16,1);GUI_ShowString(84,48,strHumi3,16,1);GUI_ShowCHinese(92,48,16,"%",1); }2)修改主函數(shù)
將 main.c 代碼中不用的函數(shù)注釋掉,再修改代碼,之后的結(jié)果如下:
要注意添加頭文件,調(diào)用溫濕度讀取并顯示函數(shù)。
3 .編譯調(diào)試后生成hex文件,然后燒錄進(jìn)STM32,具體燒錄過程請(qǐng)參考:
https://blog.csdn.net/lengyuefeng212/article/details/104178386
4 .STM32F103 開發(fā)板與 OLED 模塊連接
5 .運(yùn)行結(jié)果如下:
用手握住傳感器即可看到其溫度得到了明顯升高,環(huán)境濕度改變后同樣濕度也有了變化。
(三)、用OLED屏滑動(dòng)顯示長字符
1 .添加字模
跟上述方法一樣,獲取字模后,向 gui.c 下的 oledfont.h 頭文件里的 cfont16[] 數(shù)組內(nèi)的添加中文文字點(diǎn)陣即可。
這里我添加的是“生活不易慢慢嘆氣”
2 .修改代碼
1)修改顯示函數(shù)
同上,在 test.c 里 void TEST_MainPage(void) 函數(shù)中不用的語句注釋掉,添加自己的想要顯示的字符,如下:
2)修改主函數(shù)
將 main.c 代碼中的 while 函數(shù)注釋掉,再添加如下代碼:
3 .編譯調(diào)試后生成hex文件,然后燒錄進(jìn)STM32,具體燒錄過程請(qǐng)參考:
https://blog.csdn.net/lengyuefeng212/article/details/104178386
4 .STM32F103 開發(fā)板與 OLED 模塊連接
5 .運(yùn)行結(jié)果如下:
四、總結(jié)
在本次實(shí)驗(yàn)中我學(xué)習(xí)了I2C總線通信協(xié)議和SPI 協(xié)議,使用STM32F103完成了基于I2C協(xié)議的AHT20溫濕度傳感器的數(shù)據(jù)采集,并將采集的溫度-濕度值成功通過串口輸出。同時(shí)理解了OLED屏顯和漢字點(diǎn)陣編碼原理,學(xué)會(huì)了如何使用STM32F103的SPI接口實(shí)現(xiàn)顯示學(xué)號(hào)和姓名,顯示AHT20的溫度、濕度,以及滑動(dòng)顯示長字符。這些我之前未曾接觸過,本次實(shí)驗(yàn)受益良多。
五、參考文獻(xiàn)
https://blog.csdn.net/qq_47538417/article/details/121547952
https://blog.csdn.net/m0_58892312/article/details/121410862
https://blog.csdn.net/ssj925319/article/details/111588662
https://blog.csdn.net/qq_43279579/article/details/111678857
《STM32 HAL庫開發(fā)實(shí)戰(zhàn)指南——基于野火霸天虎開發(fā)板》.pdf
總結(jié)
以上是生活随笔為你收集整理的基于STM32F103将采集的温度-湿度值通过串口输出,用OLED屏显示自己的学号和姓名以及显示AHT20的温度和湿度,滑动显示长字符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 真彩色图像RGB,YIQ图像,HSV图像
- 下一篇: Google企业邮箱申请