.. _Arduino:

Arduino
=======

.. _Arduino-IDE和驱动的安装:

Arduino IDE和驱动的安装
=======================

当我们拿到开发板时，首先我们要安装Arduino
IDE和驱动，相关文件我们可以在官网上找到，以下链接是包含各种系统、各种版本的Arduino
IDE和驱动任你选择。

https://www.arduino.cc/en/Main/OldSoftwareReleases#1.5.x

下面我们介绍下Arduino-1.5.6 版本IDE在Windows系统的安装方法。

下载下来的文件是一个arduino-1.5.6-r2-windows.zip的压缩文件夹，解压出来到硬盘。

双击Arduino-1.5.6 .exe文件

.. image:: media/f5f98943a74471640eefe95e3cccd0ee.png

然后

.. image:: media/44384a228758644aca47e983417e0079.png

然后

.. image:: media/704e73c99bcc5eed53d0ab210107b5e1.png

等待安装完成.点击close，安装完成。

.. image:: media/742a2a6ad75dbc8f8d55cc25c2dc61ca.png

1.5.6版本安装后的样子。

.. image:: media/4baf5095962e49c1f3ebeb6c2da823f0.png

接下来是开发板驱动的安装，这次我们安装的是Keyes UNO
R3开发板的驱动，Keyes 2560
R3开发板安装驱动方法和这个类似，驱动文件可以用同一个文件。

不同的系统，安装驱动的方法也有一些细小的区别，下面我们介绍在WIN
7系统安装驱动的方法。

第一次Keyes UNO
R3开发板连接电脑时，点击计算机--属性--设备管理器，显示如下图。

.. image:: media/ef888e8d5fad0b30e4da671933f8842c.png

点击 Unknown device 安装驱动，如下图。

.. image:: media/231c0059b83eb424215dbc17edb21afb.png

进入下图，选择

.. image:: media/1b36a09374634af82cf432f86cb8843f.png

找到Arduino安装位置的drivers文件夹

.. image:: media/19f226835eac31a0ed12516dcefcfc53.png

点击“Next”，今天下图选择，开始安装驱动

|image1|\ |image2|

安装驱动完成，出现下图点击Close。

这样驱动就装好了。点击计算机--属性--设备管理器，我们可看见如下图。

.. image:: media/af9806622ecf816c62f7597448a3cc5f.png

.. _Arduino-IDE的使用方法:

Arduino IDE的使用方法
=====================

Keyes UNO
R3开发板的USB驱动安装成功之后，我们可以在Windows设备管理器中找到相应的串口。

下面示范第一个程序的烧写，串口监视器中显示“Hello World！”。

测试代码为：

::

   int val;
   int ledpin=13; 
   void setup()
   {
       Serial.begin(9600);
       pinMode(ledpin,OUTPUT);
   }
   void loop() 
   {
       val=Serial.read();
       if(val=='R')
       {
           digitalWrite(ledpin,HIGH);
           delay(500);
           digitalWrite(ledpin,LOW);
           delay(500);
           Serial.println("Hello World!");
       }
   }

我们打开Arduino 的软件，编写一段程序让Keyes UNO
R3开发板接受到我们发的指令就显示“Hello
World！”字符串；我们再借用一下Keyes UNO R3 开发板上的
D13的指示灯，让Keyes UNO
R3开发板接受到指令时指示灯闪烁一下，再显示“Hello World！”。

打开Arduino 的软件，设置板，如下。

.. image:: media/43d9c16b238cfa52845c3a1b553cc630.png

设置COM端口，如下

.. image:: media/025e24eacb26620c8831c8a3571412f6.png

点击\ |image3|\ 编译程序，检查程序是否错误；点击\ |image4|\ 上传程序；Keyes
UNO R3 开发板设置OK后右下脚显示如下图，和设备管理器中显示一致。

.. image:: media/add2f4f32678fe555861ae1763488afd.png

上传成功，输入R，点击发送，Keyes UNO R3 开发板上的
D13的指示灯闪烁一次，串口监视器中显示 Hello World! 如下图

.. image:: media/fa8f2de13c41710b9dbbfde0833eca74.png

那么恭喜你，你的第一个程序已经成功了！！！

实验课程
========

.. _实验一-草帽LED模块:

实验一 草帽LED模块
------------------

实验说明

本实验我们主要用来检测草帽LED模块。实验中我们将草帽LED模块的信号端接在开发板数字口3上，它同时也是PWM口。我们用两个实验检测，一个是让草帽LED进行闪烁实验;另一个是让PWM口控制草帽LED的亮度，让草帽LED逐渐变亮和逐渐变暗，模拟人体呼吸的现象。

实验器材

开发板*1

USB线*1

草帽LED模块*1

杜邦线若干

.. image:: media/ef8fc4fed8c964bfd81cbdb2fce41285.jpeg

测试代码

代码A:

::

   int led = 3; //定义数字口3

   void setup()

   {

     pinMode(led, OUTPUT);     //设置led为输出

   }

   void loop()

   {

     digitalWrite(led, HIGH);   //开启led

     delay(1000); //延迟1秒

     digitalWrite(led, LOW);    //关闭led

     delay(1000);//延迟1秒

   }

代码B:

::

   int ledPin = 3; // 定义数字口3

   void setup()

   {

       pinMode(ledPin, OUTPUT);// 将ledPin设置为输出

   }

   void loop()

   {

       for (int a=0; a<=255;a++)// 设置使LED逐渐变亮

       {

           analogWrite(ledPin,a); //开启led,调节亮度，范围是0-255，在255时led最亮

           delay(10); // 延迟0.01秒

       }

       for (int a=255; a>=0;a--) // 设置使LED逐渐变暗

       {

           analogWrite(ledPin,a); //开启led,调节亮度，范围是0-255，在255时led最亮

           delay(10); // 延迟0.01秒

       }

           delay(1000);// 延迟1秒

   }

测试结果

上传完代码A，上电后，我们就可以看到草帽LED不停闪烁，间隔大约为1秒。上传完代码B，上电后，我们就可以看到草帽LED先逐渐变亮，后逐渐变暗，循环交替。

实验二 干簧管模块
-----------------

实验说明

本实验我们主要用来检测干簧管模块。该模块主要由干簧管组成，模块接上电源后，信号端输出为高电平，传感器上LED变暗；当给模块施加一个磁场时信号端输出为低电平，传感器上LED变亮。实验中我们用到了Arduino
UNO 板上自带的D13 的指示灯，通过传感器，控制D13 的指示灯的亮灭。

实验器材

开发板*1

USB线*1

干簧管模块*1

杜邦线若干

接线图

.. image:: media/befc72ced581329f53601ec57343858a.jpeg

测试代码

::

   int Led=13;//定义数字口13

   int buttonpin=3; //定义数字口3

   int val;//定义数字变量val

   void setup()

   {

       pinMode(Led,OUTPUT);//将Led设置为输出

       pinMode(buttonpin,INPUT);//将buttonpin设置为输入

   }

   void loop()

   {

       val=digitalRead(buttonpin);// 读取数字口3的数值，并赋值给val

       if(val==LOW)//当val为高电平时

       {

           digitalWrite(Led,HIGH); //LED亮起

       }

       else

       {

           digitalWrite(Led,LOW); //LED熄灭

       }

   }

测试结果

按照上图接好线，上传好代码，上电后，Arduino UNO 板上的
D13的指示灯熄灭，模块上D1灯熄灭；当有磁铁靠近模块时， Arduino UNO
板上的D13 的指示灯亮起，模块上D1灯亮。

.. _实验三-双色LED模块:

实验三 双色LED模块
------------------

实验说明

本实验我们主要用来检测双色LED模块。双色LED模块采用共阴驱动，发光颜色为红色和绿色，通过两个PWM口我们可以调节显示红色和绿色的比例，组合成其他颜色。实验中我们把双色LED模块的信号端接在数字口5和6上，它同时也是PWM口。实验中我们让双色LED模块循环显示红色和绿色。

实验器材

开发板*1

USB线*1

双色LED模块*1

杜邦线若干

接线图

.. image:: media/43365258386393f2c91f7598984cd262.jpeg

测试代码

::

   int redPin = 5; // R 红色LED 控制引脚 连接到Arduino的 5脚

   int greenPin = 6; // G绿色LED 控制引脚 连接到Arduino的6脚

   void setup()

   {

       pinMode(redPin, OUTPUT); //设置redPin对应的管脚5为输出

       pinMode(greenPin, OUTPUT); //设置greenPin,对应的管脚6为输出

   }

   void loop()

   {

       // Basic colors:

       color(255, 0); // 红色亮

       delay(1000); // 延时一秒

       color(0,255); //绿色亮

       delay(1000); //延时一秒

   }

   void color (unsigned char red, unsigned char green) //颜色控制函数

   {

       analogWrite(redPin, red);

       analogWrite(greenPin,green);

   }

测试结果

上传完代码，上电后，我们就可以看到双色LED模块上LED显示红色1秒，绿色1秒，循环交替。

实验四 手指测心跳模块
---------------------

实验说明

本实验我们主要用来检测手指测心跳模块。该模块主要包含红外发射器和光敏接收器组成。红外发射器在手指的一面，光敏接收器在手指的另一面；光敏接收器用来获取发

