“迎门人体检测/zh”的版本间的差异

来自Microduino Wikipedia
跳转至: 导航搜索
调试过程
程序说明
第95行: 第95行:
  
 
==程序说明==
 
==程序说明==
*主函数部分
+
*body_welcome.ino
 
<source lang="cpp">
 
<source lang="cpp">
#include "audio.h"    //audio模块功能 
+
#include "audio.h"
#include "key.h"    //按键检测功能 
+
#include "key.h"
 
+
 
#include <Adafruit_NeoPixel.h> 
+
#include <Adafruit_NeoPixel.h>
#define PIN A0             //LED灯控制引脚 
+
#define PIN A0
Adafruit_NeoPixel strip =
+
Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel(12, PIN, NEO_GRB + NEO_KHZ800); 
+
 
 
+
//#include <SoftwareSerial.h>
#include <SoftwareSerial.h> 
+
 
 
+
uint32_t color[9] =
uint32_t color[9] = 
+
{
{ 
+
  strip.Color(0, 0, 0), strip.Color(255, 0, 0), strip.Color(248, 141, 30), strip.Color(255, 255, 0), strip.Color(0, 255, 0), strip.Color(0, 127, 255), strip.Color(0, 0, 255), strip.Color(139, 0, 255), strip.Color(255, 255, 255)
    strip.Color(0, 0, 0), strip.Color(255, 0, 0), 
+
};
strip.Color(248, 141, 30), strip.Color(255, 255, 0), 
+
 
strip.Color(0, 255, 0), strip.Color(0, 127, 255), 
+
#define body_pin 4
    strip.Color(0, 0, 255), strip.Color(139, 0, 255), 
+
#define body_pin2 6
strip.Color(255, 255, 255) 
+
int i = 1;
};                        //LED灯要显示的9种颜色 
+
int music_vol = 28; //初始音量0~30
 
+
 
#define body_pin 4       //热释传感器输入引脚 
+
boolean play_pause;
 
+
boolean play_stop;
int i = 1; 
+
boolean FLAG_1 = 0;
int music_vol = 28;      //初始音量0~30 
+
boolean FLAG_2 = 0;
 
+
void setup() {
boolean play_pause; 
+
  // initialize serial:
boolean play_stop; 
+
  Serial.begin(9600);
 
+
  pinMode(body_pin, INPUT);
void setup() 
+
  pinMode(body_pin2, INPUT);
{ 
+
//  key_init();
    // initialize serial: 
+
 
    Serial.begin(9600);      //串口初始化 
+
  audio_init(DEVICE_Flash, MODE_One_END, music_vol);
    pinMode(body_pin, INPUT); 
+
 
 
+
  strip.begin(); //初始化LED
    key_init(); 
+
  strip.show(); // Initialize all pixels to 'off'
 
+
 
    audio_init(DEVICE_Flash, MODE_One_END, music_vol); 
+
  for (int i = 0; i < 9; i++)
    //audio模块初始化:存储设备为Flash,单次播放模式,音量设置28 
+
  {
    strip.begin();    //初始化LED 
+
    colorWipe(color[i]);
    strip.show(); // Initialize all pixels to 'off' 
+
    delay(300);
 
+
  }
    for (int i = 0; i < 9; i++) 
+
  colorWipe(color[0]);
    { 
+
}
        colorWipe(color[i]); 
+
 
        delay(300); 
+
void loop() {
    }                 //LED循环显示一遍9种颜色 
+
  judge();
    colorWipe(color[0]);    //LED灯关闭 
+
  if (!digitalRead(body_pin)&&!digitalRead(body_pin2))
} 
+
  {
 
+
    colorWipe(color[0]);
void loop() 
+
    FLAG_1 = 0;
{ 
+
    FLAG_2 = 0;
    if (key_get(body_pin, 0))       //判断热释传感器触发 
+
  }
    { 
+
}
        colorWipe(color[random(1, 10)]);    //LED随机显示一种颜色 
+
 
        audio_choose(1);            //控制audio播报语音 
+
void colorWipe(uint32_t c) {
    } 
+
  for (uint16_t i = 0; i < strip.numPixels(); i++)
    Serial.println(digitalRead(body_pin)); 
+
  {
    if (!digitalRead(body_pin))   // 判断热释传感器没有触发 
+
    strip.setPixelColor(i, c);
        colorWipe(color[0]);      //LED灯关闭 
+
    strip.show();
} 
+
  }
 +
}
 +
