娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

STM32采集傳感器數(shù)據(jù)通過(guò)冒泡排序取穩(wěn)定值

發(fā)布者:HappyExplorer最新更新時(shí)間:2024-05-10 來(lái)源: elecfans關(guān)鍵字:STM32  傳感器數(shù)據(jù)  冒泡排序 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

一、前言

物聯(lián)網(wǎng)單片機(jī)開(kāi)發(fā)中,經(jīng)常需要采集各種傳感器的數(shù)據(jù)。比如:溫度、濕度、MQ2、MQ3、MQ4等等傳感器數(shù)據(jù)。這些數(shù)據(jù)采集過(guò)程中可能有波動(dòng),偶爾不穩(wěn)定,為了得到穩(wěn)定的值,我們可以對(duì)數(shù)據(jù)多次采集,進(jìn)行排序,去掉最大和最小的值,然后取平均值返回。

image-20230525140855726

image-20230525140932125

二、排序算法

【1】冒泡排序

冒泡排序(Bubble Sort)是一種簡(jiǎn)單的排序算法,也是最基礎(chǔ)、最容易理解的一種排序算法。它會(huì)遍歷要排序的數(shù)組,依次比較相鄰兩個(gè)元素的大小,如果前一個(gè)元素比后一個(gè)元素大,就交換這兩個(gè)元素的位置。

冒泡排序的過(guò)程如下:

  1. 從數(shù)組的第一個(gè)元素開(kāi)始,依次比較相鄰的兩個(gè)元素,如果前一個(gè)元素比后一個(gè)元素大,則交換這兩個(gè)元素的位置。

  2. 繼續(xù)比較相鄰的元素,直到數(shù)組的最后一個(gè)元素。

  3. 重復(fù)執(zhí)行步驟1和步驟2,直到整個(gè)數(shù)組都按照從小到大的順序排列好。

冒泡排序的時(shí)間復(fù)雜度是O(N^2),其中N是數(shù)組中元素的數(shù)量。在實(shí)際應(yīng)用中,由于其時(shí)間復(fù)雜度較高,冒泡排序很少被用于大規(guī)模數(shù)據(jù)的排序,但它仍然是一種優(yōu)秀的教學(xué)工具,因?yàn)樗菀桌斫夂蛯?shí)現(xiàn),并且可以幫助初學(xué)者理解排序算法的基本思想。


以下是C語(yǔ)言代碼的實(shí)現(xiàn),封裝為名為calculateAverage的函數(shù)。

#define ARRAY_SIZE 20

 

 // 冒泡排序算法函數(shù)

 void bubbleSort(int arr[], int n) {

     for(int i = 0; i < n-1; i++) {

         for(int j = 0; j < n-i-1; j++) {

             if(arr[j] > arr[j+1]) {

                 int temp = arr[j];

                 arr[j] = arr[j+1];

                 arr[j+1] = temp;

             }

         }

     }

 }

 

 // 計(jì)算平均值函數(shù),去除最大值和最小值

 int calculateAverage() {

     int arr[ARRAY_SIZE];

     // 連續(xù)讀取20次數(shù)據(jù)

     for(int i = 0; i < ARRAY_SIZE; i++) {

         arr[i] = ReadADC();

     }

     // 對(duì)數(shù)組進(jìn)行排序

     bubbleSort(arr, ARRAY_SIZE);

     // 去掉最大值和最小值

     int sum = 0;

     for(int i = 1; i < ARRAY_SIZE-1; i++) {

         sum += arr[i];

     }

     // 計(jì)算平均值并返回

     return sum / (ARRAY_SIZE-2);

 }


在函數(shù)中,首先定義了一個(gè)常量ARRAY_SIZE表示需要讀取的數(shù)據(jù)的數(shù)量。然后,使用一個(gè)循環(huán)讀取20次數(shù)據(jù),并將它們存儲(chǔ)到一個(gè)數(shù)組中。接著,用冒泡排序算法對(duì)數(shù)組進(jìn)行排序。在排序完成后,計(jì)算數(shù)組中除去最大值和最小值的元素之和,并計(jì)算平均值。最后,返回計(jì)算得到的平均值。


【2】插入排序

插入排序(Insertion Sort)是一種簡(jiǎn)單直觀的排序算法,它的基本思想是將一個(gè)元素插入到已排序好的序列中的適當(dāng)位置,使得插入后仍然有序。


插入排序的過(guò)程如下:


假設(shè)第一個(gè)元素已經(jīng)是排好序的序列,從第二個(gè)元素開(kāi)始,依次將每個(gè)元素插入到已經(jīng)排好序的序列中。