射的光通量；当血压脉动通过手指时，光敏接收器的电阻会用微小的变化。实验中将传感器的信号端接到开发板的模拟口A0，在Arduino
IDE的串口监视器显示相对应的数值。实验器材

开发板*1

USB线*1

手指测心跳模块*1

杜邦线若干

接线图

.. image:: media/d6caa742df229e0501876d01692e66d5.jpeg

测试代码

::

   int ledPin = 13;                        // LED连接的引脚号

   int sensorPin = 0;                       // 传感器连接的模拟引脚号

   double alpha = 0.75;                     // 滤波系数，用于低通滤波

   int period = 20;                         // 采样周期(毫秒)

   double change = 0.0;                     // 变化量变量(未使用)

   void setup()                             // 初始化函数
   {
       pinMode(ledPin, OUTPUT);             // 设置LED引脚为输出模式
       Serial.begin(115200);                // 初始化串口通信，波特率115200
   }

   void loop()                              // 主循环函数
   {
       static double oldValue = 0;          // 存储上一次的滤波值
       static double oldChange = 0;         // 存储上一次的变化量(未使用)
       
       int rawValue = analogRead(sensorPin); // 读取传感器原始值
       
       double value = alpha * oldValue + (1 - alpha) * rawValue;  // 计算低通滤波后的值
       
       Serial.print(rawValue);              // 打印原始值
       Serial.print(",");                   // 打印分隔逗号
       Serial.println(value);               // 打印滤波后的值并换行
       
       oldValue = value;                    // 保存当前滤波值供下次使用
       delay(period);                       // 等待一个采样周期
   }

测试结果

按照上图接好线，上传好代码，上电后，打开串口监视器，串口监视器显示相对应的数值，并复制到excel上，生成对应图片，如下图。

|image5|\ |image6|

.. image:: media/31f33301e17943c488dacb792d6f7548.png

.. _实验五-贴片RGB模块:

实验五 贴片RGB模块
------------------

实验说明

| 本实验我们主要用来检测贴片RGB模块。本模块由主要一个贴片全彩LED制成，通过
| R、 G、
| B三个引脚的PWM电压输入可以调节三种基色（红/蓝/绿）的强度从而实现全彩的混色效果。我们用Arduino对模块的控制可实现酷炫的灯光效果。实验中我们让贴片RGB模块循环显示不同颜色。

实验器材

开发板*1

USB线*1

贴片RGB模块*1

杜邦线若干

接线图

.. image:: media/3b7f76ac664f47023087aa162b96ddb8.jpeg

测试代码

::

   int redPin = 6;   // R 红色LED 控制引脚 连接到Arduino的 6脚
   int greenPin = 5; // G绿色LED 控制引脚 连接到Arduino的5脚
   int bluePin = 3;  // B蓝色LED 控制引脚 连接到Arduino的3脚

   void setup()
   {
       pinMode(redPin, OUTPUT);   // 设置redPin对应的管脚6为输出
       pinMode(greenPin, OUTPUT); // 设置greenPin对应的管脚5为输出
       pinMode(bluePin, OUTPUT);  // 设置bluePin对应的管脚3为输出
   }

   void loop()
   {
       // Basic colors:
       color(255, 0, 0);     // 红色亮
       delay(1000);          // 延时一秒
       color(0, 255, 0);     // 绿色亮
       delay(1000);          // 延时一秒
       color(0, 0, 255);     // 蓝色灯亮
       delay(1000);          // 延时一秒

       // Example blended colors:
       color(255, 255, 0);   // 黄色亮
       delay(1000);          // 延时一秒
       color(128, 0, 255);   // 紫色亮
       delay(1000);          // 延时一秒
       color(255, 255, 255); // 白色亮
       delay(1000);          // 延时一秒
       color(0, 0, 0);       // 关闭led
       delay(1000);          // 延时一秒
   }

   void color(unsigned char red, unsigned char green, unsigned char blue) // 颜色控制函数
   {
       analogWrite(redPin, 255 - red);
       analogWrite(greenPin, 255 - green);
       analogWrite(bluePin, 255 - blue);
   }

测试结果

上传完代码，上电后，RGB模块会陆续显示红色1秒，绿色1秒，蓝色1秒，黄色1秒，紫色1秒，白色1秒，停止显示1秒，然后循环交替。

实验六 有源蜂鸣器模块
---------------------

实验说明

本实验我们主要用来检测有源蜂鸣器模块。它主要由有源蜂鸣器组成，是一种一体化结构的电子讯响器，采用直流电源供电。模块接上电源后，当我们直接给信号端输入个高电平信号后，蜂鸣器响起。实验中我们让有源蜂鸣器模块循环响起，关闭。

实验器材

开发板*1

USB线*1

有源蜂鸣器模块*1

杜邦线若干

接线图

.. image:: media/41be77ba1c82ed0db6aacfadd51680e4.jpeg

测试代码

::

   int buzzPin = 3;    //定义数字口3

    void setup() 

    {       

     pinMode(buzzPin, OUTPUT);  //将buzzPin设置为输出

    }

    void loop()                    

   {

     digitalWrite(buzzPin, HIGH);//有源蜂鸣器响起

     delay(2000); //延迟2秒

     digitalWrite(buzzPin, LOW); //有源蜂鸣器关闭

     delay(2000);  //延迟2秒     

   }

测试结果

有源蜂鸣器只需要有个高电平电压蜂鸣器就响起。上传好代码，连接好线，上电后，有源蜂鸣器响2秒，静音2秒，循环交替。

实验七 无源蜂鸣器模块
---------------------

实验说明

本实验我们主要用来检测草无源蜂鸣器模块。蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。无源蜂鸣器内部不带振荡源，直流信号无法令其鸣叫，须用方波驱动。

实验中我们将无源蜂鸣器模块的信号端接在开发板的数字口3上，通过开发板控制数字口3输出方波，从而驱动无源蜂鸣器。我们用两个实验检测，一个是让数字口3循环输出两种频率的方波，驱动无源蜂鸣器响起;另一个是我们让数字口3输出各种频率的方波，并且设定好节奏，从而让无源蜂鸣器播放《欢乐颂》的曲子。

实验器材

开发板*1

USB线*1

无源蜂鸣器模块*1

杜邦线若干

接线图

.. image:: media/81baffae5344681be2a5ab52f983a279.jpeg

测试代码

代码A:

::

   int buzzer=3; //定义数字口3

   void setup()

   {

       pinMode(buzzer,OUTPUT);//将buzzer设置为输出

   }

   void loop()

   {

       unsigned char i,j;//定义变量i，j

       while(1)

       {

           for(i=0;i\<80;i++)// 输出一个频率的声音

           {

               digitalWrite(buzzer,HIGH);

               delay(1);//延迟1ms

               digitalWrite(buzzer,LOW);

               delay(1);//延迟1ms

           }

           for(i=0;i\<100;i++)// 输出另一个频率的声音

           {

               digitalWrite(buzzer,HIGH);

               delay(2);//延迟2ms

               digitalWrite(buzzer,LOW);

               delay(2);//延迟2ms

           }

        }

   }

代码B:

::

   #define D0 -1

   #define D1 262

   #define D2 293

   #define D3 329

   #define D4 349

   #define D5 392

   #define D6 440

   #define D7 494

   #define M1 523

   #define M2 586

   #define M3 658

   #define M4 697

   #define M5 783

   #define M6 879

   #define M7 987

   #define H1 1045

   #define H2 1171

   #define H3 1316

   #define H4 1393

   #define H5 1563

   #define H6 1755

   #define H7 1971

   //列出全部D调的频率

   #define WHOLE 1

   #define HALF 0.5

   #define QUARTER 0.25

   #define EIGHTH 0.25

   #define SIXTEENTH 0.625

   //列出所有节拍

   int tune[]= //根据简谱列出各频率

   {

       M3,M3,M4,M5,

       M5,M4,M3,M2,

       M1,M1,M2,M3,

       M3,M2,M2,

       M3,M3,M4,M5,

       M5,M4,M3,M2,

       M1,M1,M2,M3,

       M2,M1,M1,

       M2,M2,M3,M1,

       M2,M3,M4,M3,M1,

       M2,M3,M4,M3,M2,

       M1,M2,D5,D0,

       M3,M3,M4,M5,

       M5,M4,M3,M4,M2,

       M1,M1,M2,M3,

       M2,M1,M1

   };

   float durt[]= //根据简谱列出各节拍

   {

       1,1,1,1,

       1,1,1,1,

       1,1,1,1,

       1+0.5,0.5,1+1,

       1,1,1,1,

       1,1,1,1,

       1,1,1,1,

       1+0.5,0.5,1+1,

       1,1,1,1,

       1,0.5,0.5,1,1,

       1,0.5,0.5,1,1,

       1,1,1,1,

       1,1,1,1,

       1,1,1,0.5,0.5,

       1,1,1,1,

       1+0.5,0.5,1+1,

   };

   int length;

   int tonepin=3; //得用3号接口

   void setup()

   {

           pinMode(tonepin,OUTPUT);

           length=sizeof(tune)/sizeof(tune\[0\]); //计算长度

   }

   void loop()

   {

       for(int x=0;x\<length;x++)

       {

           tone(tonepin,tune\[x\]);

           delay(500\*durt\[x\]);
           //这里用来根据节拍调节延时，500这个指数可以自己调整，在该音乐中，我发现用500比较合适。

           noTone(tonepin);

       }

       delay(2000);

   }