void judge()
 +
{
 +
  if((digitalRead(body_pin)==1)&&(digitalRead(body_pin2)==0))
 +
  {
 +
    FLAG_1 = 1;
 +
    delay(200);
 +
  }
 +
  if((digitalRead(body_pin)==1)&&(digitalRead(body_pin2)==1)&&(FLAG_1 == 1))
 +
  {
 +
 
 +
    colorWipe(color[random(1, 10)]);
 +
    audio_choose(1);
 +
    Serial.println("COMING IN");
 +
    FLAG_1 = 0;
 +
    delay(1300);    //1300
 +
  }
 +
 
 +
if((digitalRead(body_pin)==0)&&(digitalRead(body_pin2)==1))
 +
  {
 +
    FLAG_2 = 1;
 +
    delay(200);    //2000
 +
  }
 +
  if((digitalRead(body_pin)==1)&&(digitalRead(body_pin2)==1)&&(FLAG_2 == 1))
 +
  {
 +
    colorWipe(color[random(1, 10)]);
 +
    audio_choose(2);
 +
    Serial.println("GOING OUT");
 +
    FLAG_2 = 0;
 +
    delay(1300);   //2000
 +
  }
 +
}
 +
 
 +
 
 
</source>
 
</source>
*LED灯控制部分
+
*Audio.h
 
<source lang="cpp">
 
<source lang="cpp">
void colorWipe(uint32_t c) 
+
#include "arduino.h"
+
//#include <SoftwareSerial.h>
    for (uint16_t i = 0; i < strip.numPixels(); i++) 
+
 
    { 
+
//SoftwareSerial mySerial(2, 3); // RX, TX
        strip.setPixelColor(i, c); 
+
 
        strip.show(); 
+
#define AUDIO_PORT Serial1    //Core+
    } 
+
//#define AUDIO_PORT mySerial  //Core
+
 
</source>
+
byte sn_reset[4]=
*音频控制部分
+
{
<source lang="cpp">
+
  0x7E,0x02,0x0C,0xEF
#include "arduino.h" 
+
};
#include <SoftwareSerial.h> 
+
 
 
+
byte sn_choose[6]=
SoftwareSerial mySerial(2, 3); // RX, TX 
+
{
 
+
  0x7E,0x04,0x03,0x00,0x01,0xEF
//#define AUDIO_PORT Serial1    //Core+ 
+
};
#define AUDIO_PORT mySerial  //Core  
+
 
 
+
byte sn_vol[5]=
byte sn_reset[4] =                    //复位指令 
+
{
{ 
+
  0x7E,0x03,0x06,0x18,0xEF
    0x7E, 0x02, 0x0C, 0xEF 
+
};
}; 
+
 
 
+
byte sn_device[5]=
byte sn_choose[6] =                   //选择曲目指令 
+
{
{ 
+
  0x7E,0x03,0x09,0x01,0xEF 
    0x7E, 0x04, 0x03, 0x00, 0x01, 0xEF 
+
};
}; 
+
 
 
+
byte sn_pause[4]=
byte sn_vol[5] =                      //调节音量指令 
+
{
{ 
+
  0x7E,0x02,0x0E,0xEF
    0x7E, 0x03, 0x06, 0x18, 0xEF 
+
};
}; 
+
 
 
+
byte sn_play[4]=
byte sn_device[5] =                  //设备设置指令 
+
{
{ 
+
  0x7E,0x02,0x0D,0xEF
    0x7E, 0x03, 0x09, 0x01, 0xEF 
+
};
}; 
+
 
 
+
byte sn_mode[5]=
byte sn_pause[4] =                  //暂停指令 
+
{
{ 
+
  0x7E,0x03,0x11,0x00,0xEF
    0x7E, 0x02, 0x0E, 0xEF 
+
};
}; 
+
 
 
+
byte sn_down[4]=
byte sn_play[4] =                   //播放指令 
+
{
{ 
+
  0x7E,0x02,0x01,0xEF
    0x7E, 0x02, 0x0D, 0xEF 
+
};
}; 
+
 
 
+
byte sn_up[4]=
byte sn_mode[5] =                   //设置播放模式指令 
+
{
{ 
+
  0x7E,0x02,0x02,0xEF
    0x7E, 0x03, 0x11, 0x00, 0xEF 
+
};
}; 
+
 
 
+
byte sn_eq[5]=
byte sn_down[4] =                   //下一曲目指令 
+
{
{ 
+
  0x7E,0x03,0x07,0x01,0xEF
    0x7E, 0x02, 0x01, 0xEF 
+
};
}; 
+
 
 
+
//-----------------------------
byte sn_up[4] =                     //上一曲目指令 
+
void audio_pause()
{ 
+
{
    0x7E, 0x02, 0x02, 0xEF 
+
  AUDIO_PORT.write(sn_pause,4);
}; 
+
  delay(50);
 
+
}
byte sn_eq[5] =                     //设置播放风格指令 
+
 
