首先
先说下自己,专业兽医,自学单片机编程后转行码农,码农掉头发,为了保住头发离职干起了服务业。现在已不做码农5年了。
做码农时职于一家小企业,主要是做电机控制器。小到刮胡刀、按摩器,大到升举机,电动叉车控制器都有。老板是个很有意思的人,除了画的大饼没有实现外,都挺好的。我记忆深刻的愚蠢代码都是在这里产出的。
1、按摩椅的无线控制器。
一个比较冷门的芯片,keil开发,2.4G通讯,BUG的原因是加密与通讯的。控制器和按摩椅通讯需要配对,这个芯片官方例程里面有一个自动跳频的加密通讯。我原本按照这个例程添加功能后一切正常,通讯距离,加密通讯和识别率都OK。除了一个遥控器可以控制无数按摩椅之外都挺好。然后程序推到重来……程序按照PDF重新写,使用手动按键配对,里面5个码,一个码用来指示当前配对状态,所以固定0XAA(敲黑板,很重要),总共256^4个识别码,数量上应该够了(反正老板不会有这么大销量)。又利用了芯片内硬件随机数来生成配对码。然后问题就来了,无论如何都无法调节接收频率(反正老板不懂,我固定设置到常用的蓝牙和WIFI之外的频率,尽量减少干扰,不过要是两个遥控器一起按下,99% 会无效),硬件随机数生成以后配对总是大概率变成0XAA,(反正老板不懂,只要检测到后面四个识别码里面有0XAA就重新来,直到生成正常的配对码之后才发送)
直到我转行不干了以后,偶然的一天自己想做个小玩具找出了当年的代码,才发现问题就是初始化时0XAA会乱入,不知道是芯片BUG还是软件BUG,除了0XAA其他都OK。
2、汽车电动座椅
第二个就是老板接来的一个改装厂的活儿,专门给阿尔法做的后排座椅控制器,总共4个电机的调节,两个座椅的通风风扇,一个加热,一个工作灯。如果有座到这个车的,后排座椅要是能多电机联动的就是我做的,当时国内都是不联动的,角度不对直接不动作(包括原厂也是),我通过算法规避了这个问题。这个算是我接手的第一个软件硬件全部由我一个人搞定的活儿。做硬件的大兄弟跑路了(真的大兄弟,和我爸年纪差不多),第一次做电路板,没啥经验但是一次搞定,单片机用的是STM8,因为有几个传感器,然后stm8第一次玩……用!然后无论如何搞不定一个IO搞定收发(读取传感器的IO同时还参与了控制),脑子一抽两个IO并联,一个IO收,一个IO发(反正领导不懂,我也脑抽,在程序中重新初始化就好了),大体功能搞定后,又要求加个任意按键“急停”(原来有个过流检测也算是一种保护措施),然后脑子又一抽,重新写了急停的模块。结果就是过流检测盒急停模块会冲突,一个模块检测到有问题后会停止动作,另一个模块过几秒后接手继续工作。找了好久的问题实在没办法只能大改程序把两个模块合并到了一起。而且带来一个问题就是每次运行之后会产生一个随机的误差,不能准确恢复到“记忆设置”,需要定期手动重置角度。
也是不干了以后才发现,这个可能是用了前人留下的魔改tiny系统的原因,停止的参数传递的时候没有到main里面导致的问题。将改好的程序发给老板,老板说留着了,但是不会改,应为客户已经接受了这个有“bug”的程序,客户会想办法解决。
3、电动桌板
这个也是汽车的改装件,汽车电动座椅做好了以后,客户说我们做的太优秀(大汗)这个也顺带一起做了。虽然只有一个电机,但是也只有一个电机,要做展开检测和急停检测。还是上面的代码做了大量的精简,因为没有传感器来读取运行角度数据,只能自己整了一套神奇的算法,通过电压电流通过标定以后计算展开的角度,也就是这个算法,整出了一个不大不小的BUG,在某些特定操作下,继电器会和加特林一样“哒哒哒哒”。后来发现是神奇算法和急停检测有冲突,检测到急停后,参数传递到神奇算法后,会有几秒的时间在“运行”和“停止”之间反复横跳。老板反正不懂,我简单粗暴的在驱动管上加了几个电阻一个电容的“延时启动”电路。
后来发现还是和上面一样停止的参数传递的时候没有到main里面导致的问题。其实就算没有发现,只要加几个延时函数也能规避掉……
4、然后我就跑路了
头发掉光光,然后就跑路了(人和程序有一个能跑就行),老板现在据说挺发财的(建的大厂房,拆迁了)。
走之前其实还接手了一个活儿,汽车上的多路影音灯光控制器,因为要对时,所以加了个GPS模块,有GPS模块老板说做的丰富一点,加上码表,高度方位啥的数据显示在屏幕上,然后不知道是哪里的问题,实际的速度总是比显示的速度稍微快了点,我又简单粗暴把GPS获取到的速度直接加了5%,神奇的就那么准了,完成了90%我就离职了,也不知道后面接手的大兄弟有没有发现这个小代码,这代码精简了下,就成了我在CSDN发的第一个代码(ARDUINO+MAX7219+GPS 模块制作的车载GPS码表,https://download.csdn.net/download/inced/15399439)。
其实,入了行才发现我们用的产品其实没有想象的那么严谨……只要能跑就行,不管是人还是代码……而且功能和BUG是同时存在的……