测试结果

上传完代码A，上电后，无源蜂鸣器会发出两种不同的声音，两种声音循环交替。上传完代码B，上电后，无源蜂鸣器会想响起《欢乐颂》的曲子。

实验八 旋转编码器模块
---------------------

实验说明

本实验我们主要用来检测旋转编码器模块。它主要由旋转编码器组成，它可通过旋转可以计数正方向和反方向转动过程中输出脉冲的次数，这种转动计数是没有限制的，复位到初始状态，即从0开始计数。实验中我们利用一个旋转编码器模块控制两个草帽LED的亮灭。

实验器材

开发板*1

USB线*1

旋转编码器模块*1

草帽LED模块*2

杜邦线若干

接线图

.. image:: media/ab08793993dc185393f1fc33dca7dc91.jpeg

测试代码

::

   const int interruptA = 0; //中断0就是在数字口2

   const int interruptB = 1;//中断1就是在数字口3

   int CLK = 2; // 定义数字口2

   int DAT = 3; // 定义数字口3

   int BUTTON = 4; // 定义数字口4

   int LED1 = 5; // 定义数字口5

   int LED2 = 6; // 定义数字口6

   int COUNT = 0;//设置数字变量COUNT为0

   void setup()

   {

       attachInterrupt(interruptA, RoteStateChanged, FALLING);

       // 当数字口2由高电平变为低电平时，触发中断。

       pinMode(CLK, INPUT);//设置CLK为输入

       digitalWrite(2, HIGH); // 设置数字口2为高电平

       pinMode(DAT, INPUT); //设置DAT为输入

       digitalWrite(3, HIGH); //设置数字口3为高电平

       pinMode(BUTTON, INPUT); //设置BUTTON为输入

       digitalWrite(4, HIGH); //设置数字口4为高电平

       pinMode(LED1, OUTPUT);//设置LED1为输出

       pinMode(LED2, OUTPUT);//设置LED1为输出

       Serial.begin(9600); //设置波特率

   }

   void loop()

   {

       if (digitalRead(BUTTON)==LOW)//当数字口4为低电平时

       {

           COUNT = 0; //设置数字变量COUNT为0

           Serial.println("STOP COUNT = 0");//显示对于内容

           digitalWrite(LED1, LOW);//LED1变暗

           digitalWrite(LED2, LOW);//LED2变暗

           delay (2000);//延迟2S

       }

       Serial.println(COUNT);//显示COUNT数据

       }
       
   void RoteStateChanged() //当数字口2由高电平变为低电平时

   {

       if (digitalRead(DAT)==HIGH) // 当数字口3为高电平时

       {

           COUNT++;//数字变量COUNT加1

           digitalWrite(LED1, HIGH);//LED1亮起

           digitalWrite(LED2, LOW);//LED2变暗

           delay(200);//延迟0.2S

       }

       else

       {

           COUNT--;//数字变量COUNT减1

           digitalWrite(LED2, HIGH);//LED2亮起

           digitalWrite(LED1, LOW);//LED1变暗

           delay(200);//延迟0.2S

       }

   }

测试结果

上传好代码，连接好线，上电后，我们可以通过旋转旋转编码器，可以随意控制两个草帽LED的亮灭。

实验九 可调电位器模块
---------------------

实验说明

本实验我们主要用来检测可调电位器模块。它主要由可调电位器组成，模块上电后，我们只需旋转模块上电位器就可以调节模拟输入数值。实验中将模块的S端接到开发板的模拟口A0，在Arduino
IDE的串口监视器上可看到对应的模拟值显示。

实验器材

开发板*1

USB线*1

可调电位器模块*1

杜邦线若干

接线图

.. image:: media/2b5d3156ac58229a20b1c30a2c854a3c.jpeg

测试代码

::

   int sensorPin =A0 ; //定义模拟口A0

   int value = 0; //设置value为0

   void setup()

   {

       Serial.begin(9600);//设置波特率

   }

   void loop()

   {

       value = analogRead(sensorPin); //将value设置为读取到的A0的数值

       Serial.println(value, DEC); //显示value数值，并自动换行

       delay(100); //延迟0.1秒
       
   }

测试结果

| 按照上图接好线，烧录好代码，上电后，我们可以在软件的串口监视器中看到模拟口A0模拟值，旋转旋钮，数据变化，变化范围在
| 0-1023，如下图。

.. image:: media/8517383472ca20d112b9ccc138661cd5.png

.. _实验十-5V单路继电器模块:

实验十 5V单路继电器模块
-----------------------

实验说明

| 本实验我们主要用来检测5V
| 单路继电器模块。这个继电器模块是高电平有效，我们把继电器模块的信号端接在数字口3。实验中我们通过开发板控制数字口3，控制模块上继电器循环开启和关闭。

实验器材

开发板*1

USB线*1

5V 单路继电器模块*1

杜邦线若干

接线图

.. image:: media/e417a8a7130786b73f84e931b65b8e91.jpeg

测试代码

::

   int Relay = 3; //定义数字口3

   void setup()

   {

       pinMode(Relay, OUTPUT); //将Relay设置为输出

   }

   void loop()

   {

       digitalWrite(Relay, HIGH); //打开继电器

       delay(2000); //延时2秒

       digitalWrite(Relay, LOW); //关闭继电器

       delay(2000); //延时2秒

   }

测试结果

按照上图接好线，上传好代码，上电后，继电器开启（ON端连通，NC断开）2秒，停止（ON端断开，NC端连通）2秒，循环交替，开启时继电器上D2灯亮起。

.. _实验十一-插件RGB模块:

实验十一 插件RGB模块
--------------------

实验说明

| 本实验我们主要用来检测插件RGB模块。本模块由主要一个插件全彩LED制成，通过
| R、 G、
| B三个引脚的PWM电压输入可以调节三种基色（红/蓝/绿）的强度从而实现全彩的混色效果。我们用Arduino对模块的控制可实现酷炫的灯光效果。实验中我们让插件RGB模块循环显示不同颜色。

实验器材

开发板*1

USB线*1

插件RGB模块*1

杜邦线若干

接线图

.. image:: media/b9cedab4e47f7b6a89b2cb7fcb0a3785.jpeg

测试代码

::

   int redPin = 6; // R 红色LED 控制引脚 连接到Arduino的 6脚

   int greenPin = 5; // G绿色LED 控制引脚 连接到Arduino的5脚

   int bluePin = 3; // B蓝色LED 控制引脚 连接到Arduino的3脚

   void setup()

   {

       pinMode(redPin, OUTPUT); //设置redPin对应的管脚6为输出

       pinMode(greenPin, OUTPUT); //设置greenPin,对应的管脚5为输出

       pinMode(bluePin, OUTPUT); //设置bluePin对应的管脚3为输出

   }

   void loop() // run over and over again

   {

       // Basic colors:

       color(255, 0, 0); // 红色亮

       delay(1000); // 延时一秒

       color(0,255, 0); //绿色亮

       delay(1000); //延时一秒

       color(0, 0, 255); // 蓝色灯亮

       delay(1000); //延时一秒

       // Example blended colors:

       color(255,255,0); // 黄色亮

       delay(1000); //延时一秒

       color(128,0,255); // 紫色亮

       delay(1000); //延时一秒

       color(255,255,255); // 白色亮

       delay(1000); //延时一秒

       color(0,0,0); // 关闭led

       delay(1000); //延时一秒

   }

   void color (unsigned char red, unsigned char green, unsigned char blue) //颜色控制函数

   {

       analogWrite(redPin, red);

       analogWrite(greenPin,green);

       analogWrite(bluePin, blue);

   }

测试结果

上传完代码，上电后，RGB模块会陆续显示红色1秒，绿色1秒，蓝色1秒，黄色1秒，紫色1秒，白色1秒，停止显示1秒，然后循环交替。

实验十二 热敏电阻传感器
-----------------------

实验说明

| 本实验我们主要用来检测热敏电阻传感器。它是基于热敏电阻的工作原理，能够实时感知周边环境温度的变化，我们把数据送到
| Arduino的模拟口，接来下我们只要经过简单的编程就能将传感器输出的数据转换为摄氏温度值，并加以显示，借此广泛应用于园艺、家庭警报系统等装置中。

实验中将传感器的信号端接到开发板的模拟口A0，在Arduino
IDE的串口监视器上可看到当前环境中的温度值。

实验器材

开发板*1

USB线*1

热敏电阻传感器*1

杜邦线若干

接线图

.. image:: media/ae94a6abfecf96fb43f51e263b44e524.jpeg

测试代码

::

   #include <math.h>

   double Thermister(int RawADC)
   {

       double Temp;

       Temp = log(((10240000/RawADC) - 10000));

       Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp *
       Temp ))* Temp );

       Temp = Temp - 273.15; // Convert Kelvin to Celcius

       return Temp;

   }

   void setup()

   {

       Serial.begin(9600); //设置波特率

   }

   void loop()

   {

       Serial.print(Thermister(analogRead(0))); // 显示计算的温度值

       Serial.println("c"); // 显示c，并自动换行

       delay(500); // 延迟0.5S

   }

