Arudio项目实战——002 Light Controls The Buzzer(蜂鸣器)

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() 初始化蜂鸣器。
    添加上面这些初始化代码之后,程序就能正常工作了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值