STM32状态机编程实例--全自动洗衣机(上)
前面几篇文章,以按键功能,介绍了状态机的原理与按键状态机实例,实现按键单击、双击、长按等状态的检测。
本篇,继续使用状态机编程,来实现一个更有趣的功能——全自动洗衣机。
1 全自动洗衣机功能分析下面是一个全自动洗衣机的控制面板:
面板上有4个按键:
电源:控制洗衣机通电与断电
水位:选择洗衣时需要的水位,有1~8个水位
程序:选择不同的洗衣模式,有1~10个模式
01:标准
02:轻柔
03:快速
…
10:桶风干
启动/暂停:用于启动或暂停洗衣任务
面板上还有一个数码管,用于显示当前的工作状态与剩余时间,可显示的工作模式有:
AA:浸泡
BB:洗涤
CC:漂洗
DD:脱水
本篇,就按照这款洗衣机的操作方式实现对应的洗衣机控制逻辑。需注意的是:
实际的洗衣机有水位检测传感器,本篇中,暂用时间延时模拟水位的增加,且默认开机时水位为0
实际的洗衣机中的洗衣模式,会根据不同的模式自动设置清洗次数与每次清洗的时间以及清洗力度,本篇为了简化起见,清洗模式的设置仅用于区分不同的清洗次数
某些特殊的清洗模式,如单独的脱水,桶风干等,本篇暂不实现
对于状态的显示 ,本篇先以串口打印的实 ...
STM32按键状态机3--增加双击与功能优化
上篇文章,介绍了将按键检测增加长按功能,并将按下抖动与松开抖动共用一个抖动状态来表示,其状态图如下:
仔细研究这个状态图,其它还存在一些问题:
短按状态,只要按下去,不需要等按键再释放,就会触发短按事件。对于需要按下再松开作为一次短按的应用来说,此状态图也不满足需求
长按状态,必须先经过短按状态,即长按按键,会先触发一个短按,再触发一个长按。如果实际应用中需要分别使用短按和长按,则此状态图不满足要求
本篇,就来解决上述两个问题,并再增加一个按键双击检测,实现一个功能更全面的按键检测。
1 增加双击检测增加一个双击检测,需要增加两个状态:
等待再次按下
确认第2次按下
同时,之前的“短按状态”和“长按状态”分别改为“确认按下”和“确认长按”。
1.1 状态图修改修改后的状态图如下,有以下几点需要注意: ...
STM32按键状态机2--状态简化与增加长按功能
上篇文章,以按键消抖功能,介绍了状态机的基本原理与使用方法。
上篇的状态图如下:
由于只检测按下与松开,并具备按键消抖功能,因此用到了如上的4个状态,按下抖动和松开抖动是两个独立的状态,并且这两个抖动的状态,也是可以在多次循环中连续运行的,这个状态机的循环周期设置的为10ms,当在抖动状态连续检测到某一电平5次后,即认为消抖完成,进入下一个稳定状态。
对于同一个功能,状态图不是一成不变的,对于按键消抖,还可以将两个抖动状态共用一个抖动状态来表示。
1 消抖状态简化1.1 状态图将按下抖动与松开抖动共用一个抖动状态来表示,同时需要将状态机的循环周期设置为50ms,这样,抖动状态只需经过一次,通过电平高低即可判定是否真的为按键抖动。简化后的状态图如下:
为了能在抖动状态时,区分前一状态是松开还是按下,进而判断此次是抖动还是按键真的动作,需要增加一个状态来记录前一状态
123KEY_STATUS g_keyStatus = KS_RELEASE; //当前循环结束的(状态机的)状态KEY_STATUS g_nowKeyStatus = KS_RELEASE; //当前状态(每次循环后与g ...
STM32按键消抖--入门状态机思维
在嵌入式软件开发中,状态机编程是一个十分重要的编程思想,它也是嵌入式开发中一个常用的编程框架。掌握了状态机编程思想,可以更加逻辑清晰的实现复杂的业务逻辑功能。
1 状态机思想状态机,或称有限状态机FSM(Finite State Machine),是一种重要的编程思想。
状态机有3要素:状态、事件与响应
状态:系统处在什么状态?
事件:发生了什么事?
响应:此状态下发生了这样的事,系统要如何处理?
状态机编程前,首先要根据需要实现的功能,整理出一个对应的状态转换图(状态机图),然后就可以根据这个状态转换图,套用状态机编程模板,实现对应是状态机代码了。
状态机编程主要有 3 种方法:switch-case 法、表格驱动法、函数指针法,本篇先介绍最简单也最易理解的switch-case 法。
2 状态机实例下面以按键消抖功能,来介绍switch-case 法的状态机编程思路。
2.1 按钮消抖状态转换图状态机机编程前,首先要明确的对应功能的状态机需要几个状态,本例的按键功能,只检测最基础的按下与松开状态(暂不实现长按、双击等状态),并增加对应的按钮去抖功能,因此,需要用到4个状态:
...
ESP8266WIFI连网播放视频
本篇介绍ESP8266在OLED上播放视频:
电脑端Python程序作为视频数据的服务器,借助OpenCV实时读取视频帧,并进行二值图像转换,尺寸调整,再将二值图像转为数组,并以二进制形式的数据通过socket方式无线发送给ESP8266。
ESP8266采用Arduino IDE编程,借助U8g2库,将图像数据实时显示到OLED屏幕中。
1 ESP8266端视频帧接收与播放程序ESP8266作为socket客户端,接收服务端发送的图像帧数据,进行显示。
ESP8266使用Arduino IDE环境进行开发。
1.1 WIFI初始化与服务器连接123456789101112131415161718192021#define IP "192.168.5.100"#define PORT 8080void initWiFi(){ Serial.print("Connecting WiFi..."); WiFi.mode(WIFI_STA); //配置WIFI为Station模式 WiFi.begin(ssid, pass); / ...
ESP8266简易WIFI天气时钟
本篇介绍了如何使用ESP8266,通过WIFI连网获取网络天气和网络时间,然后借助U8g2库,在OLED上显示当前时间和天气信息。
1 HTTP获取网络天气连网获取网络天气,一般需要通过http的方式,从天气信息提供商的网络地址获取天气信息。
1.1 注册开发者key这里以心知天气为例,需要先注册一个开发者账号,然后获取自己的私钥,也就是等下要用到的key。
然后可以先在浏览器中输入如下链接,注意要将自己的key替换进去,然后就可以测试一下天气信息的获取情况。
https://api.seniverse.com/v3/weather/now.json?key=替换为你的私钥&location=HangZhou&language=en&unit=c
如下即为获取的天气信息,是json格式的:
1.2 http请求基本原理上面先通过浏览器的方式获取到了天气信息,而ESP8266没有浏览器功能,需要编写代码实现http数据请求。
在编写代码之前,需要先了解一下基础的http请求原理。
url全称是资源描述符,一个url地址,用于描述一个网络上的资源,而http中的 ...
STM32简易多级菜单(数组查表法)
单片机开发中,有时会用到屏幕来显示内容,当需要逐级显示内容时,就需要使用多级菜单的形式了。
1 多级菜单多级菜单的实现,大体分为两种设计思路:
通过双向链表实现
通过数组查表实现
总体思路都是把菜单的各个界面联系起来,可以从上级菜单跳到下级菜单,也可从下级菜单返回上级菜单。
数组查表的方式比较简单,易于理解,本篇就来使用数组查表发在STM32上实现多级菜单的显示。
2 代码实现2.1 数组查表首先需要定义一个结构体:
12345678typedef struct{ uchar current; uchar up;//向上翻索引号 uchar down;//向下翻索引号 uchar enter;//确认索引号 void (*current_operation)();} key_table;
current:当前页面的索引号
up:按下“向上翻“按钮后要跳转到的页面索引号
down:按下“向下翻“按钮后要跳转到的页面索引号
enter:按下“确认“按钮后要跳转到的页面索引号
current_operation:当前页面的索引号要执行的显示函数,这是一个函数指针 ...
STM32外接DHT11显示温湿度
本篇介绍STM32如何外接温湿度传感器实现当前环境温湿度的读取,并显示到OLED屏幕上。
1 DTH11温湿度传感器DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,包括一个电阻式感湿元件和一个NTC测温元件。
1.1 数据读取协议微控制器MCU与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。
从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。采集数据后转换到低速模式。
1.1.1 起始信号总线空闲状态为高电平,MCU把总线拉低等待DHT11响应,MCU把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。
DHT11接收到主机的开始信号后,等待MCU的开始信号结束,然后发送80us低电平响应信号。
MCU发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号, ...
STM32移植U8g2图形库--玩转OLED显示
之前的文章,介绍过ESP8266在Arduino IDE环境中使用U8g2库,实现OLED上的各种图形显示。
本篇,介绍一下U8g2库如何移植到STM32上,进行OLED的图形显示。
本次的实验硬件为:
STM32:型号为最常见的STM32F103C8T6
OLED:0.96寸OLED,IIC接口(如果是SPI接口,文中也有对应的修改介绍)
1 U8g2简介U8g2 是一个用于嵌入式设备的单色图形库。U8g2支持单色OLED和LCD,并支持如SSD1306等多种类型的OLED驱动。
U8g2源码的开源库地址:https://github.com/olikraus/u8g2
2 移植步骤首先下载U8g2的源码,因为STM32主要是使用C语言编程,所以只需关注源码中的C源码部分,即csrc文件夹下的文件。
2.1 精简c源码U8g2支持多种显示驱动的屏幕,因为源码中也包含了各个驱动对应的文件,为了减小整个工程的代码体积,在移植U8g2时,可以删除一些无用的文件。
2.1.1 去掉无用的驱动文件这些驱动文件通常是u8x8_d_xxx.c,xxx包括驱动的型号和屏幕分辨率。ssd1306 ...
电机PID控制补充篇-野火上位机串口协议介绍
0 引言之前介绍的电机PID控制的系列文章:
电机控制进阶1–PID速度控制
电机控制进阶2–PID位置控制
电机控制进阶3–PID串级控制
得到不少电子爱好者的关注,不过也收到一些关于串口通信的疑问反馈。之前的一系列文章,确实没有着重介绍串口软件的使用细节以及通信协议的具体格式。本篇就来补充一下野火PID调试助手的串口协议。
下野火PID调试助手的使用界面如下,与串口通信协议相关的,主要分为三个部分:
参数区:包括数据通道选择、PID参数设置与展示、目标值、周期值的设置与展示
启/停区:控制电机的启动、停止以及程序的复位
数据曲线区:接收板子发上来的数据,进行速度曲线或位置曲线等的绘制
在介绍串口协议之前,推荐安装一个虚拟串口驱动软件来在自己的电脑上虚拟出两个串口,方便分析串口数据。
比如我们在电脑上产生两个虚拟串口,这两个串口可以看作是通过线连接了起来,比如我们使用野火PID助手和另一个串口助手软件分别连接这两个虚拟串口,当野火PID助手发送数据时(比如按下启动按钮),另一端的串口助手软件就可以收到并显示野火PID助手发来的数据,这样我们就能分析野火PID助手下发数据的数据格 ...