测试结果

按照上图接好线，上传好代码，上电后，我们可以在软件的串口监视器中看到当前环境中的温度值，如下图。

.. image:: media/0e3dfebc6135f2a12e5154bd459c98ed.png

实验十三 按键传感器
-------------------

实验说明

本实验我们主要用来检测按键传感器。当我们按下按键时传感器信号端输出低电平信号，释放按键时传感器信号端保持高电平。实验中我们用到了Arduino
UNO 板上自带的D13 的指示灯，通过传感器，控制D13 的指示灯的亮灭。

实验器材

开发板*1

USB线*1

按键传感器*1

杜邦线若干

接线图

.. image:: media/2fcec7e45224cf0df6561905466d4f71.jpeg

测试代码

::

   int ledPin = 13; //定义数字口13

   int inputPin = 3; //定义数字口3

   void setup()

   {

       pinMode(ledPin, OUTPUT); //将ledPin设置为输出

       pinMode(inputPin, INPUT); //将inputPin设置为输入

   }

   void loop()

   {

       int val = digitalRead(inputPin);

       //设置数字变量val，读取到数字口3的数值，并赋值给 val

       if (val == LOW) //当val为低电平时，LED亮起

       {

           digitalWrite(ledPin, HIGH); // LED亮起

       }

       else

       {

           digitalWrite(ledPin, LOW); // LED变暗

       }

   }

测试结果

按照上图接好线，上传好代码，上电后，按下传感器按键后， Arduino UNO板上的
D13 的指示灯亮起，释放传感器按键后， Arduino UNO 板上的
D13的指示灯熄灭。

实验十四 魔术光杯传感器
-----------------------

实验说明

本实验我们主要用来检测魔术光杯传感器。它是一款可以和Arduino互动的传感器，原理是利用PWM调光的原理，两个传感器的亮度发生变化。实验中滚珠开关提供数字信号，触发PWM的调节，通过程序的设计，我们就能看到类似于两组装满光的杯子倒来倒去的效果了。

实验器材

开发板*1

USB线*1

魔术光杯传感器*2

杜邦线若干

接线图

.. image:: media/24890b602429e8d37795641c6137bf9d.jpeg

测试代码

::

   int LedPinA = 5; //定义数字口5

   int LedPinB = 6; //定义数字口6

   int ButtonPinA = 7;//定义数字口7

   int ButtonPinB = 4;//定义数字口4

   int buttonStateA = 0;

   int buttonStateB = 0;

   int brightnessA = 0;

   int brightnessB= 255;

   void setup()

   {

       Serial.begin(9600);//设置波特率

       pinMode(LedPinA, OUTPUT);//数字口5设置为输出

       pinMode(LedPinB, OUTPUT);//数字口6设置为输出

       pinMode(ButtonPinA, INPUT);//数字口7设置为输入

       pinMode(ButtonPinB, INPUT);//数字口4设置为输入

   }

   void loop()

   {

       buttonStateA =digitalRead(ButtonPinA);//读取数字口7的数值赋值给buttonStateA

       if (buttonStateA == HIGH && brightnessA != 255)

       //当buttonStateA为高电平且brightnessA不为255

       {

           brightnessA ++;//brightnessA加1

           delay(10);//延迟0.01S

       }

       if (buttonStateA == LOW && brightnessA != 0)

       //当buttonStateA为低电平且brightnessA不为0

       {

               brightnessA --;//brightnessA减1

               delay(10);//延迟0.01S

       }

       analogWrite(LedPinB, brightnessA);//将brightnessA赋值为给PWM口6

       Serial.print(brightnessA);//显示brightnessA数值

       Serial.print(" ");

       buttonStateB =
       digitalRead(ButtonPinB);//读取数字口4的数值赋值给buttonStateB

       if (buttonStateB == HIGH && brightnessB != 0)

       //当buttonStateB为高电平且brightnessA不为0

       {

           brightnessB --;//brightnessB减1

           delay(10);//延迟0.01S

       }

       if (buttonStateB == LOW && brightnessB != 255)

       //当buttonStateB为低电平且brightnessA不为255

       {

           brightnessB++;//brightnessB加1

           delay(10);//延迟0.01S

       }

       analogWrite(LedPinA, brightnessB); //将brightnessB赋值为给PWM口5

       Serial.println(brightnessB);//显示brightnessB数值，并自动换行

       delay(5);

   }

测试结果

按照上图接好线，烧录好代码，上电后，将两个魔术光杯传感器同时倾斜一边，一个魔术光杯上的LED逐渐变暗，同时另一个逐渐变亮，最终一个LED完全熄灭，一个LED最亮；在串口监视器中看到对应具体数值变化，如下图。当倾斜另一边中，现象一样，方向相反。

.. image:: media/ac18c7cef405ca73aaa0302c56ef4fcb.png

.. _实验十五-DHT11温湿度传感器:

实验十五 DHT11温湿度传感器
--------------------------

实验说明

本实验我们主要用来检测DHT11温湿度传感器。它是一款含有已校准数字信号输出的温湿度复合传感器，它应用专用的数字模块采集技术和温湿度传感技术，确保产品具有极高的可靠性和卓越的长期稳定性。

实验中将传感器的信号端接到开发板的数字口3，在Arduino
IDE的串口监视器上可看到当前环境中的温度值和湿度值。

实验器材

开发板*1

USB线*1

DHT11温湿度传感器*1

杜邦线若干

接线图

.. image:: media/da17c1dfcaa509b4967232b12d24ccb4.jpeg

测试代码

::

   #include <dht11.h>                      // 包含DHT11温湿度传感器库

   dht11 DHT;                              // 创建DHT11传感器对象

   #define DHT11_PIN 3                     // 定义DHT11数据引脚为数字引脚3

   void setup(){                           // 初始化函数
       Serial.begin(9600);                 // 初始化串口通信，波特率9600
       Serial.println("DHT TEST PROGRAM"); // 打印程序标题
       Serial.print("LIBRARY VERSION: ");  // 打印库版本提示
       Serial.println(DHT11LIB_VERSION);   // 打印实际库版本号
       Serial.println();                   // 打印空行
       Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)"); // 打印数据表头
   }

   void loop(){                            // 主循环函数
       int chk;                            // 用于存储传感器状态码
       
       Serial.print("DHT11, \t");          // 打印传感器类型
       
       chk = DHT.read(DHT11_PIN);          // 读取传感器数据
       
       switch (chk){                       // 根据状态码进行判断
           case DHTLIB_OK:                 // 读取成功
               Serial.print("OK,\t");      // 打印正常状态
               break;
           case DHTLIB_ERROR_CHECKSUM:     // 校验和错误
               Serial.print("Checksum error,\t"); // 打印校验错误
               break;
           case DHTLIB_ERROR_TIMEOUT:      // 超时错误
               Serial.print("Time out error,\t"); // 打印超时错误
               break;
           default:                        // 其他未知错误
               Serial.print("Unknown error,\t"); // 打印未知错误
               break;
       }
       
       // 显示数据
       Serial.print(DHT.humidity,1);       // 打印湿度值，保留1位小数
       Serial.print(",\t");                // 打印制表符分隔
       Serial.println(DHT.temperature,1);  // 打印温度值，保留1位小数并换行
       
       delay(1000);                        // 延时1秒
   }

库文件下载地址

https://pan.baidu.com/s/1eSlMYD8

测试结果

按照上图接好线，上传好代码，上电后，我们可在软件串口监视器中看到当前环境中的温度值和湿度值，如下图。

.. image:: media/1ccd990a786881c3e386d4138c00ccef.png

实验十六 光敏电阻传感器
-----------------------

实验说明

本实验我们主要用来检测光敏电阻传感器。这个传感器对环境光线最敏感，一般用来检测周围环境的光线的亮度，触发单片机或继电器模块等。实验中将传感器的信号端接到开发板的模拟口A0，在Arduino
IDE的串口监视器上可看到对应的模拟值输出。

实验器材

开发板*1

USB线*1

光敏电阻传感器*1

杜邦线若干

接线图

.. image:: media/139c18b5b1ad5808ed7d5b471b611dde.jpeg

测试代码

::

   int sensorPin =A0 ; //定义模拟口A0

   int value = 0; //设置value为0

   void setup()

   {

       Serial.begin(9600); //设置波特率

   }

   void loop()

   {

       value = analogRead(sensorPin); //将value设置为读取到的A0的数值

       Serial.println(value, DEC); //显示value数值，并自动换行

       delay(200); //延迟0.2秒

   }

测试结果

按照上图接好线，上传好代码，上电后，我们可以在软件的串口监视器中看到代表当前光线强弱的模拟值，光线越强，数值越大，如下图。

.. image:: media/7fa8abc404c49f517a22e89caebbe76c.png

实验十七 倾斜模块传感器
-----------------------

实验说明

本实验我们主要用来检测倾斜模块传感器。这个传感器主要是利用滚珠在开关内随不同倾斜角度的发化，达到触发电路的目的；可用于倾斜检测、报警器制作或者其他检测。实验中我们用到了Arduino
UNO 板上自带的D13 的指示灯，通过传感器，控制D13 的指示灯的亮灭。

