chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32狀態(tài)機編程實例——全自動洗衣機(下)

碼農(nóng)愛學習 ? 來源:碼農(nóng)愛學習 ? 作者:碼農(nóng)愛學習 ? 2022-09-07 08:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

上篇文章,通過狀態(tài)機編程,實現(xiàn)了全自動洗衣機的邏輯控制,并通過串口打印的方式顯示各個狀態(tài)。

本篇,為了更加直觀的感受狀態(tài)機的運行,使用0.96寸OLED來顯示各個狀態(tài),并搭配對應(yīng)的動態(tài)圖標來體現(xiàn)洗衣機工作的各個狀態(tài)。

1 OLED圖片顯示

為了能方便的在OLED上顯示文字和圖片,可以借助一些圖形庫來幫我們顯示,這里使用的是U8g2圖形庫。

1.1 U8g2庫移植

U8g2庫在STM32上的移植,之前的文章已經(jīng)介紹過,具體的移植過程可以參考這篇:

移植成功后,可以使用測試例程驗證U8g2庫的顯示效果。

pYYBAGKeImaAbklYAAES8Ep9QH8703.png

1.2 圖片顯示

圖片相比較文字,可以展示更加豐富的內(nèi)容,因此本篇通過簡單的單色圖片來展示洗衣機的工作狀態(tài)。

U8g2庫顯示圖片,可以使用u8g2_DrawXBM函數(shù),需要先將圖片轉(zhuǎn)為數(shù)組。

可以使用這個在線網(wǎng)頁來進行圖片數(shù)據(jù)的轉(zhuǎn)換:https://tools.clz.me/image-to-bitmap-array

這里可以使用自己喜歡的圖片,進行展示,比如我選取了不同水量的洗衣機圖標來顯示洗衣機的當前水量,使用多張圖片的交替顯示產(chǎn)生洗衣機在清洗的動畫效果。

poYBAGMXWIeALw-DAABSGg7iq9s098.png

2 更多狀態(tài)輸出

OLED屏幕要想顯示洗衣機的工作狀態(tài),就需要獲取狀態(tài)機的具體工作狀態(tài)。這里自定義了一些展示需要用到的數(shù)據(jù),組成一個結(jié)構(gòu)體,狀態(tài)機在運行過程中,對各個成員變量進行修改,然后OLED端獲取這些數(shù)據(jù),再進行展示。

typedef struct
{
	WASHER_STATUS washerStatus; /*洗衣機的工作狀態(tài)*/
	int targetWaterLevel;       /*洗衣機的目標水位*/
	int targetWashTimes;        /*洗衣機的目標清洗次數(shù)*/
	int remainingTime;          /*洗衣機的剩余工作時間(暫未使用)*/
	int curWaterLevel;          /*洗衣機當前的水位*/
	bool hasNewData;            /*是否有新的數(shù)據(jù)(用于告訴OLED是否刷新顯示)*/
}WASHER_OUTPUT_DATA;

對于OLED的展示邏輯,這里是在狀態(tài)機的每個循環(huán)結(jié)束后,調(diào)用下面的程序邏輯進行展示:

void show_washer_status(WASHER_OUTPUT_DATA washerOutPutData)
{
	if (washerOutPutData.hasNewData)
	{
		WASHER_STATUS s = washerOutPutData.washerStatus;
		printf("u8g2 get status:%d(%s)\r\n", s, washer_status_name[s]);
		switch(s)
		{
			case WS_INIT: showWasherInit(&u8g2, washerOutPutData); break;
			case WS_IDLE: showWasherIdle(&u8g2, washerOutPutData); break;
			case WS_ADD_WATER: showWasherAddWater(&u8g2, washerOutPutData); break;
			case WS_WASH: showWasherWash(&u8g2, washerOutPutData); break;
			case WS_DRAIN_WATER: showWasherDrainWater(&u8g2, washerOutPutData); break;
			case WS_SPIN_DRY: showWasherSpinDry(&u8g2, washerOutPutData); break;
			case WS_PAUSE: showWasherPause(&u8g2, washerOutPutData); break;
			case WS_DONE: showWasherDone(&u8g2, washerOutPutData); break;
			default: break;
		}
	}
}

當此輪狀態(tài)循環(huán)有新的數(shù)據(jù)產(chǎn)生時,則根據(jù)狀態(tài)機的主狀態(tài),分別顯示對應(yīng)狀態(tài)下的圖片或動畫。

比如加水狀態(tài),會根據(jù)當前加的水位,不斷更新圖片展示的水位:

