在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

碼農愛學習 ? 來源:碼農愛學習 ? 作者:碼農愛學習 ? 2022-09-07 08:47 ? 次閱讀

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

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

1 OLED圖片顯示

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

1.1 U8g2庫移植

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

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

pYYBAGKeImaAbklYAAES8Ep9QH8703.png

1.2 圖片顯示

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

U8g2庫顯示圖片,可以使用u8g2_DrawXBM函數,需要先將圖片轉為數組。

可以使用這個在線網頁來進行圖片數據的轉換:https://tools.clz.me/image-to-bitmap-array

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

poYBAGMXWIeALw-DAABSGg7iq9s098.png

2 更多狀態輸出

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

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

對于OLED的展示邏輯,這里是在狀態機的每個循環結束后,調用下面的程序邏輯進行展示:

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;
		}
	}
}

當此輪狀態循環有新的數據產生時,則根據狀態機的主狀態,分別顯示對應狀態下的圖片或動畫。

比如加水狀態,會根據當前加的水位,不斷更新圖片展示的水位:

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);
}

?對于主程序的結構,和上篇一樣,只是增加了OLED的顯示:

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

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

在狀態機每運行一個循環,獲取一下具體的狀態數據,然后使用OLED將具體的狀態數據展示出來。

3 具體演示

再來對比看下這個狀態圖,實驗測試狀態機的執行。

pYYBAGMWC8CAUAu0AADA8uwfW3c243.png

正常的洗衣流程

不考慮暫停這個狀態,洗衣機上點開始后,依次經歷空閑、加水、清洗、排水、甩干這幾個流程即結束,若清洗計數設置了不知1次,則加水、清洗、排水這3個動作會循環執行對應的次數。

洗衣流程中暫停再繼續

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

暫停后修改水量或次數后再繼續

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

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

注:本狀態機還有繼續優化的空間,比如:

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

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

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

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

poYBAGMXWbmAIDfmAAsqoUkF_GU573.png

4 總結

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

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

    關注

    2288

    文章

    10996

    瀏覽量

    361908
  • 洗衣機
    +關注

    關注

    13

    文章

    682

    瀏覽量

    43827
  • 狀態機
    +關注

    關注

    2

    文章

    493

    瀏覽量

    28031
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    FPGA設計洗衣機

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

    跪求畢業設計:全自動洗衣機系統設計!!!

    急需!!!全自動洗衣機系統設計與研究
    發表于 04-29 23:38

    跪求 全自動洗衣機系統 proteus仿真!!!

    本人做畢業設計 全自動洗衣機系統研究與設計跪請各位幫忙!!!
    發表于 05-01 18:50

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

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

    全自動洗衣機

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

    轉: 全自動洗衣機控制系統

    全自動洗衣機控制系統
    發表于 08-03 16:55

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

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

    如何去實現一種基于單片全自動洗衣機模擬系統設計

    基于單片全自動洗衣機模擬系統實現的功能是什么?如何去實現一種基于單片全自動洗衣機模擬系統
    發表于 01-17 08:13

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

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

    全自動洗衣機控制電路

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

    全自動洗衣機

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

    全自動洗衣機程序

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

    自動洗衣機全自動教程

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

    基于STM32單片全自動洗衣機

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

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

    本篇實現了一款全自動洗衣機的基礎洗衣控制流程,可實現不同水位與清洗次數的設置,以及任務的暫停與繼續。此外,通過對之前按鍵狀態機的進一步優化修改,實現了按鍵
    的頭像 發表于 09-06 08:47 ?3421次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>狀態機</b><b class='flag-5'>編程</b><b class='flag-5'>實例</b>——<b class='flag-5'>全自動</b><b class='flag-5'>洗衣機</b>(上)
    主站蜘蛛池模板: 女上男下边吃奶边做视频成都 | 97理论片| 国产午夜免费 | 久优草| 久久久久久夜精品精品免费啦 | 99久久网站 | 综合天堂| 日韩黄色网 | 欧美爱爱网址 | 久热福利 | 日韩城人视频 | 美女国产 | www.激情网.com | 2018天天干天天射 | 91激情网 | 天天操天天操天天操 | 井野雏田小樱天天被调教 | 免费在线公开视频 | 日本三级成人午夜视频网 | l欧美18一19sex性| h在线免费观看 | 欧美xxxxx性视频 | 一个综合色 | 日本人六九视频69jzz免费 | 在线视频精品免费 | 五月天婷婷久久 | 国产免费糟蹋美女视频 | 欧美成人精品福利网站 | 天堂网在线www | 国产三级精品三级在线观看 | 久久99精品久久久久久臀蜜桃 | 人人免费人人专区 | 欧美人成在线观看 | 国产v精品成人免费视频400条 | 手机看片福利日韩国产 | 亚洲午夜精品久久久久久抢 | 夜色sese| 三级理论在线播放大全 | 色多多视频在线 | 四虎永久在线精品2022 | 亚色在线|