实验器材

开发板*1

USB线*1

倾斜模块传感器*1

杜邦线若干

接线图

.. image:: media/454f8df722c6e83ae9baaab6ce1a873f.jpeg

测试代码

::

   int ledPin = 13; //定义数字口13

   int switcher = 3; // 定义数字口3

   void setup()

   {

       pinMode(ledPin, OUTPUT); // 将ledPin设置为输出

       pinMode(switcher, INPUT); //将switcher设置为输入

   }

   void loop()

   {

       if(digitalRead(switcher)==HIGH) //当读取数字口3，并发现为高电平

       {

           digitalWrite(ledPin, HIGH); // LED亮起

       }

       else

       {

           digitalWrite(ledPin, LOW); // LED变暗

       }

   }

测试结果

按照上图接好线，上传好代码，上电后，倾斜一方时 Arduino UNO 板上的
D13的指示灯亮，数字倾斜模块上D1灯灭；倾斜另一方时 Arduino UNO 板上的
D13的指示灯灭，数字倾斜模块上D1灯亮。

实验十八 光折断传感器
---------------------

实验说明

| 本实验我们主要用来检测光折断传感器。它主要由光遮断器组成，它属于对射遮断式光电开关光学开关传感器
| 。实验中我们用到了Arduino UNO 板上自带的D13
| 的指示灯，通过传感器，控制D13 的指示灯的亮灭。

实验器材

开发板*1

USB线*1

光折断传感器*1

杜邦线若干

接线图

.. image:: media/e2d97b43d00d2d91aa8a5f730e2fc028.jpeg

测试代码

::

   int Led = 13 ;//定义数字口13

   int buttonpin = 3; //定义数字口3

   int val ;//定义数字变量val

   void setup ()

   {

       pinMode (Led, OUTPUT) ; //将Led设置为输出

       pinMode (buttonpin, INPUT) ;//将buttonpin设置为输入

   }

   void loop ()

   {

       val = digitalRead (buttonpin) ;//读取到数字口3的数值，并赋值给 val

       if (val == HIGH)//当val为高电平时，LED亮起

       {

           digitalWrite (Led, HIGH);// LED亮起

       }

       else

       {

           digitalWrite (Led, LOW);// LED变暗

       }

   }

测试结果

按照上图接好线，烧录好代码，上电后，模块上的D1灯亮起，Arduino
UNO板上的D13 的
LED指示灯关闭；用纸片挡挡住模块凹槽后，模块上的D1灯关闭，Arduino
UNO板上的D13 的 LED 指示灯亮起。

.. _实验十九-ADXL345加速度传感器:

实验十九 ADXL345加速度传感器
----------------------------

实验说明

| 本实验我们主要用来检测ADXL345加速度传感器。ADXL345是一款小巧纤薄的低功耗三轴加速度计，它的分辨率为13位，测量范围为±16
  g，数字输出数据为 16
| 位二进制补码格式。它支持I2C和SPI的通信方式。实验中将利用I2C通信，在Arduino
  IDE的串口监视器上可看到传感器所测数据。

实验器材

开发板*1

USB线*1

ADXL345加速度传感器*1

杜邦线若干

接线图

.. image:: media/381f08101bfaa1de3a0e6b38fa9578f4.jpeg

测试代码

::

   #include <Wire.h>

   // ADXL345 寄存器定义
   #define ADXL345_ADDRESS (0xA6 >> 1)  // 设备地址为8位，但右移1位转为7位
                                        // 因为Wire库只接受7位地址
   #define ADXL345_REGISTER_XLSB (0x32)

   int accelerometer_data[3];

   // 该函数仅告诉芯片将数据发送到输出寄存器
   // 将数据写入从设备的缓冲区
   void i2c_write(int address, byte reg, byte data) 
   {
     // 发送输出寄存器地址
     Wire.beginTransmission(address);
     // 连接设备
     Wire.write(reg);
     // 发送数据
     Wire.write(data);  // 低字节
     Wire.endTransmission();
   }

   // 使用指针读取数据
   // 微控制器从传感器的输入寄存器读取数据
   void i2c_read(int address, byte reg, int count, byte* data) 
   {
     // 用于记录接收到的数据量
     int i = 0;
     
     // 发送输入寄存器地址
     Wire.beginTransmission(address);
     // 连接设备
     Wire.write(reg);
     Wire.endTransmission();
     
     // 重新连接设备
     Wire.beginTransmission(address);
     // 从从设备请求数据
     // count表示要请求的字节数
     Wire.requestFrom(address, count);
     
     while(Wire.available()) 
     {  // 从设备可能发送少于请求的数据
       char c = Wire.read();    // 以字符形式接收一个字节
       data[i] = c;
       i++;
     }
     Wire.endTransmission();
   }

   void init_adxl345() 
   {
     byte data = 0;
     
     i2c_write(ADXL345_ADDRESS, 0x31, 0x0B);  // 13位模式 ±16g
     i2c_write(ADXL345_ADDRESS, 0x2D, 0x08);  // 电源寄存器
     i2c_write(ADXL345_ADDRESS, 0x1E, 0x00);  // x轴偏移
     i2c_write(ADXL345_ADDRESS, 0x1F, 0x00);  // y轴偏移
     i2c_write(ADXL345_ADDRESS, 0x20, 0x05);  // z轴偏移
     
     // 检查初始化是否成功
     i2c_read(ADXL345_ADDRESS, 0X00, 1, &data);
     if(data == 0xE5)
       Serial.println("初始化成功");
     else
       Serial.println("初始化失败");
   }

   void read_adxl345() 
   {
     byte bytes[6];
     memset(bytes, 0, 6);
     
     // 从ADXL345读取6个字节
     i2c_read(ADXL345_ADDRESS, ADXL345_REGISTER_XLSB, 6, bytes);
     
     // 解包数据
     for (int i = 0; i < 3; ++i) 
     {
       accelerometer_data[i] = (int)bytes[2*i] + (((int)bytes[2*i + 1]) << 8);
     }
   }

   // 初始化并启动所有设置
   void setup() 
   {
     Wire.begin();
     Serial.begin(9600);
     
     for(int i = 0; i < 3; ++i) 
     {
       accelerometer_data[i] = 0;
     }
     
     init_adxl345();
   }

   void loop() 
   {
     read_adxl345();
     
     Serial.print("加速度: ");
     Serial.print(float(accelerometer_data[0]) * 3.9 / 1000);  // 13位模式下3.9mg/LSB的比例因子
     Serial.print("\t");
     Serial.print(float(accelerometer_data[1]) * 3.9 / 1000);
     Serial.print("\t");
     Serial.print(float(accelerometer_data[2]) * 3.9 / 1000);
     Serial.print("\n");
     
     delay(100);
   }

库文件下载地址

https://pan.baidu.com/s/1kVkXsm7

测试结果

按照上图接好线，烧录好代码，上电后，打开串口监视器，转动传感器，数值变化显示如下图。

.. image:: media/b035d1551e9c5440883cb2dee79e6f14.png

实验二十 麦克风声音传感器
-------------------------

实验说明

本实验我们主要用来检测麦克风声音传感器。这个传感器的S端是模拟输出，是麦克风的电压信号实时输出，通过电位器可调节信号增益。实验中将传感器的S端接到开发板的模拟口A0，在Arduino
IDE的串口监视器上可看到对应的模拟值输出。

实验器材

开发板*1

USB线*1

麦克风声音传感器*1

杜邦线若干

接线图

.. image:: media/eba008c0dc17fc0a8316a62c1bd28c7e.jpeg

测试代码

::

   int sensorPin =A0 ; //定义模拟口A0

   int value = 0; //设置value为0

   void setup()

   {

       Serial.begin(9600); //设置波特率

   }

   void loop()

   {

       value = analogRead(sensorPin); //将value设置为读取到的A0的数值

       Serial.println(value, DEC); //显示value数值，并自动换行

       delay(100); //延迟0.1秒

   }

测试结果

按照上图接好线，上传好代码，上电后，我们可以在软件的串口监视器相对应模拟值，如下图。声音越大模拟值越大。

.. image:: media/c036d6720f56d6372acc33563cc29614.png

实验二十一 霍尔传感器
---------------------

实验说明

本实验我们主要用来检测霍尔传感器。传感器输入为磁感应强度，输出是一个数字电压信号。它具有体积小、灵敏度高、响应速度快、温度性能好、可靠性高等特点。产品可用于无触点开关、位置转速检测与控制、全报警装置、纺织控制系统等方面。实验中我们用到了Arduino
UNO 板上自带的D13 的指示灯，通过传感器，控制D13 的指示灯的亮灭。

实验器材

开发板*1

USB线*1

霍尔传感器*1

杜邦线若干

接线图

.. image:: media/6db2d50d0551eeb8ecd02512393fe9b5.jpeg

测试代码