void drawCurWaterLevel(u8g2_t *u8g2, int level)
{
	switch(level)
	{
		case 0: u8g2_DrawXBM(u8g2,64, 16, 48, 48, pic_water_0); break;
		case 1: u8g2_DrawXBM(u8g2,64, 16, 48, 48, pic_water_1); break;
		case 2: u8g2_DrawXBM(u8g2,64, 16, 48, 48, pic_water_2); break;
		case 3: u8g2_DrawXBM(u8g2,64, 16, 48, 48, pic_water_3); break;
		case 4: u8g2_DrawXBM(u8g2,64, 16, 48, 48, pic_water_4); break;
		case 5: u8g2_DrawXBM(u8g2,64, 16, 48, 48, pic_water_5); break;
		case 6: u8g2_DrawXBM(u8g2,64, 16, 48, 48, pic_water_6); break;
		case 7: u8g2_DrawXBM(u8g2,64, 16, 48, 48, pic_water_7); break;
		default: break;
	}
}

void showWasherAddWater(u8g2_t *u8g2, WASHER_OUTPUT_DATA data)
{
	char strStatus[14] = "AddWater";
	u8g2_ClearBuffer(u8g2);
    u8g2_SetFont(u8g2,u8g2_font_ncenB10_tr);
	u8g2_DrawStr(u8g2,0,15,strStatus);
	
	drawCurWaterLevel(u8g2, data.curWaterLevel);
	
	u8g2_SendBuffer(u8g2);
}

?對于主程序的結(jié)構(gòu),和上篇一樣,只是增加了OLED的顯示:

int main(void)
{	
	delay_init();	    	 //延時函數(shù)初始化	  
	LED_Init();		  	//初始化與LED連接的硬件接口
	oled_init();
	
	KEY_Init();
	uart_init(115200);
	TIM3_Int_Init(500-1,7200-1); //調(diào)用定時器使得50ms產(chǎn)生一個中斷

	printf("hello\r\n");
	
	while(1)
	{
		washer_run_loop();
		
		WASHER_OUTPUT_DATA data = get_washer_output_data();
		
		show_washer_status(data);
		
		delay_ms(100);
	}
}

在狀態(tài)機每運行一個循環(huán),獲取一下具體的狀態(tài)數(shù)據(jù),然后使用OLED將具體的狀態(tài)數(shù)據(jù)展示出來。

3 具體演示

再來對比看下這個狀態(tài)圖,實驗測試狀態(tài)機的執(zhí)行。

pYYBAGMWC8CAUAu0AADA8uwfW3c243.png

正常的洗衣流程

不考慮暫停這個狀態(tài),洗衣機上點開始后,依次經(jīng)歷空閑、加水、清洗、排水、甩干這幾個流程即結(jié)束,若清洗計數(shù)設(shè)置了不知1次,則加水、清洗、排水這3個動作會循環(huán)執(zhí)行對應(yīng)的次數(shù)。

洗衣流程中暫停再繼續(xù)

在洗衣機的運行狀態(tài):加水、清洗、排水、甩干,通過暫停按鈕,可以暫停這些狀態(tài)的執(zhí)行,此時狀態(tài)機會運行于暫停模式,再按繼續(xù)(暫停/繼續(xù)的一個按鈕),則會繼續(xù)執(zhí)行洗衣工作。

暫停后修改水量或次數(shù)后再繼續(xù)

在洗衣過程中,如果想要修改洗衣的水量或次數(shù),可以先通過暫停鍵來暫停洗衣機的運行,然后通過水位或次數(shù)按鈕,使狀態(tài)機從暫停狀態(tài)先切換到空閑狀態(tài),進行水位或次數(shù)的調(diào)整后,再繼續(xù),即會按照新的設(shè)置參數(shù)繼續(xù)運行洗衣程序。

比如本來的清洗水位是3,清洗次數(shù)是1,在第一次清洗的加水時按下暫停,再將清洗參數(shù)進行修改,比如水位設(shè)為5,次數(shù)設(shè)為2,再繼續(xù)后,會再次進入加水狀態(tài),并將水位補到5后,繼續(xù)清洗,并清洗2遍結(jié)束。

注:本狀態(tài)機還有繼續(xù)優(yōu)化的空間,比如:

水量只會補加,多了此輪清洗不會排出。比如先設(shè)置的水位是5,在加到3個時候,暫停并修改為2,再繼續(xù)后,判斷大于目標水位則會直接開始清洗,不會先由水位3再排水到水位2再清洗

任何清洗狀態(tài)(加水、清洗、排水)按下暫停調(diào)整水位后,再繼續(xù),都會默認跳到加水重新新的清洗循環(huán),如果是在排水狀態(tài),調(diào)整了水位后,此次的水還沒有排位,就又重新加水開始洗,不太合理

以上3種測試方式的演示效果,可以再對比看下演示視頻

https://www.bilibili.com/video/BV1xT411E7pY

poYBAGMXWbmAIDfmAAsqoUkF_GU573.png

4 總結(jié)

