上个星期和创元素的波波和土豪,闲得蛋疼,便决定来DIY一个酷毙灯。虽然调试到很晚,但是很开心,成功了。先上视频和图片,大神勿喷。
我们暂且把这个山寨的称为苦逼灯吧,这苦逼灯是由小学拿奖的专业连线技工和研究三极管多天的波波大神,和arduino菜鸟的我完成了。
主要元器件:三极管(当成开关控制),arduino 板,led,超声波传感器(可以用红外发射接收的方法,人体红外传感器,还有很多很多传感器,其实原理就是要返回一个信号就行了)
功能以及原创的idea:功能是纯手势控制,却可以在你要关闭时保持几秒钟的时间在关闭,这样子就可以避免熬夜的你抹黑上床是看不到而摔倒的事故发生。
苦逼灯的arduino代码(不好意思,没时间好好整理,不懂请发帖问):
技术难题(我们几个还不懂,求大神指点迷津):
if (cm < 20){val = 1;}
else {val = 0;}后面去掉delay()会出现很大问题,随着delay值的增大,误差越小。这个搞了很久才发现
const int EchoPin = 49; int san = 10; int val = 0; int oldval = 0; float cm; int state = 1; void setup() { pinMode(san,OUTPUT); Serial.begin(115200); pinMode(TrigPin, OUTPUT); pinMode(EchoPin, INPUT); pinMode(san, OUTPUT); pinMode(13, OUTPUT); } void loop() { digitalWrite(13,1); digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin delayMicroseconds(2); digitalWrite(TrigPin, HIGH); delayMicroseconds(10); digitalWrite(TrigPin, LOW); cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm cm = (int(cm * 100.0)) / 100.0; //保留两位小数 Serial.print(cm); Serial.print("cm"); if (cm < 20) { val = 1; } else { val = 0; } delay(200); if( (val == 1)and(oldval == 0)) { state = state +1; } oldval = val; if (state==4){state = 1;} if (state ==1) { digitalWrite(san,1); Serial.println(state); } if (state ==2) { digitalWrite(san,0); Serial.println(state); } if (state ==3) { digitalWrite(san,0); delay(3000); for (int x=0;x < 9;x++) { digitalWrite(san,1); delay(30); digitalWrite(san,0); delay(30); } Serial.println(state); state =1; oldval=0; } } |
加单片机的执行速度是以微秒级来运行的。所以运行一次LOOP的代码(如果没有任何延时的话),运行一次也就几十毫秒左右(一般那里来说)。所以如果不加延时的话,可能1秒的时间内超声波模块就已经检测好多好多次。那个延时也不能说越长越好,太长的话,比如1秒,那么可能有时候响应会比较慢而且响应不灵敏,太短的或者不加延时的话,可能就会出现过度灵敏导致误判的结果。
是一次手势操作时会有一小段时间超声波测距的值会在20cm上下波动多次触发val==1&&oldval==0,必须用delay来避免?
if (state==4){state = 1;}
if (state ==1)
{
digitalWrite(san,1);
Serial.println(state);
}
if (state ==2)
{
digitalWrite(san,0);
Serial.println(state);
}
if (state ==3)
{
digitalWrite(san,0);
delay(3000);
for (int x=0;x < 9;x++)
{
digitalWrite(san,1);
delay(30);
digitalWrite(san,0);
delay(30);
}
Serial.println(state);
state =1;
oldval=0;
}
当state == 3时,不就会state = 1了,然后???又有一个state == 4时state = 1