{ 
+
void audio_play()
    0x7E, 0x03, 0x07, 0x01, 0xEF 
+
{
}; 
+
  AUDIO_PORT.write(sn_play,4);
 
+
  delay(50);
//----------------------------- 
+
}
void audio_pause()                  //音频暂停 
+
 
{ 
+
//play eq    (Normal/Pop/Rock/Jazz/Classic/Base) 0-5
    AUDIO_PORT.write(sn_pause, 4); 
+
void audio_eq(byte _audio_eq)
    delay(50); 
+
{
} 
+
  sn_mode[3]=_audio_eq;
 
+
  AUDIO_PORT.write(sn_eq,5);
void audio_play()                    //音频播放 
+
  delay(100);
{ 
+
}
    AUDIO_PORT.write(sn_play, 4); 
+
 
    delay(50); 
+
#define MODE_loopAll 0
} 
+
#define MODE_loopOne 1
 
+
#define MODE_One_STOP 2
//play eq    (Normal/Pop/Rock/Jazz/Classic/Base)  0-
+
#define MODE_One_END  4
void audio_eq(byte _audio_eq)      //设置播放风格 
+
//play mode    (ALL/FOL/ONE/RAM/ONE_STOP) 0-4
{ 
+
void audio_mode(byte _audio_mode)
    sn_mode[3] = _audio_eq; 
+
{
    AUDIO_PORT.write(sn_eq, 5); 
+
  sn_mode[3]=_audio_mode;
    delay(100); 
+
  AUDIO_PORT.write(sn_mode,5);
} 
+
  delay(100);
 
+
}
#define MODE_loopAll 0 
+
 
#define MODE_loopOne 1 
+
#define DEVICE_Flash  5
#define MODE_One_STOP 2 
+
#define DEVICE_TF  1
#define MODE_One_END  4 
+
//device select    (U/TF/AUX/SLEEP/FLASH) 0-4
//play mode    (ALL/FOL/ONE/RAM/ONE_STOP)  0-
+
void audio_device(byte _audio_device)
void audio_mode(byte _audio_mode)   //设置播放模式 
+
{
{ 
+
  sn_device[3]=_audio_device;
    sn_mode[3] = _audio_mode; 
+
  AUDIO_PORT.write(sn_device,5);
    AUDIO_PORT.write(sn_mode, 5); 
+
  delay(1500);
    delay(100); 
+
}
} 
+
 
 
+
void audio_down()
#define DEVICE_Flash  5 
+
{
#define DEVICE_TF  1 
+
  AUDIO_PORT.write(sn_down,4);
//device select    (U/TF/AUX/SLEEP/FLASH)  0-
+
  delay(500);
void audio_device(byte _audio_device)  //设置存储方式 
+
}
{ 
+
 
    sn_device[3] = _audio_device; 
+
void audio_up()
    AUDIO_PORT.write(sn_device, 5); 
+
{
    delay(1500); 
+
  AUDIO_PORT.write(sn_up,4);
} 
+
  delay(500);
 
+
}
void audio_down()     //播放下一曲目 
+
 