本篇在上篇全自動洗衣機的狀態(tài)機編程實例的基礎(chǔ)上,增加了OLED來更新直觀的展示洗衣機的工作狀態(tài),并通過3種測試場景來展示洗衣機工作狀態(tài)機的執(zhí)行。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • STM32
    +關(guān)注

    關(guān)注

    2301

    文章

    11069

    瀏覽量

    369330
  • 洗衣機
    +關(guān)注

    關(guān)注

    13

    文章

    689

    瀏覽量

    44638
  • 狀態(tài)機
    +關(guān)注

    關(guān)注

    2

    文章

    495

    瀏覽量

    28652
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    FPGA設(shè)計洗衣機

    本帖最后由 eehome 于 2013-1-5 09:59 編輯 設(shè)計一個全自動洗衣機控制器,它具有三閥門分別是冷水、 設(shè)計一個全自動洗衣機控制器,它具有三閥門分別是冷水、 設(shè)計
    發(fā)表于 05-04 20:35

    跪求畢業(yè)設(shè)計:全自動洗衣機系統(tǒng)設(shè)計?。?!

    急需?。?!全自動洗衣機系統(tǒng)設(shè)計與研究
    發(fā)表于 04-29 23:38

    跪求 全自動洗衣機系統(tǒng) proteus仿真!?。?/a>

    本人做畢業(yè)設(shè)計 全自動洗衣機系統(tǒng)研究與設(shè)計跪請各位幫忙?。?!
    發(fā)表于 05-01 18:50

    全自動洗衣機原理與維修資料

    給大家分享全自動洗衣機原理與維修資料。
    發(fā)表于 03-17 20:34

    全自動洗衣機

    單片全自動洗衣機
    發(fā)表于 04-12 13:11

    轉(zhuǎn): 全自動洗衣機控制系統(tǒng)

    全自動洗衣機控制系統(tǒng)
    發(fā)表于 08-03 16:55

    洗衣機為什么能自動運行呢

    知識點:全自動洗衣機、程序、計算機如今,洗衣機已經(jīng)進入千家萬戶,人們再也不用面對一大堆臟衣服發(fā)愁了,只要把臟衣服、洗衣粉放到洗衣機里,接通電
    發(fā)表于 09-02 06:52

    如何去實現(xiàn)一種基于單片全自動洗衣機模擬系統(tǒng)設(shè)計

    基于單片全自動洗衣機模擬系統(tǒng)實現(xiàn)的功能是什么?如何去實現(xiàn)一種基于單片全自動洗衣機模擬系統(tǒng)
    發(fā)表于 01-17 08:13

    基于單片SPMC75的模擬全自動洗衣機的設(shè)計

    基于單片SPMC75的模擬全自動洗衣機的設(shè)計 洗衣機是一種在家庭生活中不可缺少的家用電器,全自動
    發(fā)表于 10-26 14:22 ?1839次閱讀

    全自動洗衣機控制電路

    全自動洗衣機控制電路,PCB學習好資料,歡迎下載學習。
    發(fā)表于 03-23 09:50 ?0次下載

    全自動洗衣機

    介紹全自動洗衣機單片控制系統(tǒng)的外文期刊,適合學術(shù)方面的閱讀。
    發(fā)表于 05-06 14:37 ?8次下載

    全自動洗衣機程序

    全自動洗衣機程序全自動洗衣機程序全自動洗衣機程序
    發(fā)表于 05-19 16:40 ?28次下載

    自動洗衣機全自動教程

    剛到福州,住進了一個套房,雖然有洗衣機,但是是半自動的,每次洗衣服很煩,就跟房東商量一,然后就有了這一臺全自動
    的頭像 發(fā)表于 08-17 10:23 ?2.4w次閱讀

    基于STM32單片全自動洗衣機

    1.基于STM32單片的一種全自動洗衣機,該系統(tǒng)除了具備洗滌,漂洗,脫水,甩干功能外,還具有洗滌時間設(shè)置,水位檢測,烘干功能。 2.具有藍牙通信功能,可通過手機app對
    的頭像 發(fā)表于 11-02 10:22 ?9701次閱讀

    STM32狀態(tài)機編程實例——全自動洗衣機(上)

    本篇實現(xiàn)了一款全自動洗衣機的基礎(chǔ)洗衣控制流程,可實現(xiàn)不同水位與清洗次數(shù)的設(shè)置,以及任務(wù)的暫停與繼續(xù)。此外,通過對之前按鍵狀態(tài)機的進一步優(yōu)化修改,實現(xiàn)了按鍵
    的頭像 發(fā)表于 09-06 08:47 ?3984次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>狀態(tài)機</b><b class='flag-5'>編程</b><b class='flag-5'>實例</b>——<b class='flag-5'>全自動</b><b class='flag-5'>洗衣機</b>(上)