在一些便利店的门口,我们经常会发现这样一个装置,当我们进入便利店时,会有一个音箱播放一次欢迎光临的音效。在本节课中我们将会一起来制作一个这样的迎客装置。

知识锦囊

PIR运动传感器

image.png
PIR运动传感器是一种红外运动传感器,可用于检测到是否有人或动物在其检测范围内经过。日常生活中见到的楼道感应灯,商场的电动门等,通常都是利用红外运动传感器,来实现有人经过时就开灯或者开门。

红外运动传感器的全称是“被动式红外运动传感器”,它由对红外光线敏感的特殊材质组成。当传感器闲置时,位于传感器检测范围内的物体,如房间、墙和桌子等,发射的红外线强度几乎恒定;而当有人或动物经过时,传感器检测到的红外线强度就会发生一定的变化,根据这些变化,就可以判定是否有人或动物经过。

OLED显示屏

image.png
OLED又叫有机电激光显示、有机发光半导体,其自发光、低功耗、反应速度快、高分辨率、质量轻等优点使它的应用领域非常广泛。0.96寸OLED显示屏是具有Grove I2C接口的单色(白色)128×64像素无源显示矩阵模块。在项目制作时,我们可以通过OLED显示屏显示时间、温湿度等传感器返回的数值,也可以直接显示字母、数字、图形甚至图案,实现可视化交互的效果。

实践操作

任务一:当有人靠近时,在显示器上显示欢迎光临

首先是硬件连接部分,我们将PIR运动传感器和OLED显示屏分别连接到主控板上。PIR运动传感器连接A0/D0接口,OLED显示屏连接到IIC接口。
image.png
接下来下载OLED显示屏的库文件U8x8lib.zip下载成功之后,将该文件解压到Ardunio的库文件夹中(文件夹地址:此电脑/文档/Arduino/libraries)完成传感器库的导入。
然后打开Arduino IDE,新建一个程序文件,编写以下代码:

  1. #include <Arduino.h>
  2. #include <U8g2lib.h>
  3. #define BAT_ENABLE 19 //Grove端口使能引脚
  4. #define PIR_SENSOR 0 //PIR传感器连接到D0接口
  5. #ifdef U8X8_HAVE_HW_SPI
  6. #include <SPI.h>
  7. #endif
  8. #ifdef U8X8_HAVE_HW_I2C
  9. #include <Wire.h>
  10. #endif
  11. U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // High speed I2C
  12. // U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); //Low spped I2C
  13. void setup(void) {
  14. digitalWrite(BAT_ENABLE, HIGH);//启用Grove端口
  15. pinMode(PIR_SENSOR, INPUT);//设置PIR传感器为输入模式
  16. u8g2.begin();
  17. }
  18. void loop(void) {
  19. u8g2.clearBuffer(); // 清除缓存
  20. u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体
  21. if(digitalRead(PIR_SENSOR)){//如果检测到有人靠近
  22. u8g2.drawStr(0,10,"Hi,Welcome"); // 显示欢迎光临
  23. u8g2.sendBuffer(); //将信息传输到显示器
  24. }
  25. else{
  26. u8g2.drawStr(0,10,"see you"); // write something to the internal memory
  27. u8g2.sendBuffer(); //将信息传输到显示器
  28. }
  29. delay(1000);
  30. }

然后,

  • 单击工具>开发板> Wio LTE
  • 单击工具>端口以选择正确的端口号。(不要选择COM1

接下来单击Arduino IDE左上方的Upload按钮,几秒钟后,程序成功上传;
程序上传成功之后,尝试靠近和远离PIR运动传感器,观察OLED显示屏是否正确显示欢迎语句。
image.png
image.png

任务二:添加欢迎光临音效

一个完善的迎客装置除了显示文字之外,如果能够同时发出欢迎光临的声音提示,效果就会变得更好。在本任务中,我们将会在任务一的基础上加上声音提示的功能,接下来让我们看一下该怎么做吧!
首先是硬件连接部分,我们将PIR运动传感器、蜂鸣器和OLED显示屏分别连接到主控板上。PIR运动传感器连接A0/D0接口,OLED显示屏连接到IIC接口,蜂鸣器连接到A2/D2接口。
image.png
接下来让我们回到代码部分:

  1. #include <Arduino.h>
  2. #include <U8g2lib.h>
  3. #define BAT_ENABLE 19 //Grove端口使能引脚
  4. #define PIR_SENSOR 0 //PIR传感器连接到D0接口
  5. #define buzzer_PIN 2//定义蜂鸣器连接至D2接口
  6. #ifdef U8X8_HAVE_HW_SPI
  7. #include <SPI.h>
  8. #endif
  9. #ifdef U8X8_HAVE_HW_I2C
  10. #include <Wire.h>
  11. #endif
  12. int a = 0; //设置一个变量
  13. U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // High speed I2C
  14. // U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); //Low spped I2C
  15. void setup(void) {
  16. digitalWrite(BAT_ENABLE, HIGH);//启用Grove端口
  17. pinMode(PIR_SENSOR, INPUT);//设置PIR传感器为输入模式
  18. pinMode(buzzer_PIN, OUTPUT); //设置蜂鸣器的引脚为输出状态
  19. u8g2.begin();
  20. }
  21. void loop(void) {
  22. u8g2.clearBuffer(); // 清除缓存
  23. u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体
  24. if(digitalRead(PIR_SENSOR)){//如果检测到有人靠近
  25. if(a == 0){
  26. digitalWrite(buzzer_PIN,HIGH);//启动蜂鸣器
  27. delay(200);
  28. digitalWrite(buzzer_PIN,LOW);//关闭蜂鸣器
  29. a = 1;
  30. }
  31. u8g2.drawStr(0,10,"Hi,Welcome"); // 显示欢迎光临
  32. u8g2.sendBuffer(); //将信息传输到显示器
  33. }
  34. else{
  35. if(a == 1){
  36. digitalWrite(buzzer_PIN,HIGH);//启动蜂鸣器
  37. delay(200);
  38. digitalWrite(buzzer_PIN,LOW);//关闭蜂鸣器
  39. a = 0;
  40. }
  41. u8g2.drawStr(0,10,"see you"); // write something to the internal memory
  42. u8g2.sendBuffer(); //将信息传输到显示器
  43. }
  44. delay(1000);
  45. }

image.png
上传程序之后,检查蜂鸣器是否传出了欢迎光临提示声音。