{ 
+
void audio_vol(byte _audio_vol)
    AUDIO_PORT.write(sn_down, 4); 
+
{
    delay(500); 
+
  sn_vol[3]=_audio_vol;
} 
+
  AUDIO_PORT.write(sn_vol,5);
 
+
  delay(50);
void audio_up()     //播放上一曲目 
+
}
{ 
+
 
    AUDIO_PORT.write(sn_up, 4); 
+
void audio_choose(byte _audio_choose)
    delay(500); 
+
{
} 
+
  sn_choose[4]=_audio_choose;
 
+
  AUDIO_PORT.write(sn_choose,6);
void audio_vol(byte _audio_vol)    //设置音量 
+
  delay(100);
{ 
+
}
    sn_vol[3] = _audio_vol; 
+
 
    AUDIO_PORT.write(sn_vol, 5); 
+
void audio_reset()
    delay(50); 
+
{
} 
+
  AUDIO_PORT.write(sn_reset,4);
 
+
  delay(500);
void audio_choose(byte _audio_choose)   //选择曲目 
+
}
{ 
+
 
    sn_choose[4] = _audio_choose; 
+
void audio_init(int _audio_init_device,int _audio_init_mode,int _audio_init_vol)
    AUDIO_PORT.write(sn_choose, 6); 
+
{
    delay(100); 
+
  AUDIO_PORT.begin(9600);
} 
+
  delay(500);
 
+
  audio_reset();
void audio_reset()      //音频复位 
+
  audio_device(_audio_init_device);
{ 
+
  audio_mode(_audio_init_mode);
    AUDIO_PORT.write(sn_reset, 4); 
+
  audio_vol(_audio_init_vol);
    delay(500); 
+
  audio_pause();
} 
+
}
 
 
void audio_init(int _audio_init_device, 
 
int _audio_init_mode, int _audio_init_vol) 
 
{ 
 
    AUDIO_PORT.begin(9600); 
 
    delay(500); 
 
    audio_reset(); 
 
    audio_device(_audio_init_device); 
 
    audio_mode(_audio_init_mode); 
 
    audio_vol(_audio_init_vol); 
 
    audio_pause(); 
 
} 
 
 
</source>
 
</source>
 +
 
==视频==
 
==视频==

2015年11月23日 (一) 11:08的版本

概述

  • 项目名称:Microduino迎门人体检测
  • 目的:当有人靠近时,彩灯变色并播报欢迎语音
  • 难度:中
  • 耗时:2小时
  • 制作者:
  • 简介:

本次教程我们将使用Microduino产品模块快速搭建一个迎门人体检测体统, 该系统通过热释传感器探测3米范围内是否有人靠近,在有人靠近时,可以通过彩色LED灯变换色彩进行提示,并播报出欢迎语音。

材料清单

  • Microduino设备
模块 数量 功能
Microduino-Core/zh 1 核心板
Microduino-USBTTL/zh 1 下载程序
Microduino-Audio/zh 1 音频控制
Microduino-Amplifier/zh 1 功率放大
Microduino-Sensorhub/zh 1 与传感器和舵机相连
Microduino-PIR/zh 1 热释红外传感器
Microduino-Lantern/zh 1 彩色LED灯
  • 其他设备
模块 数量 功能
Micro-USB线 1 下载程序,供电
喇叭 2 发声
螺丝 5 固定模块
外壳 1

实验原理

迎门人体检测系统主要分为检测与控制两个部分。检测部分采用红外热释传感器Microduino-PIR,能探测附近人体的红外特征信号。控制部分为声光控制,发光部件采用Microduino-Lantern模块,能让LED呈现美轮美奂的颜色;音频部分通过Microduino-Aduio模块管理音频文件,Microduino-Amplifier功率放大模块驱动2个喇叭发出洪亮的声音。

Doorwelcome1.jpg

整体系统的控制原理即接入以上两个部分,Microduino-Core核心通过PIR传感器探测到附近有人靠近后,控制Lantern模块变换颜色,Auido模块播报“欢迎光临”语音,从而达到迎宾欢迎的效果。

  • 主要传感器