每次從未排序的部分中取出一個(gè)元素,與已排序的序列中的元素從后向前依次比較,找到插入的位置,即找到一個(gè)比當(dāng)前元素小的值或者已經(jīng)到了開(kāi)頭位置。

將當(dāng)前元素插入到已排序序列的合適位置上,重新調(diào)整已排序的序列,繼續(xù)對(duì)未排序的序列進(jìn)行排序。

重復(fù)執(zhí)行步驟2和步驟3,直到整個(gè)數(shù)組都按照從小到大的順序排列好。

插入排序的時(shí)間復(fù)雜度是O(N^2),其中N是數(shù)組中元素的數(shù)量。在實(shí)際應(yīng)用中,插入排序通常適用于處理小規(guī)模數(shù)據(jù)或者已經(jīng)接近有序的數(shù)據(jù),因?yàn)榇藭r(shí)插入排序的效率高于其他排序算法。


以下是C語(yǔ)言代碼的實(shí)現(xiàn),封裝為名為calculateAverage的函數(shù)。


#define ARRAY_SIZE 20

 

 // 插入排序算法函數(shù)

 void insertionSort(int arr[], int n) {

     for(int i = 1; i < n; i++) {

         int key = arr[i];

         int j = i-1;

         while(j >= 0 && arr[j] > key) {

             arr[j+1] = arr[j];

             j--;

         }

         arr[j+1] = key;

     }

 }

 

 // 計(jì)算平均值函數(shù),去除最大值和最小值

 int calculateAverage() {

     int arr[ARRAY_SIZE];

     // 連續(xù)讀取20次數(shù)據(jù)

     for(int i = 0; i < ARRAY_SIZE; i++) {

         arr[i] = ReadADC();

     }

     // 對(duì)數(shù)組進(jìn)行排序

     insertionSort(arr, ARRAY_SIZE);

     // 去掉最大值和最小值

     int sum = 0;

     for(int i = 1; i < ARRAY_SIZE-1; i++) {

         sum += arr[i];

     }

     // 計(jì)算平均值并返回

     return sum / (ARRAY_SIZE-2);

 }

在函數(shù)中,首先定義了一個(gè)常量ARRAY_SIZE表示需要讀取的數(shù)據(jù)的數(shù)量。然后,使用一個(gè)循環(huán)讀取20次數(shù)據(jù),并將它們存儲(chǔ)到一個(gè)數(shù)組中。接著,用插入排序算法對(duì)數(shù)組進(jìn)行排序。在排序完成后,計(jì)算數(shù)組中除去最大值和最小值的元素之和,并計(jì)算平均值。最后,返回計(jì)算得到的平均值。


【3】希爾排序

希爾排序(Shell Sort)是一種由Donald Shell在1959年發(fā)明的排序算法,它是插入排序的一種變體,旨在減少排序中元素的移動(dòng)次數(shù),從而使算法更快。希爾排序的基本思想是把數(shù)組中相距某個(gè)“增量”的元素組成一個(gè)子序列,對(duì)每個(gè)子序列進(jìn)行插入排序,然后逐步縮小增量,重復(fù)進(jìn)行上述操作,直到增量為1,最后再對(duì)整個(gè)數(shù)組進(jìn)行一次插入排序。


希爾排序的過(guò)程如下:


選擇一個(gè)增量序列,將待排序的數(shù)組按照這個(gè)增量序列分成若干組(子序列)。通常,在第一次排序時(shí),增量取數(shù)組長(zhǎng)度的一半,以后每次將增量減半,直到增量為1。

對(duì)每個(gè)子序列進(jìn)行插入排序,即將每個(gè)子序列中的元素按照遞增的順序插入到已排序好的序列中。

重復(fù)執(zhí)行步驟2,改變?cè)隽浚钡皆隽繛?。

最后再對(duì)整個(gè)數(shù)組進(jìn)行插入排序。

希爾排序的時(shí)間復(fù)雜度與所選取的增量序列有關(guān)。最壞情況下的時(shí)間復(fù)雜度為O(N^2),其中N是數(shù)組中元素的數(shù)量。但在大多數(shù)情況下,希爾排序的時(shí)間復(fù)雜度優(yōu)于O(N^2),可以達(dá)到O(N log N)的級(jí)別。希爾排序的空間復(fù)雜度為O(1),因?yàn)樗谂判蜻^(guò)程中只需要常數(shù)個(gè)額外的存儲(chǔ)空間。


以下是C語(yǔ)言代碼實(shí)現(xiàn),封裝為名為calculateAverage的函數(shù)。


