大连林海 发表于 2015-10-8 21:15:17

Arduino与Processing互动之红外热释电与感应路灯

http://image.geek-workshop.com/forum/201112/25/163027iljoo8neypann4lm.jpg
基于热释电效应的人体热释运动传感器,能检测到人体或动物身上发出的红外线,配合菲涅尔透镜能是传感器探测范围更远更广。与Arduino专用传感器扩展板结合使用,可以非常容易地实现与人体或动物相关的互动效果。

   当红外热释电运动传感器的附近有人在移动,这个小装置就会即刻触发,输出高电平,就算人离开了,高电平也依旧持续一段时间才会改变会低电平,而这个持续的时间长短可以由传感器模块上的那个黄色可变电阻调整,时间长短约为0.3至18秒。然后如果检测到没人再移动,这个传感器又会回到“休眠”状态,传感器维持低电平。
http://image.geek-workshop.com/forum/201112/25/163039d52s7uq2z4cgp2a0.jpg


实验现象是:手在传感器附近移动,传感器被触发,Processing画布上的灯点亮,人偶从画布左端开始移动,到画布右端消失,然后,画布黑屏,直到传感器又被移动物体触发,再重复上述过程。
http://v.youku.com/v_show/id_XMzM1NjU4ODU2.html

下面给出Arduino和Processing的程序, 我用蓝色字体标注了两者串口通讯的程序段。Arduino程序:int ledPin = 13;   // LED 连接到数字端口13
int sensor = 2;    //传感器连接到数字端口2
//红外热释电运动传感器发出高电平,则被触发
//发出低电平,则其处于休眠状态
int val = 0; //存储传感器输出的数字量

void setup()
{
pinMode(ledPin, OUTPUT);      // sets the digital pin as output
pinMode(sensor, INPUT);       // sets the digital pin as input
digitalWrite(ledPin,HIGH);    //初始化熄灭灯
Serial.begin(9600);//设置串行通信的波特率
}

void loop()
{
val = digitalRead(sensor);   // read the input pin
//如果红外热释电运动传感器被触发,将保持高电平一段时间
if(HIGH == val)
{
    Serial.print(1,BYTE);//向Processing发出传感器被触发标志
    digitalWrite(ledPin,LOW);   // LED亮
    delay(50);//延时,以使串行通讯不至于太忙
}
else
{digitalWrite(ledPin,HIGH);    // LED灭
Serial.print(0,BYTE);//向Processing发出传感器休眠标志
delay(50);
}
}

Processing程序:(与动画相关的指令用红色字体标注)
/*Processing接受到Arduino控制器的红外热释传感器发出的
触发信号后,画布上的路灯点亮,当人走过画布后,画布黑屏*/
import processing.serial.*;//导入serial通信库
Serial duankou;//创建对象duankou
//变量存储Arduino传来数据,用来标志传感器是否被触发
int data;
int frame=0;//动画变量
int flag=0;//路灯是否亮标志
//声明一个PImage类型
PImage photo1;//人偶图片定义
PImage photo2;//路灯图片定义
//串行通讯子程序
void communication()
{
if(duankou.available()>0)
{
    //把Arduino传来的字节存入变量data
    //一个字节数值范围是0~255.
    data=duankou.read();
    //把Arduino传来的字节显示在控制台中
    println(data);
    //如果data=1,则说明红外热释被触发
    if(data==1)
    {
      flag=1;//路灯亮标志
    }   
}
}
//初始化程序
void setup()
{
size(700,400);//画布尺寸定义
//调用图片到变量photo
photo1=loadImage("Puppet.JPG");
photo2=loadImage("light_bulb.png");
   //设定通讯端口为COM3,波特率为9600
duankou = new Serial(this,"COM3",9600);
}
//主程序
void draw()
{
if(flag==1 && frame<=680)//如果路灯亮
{
       background(255);
       image(photo2,200,-10);//设置路灯在画布的位置
       for(int i=0;i<50;i++)//延时
       { communication();//调用通讯程序
      }
      image(photo1,frame,235);//人偶沿X坐标         
       frame+=1;//增加动画变量值   
   }
    else
   {
   background(0);//画布黑屏
    flag=0;//flag设置为路灯不亮标志
    frame=0;//动画变量清零
    communication();//调用通讯程序
   }
}








dsweiliang 发表于 2015-10-9 21:33:50

{:5_144:}能做个床头灯,我就不用起床摸黑了

大连林海 发表于 2015-10-10 12:54:40

dsweiliang 发表于 2015-10-9 21:33
能做个床头灯,我就不用起床摸黑了

床头灯 应该很简单啊

发表于 2022-4-25 08:49:50

哥,你这视频被屏蔽了
页: [1]
查看完整版本: Arduino与Processing互动之红外热释电与感应路灯