Arudio项目实战——002 Light Controls The Buzzer(蜂鸣器)
通过该项目实现蜂鸣器效果
Cblock源码
Cblock转Arduino源代码
//核心库
#include <Arduino.h>
//通信库
#include <Wire.h>
#include <SoftwareSerial.h>
//Me-motor模块库(蜂鸣器)
#include <MeMCore.h>
//定义电机9号和10号
MeDCMotor motor_9(9);
MeDCMotor motor_10(10);
//移动函数,方向和速度为参数
void move(int direction, int speed)
{
int leftSpeed = 0;
int rightSpeed = 0;
//根据方向参数设置左右电机速度
if(direction == 1){//前进
leftSpeed = speed;
rightSpeed = speed;
}else if(direction == 2){//后退
leftSpeed = -speed;
rightSpeed = -speed;
}else if(direction == 3){//左转
leftSpeed = -speed;
rightSpeed = speed;
}else if(direction == 4){//右转
leftSpeed = speed;
rightSpeed = -speed;
}
//让电机转动,M1为左电机,M2为右电机
motor_9.run((9)==M1?-(leftSpeed):(leftSpeed));//当电机9号为M1时,速度取反,否则不变
motor_10.run((10)==M1?-(rightSpeed):(rightSpeed));//当电机10号为M1时,速度取反,否则不变
}
//
double angle_rad = PI/180.0;//角度转弧度,PI为圆周率
double angle_deg = 180.0/PI;//弧度转角度,PI为圆周率
//定义光敏电阻6号
MeLightSensor lightsensor_6(6);//光敏电阻
MeBuzzer buzzer;//定义蜂鸣器
void setup(){
}
void loop(){
//如果光敏电阻值小于6
if((lightsensor_6.read()) < (6)){
//蜂鸣器发出3组声音
for(int __i__=0;__i__<3;++__i__)//
{
_delay(0);//延时0毫秒
buzzer.tone(392, 250);//发出声音,频率为392Hz,持续时间为250毫秒
delay(20);
}
for(int __i__=0;__i__<3;++__i__)
{
_delay(0);
buzzer.tone(392, 500);
delay(20);
}
for(int __i__=0;__i__<3;++__i__)
{
_delay(0);
buzzer.tone(392, 250);
delay(20);
}
}
_loop();
}
void _delay(float seconds){
long endTime = millis() + seconds * 1000;//结束时间=当前时间+延时时间*1000
while(millis() < endTime)_loop();//如果当前时间小于结束时间,则执行_loop()函数
}
void _loop(){
}
代码解释
首先,通过包含核心库Arduino.h和通信库Wire.h,SoftwareSerial.h来使程序使用Arduino的必备库,并通过Me-motor模块库MeMCore.h来使用Me-motor模块。
接着定义了两个电机,电机9号和10号,并使用MeDCMotor类来控制。在程序中定义了一个名为move的函数,它接受两个参数:方向和速度。这个函数的目的是控制电机的移动。
当这个函数被调用时,根据方向参数设置左右电机速度。之后,通过调用motor_9和motor_10对象的run方法来让电机转动。
之后,定义了角度之间的换算值,angle_rad = PI/180.0,angle_deg = 180.0/PI。在程序中定义了一个MeLightSensor类型的对象lightsensor_6, MeBuzzer类型的对象buzzer, 分别控制光敏电阻和蜂鸣器。
在主函数loop中,使用if语句检测光敏电阻值是否小于6,如果是,蜂鸣器发出3组声音,一组声音包括音调392,持续时间为250毫秒,20毫秒的延迟。
最后还有_loop()和_delay()两个函数,_loop()函数没有任何操作,它可能是留给用户自定义操作的。_delay()函数接收一个float类型的参数seconds, 这个函数会在millis()+ seconds * 1000 毫秒后结束,并在循环内部调用_loop()函数, 这段函数可能用于实现类似于普通的 delay()函数的功能。
代码优化
#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h
#include <MeMCore.h>
MeLightSensor lightsensor_6(6);
MeBuzzer buzzer;
void setup(){
}
void loop(){
if((lightsensor_6.read()) < (6)){
for(int __i__=0;__i__<3;++__i__)
{
delay(0);
buzzer.tone(392, 250);
delay(20);
}
for(int __i__=0;__i__<3;++__i__)
{
delay(0);
buzzer.tone(392, 500);
delay(20);
}
for(int __i__=0;__i__<3;++__i__)
{
delay(0);
buzzer.tone(392, 250);
delay(20);
}
}
优化解释
在Cblock转换为Arduino代码过程中,我们会发现有些用不到的机器组件,我们只是简单的实现一个蜂鸣器的效果,例如电机的应用,敏感电阻的使用都不会用到,所以对以上代码做出优化。这段代码中包含三个部分:首先是包含头文件,其次是定义变量和对象,最后是setup()和loop()函数。
首先是包含头文件,包括Arduino.h 是Arduino开发板所需的库,用于支持硬件和软件功能Wire.h 和 SoftwareSerial.h 分别用于支持硬件I2C和串口通信MeMCore.h 是Makeblock库中的Me系列模块所需的库,用于控制Me系列模块,如MeLightSensor和MeBuzzer。
然后是定义变量和对象,包括MeLightSensor lightsensor_6(6); 定义一个叫lightsensor_6的对象,使用的是6号端口。
MeBuzzer buzzer; 定义一个叫buzzer的对象,可以控制蜂鸣器最后是setup()和loop()函数setup()函数在程序启动时执行一次,一般用来初始化硬件和软件。此代码中setup()函数为空,不会执行任何操作loop()函数在setup()执行完后,会不断循环执行。
其中if语句中判断了灯传感器读数是否小于6,如果是,就会执行三个循环,每次循环会让蜂鸣器发出392Hz的音调,持续时间分别为250ms,500ms,250ms,每次循环之间间隔20ms。
总结: 这段代码是使灯传感器来检测环境光线强度,如果环境光线强度小于6,那么会让蜂鸣器播放出三次不同的音调。但是值得注意的是,这段代码有一些问题,在代码中会报一些错误,因为在setup()中没有对硬件进行初始化,如果要正确运行请在setup()中加入初始化代码。
void setup() {
Serial.begin(115200);
Wire.begin();
lightsensor_6.begin();
buzzer.begin();
}
- Serial.begin(115200) 初始化串口通信,设置波特率为115200bps。
- Wire.begin() 初始化I2C通信。
- lightsensor_6.begin() 初始化灯传感器。
- buzzer.begin() 初始化蜂鸣器。
添加上面这些初始化代码之后,程序就能正常工作了。