Microduino-PIR/zh 人体都有恒定的体温,一般在37摄氏度,所以会发出特定波长10um左右的红外线,热释传感器就是通过被动式红外探头探测10um左右红外线而进行工作的。人体发射的10um左右的红外线经过菲涅尔滤光片增强后聚集到红外探头上。 红外探头通常采用热释电元件,这种元件在接受到人体红外辐射温度发生变化时就会失去电荷平衡,向外释放电荷,后续电路经过处理就能产生可以处理的电信号。 菲涅尔透镜利用透镜的特殊光学原理,在探测器前方产生一个交替变化的“盲区”和“高灵敏区”,以提高他的探测接收灵敏度。当有人从透镜前走过时,人体发出的红外线就不断地交替从“盲区”进入“高灵敏区”,这样就使接收到的红外信号以忽强忽弱的脉冲形式输入,从而增强其能量幅度。热释红外传感器只有配合菲涅尔透镜使用才能发挥最大作用。

文档

调试过程

  • 下载程序

将Microduino-Core与Microduino-USBTTL叠加(无上下顺序),通过USB数据与电脑连接起来。

Download1.jpg

打开Arduino IDE编程软件,点击【文件】->【打开】

Dl1.jpg

浏览到项目程序地址,点击“body_welcome.ino”程序打开。

点击【工具】,在板选项里面选择板卡(Microduino-Core),在处理器选项里面选择处理器(Atmega328p@16M,5V),再在端口选项里面选择正确的端口号,然后直接烧录程序。

Dl3.jpg

使用USB数据线将Microduino-Audio模块与电脑连接。

Dl4.jpg

连接成功能显示出一个名为Microduino Audio的CD驱动器,然后执行以下步骤:

Dl5.jpg

打开CD驱动器后会出现音乐更新软件Music Update tool,选择“音频加载”选项;

Dl6.jpg

点击“浏览”,选择“music”文件夹中的"001.wav"音频文件,将音频文件添加到软件中

在”更新下载”选项中选择“更新”,更新完成后,音频文件就已写入flash中。

Dl8.jpg
  • 搭建

将热释传感器接到Sensorhub的D4接口,Lantern灯接到Sensorhub的A0接口。

Microduino-sensorhub rule.JPG

把用到的设备叠加起来(无上下顺序)

  • Microduino-Core
  • Microduino-Audio
  • Microduino-Amplifier
  • Microduino-Sensorhub

把叠加好的模块放入外壳中,把喇叭、热释传感器、LED灯固定到相应位置

将两个喇叭接到Amplifier的扬声器接口

用USB数据线连接Audio模块的USB接口,确认系统已供电

此时热释传感器检测到附近有人后,LED灯会变换颜色,喇叭播放出欢迎语音

程序说明

  • body_welcome.ino
#include "audio.h"
#include "key.h"

#include <Adafruit_NeoPixel.h>
#define PIN A0
Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, PIN, NEO_GRB + NEO_KHZ800);

//#include <SoftwareSerial.h>

uint32_t color[9] =
{
  strip.Color(0, 0, 0), strip.Color(255, 0, 0), strip.Color(248, 141, 30), strip.Color(255, 255, 0), strip.Color(0, 255, 0), strip.Color(0, 127, 255), strip.Color(0, 0, 255), strip.Color(139, 0, 255), strip.Color(255, 255, 255)
};

#define body_pin 4
#define body_pin2 6
int i = 1;
int music_vol = 28; //初始音量0~30

boolean play_pause;
boolean play_stop;
boolean FLAG_1 = 0;
boolean FLAG_2 = 0;
void setup() {
  // initialize serial:
  Serial.begin(9600);
  pinMode(body_pin, INPUT);
  pinMode(body_pin2, INPUT);
//  key_init();

  audio_init(DEVICE_Flash, MODE_One_END, music_vol);

  strip.begin();	//初始化LED
  strip.show(); // Initialize all pixels to 'off'

  for (int i = 0; i < 9; i++)
  {
    colorWipe(color[i]);
    delay(300);
  }
  colorWipe(color[0]);
}

void loop() {
  judge();
  if (!digitalRead(body_pin)&&!digitalRead(body_pin2))
   {
    colorWipe(color[0]);
    FLAG_1 = 0;
    FLAG_2 = 0;
   }
}

