路上刷到一个“如何实现三个开关控制一盏灯”的帖子,一时起兴,有此文
1个开关控制一盏灯
先考虑最简单的情况,1个开关控制一盏灯。直接在一个通路中放入一个开关,在这里直接控制电路的开闭即可。抽象一点,开关作为二值状态控制器,0断1通
2个开关控制一盏灯
如下图所示,电路中的两个开关都可以输出0/1两种状态,当它们同时输出00或者11时,电路连通。
这其实就是两个开关output的异或值
3个开关控制一盏灯
这种情况乍一想感觉比较复杂
首先的想法是认为三个开关互相对称,于是考虑一个逻辑上三者对称的电路拓扑结构,想了蛮久没有想出具体实现的方式
其实再多思考一下,增加到4个开关、5个开关、乃至100个、n个开关怎么办?从电路门外汉的角度看,要设计出n维对称的电路是做不到的
这里其实陷入“三个开关互相对称”的复杂设定中,没有跳出来去把复杂问题转换成已知简单问题。既然我们已经知道了2个开关控制一盏灯是怎么做的,那么一个更可靠的思路应该是把问题想办法转换成已有解决方案的已知问题
要不断缩减问题规模,把大问题变成小问题,把未知问题变成已知问题,类似将问题向下递归的思想
把3个开关中的2个开关先看作1个逻辑开关,于是问题就变成了,这个逻辑开关需要输出0/1两种状态,非0即1,0表示选择上路线,1表示选择下路线,但绝不可以什么都不输出
尝试1
如图所示,第一版尝试,phy switch1 和 phy switch2 按最简单的方式组合起来,存在两个明显的问题
- 问题1. 逻辑开关只有一种output,对外而言,它作为一个整体只有一种输出,无法输出0/1两种状态
- 问题2. 逻辑开关内部可能存在断路的情况,正如图中所示,那么这个逻辑开关就什么也没输出,违背了“绝不可以什么都不输出”的原则
尝试2
对于问题1,显然这个逻辑开关需要两个output线路。于是得到下面的v1.5版本
现在,这个逻辑开关已经存在两个output,phy switch1可以控制输出0还是1,并且任意时刻都有输出,问题2也得到解决。那么,问题就是如何设计和摆放 phy switch2
到这里,问题逐渐清晰起来。显然,phy switch2只能放在如下蓝圈位置:
那么,phy switch2的输入和 phy switch1就不一样了---- phy switch2 有两种input,而 phy switch1 只有一种input
phy switch2接在phy switch1后面,显然任意时刻必有一种input。现在的要求是,对于同一input,phy switch2可以切换到不同output。那简单了,phy switch2就是一个改向器:
当phy switch2关闭时,phy switch1的output1和output2正常直线输出;当phy switch2打开时,phy switch1的output1和output2被颠倒后再输出
于是,这个逻辑开关就实现了:
- 存在二值output,并且时时刻刻都有output
- 控制任何一个物理开关,都可以切换output值
于是,3个开关控制一盏灯的电路设计就实现了
n个开关控制一盏灯
n个开关控制一盏灯都可以收敛成2个开关控制一盏灯的情况,加入足够多的改向开关就可以了