电子说
检测运动,然后以高音调的警报声和闪烁的灯光吓跑入侵者。听起来有趣吗?当然可以。这是今天的Arduino项目的目标,适合初学者。在进行过程中,我们将完全从头开始进行测试,以便您可以希望了解所有过程,而不仅仅是安装我已经完成的工作。
免责声明:这实际上不会保护您的房屋。
可能会给您妹妹一个令人讨厌的冲击。
您需要:
Arduino
超声波“ ping”传感器,我使用的是HC-SR04,PIR会更好,但价格昂贵。可以将ping传感器秘密地放置在门口中,并且仍然可以执行相同的基本工作,并且只需$ 5
压电蜂鸣器
LED条形灯,其接线与我们以前使用的相同在这个项目中。
在连接该项目时,不要每次都删除所有内容-继续在最后一个块上进行构建。到“编码警报系统”部分时,您应该已经将所有零碎的东西连接起来,看起来像这样:
闪烁的灯光
使用该项目的接线图连接您的LED灯带;不要更改引脚,因为我们需要PWM输出。使用此代码快速测试您的接线。如果一切顺利,您应该具有以下条件:
距离传感器
在SR04模块上,您会找到4个引脚。 VCC 和 GND 分别连接至+ 5V电源轨和地。 TRIG 是用于发送声纳信号的引脚,将其置于引脚6上; ECHO 用于回读信号(并由此计算距离)-将其放在7上。
事情非常简单,我们可以使用一个名为NewPing的库。下载并放置在Arduino的 Library 文件夹中,然后重新启动IDE,然后继续。使用此代码进行测试;打开串行监视器,并确保速度设置为115200波特。运气好的话,您应该会看到一些距离测量值以很高的速度发送回给您。您可能会发现1或2厘米的差异,但这很好。尝试将手放在传感器的前面,上下移动以观察变化的读数。
代码应该很容易理解。开始时有一些相关引脚的声明,包括最大距离-这可能取决于您使用的确切传感器,但是只要您能够准确获得小于1米的读数,就可以了。
在此测试应用程序的循环中,我们使用 ping()函数发出声纳ping,以毫秒为单位取回该值花费了多长时间的值返回。为此,我们使用以 US_ROUNDTRIP_CM 常量构建的NewPing库,该库定义移动一厘米需要多少微秒。两次ping之间还存在50毫秒的延迟,以避免传感器过载。
压电式警报
压电晶体传感器是一种简单且便宜的蜂鸣器,我们可以使用PWM引脚3发出不同的音调。将一根导线连接到引脚3,将一根导线连接到接地导轨–没关系。
使用此代码进行测试。
杀死相当讨厌且响亮的警报的唯一方法是拔插头。该代码解释起来有些复杂,但是它涉及使用正弦波来产生独特的声音。调整数字以使用不同的音调。
编码警报系统
现在我们已经拥有了拼图的所有内容,让我们将它们组合在一起。
继续制作一个新的草图,称为警报。首先将到目前为止在测试示例中使用的所有变量和引脚定义进行组合。
#include
// Select which PWM-capable pins are to be used.
#define RED_PIN 10
#define GREEN_PIN 11
#define BLUE_PIN 9
#define TRIGGER_PIN 6 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN 7 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 100 // Maximum distance we want to ping for (in centimeters)。
#define ALARM 3
float sinVal;
int toneVal;
首先编写基本的 setup()功能–我们现在只处理灯光。我在主循环开始前添加了5秒的延迟,以便在需要时给我们一些时间。
void setup(){
//set pinModes for RGB strip
pinMode(RED_PIN,OUTPUT);
pinMode(BLUE_PIN,OUTPUT);
pinMode(GREEN_PIN,OUTPUT);
//reset lights
analogWrite(RED_PIN,0);
analogWrite(BLUE_PIN,0);
analogWrite(RED_PIN,0);
delay(5000);
}
让我们使用一个帮助函数
//helper function enabling us to send a colour in one command
void color (unsigned char red, unsigned char green, unsigned char blue) // the color generating function
{
analogWrite(RED_PIN, red);
analogWrite(BLUE_PIN, blue);
analogWrite(GREEN_PIN, green);
}
最后,我们的循环现在将由红色和黄色之间的简单彩色闪光组成(或者,无论您希望发出什么警报,只需更改RGB值即可。
void loop(){
color(255,0,0); //red
delay(100);
color(255,255,0); //yellow
delay(100);
}
上传并测试以确保您处在正确的轨道上。
现在,让我们集成距离传感器,以便仅在有物体进入(例如50厘米)(刚好小于门框的宽度)时才触发那些灯。我们已经定义了正确的引脚并导入了库,因此在您的 setup()函数之前,添加以下行以对其进行实例化:
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
在此之下,添加一个变量以存储是否触发警报,当然默认为false。
boolean triggered = false;
在 setup()函数,以便我们可以监视串行输出和调试。
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
接下来,让我们将当前循环重命名为 alarm() –如果警报已触发,将调用此名称。
void alarm(){
color(255,0,0); //red
delay(100);
color(255,255,0); //yelow
delay(100);
}
现在创建一个新的 loop()函数,一个
void loop(){
if(triggered == true){
alarm();
}
else{
delay(50);// Wait 50ms between pings (about 20 pings/sec)。 29ms should be the shortest delay between pings.
unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS)。
unsigned int distance = uS / US_ROUNDTRIP_CM;
Serial.println(distance);
if(distance 《 100){
triggered = true;
}
}
}
在其中,我们获取一个新的ping命令,读取结果,并在出现警报的情况下触发警报。 p》
首先检查是否已触发警报,如果已触发,则关闭警报功能(此时仅闪烁指示灯)。
如果未触发但是,仍要从传感器获取当前读数。
如果传感器的读数小于100厘米,则说明光束已被填充(显然,如果触发时间过早,请调整此值)。
在添加烦人的压电蜂鸣器之前,请立即试用。
工作吗?大。现在让我们重新添加蜂鸣器。将 pinMode 添加到 setup()例程中。
pinMode(ALARM, OUTPUT);
然后将压电蜂鸣器循环添加到alarm()函数:
for (int x=0; x《180; x++) {
// convert degrees to radians then obtain sin value
sinVal = (sin(x*(3.1412/180)));
// generate a frequency from the sin value
toneVal = 2000+(int(sinVal*1000));
tone(ALARM, toneVal);
}
如果此时尝试进行编译,则会遇到错误-我故意将其保留,以便您可以看到一些常见的错误问题。在这种情况下,NewPing库和标准音调库都使用相同的中断-它们基本上是冲突的,因此您无法做很多修复。哦,亲爱的。
不过不用担心。这是一个常见问题,已经有人解决了,请下载此NewTone并将其添加到Arduino Libraries文件夹中。调整程序的开头以包括以下内容:
#include
,并调整以下行:
tone(ALARM, toneVal);
至
NewTone(ALARM, toneVal);
。
就是这样。将警报设置在卧室的门口,以防下一个不幸的窃贼。
或者是一只狗,看起来好像完全没被警报吓到。
遇到麻烦了代码?这是完整的应用程序。如果您遇到随机错误,请尝试将其粘贴在下面,我会帮忙看看。
责任编辑:wv
全部0条评论
快来发表一下你的评论吧 !