void colorWipe(uint32_t c) {
  for (uint16_t i = 0; i < strip.numPixels(); i++)
  {
    strip.setPixelColor(i, c);
    strip.show();
  }
}
void judge()
{
  if((digitalRead(body_pin)==1)&&(digitalRead(body_pin2)==0))
  {
    FLAG_1 = 1;
    delay(200);
  }
  if((digitalRead(body_pin)==1)&&(digitalRead(body_pin2)==1)&&(FLAG_1 == 1))
  {

    colorWipe(color[random(1, 10)]);
    audio_choose(1);
    Serial.println("COMING IN");
    FLAG_1 = 0;
    delay(1300);    //1300
  }
  
 if((digitalRead(body_pin)==0)&&(digitalRead(body_pin2)==1))
  {
    FLAG_2 = 1;
    delay(200);    //2000
  }
  if((digitalRead(body_pin)==1)&&(digitalRead(body_pin2)==1)&&(FLAG_2 == 1))
  {
    colorWipe(color[random(1, 10)]);
    audio_choose(2);
    Serial.println("GOING OUT");
    FLAG_2 = 0;
    delay(1300);   //2000
  }
}
  • Audio.h
#include "arduino.h"
//#include <SoftwareSerial.h>

//SoftwareSerial mySerial(2, 3); // RX, TX

#define AUDIO_PORT Serial1    //Core+
//#define AUDIO_PORT mySerial  //Core

byte sn_reset[4]=
{
  0x7E,0x02,0x0C,0xEF
};

byte sn_choose[6]=
{
  0x7E,0x04,0x03,0x00,0x01,0xEF
};

byte sn_vol[5]=
{
  0x7E,0x03,0x06,0x18,0xEF 
};

byte sn_device[5]=
{
  0x7E,0x03,0x09,0x01,0xEF  
};

byte sn_pause[4]=
{
  0x7E,0x02,0x0E,0xEF
};

byte sn_play[4]=
{
  0x7E,0x02,0x0D,0xEF
};

byte sn_mode[5]=
{
  0x7E,0x03,0x11,0x00,0xEF
};

byte sn_down[4]=
{
  0x7E,0x02,0x01,0xEF
};

byte sn_up[4]=
{
  0x7E,0x02,0x02,0xEF
};

byte sn_eq[5]=
{
  0x7E,0x03,0x07,0x01,0xEF
};

//-----------------------------
void audio_pause()
{
  AUDIO_PORT.write(sn_pause,4);
  delay(50);
}

void audio_play()
{
  AUDIO_PORT.write(sn_play,4);
  delay(50);
}

//play eq    (Normal/Pop/Rock/Jazz/Classic/Base)  0-5
void audio_eq(byte _audio_eq)
{
  sn_mode[3]=_audio_eq;
  AUDIO_PORT.write(sn_eq,5);
  delay(100);
}

#define MODE_loopAll 0
#define MODE_loopOne 1
#define MODE_One_STOP 2
#define MODE_One_END  4
//play mode    (ALL/FOL/ONE/RAM/ONE_STOP)  0-4
void audio_mode(byte _audio_mode)
{
  sn_mode[3]=_audio_mode;
  AUDIO_PORT.write(sn_mode,5);
  delay(100);
}

#define DEVICE_Flash  5
#define DEVICE_TF  1
//device select    (U/TF/AUX/SLEEP/FLASH)  0-4
void audio_device(byte _audio_device)
{
  sn_device[3]=_audio_device;
  AUDIO_PORT.write(sn_device,5);
  delay(1500);
}

void audio_down()
{
  AUDIO_PORT.write(sn_down,4);
  delay(500);
}

void audio_up()
{
  AUDIO_PORT.write(sn_up,4);
  delay(500);
}

void audio_vol(byte _audio_vol)
{
  sn_vol[3]=_audio_vol;
  AUDIO_PORT.write(sn_vol,5);
  delay(50);
}

void audio_choose(byte _audio_choose)
{
  sn_choose[4]=_audio_choose;
  AUDIO_PORT.write(sn_choose,6);
  delay(100);
}

void audio_reset()
{
  AUDIO_PORT.write(sn_reset,4);
  delay(500);
}

void audio_init(int _audio_init_device,int _audio_init_mode,int _audio_init_vol)
{
  AUDIO_PORT.begin(9600);
  delay(500);
  audio_reset();
  audio_device(_audio_init_device);
  audio_mode(_audio_init_mode);
  audio_vol(_audio_init_vol);
  audio_pause();
}

视频