::

   int ledPin = 13; //定义数字口13

   int inputPin = 3; //定义数字口3

   int val = 0; //定义数字变量val，并设为0

   void setup()

   {

       pinMode(ledPin, OUTPUT); //将ledPin设置为输出

       pinMode(inputPin, INPUT); //将inputPin设置为输入

   }

   void loop()
   {

       val = digitalRead(inputPin); //读取到数字口3的数值，并赋值给val

       if (val == LOW) //当val为低电平时，LED亮起

       {

           digitalWrite(ledPin, HIGH); //LED亮起

       }

       else

       {

           digitalWrite(ledPin, LOW); //LED变暗

       }

   }   

测试结果

按照上图接好线，上传好代码后，上电后，Arduino UNO 板上的
D13的指示灯关闭，模块上D1灯关闭；当有磁铁靠近模块时， Arduino UNO
板上的D13 的指示灯亮起，模块上D1灯亮起。

实验二十二 碰撞传感器
---------------------

实验说明

本实验我们主要用来检测碰撞传感器。当传感器因碰撞物体按下按键时传感器信号端输出低电平信号，释放按键时传感器信号端保持高电平。该传感器可用于3D打印机内做限位开关。实验中我们用到了Arduino
UNO 板上自带的D13 的指示灯，通过传感器，控制D13 的指示灯的亮灭。

实验器材

开发板*1

USB线*1

碰撞传感器*1

杜邦线若干

接线图

.. image:: media/8d7ef1bdeb4b3eee0ef114b4b2918e12.jpeg

测试代码

::

   int Led=13;//定义 LED 接口

   int Shock=3;//定义碰撞传感器接口

   int val;//定义数字变量 val

   void setup()

   {

       pinMode(Led,OUTPUT);//定义 LED 为输出接口

       pinMode(Shock,INPUT);//定义碰撞击传感器为输出接口

   }

   void loop()

   {

       val=digitalRead(Shock);//将数字接口 3 的值读取赋给 val

       if(val==LOW)//当碰撞传感器检测有信号时，LED 亮起

       {

           digitalWrite(Led,HIGH); //LED 亮起

       }

       else

       {

           digitalWrite(Led,LOW); //LED 变暗

       }
   }

测试结果

按照上图接好线，烧录好代码；上电后，将碰撞传感器的小铁片往下压，Arduino
UNO 板上的 D13 的指示灯亮起和碰撞模块上D1灯亮起，否则。Arduino UNO
板上的 D13 的指示灯熄灭和碰撞模块上D1灯熄灭。

实验二十三 红外发射传感器和红外接收传感器
-----------------------------------------

实验说明

本实验我们主要用来检测红外发射传感器和红外接收传感器，二者相互搭配使用。红外发射传感器主要由红外发射管等组成，它是可将电能直接转换成近红外光并能辐射出去的发光器件。红外接收传感器主要由红外接收头组成，它是集接收、放大、解调一体的器件，它内部IC就已经完成了解调，输出的就是数字信号。

| 实验中我们用2块Arduino UNO
| 板分别搭建红外发射电路和红外接收电路，实验中我们利用红外发射模块发送信号，红外接收模块接收到信号，并进行解码，将结果在Arduino
  IDE的串口监视器上显示。

实验器材

开发板*2

USB线*1

红外发射传感器*1

红外接收传感器*1

杜邦线若干

接线图

红外发射传感器接线图

.. image:: media/cf3d70aa0a816c72e603289c22555046.jpeg

红外接收传感器接线图

.. image:: media/d1c3e3f93be00269cead568b4c0e3701.jpeg

测试代码

发射代码

::

   #include <IRremote.h>

   IRsend irsend;

   void setup()

   {

       Serial.begin(9600);

   }

   void loop()

   {

       for (int i = 0; i < 50; i++)

       {

           irsend.sendSony(0xa90, 12); // Sony电视电源开关编码

           delay(40);

       }

   }

接收代码

::

   #include <IRremote.h>

   int RECV_PIN = 11; //定义数字口11

   IRrecv irrecv(RECV_PIN);

   decode_results results;

   void setup()

   {

       Serial.begin(9600);//设置波特率

       irrecv.enableIRIn(); // 使能红外接收

   }

   void loop()

   {

       if (irrecv.decode(&results))

       {

           Serial.println(results.value, HEX); //显示数据

           irrecv.resume();

       }

   }

库文件下载地址

https://pan.baidu.com/s/1pLDpyg7

测试结果

按照上图分别接好线，烧录好代码；上电后，红外发射传感器对准红外接收传感器发送信号，红外发射传感器和红外接收传感器的D1灯快速闪烁，将接了红外接收传感器的arduino板接到电脑，我们可以在串口监视器显示“A90”，如下图。

.. image:: media/c0f7fe2a71950da6a22e722405c156a2.png

实验二十四 超声波传感器
-----------------------

实验说明

本实验我们主要用来检测超声波传感器。该传感器主要用于测距，它具有高精度、盲区（2cm）超近、性能稳定的特点。

实验中将传感器的信号端接到开发板的数字口7和数字口8，在Arduino
IDE的串口监视器上可看到超声波传感器和前方障碍物之间的距离。

实验器材

开发板*1

USB线*1

超声波传感器*1

杜邦线若干

接线图

.. image:: media/d104a3e8670b189887e3504c3519f508.jpeg

测试代码

::

   #define echoPin 7    // 回声信号引脚
   #define trigPin 8    // 触发信号引脚
   #define LEDPin 13    // 板载LED指示灯

   int maximumRange = 200;  // 最大检测范围(厘米)
   int minimumRange = 0;    // 最小检测范围(厘米)
   long duration, distance; // 持续时间用于计算距离

   void setup() {
     Serial.begin(9600);
     pinMode(trigPin, OUTPUT);  // 设置触发引脚为输出模式
     pinMode(echoPin, INPUT);   // 设置回声引脚为输入模式
     pinMode(LEDPin, OUTPUT);   // 设置LED引脚为输出模式(可选指示器)
   }

   void loop() {
     /* 以下触发/回声引脚循环用于通过声波反射确定最近物体的距离 */
     
     // 发送10微秒的高电平触发信号
     digitalWrite(trigPin, LOW);
     delayMicroseconds(2);
     digitalWrite(trigPin, HIGH);
     delayMicroseconds(10);
     digitalWrite(trigPin, LOW);

     // 读取回声引脚高电平持续时间(微秒)
     duration = pulseIn(echoPin, HIGH);

     // 根据声速计算距离(厘米)
     distance = duration / 58.2;

     if (distance >= maximumRange || distance <= minimumRange) {
       /* 当距离超出量程时：
          - 向电脑发送负数
          - 点亮LED表示"超出量程" */
       Serial.println("-1");
       digitalWrite(LEDPin, HIGH);
     }
     else {
       /* 正常量程内：
          - 通过串口发送距离数据
          - 关闭LED表示测量成功 */
       Serial.println(distance);
       digitalWrite(LEDPin, LOW);
     }

     // 下次测量前延迟50毫秒
     delay(50);
   }

测试结果

按照上图接好线，上传好代码，上电后，打开串口监视器，即可看到超声波传感器和前方障碍物之间的距离，单位为cm，显示如下图。

.. image:: media/9d204e83d501811a8c38fe49567c817a.png

.. _实验二十五-MQ-2-烟雾传感器:

实验二十五 MQ-2 烟雾传感器
--------------------------

实验说明

| 本实验我们主要用来检测MQ-2
| 烟雾传感器。该传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时，传感器的电导率随空气中可燃气体浓度的增加而增大。MQ-2
| 气体传感器对液化气、丙烷、氢气的灵敏度高，对天然气和其它可燃蒸汽的检测也很理想。它可检测多种可燃性气体，是一款适合多种应用的低成本传感器。

实验中将传感器的A0端接到开发板的模拟口A0，在Arduino
IDE的串口监视器上可看到对应的模拟值输出。

实验器材

开发板*1

USB线*1

MQ-2 烟雾传感器*1

杜邦线若干

接线图

.. image:: media/a4083f0493d9f34872b4d7846e4c4a1c.jpeg

测试代码

::

   void setup() 
   {

       Serial.begin(9600); //设置波特率

   }

   void loop() 
   {

       int sensorValue = analogRead(A0);
       //读取到的A0的数值，并赋值给数字变量sensorValue

       Serial.println(sensorValue, DEC); //显示sensorValue数值，并自动换行

       delay(100); //延迟0.1秒

   }

测试结果

按照上图接好线，上传好代码，上电后，传感器上D1灯亮起，调节电位器可调节灵敏度；打开窗口监视器，可看到相对应的模拟值。检测到气体浓度越高，模拟值越大。

.. image:: media/c738bef81db6a659646c2c01890b0914.png

实验二十六 敲击模块传感器
-------------------------

实验说明

本实验我们主要用来检测敲击模块传感器。它主要由SW-280振动开关组成，是电感式接近开关，是在感应震动力大小将感应结果传递到电路装置,并使电路启动工作的电子开关。实验中我们用到了Arduino
UNO 板上自带的D13 的指示灯，通过传感器，控制D13 的指示灯的亮灭。

实验器材

开发板*1

USB线*1

敲击模块传感器*1

杜邦线若干

接线图

.. image:: media/9a5c65c1200a9211e8ea7f2b03d96a22.jpeg

测试代码

