状态转换
近期在实现一些个功能的时候总也会遇到状态紊乱的现象,在这里记录下自己解决的一种思路吧。
其实要实现的功能是
(1)人来的时候灯会开,
(2)人走的时候灯会关,
(3)人来是可以控制灯开,关,灯越亮,越暗
(4)人走是可以控制灯开,关,灯越亮,越暗
看起来很简单,但是其实实现起来很乱,个人思路是使用状态机来做
使用onehot编码来实现,分为12个状态
人来:10000
人来按开灯:11000
人来按关灯:10100
人来按灯亮:10010
人来按灯暗:10001
人来的灯稳定状态:1ffff
人走:00000
人走按开灯:01000
人走按关灯:00100
人走按灯亮:00010
人走按灯暗:00001
人走的灯稳定状态:0ffff
其实不难理解其实本质就是抽象三个状态
如果人来了,那么就进入了10000,此时按下开进入11000,会进入Open(),
按下关进入10100会进入Shut(),按下调亮进入10010,进入Up(),但是此时如果不改变状态,下次还会进入10010,再次进入Up(),所以需要进入一个稳定状态来避免进入10010所以进入了1ffff,对于调暗同理,同时对于人走也是一个道理。然后我们就讲清楚了
人走到稳定
人来到稳定
的两个状态
还差人走00000到人来10000的状态,这两个进行转换的设定好了后就完成了所有状态的转换,完成了任务。
转换例子
以下是最流畅的转换方式,完全在三个大状态下转换
当然还可以变形,因为对于打开和关闭是可以自维持的,可以自动锁定自己状态,不跳到稳定都可以的
当然思路不会局限于此,还可以采用边沿触发来省去对应的最高位代表的人走到人来的bit,以此节省资源。
当然后续由于需要加入所谓的温度改变转速,所以又加入两个状态
也就是如果打开了同时没有手动调节温度,那么会进入自动温度调节转速状态
(同时加入了自启动状态)