#define ARRAY_SIZE 20

 

 // 希爾排序算法函數(shù)

 void shellSort(int arr[], int n) {

     for(int gap = n/2; gap > 0; gap /= 2) {

         for(int i = gap; i < n; i++) {

             int temp = arr[i];

             int j;

             for(j = i; j >= gap && arr[j-gap] > temp; j -= gap) {

                 arr[j] = arr[j-gap];

             }

             arr[j] = temp;

         }

     }

 }

 

 // 計(jì)算平均值函數(shù),去除最大值和最小值

 int calculateAverage() {

     int arr[ARRAY_SIZE];

     // 連續(xù)讀取20次數(shù)據(jù)

     for(int i = 0; i < ARRAY_SIZE; i++) {

         arr[i] = ReadADC();

     }

     // 對(duì)數(shù)組進(jìn)行排序

     shellSort(arr, ARRAY_SIZE);

     // 去掉最大值和最小值

     int sum = 0;

     for(int i = 1; i < ARRAY_SIZE-1; i++) {

         sum += arr[i];

     }

     // 計(jì)算平均值并返回

     return sum / (ARRAY_SIZE-2);

 }


在函數(shù)中,首先定義了一個(gè)常量ARRAY_SIZE表示需要讀取的數(shù)據(jù)的數(shù)量。然后,使用一個(gè)循環(huán)讀取20次數(shù)據(jù),并將它們存儲(chǔ)到一個(gè)數(shù)組中。接著,用希爾排序算法對(duì)數(shù)組進(jìn)行排序。在排序完成后,計(jì)算數(shù)組中除去最大值和最小值的元素之和,并計(jì)算平均值。最后,返回計(jì)算得到的平均值。


關(guān)鍵字:STM32  傳感器數(shù)據(jù)  冒泡排序 引用地址:STM32采集傳感器數(shù)據(jù)通過(guò)冒泡排序取穩(wěn)定值

上一篇:深入解讀STM32啟動(dòng)詳細(xì)流程分析-上
下一篇:STM32+DHT11監(jiān)測(cè)環(huán)境的溫濕度

推薦閱讀最新更新時(shí)間:2025-04-23 12:29

以色列創(chuàng)企融資100萬(wàn)美元 研發(fā)傳感器網(wǎng)絡(luò)可實(shí)時(shí)收集周圍環(huán)境數(shù)據(jù)
智能城市概念不再是電影中的白日夢(mèng),而是馬上就可以在任何城市中實(shí)現(xiàn)的現(xiàn)實(shí)。想象一下,城市中的故障可被實(shí)時(shí)處理,而且城市也可以學(xué)會(huì)如何優(yōu)化以更好地服務(wù)于市民。不過(guò),并非每個(gè)人都想要一個(gè)技術(shù)更先進(jìn)的未來(lái),特別是如果這意味著必須需要為此犧牲自己的隱私。 (圖片來(lái)源:RoadSense) 不過(guò),據(jù)外媒報(bào)道,以色列初創(chuàng)公司RoadSense研發(fā)了一個(gè)傳感器網(wǎng)絡(luò),可以提供從街道上收集的定制化數(shù)據(jù),而且不會(huì)侵犯到任何人的隱私。最近,該公司宣布其在種子輪融資中籌集了100萬(wàn)美元。該輪融資由Capital Nature領(lǐng)投,該公司參與的Highroad創(chuàng)新項(xiàng)目也對(duì)其進(jìn)行了投資。RoadSense于2019年創(chuàng)辦,由首席執(zhí)行官Baruch
[汽車電子]
以色列創(chuàng)企融資100萬(wàn)美元 研發(fā)<font color='red'>傳感器</font>網(wǎng)絡(luò)可實(shí)時(shí)收集周圍環(huán)境<font color='red'>數(shù)據(jù)</font>
邊緣上的AI:“協(xié)作機(jī)器人”如何快速處理傳感器數(shù)據(jù)
無(wú)論是傳統(tǒng)的工業(yè)機(jī)器人系統(tǒng),還是當(dāng)今最先進(jìn)的協(xié)作機(jī)器人(Cobot),它們都要依靠可生成大量高度可變數(shù)據(jù)的傳感器。這些數(shù)據(jù)有助于構(gòu)建更佳的機(jī)器學(xué)習(xí)(ML)和人工智能(AI)模型。而機(jī)器人依靠這些模型變得“自主”,可在動(dòng)態(tài)的現(xiàn)實(shí)環(huán)境中做出實(shí)時(shí)決策和導(dǎo)航。 工業(yè)機(jī)器人通常位于“封閉”環(huán)境中,出于安全原因,如果該環(huán)境中有人類進(jìn)入,機(jī)器人會(huì)停止移動(dòng)。但是限制人類/機(jī)器人協(xié)作,也使得很多益處無(wú)法實(shí)現(xiàn)。具有自主運(yùn)行功能的機(jī)器人,可以支持安全高效的人類與機(jī)器人的共存。 機(jī)器人應(yīng)用的傳感和智能感知非常重要,因?yàn)闄C(jī)器人系統(tǒng)的高效性能,特別是ML/AI系統(tǒng), 在很大程度上取決于為這些系統(tǒng)提供關(guān)鍵數(shù)據(jù)的傳感器的性能。當(dāng)今數(shù)量廣泛且日益完善和精確的傳感器
[機(jī)器人]
CC2420和MMA7260的無(wú)線傳感器數(shù)據(jù)采集系統(tǒng)
   引言   隨著工業(yè)測(cè)控系統(tǒng)規(guī)模的不斷擴(kuò)大以及數(shù)據(jù)采集的多樣性,有線網(wǎng)絡(luò)由于安裝盒成本高昂以及使用不便等缺點(diǎn)受到很大的限制,而無(wú)線傳感器網(wǎng)絡(luò)憑借投資成本低、結(jié)構(gòu)靈活、易于改造、無(wú)需布線等優(yōu)勢(shì),在數(shù)據(jù)采集領(lǐng)域得到了比較廣泛的應(yīng)用。ZigBee無(wú)線傳輸協(xié)議是一種新興的短距離、低功耗、低復(fù)雜度、低數(shù)據(jù)傳輸速率且低成本的雙向無(wú)線網(wǎng)絡(luò)通信技術(shù),主要應(yīng)用于工業(yè)控制、傳感數(shù)據(jù)采集和系統(tǒng)監(jiān)控等領(lǐng)域。工業(yè)中各種機(jī)構(gòu)的振動(dòng)對(duì)機(jī)械產(chǎn)品的工作性能有較大影響,機(jī)構(gòu)疲勞損壞容易導(dǎo)致生產(chǎn)過(guò)程中事故的發(fā)生。因此,采用傳感器來(lái)采集振動(dòng)信號(hào)用于分析產(chǎn)品性能和預(yù)防事故的發(fā)生具有重大意義。    1 ZigBee技術(shù)協(xié)議簡(jiǎn)介   2002年8月ZigBee聯(lián)盟