::

   int Led=13;//定义数字口13

   int Shock=3;//定义数字口3

   int val;//定义数字变量val

   void setup()

   {

       pinMode(Led,OUTPUT);//将Led设置为输出

       pinMode(Shock,INPUT);//将Shock设置为输入

   }

   void loop()

   {

       val=digitalRead(Shock);//读取到数字口3的数值，并赋值给val

       if(val==LOW) //当val为低电平时，Led亮起

       {

           digitalWrite(Led,HIGH); //Led亮起

       }

       else

       {

           digitalWrite(Led,LOW); //Led变暗

       }

   }

测试结果

按照上图接好线，上传好代码，上电后，敲击该模块，Arduino UNO 板上的D13 的
LED 指示灯和模块上 D1 灯亮起。

实验二十七 电容触摸传感器
-------------------------

实验说明

本实验我们主要用来检测电容触摸传感器。它主要由触摸检测IC等组成。触摸检测IC是为了用可变面积的键取代传统的按钮键而设计的，具有低功耗和宽工作电压的特点。当我们上电之后，传感器需要约0.5sec的稳定时间，此时间段内不要对键进行触摸，此时所有功能都被禁止，始终进行自校准，当键没被触摸时，重校准周期约为4.0sec。传感器可用于防水电器、按钮键取代品等地方。

| 实验中我们用到了Arduino UNO 板上自带的D13
| 的指示灯，通过传感器，控制D13 的指示灯的亮灭。

实验器材

开发板*1

USB线*1

电容触摸传感器*1

杜邦线若干

接线图

.. image:: media/0f4c3cb909dee3d292bd3014789b5c2d.jpeg

测试代码

::

   int ledPin = 13; //定义数字口13

   int KEY = 3; //定义数字口3

   void setup()

   {

       pinMode(ledPin, OUTPUT); //将ledPin设置为输出

       pinMode(KEY, INPUT); //将KEY设置为输入

   }

   void loop()

   {

       if(digitalRead(KEY)==HIGH) //当数字口3读取为高电平时，LED亮起

       {

           digitalWrite(ledPin, HIGH); // LED亮起

       }

       else

       {

           digitalWrite(ledPin, LOW); //LED变暗

       }

   }

测试结果

按照上图接好线，上传好代码；上电后，按下按键后，传感器上D2灯亮起，Arduino
UNO 板上的 D13的指示灯亮起；否则，传感器上D2灯熄灭，Arduino UNO 板上的
D13的指示灯熄灭。

实验二十八 摇杆模块传感器
-------------------------

实验说明

本实验我们主要用来检测摇杆模块传感器。它使用5V供电，信号端X,Y接模拟口，原始状态下读出电压为2.5V左右，当随箭头方向按下，读出电压值随着增加，最大到5V，箭头相反方向按下，读出电压值减少，最小为0V；信号端B接数字口，原始状态下输出0，按下输出1。

实验中我们将摇杆模块传感器信号端接到开发板上的两个模拟口和一个数字口上，然后在软件的串口监视器显示对应数据，根据数据，我们可以知道摇杆模块传感器具体状态。

实验器材

开发板*1

USB线*1

摇杆模块传感器*1

杜邦线若干

接线图

.. image:: media/52ecf90c14aa4fbdaac436d3a609b5a8.jpeg

测试代码

::

   int JoyStick_X = 0; //定义模拟口A0

   int JoyStick_Y = 1; //定义模拟口A1

   int JoyStick_Z = 3; //定义数字口3

   void setup()

   {

       pinMode(JoyStick_Z, INPUT);//将JoyStick_Z设置为输入

       Serial.begin(9600); // 设置波特率

   }

   void loop()

   {

       int x,y,z; //定义数字变量x y z

       x=analogRead(JoyStick_X); //将x设置为读取到的A0的数值

       y=analogRead(JoyStick_Y);//将y设置为读取到的A1的数值

       z=digitalRead(JoyStick_Z);//将z设置为读取到的数字口3的数值

       Serial.print(x ,DEC); //显示x的数值

       Serial.print(","); //显示逗号

       Serial.print(y ,DEC);//显示y的数值

       Serial.print(",");//显示逗号

       Serial.println(z ,DEC);//显示z的数值，并自动换行

       delay(100);//延迟0.1S

   }

测试结果

按照上图接好线，上传好代码，上电后，通电后，将 X
轴向左移，X轴数据在0-512 范围内，X 轴向右移，X 轴数据在
512-1023范围内；将 Y轴向上移，Y 轴数据在 0-512范围内，Y 轴向下移，Y
轴数据在 512-1023范围内，如附图；Z 轴方向为 0，按下摇杆后，Z 轴显示 1。

.. image:: media/3cfff295e20ab7f5daa310beda9970f8.png

.. _实验二十九-MQ-3-酒精传感器:

实验二十九 MQ-3 酒精传感器
--------------------------

实验说明

| 本实验我们主要用来检测MQ-3
| 酒精传感器。它所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在酒精蒸汽时，传感器的电导率随空气
| 中酒精蒸汽浓度的增加而增大。

实验中将传感器的A0端接到开发板的模拟口A0，在Arduino
IDE的串口监视器上可看到对应的模拟值输出。

实验器材

开发板*1

USB线*1

MQ-3 酒精传感器*1

杜邦线若干

接线图

.. image:: media/11032e2942a9edca6f0728668a6c47f5.jpeg

测试代码

::

   void setup() 
   {

       Serial.begin(9600); //设置波特率

   }

   void loop()
   {
       int sensorValue = analogRead(A0);
       //读取到的A0的数值，并赋值给数字变量sensorValue

       Serial.println(sensorValue, DEC); //显示sensorValue数值，并自动换行
   }

测试结果

| 按照上图接线，烧录好程序，上电后，传感器上D1灯亮起，调节电位器可调节灵敏度；打开窗口监视器，可看到相对应的模拟值，将酒精靠近传感器时数据增大变化。
| |image7|

实验三十 避障传感器
-------------------

实验说明

本实验我们主要用来检测避障传感器。接好线上电后，传感器感应到物体时信号端S输出0，未感应到时信号端S输出1。它可通过调节电位器用来调节感应灵敏度。它速度快，适合智能小车避障、黑白线循迹、防跌落，产品计数器，流水线切割，液位检测等。实验中我们用到了Arduino
UNO 板上自带的D13 的指示灯，通过传感器，控制D13 的指示灯的亮灭。

实验器材

开发板*1

USB线*1

避障传感器*1

杜邦线若干

接线图

.. image:: media/7b0f7373022f6c7e29ddda062f8b5815.jpeg

测试代码

::

   const int sensorPin = 3; //定义数字口13

   const int ledPin = 13; //定义数字口3

   int sensorState = 0; //定义数字变量sensorState，并设为0

   void setup()

   {

       pinMode(ledPin, OUTPUT); //将ledPin设置为输出

       pinMode(sensorPin, INPUT);//将sensorPin设置为输入

   }

   void loop()

   {

       sensorState = digitalRead(sensorPin);

       //读取到数字口3的数值，并赋值给sensorState

       if (sensorState == LOW) //当sensorState为低电平时，LED亮起

       {

           digitalWrite(ledPin, HIGH);//LED亮起

       }

       else

       {

           digitalWrite(ledPin, LOW);//LED变暗

       }

   }

测试结果

按照上图接好线，上传好代码，上电后，通电后，靠近红外发射头的电位器顺时针调到尽头，再调节靠近红外接收头的电位器，观察D1灯，使D1灯关闭，并且保持将要亮起的临界点，此时感应距离最长。没有障碍物挡住红外避障传感器时，红外避障传感器上的D1灯关闭，Arduino
UNO 板上的
D13的指示灯关闭；当用障碍物挡住红外避障传感器，红外避障传感器上的D1灯亮起，Arduino
UNO 板上的 D13 的指示灯亮起。

.. _实验三十一-LM35温度传感器:

实验三十一 LM35温度传感器
-------------------------

实验说明

本实验我们主要用来检测LM35温度传感器。它的输出电压与摄氏温标呈线性关系，转换公式如式，0时输出为0V，每升高1℃，输出电压增加10mV。

实验中将传感器的信号端接到开发板的模拟口A0，在Arduino
IDE的串口监视器上可看到当前环境中的温度值。

实验器材

开发板*1

USB线*1

LM35温度传感器*1

杜邦线若干

接线图

.. image:: media/fbbd0c4e254b376b37c67a81ae4a4fd8.jpeg

测试代码

::

   void setup()

   {

       Serial.begin(9600);//设置波特率

   }

   void loop()

   {

       int val; //定义数字变量val

       int dat;//定义数字变量dat

       val=analogRead(0);//将val设置为读取到的A0的数值

       dat=(500 \* val) /1024; //计算出当前温度数字dat

       Serial.print("Temp:"); //显示 Temp:

       Serial.print(dat); //显示计算的温度值

       Serial.println("C");//显示C，并自动换行

       delay(500); //延迟0.5S

   }

测试结果

按照上图接好线，上传好代码，上电后，我们可以在软件的串口监视器中看到当前环境中的温度值，如下图。

.. image:: media/722e9d11c697ee67288ed69fbf4722e0.png

实验三十二 人体红外热释电传感器
-------------------------------

实验说明

