前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >和12岁小同志搞创客开发:手撕代码,做一款声控灯

和12岁小同志搞创客开发:手撕代码,做一款声控灯

作者头像
不脱发的程序猿
发布2021-11-17 11:07:07
3230
发布2021-11-17 11:07:07
举报

机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧。

项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html


之前两篇博文主要是数字量输入、输出类型传感器的驱动。

和12岁小同志搞创客开发:手撕代码,点亮LED灯

和12岁小同志搞创客开发:手撕代码,做一款人体感应灯

本篇博文讲讲模拟量传感器的驱动。

小时候有没有对走廊的声控灯很感兴趣呢?会不会拼命的跺脚只为让那盏灯点亮。本篇博文我们使用声音传感器做个这样的声控灯。只要你轻轻拍下手,灯就自动亮起来了,没了声音,灯就又自动关了。

MIC声音传感器是一款基于麦克风为声音检测的传感器,可用来对周围环境中的声音强度进行检测,具有300倍的放大器,输出模拟信号能使用3.3V和5V为基准AD采集,可以用来实现根据声音大小进行互动的效果、制作声控机器人、声控开关、声控报警等。

传感器连线效果如下所示:

实现代码如下所示:

代码语言:javascript
复制
int soundPin = 0;       //声音传感器接到模拟0
int ledPin =  13;       //LED接到数字13

void setup() {
  pinMode(ledPin, OUTPUT);
 // Serial.begin(9600);    //用于调试
}

void loop(){
  int soundState = analogRead(soundPin);  //读取传感器的值
 // Serial.println(soundState);      //串口打印声音传感器的值

//如果声音值大于10,亮灯,并持续10s,否则关灯
  if (soundState > 10) {           
      digitalWrite(ledPin, HIGH);  
      delay(10000);
  }else{
      digitalWrite(ledPin, LOW);
  }
}

在setup()中只设置了LED为输出,由于声音传感器模拟口都是输入设置,所以不需要设置了。

声音传感器是输入设备,所以需要读取对应模拟口IO的值。与读取数字口函数digitalRead(pin)类似,模拟口读取函数如下所示:

代码语言:javascript
复制
analogRead(pin)

这个函数用于从模拟引脚读值,pin是指连接的模拟引脚。Arduino的模拟引脚连接到一个了10位AD转换,输入0~5V的电压对应读到0~1023的数值,每个读到的数值对应的都是一个电压值。比如:ADC数值512代表电压2.5V。

为了方便调测,程序中添加了串口监视器功能,需要修改预设值的话,可以打开串口监视器,看看你需要的声音强度的值在什么范围,然后做相应调整就可以了。

begin()函数实现打开串口,设置通信波特率,原型如下所示:

代码语言:javascript
复制
void HardwareSerial::begin  (long speed)

speed:波特率数值

常用串口波特率包括:4800、9600、19200、38400、115200等。

print()函数和println()函数实现往串口发数据,只是print()函数没有换行功能而println()函数有换行。它们以ASCII码形式向串口发送数据。整数的每一数位将以ASCII码形式发送;浮点数同样以ASCII码形式发送,默认保留小数点后两位;字节型数据将以单个字符形式发送;字符和字符串会以其相应的形式发送。例如以下示例:

代码语言:javascript
复制
Serial.print(78) 发送 "78"
Serial.print(1.23456) 发送 "1.23"
Serial.print('N') 发送 "N"
Serial.print("Hello world.") 发送 "Hello world."

print()函数和println()函数还有可选的第二个参数用于指定数据的格式。允许的值为:BIN (binary二进制), OCT(octal八进制),DEC(decimal十进制),HEX(hexadecimal十六进制)。对于浮点数,该参数指定小数点的位数。例如以下示例:

代码语言:javascript
复制
Serial.print(78, BIN) gives "1001110"
Serial.print(78, OCT) gives "116"
Serial.print(78, DEC) gives "78"
Serial.print(78, HEX) gives "4E"
Serial.println(1.23456, 0) gives "1"
Serial.println(1.23456, 2) gives "1.23"
Serial.println(1.23456, 4) gives "1.2346"
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-11-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档