[測(cè)試測(cè)量]
CC2420和MMA7260的無(wú)線<font color='red'>傳感器</font><font color='red'>數(shù)據(jù)</font>采集系統(tǒng)
USB傳感器與存儲(chǔ)器在數(shù)據(jù)記錄中的應(yīng)用
目前市場(chǎng)上有很多種數(shù)據(jù)采集設(shè)備可用于在PC上記錄數(shù)據(jù),如NationalInstrument的LabVIEW,不過(guò)這類設(shè)備的傳感器件開(kāi)始越來(lái)越多地采用USB接口而不是RS232或其他傳統(tǒng)接口。過(guò)去在嵌入式系統(tǒng)中應(yīng)用USB設(shè)備需要性能相對(duì)較強(qiáng)的硬件,要帶有USBHost控制器接口、RTOS以及USB軟件驅(qū)動(dòng),結(jié)果因USBHost功能實(shí)施成本的原因設(shè)計(jì)工程師一直都不太愿意在小型8位或16位MCU系統(tǒng)上增加USB設(shè)備。但隨著最新一代智能USBHost控制器IC的推出,與MCU配合使用不僅可為PC應(yīng)用使用USB數(shù)據(jù)采集設(shè)備,而且還可將數(shù)據(jù)存儲(chǔ)在低成本高容量的閃存盤(pán)上。 數(shù)據(jù)記錄應(yīng)用 第一個(gè)應(yīng)用實(shí)例顯示了一個(gè)MCU控制器和一
[工業(yè)控制]
STM32學(xué)習(xí)筆記(九)DMA(Direct memory access controller)
直接存儲(chǔ)器讀取 DMA簡(jiǎn)介 直接存儲(chǔ)器存取(DMA)用來(lái)提供在外設(shè)和存儲(chǔ)器之間或者存儲(chǔ)器和存儲(chǔ)器之間的高速數(shù)據(jù)傳輸。無(wú)須CPU干預(yù),數(shù)據(jù)可以通過(guò)DMA快速地移動(dòng),這就節(jié)省了CPU的資源來(lái)做其他操作。 DMA框圖 由圖可見(jiàn),DMA 一共有 DMA1 和 DMA2 兩個(gè)控制器。DMA1 有7個(gè)通道,DMA2 有5個(gè)通道。 在存儲(chǔ)器和存儲(chǔ)器之間傳輸數(shù)據(jù)時(shí),可任選通道進(jìn)行傳輸;但在外設(shè)和存儲(chǔ)器之間傳輸數(shù)據(jù)時(shí),需要用到專用的通道。 各個(gè)通道的 DMA1 請(qǐng)求 各個(gè)通道的 DMA2 請(qǐng)求 DMA寄存器 中斷狀態(tài)寄存器 --- ISR(interrupt status register):存放DMA中斷的標(biāo)志位; 注意:若為D
[單片機(jī)]
STM32 LL庫(kù)串口中斷
因HAL庫(kù)運(yùn)行效率慢,所以串口部分使用LL庫(kù),LL庫(kù)更底層 工程設(shè)置 1、開(kāi)啟串口中斷 image 2、串口使用LL庫(kù) image 程序設(shè)置 1、設(shè)置中斷回調(diào) void LLx_UART2_RxCpltCallback(unsigned char data){ ReceiveData(&wirless_dev, data);} 2、設(shè)置串口中斷 void USART2_IRQHandler(void){ /* USER CODE BEGIN USART2_IRQn 0 */ extern void LLx_UART2_RxCpltCallback(); volatile unsigned char d
[單片機(jī)]
UCGUI在STM32平臺(tái)移植經(jīng)驗(yàn)(無(wú)操作系統(tǒng))
ucgui 移植的前提是已經(jīng)具備了LCD驅(qū)動(dòng)函數(shù),已經(jīng)能夠?qū)崿F(xiàn)點(diǎn)亮LCD屏幕,并實(shí)現(xiàn)畫(huà)點(diǎn)以及獲取指定點(diǎn)顏色值的功能。一般的顯示屏供應(yīng)商會(huì)提供對(duì)應(yīng)的驅(qū)動(dòng)函數(shù)。主要有初始化函數(shù)void LCD_Init(),屏幕畫(huà)點(diǎn)函數(shù) Void LCD_DrawPoint(u16 x,u16 y,u16 color),以及獲取指定點(diǎn)顏色值的U16 LCD_ReadPoint(u16 x,u16 y)函數(shù)。移植的關(guān)鍵在于把這三個(gè)函數(shù)與ucgui提供的接口函數(shù)匹配。 打開(kāi)GUILCDDriver中的LCDDummy.c文件,找到int LCD_L0_Init(void)初始化函數(shù),LCD_L0_SetPixelIndex(int x, int y,
[單片機(jī)]
UCGUI在<font color='red'>STM32</font>平臺(tái)移植經(jīng)驗(yàn)(無(wú)操作系統(tǒng))
STM32自定義printf實(shí)現(xiàn)多串口互用
STM32 串口使用頻繁的朋友可能知道一個(gè)問(wèn)題,庫(kù)自帶的 USART_SendData 函數(shù)一次只能發(fā)送 1 Byte 字符 如果我們要輸出一個(gè)帶格式、帶參數(shù)的串口數(shù)據(jù)就只能通過(guò) sprintf 打印到一個(gè)臨時(shí)數(shù)組,然后再使用一個(gè)for循環(huán)調(diào)用USART_SendData一個(gè)字符一個(gè)字符的輸出,過(guò)程非常麻煩! 姜斌是一個(gè)非常怕麻煩的人所以這種方法無(wú)疑讓我發(fā)瘋!后來(lái)在原子(OpenEDV)那里購(gòu)買了開(kāi)發(fā)板拿到了例程。里面重定向了printf函數(shù)作為串口輸出函數(shù),有了這個(gè)函數(shù)之后就能夠很輕松的參數(shù)輸出,但問(wèn)題就在這里我們串口1 串口2 都要帶參數(shù)輸出怎么辦? 本次實(shí)驗(yàn):自定義printf函數(shù) 實(shí)驗(yàn)數(shù)據(jù)來(lái)源: 配置usart
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 绍兴市| 行唐县| 镇康县| 和林格尔县| 长白| 西峡县| 法库县| 榆中县| 微山县| 九龙坡区| 阜阳市| 德保县| 五常市| 南澳县| 社会| 饶河县| 平远县| 石柱| 惠安县| 高州市| 海丰县| 礼泉县| 厦门市| 林州市| 阳江市| 云阳县| 吴堡县| 镇沅| 临城县| 大兴区| 大冶市| 醴陵市| 舞阳县| 恩施市| 盈江县| 伊通| 和政县| 抚宁县| 靖远县| 新竹县| 磐石市|