本实验我们主要用来人体红外热释电传感器。它是基于红外线技术的自动控制产品。它具有灵敏度高、可靠性强、超低功耗，超低电压工作模式等特点，广泛应用于各类自动感应电器设备,尤其是干电池供电的自动控制产品。我们可以通过调节两个电位器调节感应距离和感应延时。调节距离电位器顺时针旋转，感应距离增大（约7米），反之，感应距离减小（约3米）。调节延时电位器顺时针旋转，感应延时加长（约300S），反之，感应延时减短（约5S）。

| 实验中我们用到了Arduino UNO 板上自带的D13
| 的指示灯，通过传感器感应附近是否有人体运动，控制D13 的指示灯的亮灭。

实验器材

开发板*1

USB线*1

人体红外热释电传感器*1

杜邦线若干

接线图

.. image:: media/9e9ea504bb5011fd16d1d808e73ce1f4.jpeg

测试代码

::

   byte sensorPin = 3;//定义数字口3

   byte indicator = 13;//定义数字口13

   void setup()

   {

       pinMode(sensorPin,INPUT);//设置数字口3位输入

       pinMode(indicator,OUTPUT);//设置数字口13为输出

       Serial.begin(9600);//设置波特率

   }

   void loop()

   {

       byte state = digitalRead(sensorPin);//读取到数字口3的数值赋值给state

       digitalWrite(indicator,state);//控制数值口13的状态

       if(state ==1)//当数值口3位高电平时，串口监视器输出对应字符，并自动换行

           Serial.println("Somebody is in this area!");

       else if(state == 0)
       //当数值口3位低电平时，串口监视器输出对应字符，并自动换行

           Serial.println("No one!");

       delay(500);//延迟0.5秒

   }

测试结果

按照上图接好线，上传好代码，上电后，检测到人体运动时Arduino
UNO板上D13的指示灯亮起，串口监视器中显示"Somebody is in this
area!"；没有检测到人体运动时Arduino
UNO板上D13的指示灯熄灭，串口监视器中显示"No one!"。

.. image:: media/855ae7997253b7ec304fbb5aa3403f5d.png

实验三十三 激光头传感器模块
---------------------------

实验说明

本实验我们主要用来检测激光头传感器模块。它主要由激光头组成，激光头由发光管芯、聚光透镜、铜可调套筒三部分组成。接上电源后，我们在信号端直接输入个高电平数字信号，传感器开始工作。它可用于激光类玩具、电子教鞭笔、电子水平尺、微型液晶投影等地方。实验中我们让激光头传感器模块循环开启，关闭。

实验器材

开发板*1

USB线*1

激光头传感器模块*1

杜邦线若干

接线图

.. image:: media/82a92246a41526e768efa92757a1b269.jpeg

测试代码

::

   void setup()

   {

       pinMode(3, OUTPUT); // 定义3脚为数字输出接口

   }

   void loop() 
   {

       digitalWrite(3, HIGH); // 打开激光头

       delay(1000); // 延时一秒

       digitalWrite(3, LOW); // 关闭激光头

       delay(1000); // 延时一秒

   }

测试结果

按照上图接好线，上传好代码，上电后，激光头打开1秒，关闭1秒，循环交替。

实验三十四 巡线传感器
---------------------

实验说明

| 本实验我们主要用来检测巡线传感器。传感器上的TCRT5000红外对管的工作原理是利用红外线对颜色的反射率不一样，将反射信号的强弱转化成电流信号。传感器在检测到黑色高电平有效，检测到白色是为低电平有效，检测高度为
| 0—3cm。在电路中你可以使用旋钮电位器来调黑白寻迹的灵敏度。

实验中将传感器的S端接到开发板的数字口D3，在Arduino
IDE的串口监视器上可看到对应的数值输出。

实验器材

开发板*1

USB线*1

巡线传感器*1

杜邦线若干

接线图

.. image:: media/c9e82713b33bc1da39dac480d2314764.jpeg

测试代码

::

   void setup()

   {

       Serial.begin(9600);//设置波特率

   }

   void loop()

   {

       Serial.println(digitalRead(3)); //
       输出从数字口3读取到的数值，并自动换行

       delay(500);//延迟0.5秒

   }

测试结果

按照上图接好线，上传好代码，上电后，传感器在检测到黑色时，信号端输出高电平，串口监视器显示1，传感器上D1指示灯熄灭；传感器在检测到其他颜色时，信号端输出低电平，串口监视器显示0，传感器上D1指示灯亮起。旋转电位器可调节灵敏度，将D1调节至亮与不亮的临界点时，灵敏度最高。

.. image:: media/d52b84d15265030966a10eb62b88a010.png

.. _实验三十五-18B20温度传感器:

实验三十五 18B20温度传感器
--------------------------

实验说明

| 本实验我们主要用来检测18B20温度传感器。该传感器主要由DS18B20可编程数字温度器等组成，具有体积小，抗干扰能力强，精度高的特点。它的测温范围
| －55℃～+125℃，固有测温误差是1℃。

实验中将传感器的信号端接到开发板的数字口3，在Arduino
IDE的串口监视器上可看到当前环境中的温度值。

实验器材

开发板*1

USB线*1

18B20温度传感器*1

杜邦线若干

接线图

.. image:: media/9e70e746aa05ded51dab3a88780950d2.jpeg

测试代码

::

   #include <OneWire.h>

   int DS18S20_Pin = 3;  // 定义数字引脚3连接温度传感器
   OneWire ds(DS18S20_Pin);  // 创建OneWire实例

   void setup(void)
   {
       Serial.begin(9600);  // 初始化串口通信，波特率9600
   }

   void loop(void)
   {
       float temperature = getTemp();  // 获取温度值
       Serial.println(temperature);    // 打印温度值并换行
       delay(100);                    // 延时100毫秒
   }

   float getTemp()
   {
       // 从DS18S20传感器获取温度值（单位：摄氏度）
       byte data[12];
       byte addr[8];

       if (!ds.search(addr))
       {
           // 总线上没有更多传感器，重置搜索状态
           ds.reset_search();
           return -1000;  // 返回错误代码
       }

       if (OneWire::crc8(addr, 7) != addr[7])
       {
           Serial.println("CRC is not valid!");
           return -1000;
       }

       if (addr[0] != 0x10 && addr[0] != 0x28)
       {
           Serial.print("Device is not recognized");
           return -1000;
       }

       ds.reset();
       ds.select(addr);
       ds.write(0x44, 1);  // 开始温度转换（使用寄生供电）

       byte present = ds.reset();
       ds.select(addr);    
       ds.write(0xBE);     // 读取暂存器内容

       for (int i = 0; i < 9; i++)  // 需要读取9个字节
       {
           data[i] = ds.read();
       }

       ds.reset_search();  

       byte MSB = data[1];  // 温度高字节
       byte LSB = data[0];  // 温度低字节
       float tempRead = ((MSB << 8) | LSB);  // 使用二进制补码合并数据
       float TemperatureSum = tempRead / 16;  // 转换为实际温度值
       
       return TemperatureSum;    
   }

库文件下载地址

https://pan.baidu.com/s/1o7HKVKQ

测试结果

按照上图接好线，上传好代码，上电后，通电后，我们可在软件串口监视器中看到当前环境温度值，如下图。

.. image:: media/da4fbb644f61e4aded66f742aa85d5e3.png

.. _实验三十六-TEMT6000光线传感器:

实验三十六 TEMT6000光线传感器
-----------------------------

实验说明

本实验我们主要用来检测TEMT6000光线传感器它主要由一个高灵敏可见光光敏（NPN型）三极管构成，可以将捕获的微小光线变化并放大100倍左右，并且轻松的被微控制器识别，进行AD转换。它对可见光照度的反应特性与人眼的特性类似，可以模拟人对环境光线的强度的判断，从而方便做出与人友好互动的应用。

实验中将传感器的S接到开发板的模拟口A0，在Arduino
IDE的串口监视器上可看到对应的模拟值输出。

实验器材

开发板*1

USB线*1

TEMT6000光线传感器*1

杜邦线若干

接线图

.. image:: media/53060ecd1356bd72e7bc6f168d5a320a.jpeg

测试代码

::

   void setup() 
   {

       Serial.begin(9600); //设置波特率

   }

   void loop() 
   {

       int sensorValue = analogRead(A0);
       //读取到的A0的数值，并赋值给数字变量sensorValue

       Serial.println(sensorValue, DEC); //显示sensorValue数值，并自动换行

       delay(100); //延迟0.1秒

   }

测试结果

按照上图接线，上传好程序，上电后，打开窗口监视器，设置波特率为9600，即可看到代表当前光照强度的模拟值，如下图。

.. image:: media/2c9ff6af0da53e4567c0ee4a0a9b4bab.png

.. |image1| image:: media/501a7a03b5656b8ad60d5e077c58fa51.png
.. |image2| image:: media/b9b5f051f1a2b6afdc68eb3b7b2f1c7d.png
.. |image3| image:: media/eb385c638a1aa0b63971a8871b1bb907.png
.. |image4| image:: media/027da150683195e85b2f0dcdd879e0c1.png
.. |image5| image:: media/84c3c93e5c18f312690a07500af196e6.png
.. |image6| image:: media/1c441bdd4fdda4368426597b7e011b7d.png
.. |image7| image:: media/784f8626c7a704528b963b00390d3f90.png
