分类
Micro:Bit系列

KE0124 microbit 传感器套装

目录

1. 产品说明 4

2. 产品清单 4

3. micro:bit 驱动安装方法 9

4. micro:bit 使用方法 11

5. micro:bit 引脚说明 13

6. micro bit元件和接口说明 13

7. 实验课程 14

实验一 Hello world! 14

实验二 自带按键控制点阵 17

实验三 测试micro bit自带加速度计和电子罗盘 18

实验四 自带温度传感器测试温度 20

实验五 板载蓝牙测试 21

实验六 LED闪烁 29

实验七 人体呼吸 31

实验八 LED闪烁和人体呼吸 32

实验九 断开的声音 34

实验十 编辑你的音乐 35

实验十一 自由搭配你的颜色 39

实验十二 外接按键 42

实验十三 左右倾斜 43

实验十四 光遮断的演示 45

实验十五 电容触摸按键 47

实验十六 模拟交通灯 49

实验十七 磁场的存在 51

实验十八 跟着黑线走 53

实验十九 前方有障碍物 55

实验二十 有人来了 57

实验二十一 着火啦 58

实验二十二 到顶部了 60

实验二十三 磁场开关 62

实验二十四 继电器的作用 64

实验二十五 超声波测试距离 66

实验二十六 光的亮度 70

实验二十七 我听到脚步声了 71

实验二十八 电位器的使用 73

实验二十九 空气中的酒精含量 75

实验三十 空气中的可燃气体 77

实验三十一 测试环境温度 79

实验三十二 TEMT6000测试光线 81

实验三十三 自动浇花系统 83

实验三十四 水位报警系统 85

实验三十五 测试紫外线 88

实验三十六 空气中的水汽 89

实验三十七 检测压力 91

实验三十八 震动控灯 93

实验三十九 摇杆模块的使用 95

实验四十 舵机的使用 98

实验四十一 添加一个显示器 100

实验四十二 DHT11温湿度测试 103

8. 相关资料链接 106

1. 产品说明

Micro bit是一款由英国BBC 设计的ARM架构的单片机。它仅有信用卡一半大小,板载蓝牙,加速度计,电子罗盘,三个按钮,5 x 5 LED点阵,主要用于青少年的编程教育。为了方便学习micro bit,我们特别搭配了这个套件。套件包含一个完全兼容micro bit和各种传感器模块的扩展板和常用的传感器模块。
使用时我们给扩展板供电DC7-9V,扩展板既可以给Micro bit板供电,又可以给传感器模块供电。在我们使扩展板时,我们可以通过连接跳线帽,控制给传感器供电接口V1和V2的电压(DC 3.3V和DC 5V)。我们还会根据这些传感器模块,我们还提供搭配micro bit板使用的学习课程,课程包含接线方法,测试代码等。

特别注意:由于扩展板外接传感器模块工作时,AMS1117-3.3V和NCP1117ST50T3G芯片工作电流过大,容易发烫,使用时特别注意,避免触碰这两个芯片,导致烫伤。

2. 产品清单

编码 规格型号 数量 图片
1 keyes micro bit 传感器V2扩展板 1
2 Keyes 薄膜压力传感器 1
3 keyes 巡线传感器 1
4 keyes 震动模块传感器 1
5 keyes 水滴水蒸气传感器 1
6 keyes TEMT6000光线传感器 1
7 keyes 光敏电阻传感器 1
8 keyes 麦克风声音传感器 1
9 keyes 有源蜂鸣器模块 1
10 keyes GUVA-S12SD 3528 紫外线传感器 1
11 keyes 无源蜂鸣器模块 1
12 keyes 插件RGB模块 1
13 keyes 霍尔传感器 1
14 keyes 电容触摸传感器 1
15 keyes MQ-2 烟雾传感器 1
16 keyes 水位传感器 1
17 keyes LM35温度传感器 1
18 keyes 食人鱼LED白光模块 1
19 Keyes 红绿灯模块 1
20 keyes 干簧管模块 1
21 keyes 土壤传感器 1
22 keyes 光折断传感器 1
23 keyes 碰撞传感器 1
24 keyes 避障传感器 1
25 keyes 草帽LED白发白模块 1
26 keyes 3W LED模块 1
27 keyes DHT11温湿度传感器 1
28 keyes 摇杆模块传感器 1
29 keyes MQ-3 酒精传感器 1
30 keyes 倾斜模块传感器 1
31 keyes 5V 单路继电器模块 1
32 keyes 火焰传感器 1
33 keyes 按键传感器 1
34 keyes 人体红外热释电传感器 1
35 keyes 可调电位器模块 1
36 HC-SR04超声波模块 1
37 1602 I2C 蓝屏 LCD 1
38 SG90 9G 23*12.2*29mm 蓝色 辉盛 90度 舵机 1
39 母对母 杜邦线20CM/40P/2.54/10股铜包铝 24号线 1

3. micro:bit 驱动安装方法

下面我们给micro:bit开发板安装驱动。首先将micro:bit开发板用USB线连接到电脑上,然后双击驱动文件mbed USB 2020,点击Install。

继续点击Install,安装驱动。

点击Finish,安装完成。

安装完成后。

点击“Computer” —>“Properties”—> “Device manager”,我们可以看到下图。

4. micro:bit 使用方法

micro: bit的编程环境有在线编程工具和本地编程工具两种,这里我们介绍下在谷歌浏览器的编程方法。首先在谷歌浏览器中打开https://makecode.microbit.org/网站进入编程环境。利用网站上模块,开始图形化编程,如下图。

点击JavaScript,你可以看到对应的程序代码,如下图。

将程序命名为LED1,并保存,如下图。

保存或,并在C盘中找到对应文件,如下图。

将micro: bit用USB接到电脑上,然后在C盘找到microbit-LED1文件,并发送到MICROBIT(G)上,就完成程序上传了。

程序上传后,给micro: bit上电后,micro: bit上5 x 5 LED点阵显示对应图案。供电方法有两种,一是直接通过USB线供电;二是用电池盒供电,电池盒接2个1.5V的5号电池,如下图。

USB线供电 电池盒供电

5. micro:bit 引脚说明

在我们开始试验之前,我们需要对micro bit主板的各个引脚需要由一定的了解,具体信息参照下图。

详细信息请参考官方网站:https://microbit.org/guide/hardware/pins/

6. micro bit元件和接口说明

7. 实验课程

实验一 Hello world!

实验说明

首先先来学习micro:bit主板串口通信功能,只需要一块micro bit主板和一根USB线的简单实验,让我们的micro bit主板说出“Hello World!”,这是一个让micro bit主板和PC 机通信的实验,这也是一个入门试验,希望可以带领大家进入micro bit的世界。

实验中我们要用到一个串口通讯软件,这里我们用的是Arduino IDE。

测试代码

Arduino IDE安装方法

Double click arduino-1.5.6-r2-windows to start.

Select “I Agree”to accept license agreement.

Select components to install and click “Next”.

Click “Browse” and select another folder. Click “Install” to start the installation.

Finally, wait for a few minutes to finish.

测试结果

将micro bit用micro USB线接在电脑上,上传好代码,打开Arduino IDE,设置要COM口。打开串口监视器,设置波特率为115200(经过测试,micro:bit的USB串口通讯波特率是115200),在串口监视器中输入 “R”字符,点击Send,串口监视器中输出“Hello world!”字符,如下图。

实验二 自带按键控制点阵

实验说明

在micro bit控制板上自带3个按键,其中一个是复位按键,另外两个AB按键作为控制按键。在这一课程中,我们利用控制板自带的两个按键,控制控制板自带的LED点阵。

在这一课程中,我们利用两个测试代码测试,一种是不带循环,一种是带有循环程序。

测试代码

代码1:

代码2:

测试结果

上传好代码1,上电后,按下按键A,控制板LED点阵显示心形;按下按键B,控制板LED点阵显示倒立心形;按下按键A和按键B,控制板LED点阵显示另外图案。

上传好代码2,上电后,按下按键A,控制板LED点阵显示心形;按下按键B,控制

板LED点阵显示倒立心形;按下按键A和按键B,控制板LED点阵循环显示3种图案。

实验三 测试micro bit自带加速度计和电子罗盘

实验说明

在micro bit控制板上自带加速度计和电子罗盘,我们可以利用控制板上该元件测试控制板当前的状态,测试出控制板当前的3轴加速度。

在这一课程中,我们完成两个实验,实验一,是利用控制板加速度计和电子罗盘控制LED点阵显示不同图案;实验二是直接测试出控制板的3轴加速度,并在点阵和串口监视器上显示。

测试代码

代码1:

代码2:

测试结果

上传好代码1,上电后,当我们移动控制板,使控制板金手指朝上时,控制板显示第1个图案;移动控制板,使控制板金手指朝下时,控制板显示第2个图案;水平放置控制板,使控制板点阵朝上时,点阵显示第3个图案;水平放置控制板,使控制板点阵朝下时,点阵显示第4个图案;晃动控制板,控制板震动时,点阵显示第5个图案;向左倾斜控制板时,点阵显示第6个图案;向右倾斜控制板时,点阵显示第7个图案。

上传好代码2,利用micro USB线上电后,我们可以测试出控制板的X Y Z 3轴加速度值,单位为mg。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用Arduino IDE软件串口监视器上看到显示结果,显示如下图。

实验四 自带温度传感器测试温度

实验说明

在micro bit控制板上自带一个温度传感器。在这一课程中,我们利用该传感器测试当前环境中的温度,并将测试结果在控制板自带点阵显示。

测试代码

测试结果

上传好代码,利用micro USB线上电后,我们可以测试出当前环境中的温度值,单位为℃。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用Arduino IDE软件串口监视器上看到显示结果,显示如下图。

实验五 板载蓝牙测试

实验说明

在micro bit控制板自带蓝牙,我们可以通过连接蓝牙,实现无线传输代码功能。试验中,我们利用一个苹果ipad,和micro bit连接,实现无线传输代码功能。安卓系统手机实现无线传输代码方法和苹果ipad类似,这里就不一一介绍了。

试验步骤

1.在App Store中搜索micro:bit,安装对应APP。

2.iPad和micro bit控制板配对连接。

a. APP安装成功后,点击打开APP,给micro bit控制板上电,选择APP第一

项开始配对蓝牙。

b.点击配对一个新的micro:bit开始配对。

c.根据提示,首先按下micro bit控制板A B按键,然后按下复位按键,然后再松开复

位按键,micro bit控制板上LED点阵会最终显示一个图案。点击下一步。

d.在iPad上设置图案,使图案和micro bit控制板上 显示的图案一样,点击下一步。

e.点击下一步配对,配对成功。

3.连接成功后,开始利用APP编写上传代码。

a.选择第二项,开始编写程序,编写程序OK。

b.点击,选择第一项开始课程设置。

c.选择设置第一项,保存设置。

d.点击图案,设置代码名称,并保存。

e.保存成功,直接开始上传程序,默认选择程序是刚开始保存的程序。

特别注意:上传代码时,需要参考第二步c小步方法,使LED点阵显示密码图案,

才能上传程序成功。

f.程序上传成功,显示如下图。

实验六 LED闪烁

实验说明

LED 闪烁实验是比较基础的实验之一,在使用方法中,我们控制的是micro: bit自带的5 x 5 LED点阵。在这个实验中我们外接一个keyes 草帽LED白发白模块,然后控制模块上LED闪烁,实验中我们先关闭5 x 5 LED点阵功能。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 草帽LED白发白模块*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,我们就可以看到keyes 草帽LED白发白模块 上LED不停闪烁,间隔大约为1秒。

实验七 人体呼吸

实验说明

在这个实验中,我们外接keyes 食人鱼LED白光模块到扩展板上。实际上keyes 食人鱼LED白光模块和上一课用到的keyes 草帽LED白发白模块功能完全一样,二者可以替换使用,只是模块上LED外观了亮度一些不同。

实验中,我们将keyes 食人鱼LED白光模块信号端接到了micro:bit主板的P0上。从micro:bit 引脚说明我们知道P0还可以当做模拟信号输入端口。实验中我们通过P0端口控制模块上LED亮度,是它逐渐变亮,然后逐渐变暗,循环交替,模拟人体呼吸现象。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 食人鱼LED白光模块*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完程序,上电后,我们就可以看到keyes 食人鱼LED白光模块上LED先逐渐变亮,然后逐渐变暗,循环交替,和人体呼吸一样。

实验八 LED闪烁和人体呼吸

实验说明

在这个实验中,我们外接keyes 3W LED模块到扩展板上。实际上keyes 3W LED模块和上两课课用到的LED 模块使用方法完全一样,可以替换使用,只是这个模块模块上LED用了3W LED,亮度特别大,我们完全可以将它用来照明。

这个实验,我们是将实验六和实验七结合起来,我们先控制模块上LED闪烁2次,然后再让模块LED模拟人体呼吸2次,二者循环交替。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 3W LED模块*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,我们就可以看到keyes 3W LED模块上LED闪烁2次,然后再模拟人体呼吸2次,二者循环交替。

实验九 断开的声音

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。有源蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号。本课程中用到了keyes 有源蜂鸣器模块,模块上焊接的是有源蜂鸣器。

实验中中我们将keyes 有源蜂鸣器模块的信号的接到了micro:bit主板的P7端。当我们给P7端输入高电平时,蜂鸣器持续响起。在这里我们参考LED闪烁实验,我们控制模块上蜂鸣器循环响起和关闭,就相当于把声音截成一段一段的。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 有源蜂鸣器模块*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,我们就可以听到keyes 有源蜂鸣器模块上蜂鸣器循环响起和关闭,就相当于把声音截成一段一段的。

实验十 编辑你的音乐

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了无源蜂鸣器,无源蜂鸣器内部不带振荡源,直流信号无法令其鸣叫,须用方波驱动。

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。无源蜂鸣器内部不带振荡源,直流信号无法令其鸣叫,须用方波驱动。本课程中用到了keyes 无源蜂鸣器模块,模块上焊接的是无源蜂鸣器。

实验中中我们将keyes 无源蜂鸣器模块的信号的接到了micro:bit主板的P0端。在这一课程中,我们完成两个实验,一个是直接控制输入P0的高低电平,设置两个方波,控制模块上蜂鸣器响起;另一个是利用软件自带功能,在P0端输入不同频率、不同长度的方波,最终是模块上蜂鸣器响起《欢乐颂》的曲子(这是输入的PIO口只能是P0,不能是其它接口)。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 无源蜂鸣器模块*1

杜邦线若干

接线图

测试代码

代码1

代码2

注意:点击软件中图标,我们可以看到程序中各个音频的频率,如下图。

测试结果

按照接线图接好线,上传完代码1,上电后,我们就可以听到keyes 无源蜂鸣器模块上蜂鸣器循环响起两种声音。上传完代码2,上电后,我们就可以听keyes 无源蜂鸣器模块上蜂鸣器循环响起《欢乐颂》的曲子。

实验十一 自由搭配你的颜色

实验说明

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

这个实验中我们用到了keyes 插件RGB模块,它是共阴极RGB模块。在这个实验中,我们把控制模块红绿蓝三个颜色通道的信号端接到了micro:bit主板的P0 P1 P2接口上,根据引脚说明,这3个引脚也是模拟输入信号端口。在实验中,我们通过控制P0 P1 P2的模拟输入值,首先控制模块RGB灯显示红绿蓝三种颜色灯光,然后控制RGB灯快速变换颜色。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 插件RGB模块*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,我们就可以看到keyes 插件RGB模块上RGB灯显示红绿蓝三种颜色灯光,然后RGB灯快速变换颜色,循环交替。

实验十二 外接按键

实验说明

在做你设计电路时,按键开关是最常用的一种元件。尽管micro:bit主板上自带了两个按键,但是有时设计电路还是需要用到外接按键。

在这里我们就外接一个keyes 按键传感器 到扩展板,然后控制micro:bit主板上LED点阵显示不同图案。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 按键传感器 *1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,按下模块上按键,micro:bit主板上LED点阵显示图案,否则显示 图案。

实验十三 左右倾斜

实验说明

在你做电路设计时,有时候你需要测试一个物体是否左右倾斜,这样你就可以用到keyes 倾斜模块传感器。它主要是利用滚珠在开关内随不同倾斜角度的发化,达到触发电路的目的。

我们外接一个keyes 倾斜模块传感器 到扩展板,通过左右倾斜keyes 倾斜模块传感器 ,然后控制micro:bit主板上LED点阵显示不同图案。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 倾斜模块传感器 *1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,keyes micro bit 传感器V2扩展板倾向左边,micro:bit主板上LED点阵显示图案,倾向右边显示 图案。

实验十四 光遮断的演示

实验说明

在日常生活中,我们经常需要实现计数和测速功能。keyes 光折断传感器和单片机搭配使用,利用代码调试就可以实现这些功能。它的原理非常简单,它主要由光遮断器组成,当我们用纸片挡住光遮断器凹槽时,模块信号端发生变化。测试时,我们让物体因为运动,而不断有物体挡住光遮断器凹槽,模块信号端就不断出现高低电平变化,然后我们通过模块信号端数据,计算出物体运动情况,即可达到计数和测速的功能。

在这里,我们将keyes 光折断传感器接到扩展板,模拟物体挡住和不挡住光遮断器凹槽,观察信号变化,然后控制micro:bit主板上LED点阵显示不同图案。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 光折断传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,用纸片挡住keyes 光折断传感器上光遮

断器凹槽,micro:bit主板上LED点阵显示图案,否则显示 图案。

实验十五 电容触摸按键

实验说明

在实验十二中,我们做了外接按键模块的实验。这一课程中我们用到了keyes 电容触摸传感器,让完全可以替代按键模块。它主要由触摸检测IC等组成。触摸检测IC是为了用可变面积的键取代传统的按钮键而设计的,具有低功耗和宽工作电压的特点。当我们上电之后,传感器需要约0.5sec的稳定时间,此时间段内不要对键进行触摸,此时所有功能都被禁止,始终进行自校准,当键没被触摸时,重校准周期约为4.0sec。传感器可用于防水电器、按钮键取代品等地方。

在这里我们就外接一个keyes 电容触摸传感器到扩展板,然后控制micro:bit主板上LED点阵显示不同图案。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 电容触摸传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,待传感器稳定后,触摸传感器感应区域,micro:bit主板上LED点阵显示图案,否则显示 图案。

实验十六 模拟交通灯

实验说明

当我们走在十字路口上,我们到处到可以看到红绿灯指挥着行人和车辆有序的运行。然而红绿灯是怎样被控制运行呢?

在这里我们将一个Keyes 红绿灯模块接到扩展板上,由micro:bit主板控制模块上3个灯的闪烁,完全模拟一个红绿灯的运行。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

Keyes 红绿灯模块*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,绿灯亮5秒,熄灭,黄灯闪烁3次,间隔为0.5秒,然后熄灭,然后红灯亮,亮5秒,熄灭,绿灯亮起,循环交替。

实验十七 磁场的存在

实验说明

在日常生活中传感器无处不在,户外公共的路灯,一到白天自动亮起,一到晚上自动熄灭,这就是用到了光照传感器。楼道电灯,当人走过发出声音时,电灯自动亮起,过后,安静下来,电灯关闭,这用到了声音传感器。

这一课程中我们用到keyes 霍尔传感器,它的主要元件是A3144E,它是检测磁场的传感器,是信号端输出的是数字信号,只能检测周围是否存在磁场,检测不出磁场强度。在这里,我们将keyes 霍尔传感器到扩展板,观察信号变化,然后控制micro:bit主板上LED点阵显示不同图案。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 霍尔传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,传感器感应到附近磁场时,micro:bit主板上LED点阵显示图案,否则显示 图案。

实验十八 跟着黑线走

实验说明

当我们在做DIY实验中,我们经常可以看到别人DIY这样一款小车,小车直接沿着黑色的线行走,不会超出黑线范围,那这又是一个什么原理呢?

实际上它主要用到了3个keyes 巡线传感器,可以检测小车底下是否是黑线,然后根据检测结果控制小车运动,从而实现小车沿黑线行走。那keyes 巡线传感器又是怎么检测黑色的线呢?

原来每一个keyes 巡线传感器都带有一个TCRT5000红外对管,它的工作原理是利用红外线对颜色的反射率不一样,将反射信号的强弱转化成电流信号。当检测到黑线时,红外线没有发射或者发射回来强度不够大,这样传感器信号端输出高电平,否则传感器信号端输出低电平。这样我们就可以通过传感器信号端高低电平情况,判断检测到的颜色了。

在这里,我们将keyes 巡线传感器到扩展板,控制micro:bit主板上LED点阵显示测试结果。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 巡线传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完程序,上电后,当传感器没有检测到物体或检测到黑线时,那么,红外线没有发射或者发射回来强度不够大,那么传感器信号端输出为高电平,micro:bit主板上LED点阵显示数字1,否则显示数字0。

特别注意:我们旋转传感器上电位器,使传感器上D1 LED介于亮与不亮之间,灵敏度

最高。传感器的检测高度为   0—3cm。

实验十九 前方有障碍物

实验说明

同样的DIY小车,我看过这样一款小车,小车自动避开前方障碍物,自动沿着我们预设好的线路行走,那这又是一个什么原理呢?

实际上它主要用到了3个keyes 避障传感器 ,可以检测小车前方是否有障碍物,然后根据检测结果控制小车运动,使小车避开障碍物,沿着预定轨道前进。那keyes 避障传感器又是怎么检测前方障碍物呢?

原来每一个keyes 避障传感器都带有具有一对红外线发射管与接收器,发射管发射出一定频率的红外线,红外线遇到障碍物,被反射到达接收器,接收器收到红外线后,传感器信号端输出为低电平;如果没有障碍物,发射出去的红外线,因为传播距离越远而逐渐减弱,最后消失,接收器没有收到红外线,传感器信号端输出为高电平。这样我们就可以通过传感器信号端高低电平情况,判断前方是否有障碍物了。

在这里,我们将keyes 避障传感器到扩展板,控制micro:bit主板上LED点阵显示测试结果。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 避障传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,当传感器检测前方有障碍物时,那么传感器信号端输出为低电平,micro:bit主板上LED点阵显示数字0,否则显示数字1。

特别注意:我们可以调节传感器上两个电位器,调节它的灵敏度。靠近红外发射管的电位器顺时针调到尽头,再调节靠近红外接收器的电位器,观察D2灯,使D2灯关闭,并且保持将要亮起的临界点,此时感应距离最长。传感器的有效距离为2~40cm。

实验二十 有人来了

实验说明

我们在影视剧中看过这样的镜头,有人去偷袭一个目标时,还没有靠近目标,就直接被发现,而警报响起。有些特种兵去偷袭目标时,会再全身涂满湿润的泥巴,这样就不会给对方发现了,那这是为什么呢?

原来普通人体会发射10um左右的特定波长红外线,被偷袭的目标附近都安装了相关传感器能够感应到人体发射的红外线,然后报警,涂满泥巴后,传感器就感应不到人体发射的红外线了。

在这里,我们用keyes 人体红外热释电传感器来检测附近是否有人运动,假如附近有人运动时,传感器信号端输出高电平,否则输出低电平。特别注意,这个传感器只能检测在运动中的人体,静止中的人体检测不到,检测距离最远为7米。

实验中,我们将keyes 人体红外热释电传感器接到扩展板,观察信号变化,然后控制micro:bit主板上LED点阵显示不同图案。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

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

杜邦线若干

接线图

注:调节距离电位器(RP2)顺时针旋转,感应距离增大(约7米),反之,感应距离减小(约3米)。

调节延时电位器(RP1)顺时针旋转,感应延时加长(约300S),反之,感应延时减短(约5S)。

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,传感器感应到附近有人运动时,micro:bit主板上LED点阵显示图案,否则显示 图案。

实验二十一 着火啦

实验说明

在生活中,我们发现有很多地方出现火灾,没有及时救火,导致火势愈演愈烈,最终造成重大损失。那么有没有办法避免这种情况呢?有,就是在容易着火的地方安装火焰传感器和喇叭,当火焰传感器检测到附近着火时,喇叭及时发出声音报警,提醒人们及时救火;甚至还可以直接和灭火器连接,在提醒人们救火的同时,自动控制灭火器灭火。

在这里我们用一个keyes 火焰传感器和一个keyes 有源蜂鸣器模块模拟自动报警系统。当keyes 火焰传感器检测到火焰时,keyes 有源蜂鸣器模块上蜂鸣器直接响起报警。

注意keyes 火焰传感器可以检测火焰或者波长在760纳米~1100纳米范围内的光源,它的探测角度为60度左右。我们可以通过旋转传感器上电位器,可以调节它的灵敏度。当调节电位器使传感器上LED介于不亮与亮之间的临界点时,灵敏度最好。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 火焰传感器*1

keyes 有源蜂鸣器模块*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,传感器感应到附近有火焰时,模块上蜂鸣器响起,否则蜂鸣器关闭。

实验二十二 到顶部了

实验说明

在我们DIY过程中,经常要用的一个机器-3D打印机,有了它,我们可以打印出想要的各种结构器件了。在打印接里,限位开关必不可少,它主要提供打印机XYZ轴是否到达边界点的信息。keyes 碰撞传感器也是一款限位开关,完全可以用在3D打印机上。它本质上它和按键模块一样,当打印机到顶部时,挤压弹簧片,模块输出低电平,离开顶部,松开弹簧片,模块输出高电平。

在这里我们用一个keyes 碰撞传感器和一个keyes 有源蜂鸣器模块模拟3D打印机限位。当keyes 碰撞传感器到顶时,keyes 有源蜂鸣器模块上蜂鸣器直接响起报警。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 碰撞传感器*1

keyes 有源蜂鸣器模块*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,按下传感器弹片时,模块上蜂鸣器响起,否则蜂鸣器关闭。

实验二十三 磁场开关

实验说明

我们在第十七课中用keyes 霍尔传感器来检测附近是否存在磁场。实际上检测磁场的元件不只是这个,keyes 干簧管模块也可以用来检测附近是否存在磁场。那二者之间有什么区别呢?

keyes 干簧管模块主要由干簧管组成,干簧管为机械式的磁敏开关,无源器件。其工作原理是磁场磁化其簧片,使其开启与关断达到开关的效果。但由于是接触式的开关,其工作寿命有限制,而且运输、安装过程中易损坏。

keyes 霍尔传感器的主要元件是A3144E,它是电子式的磁敏器件,有源器件,输出形式为开关型。它利用磁场和霍尔效应达到无接触式控制的目的。由于霍尔元件本身是一颗芯片,其工作寿命理论上无限制。

在这里,我们将keyes 干簧管模块到扩展板,观察信号变化,然后控制micro:bit主板上LED点阵显示不同图案。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 干簧管模块*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,模块感应到附近磁场时,micro:bit主板上LED点阵显示图案,否则显示 图案。

实验二十四 继电器的作用

实验说明

在生活中,我们一般用220V的交流电来驱动电器设备。有时候我们需要用到开关来控制电器,假如直接把开关接到220V的交流电电路中,一旦漏电,那么就会危及人身安全,这样不好。于是我们就设计了一个继电器模块。这个继电器模块常开(NO)和常闭(NC)接口,它是高电平有效。

使用时我们在- +供电5V,S接信号端,当给S高电压时,驱动继电器,即常开(NO)连通、常闭(NC)断开;当给S低电压时,关闭继电器,即常开(NO)断开、常闭(NC)连通。这样我们把220V的交流电电路接到常开(NO)或常闭(NC)接口,通过5V电压控制,安全方便。

在这里,我们将模拟继电器控制外接电路,我们用keyes 5V 单路继电器模块控制一个LED(为方便接线,电路中没有加220V电压,还是5V,原理是一样)的亮灭。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 5V 单路继电器模块*1

keyes 草帽LED白发白模块 *1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传完代码,上电后,继电器开启,模块LED亮起,让后继电器关闭,模块LED熄灭,间隔1秒,循环交替。

实验二十五 超声波测试距离

实验说明

自然界有一种叫蝙蝠的动物,蝙蝠在夜间飞行不是靠眼睛看的,而是靠耳朵和发音器官飞行的。蝙蝠在飞行时,会发出一种尖叫声,这是一种超声波信号,是人类无法听到的,因为它的音频很高。这些超声波的信号若在飞行路线上碰到其他物体,就会立刻反射回来,在接收到返回的信息之后,蝙蝠于振翅之间就完成了听、看、计算与绕开障碍物的全部过程。

超声波测距模块的原理跟上面的原理是一样的,超声波测距模块一触发信号后发射超声波,当超声波投射到物体而反射回来时,模块输出一回响信号,以触发信号和回响信号间的时间差,来判定物体的距离。

在这里,我们将 HC-SR04 超声波模块接到扩展板上,用于测试超声波模块和前方障碍物的距离,并显示出来。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

HC-SR04 超声波模块*1

杜邦线若干

接线图

测试代码

代码1

代码2

利用库文件设置代码

在下图模块搜索sonar

点击下图自动下载库文件了,然后在编辑代码栏目里看到对应模块。

测试结果

按照接线图接好线,陆续上传两个程序,上电后,两个程序实验现象一致。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验二十六 光的亮度

实验说明

在生活中我们发现,很多公共场所的照明灯,一到晚上它就自动亮起来,一到白天

它就自动熄灭, 难道这些灯都是有人去控制吗?

实际上不是,实际上很多照明灯都是安装了一个感光元件,可以测量外界光的亮度,

当到晚上时,亮度低了,就自动控制路灯亮起;当到白天时,亮度高了,就自动控制路灯熄灭。

在这里,我们接keyes 光敏电阻传感器接到扩展板来测试外界光的亮度。我们需要用到micro:bit主板的模拟输入功能,只有几个特定的PIO口才有该功能,具体的可以参考micro:bit 引脚说明。实验中传感器信号端接的是P0端,将所测结果在micro:bit主板上LED点阵或串口监视器上显示。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 光敏电阻传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传代码,上电。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验二十七 我听到脚步声了

实验说明

在生活中,当我们晚上经过楼道时,如果脚步方轻,黑漆漆一片,而当我们加重脚步,或者大叫一声,楼道里的照明灯就会陆续亮起。

实际上楼道里的照明电路里安装有声音传感器,当检测当外界声音时,控制开启照明灯,否则关闭照明灯。

在这实验中,我们keyes 麦克风声音传感器的信号端接到micro:bit主板的P0,通过读取P0端的模拟值,来检测外界的声音大小。检测时,外界声音越大,模拟值越大。我们将所测的模拟值在micro:bit主板上LED点阵或串口监视器上显示。

注意:keyes 麦克风声音传感器是用来调节声音的放大倍数,顺时针旋转电位器,增大

放大倍数。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 麦克风声音传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传代码,上电。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验二十八 电位器的使用

实验说明

当我们在做DIY实验时,我们经常要用到电位器模块。电位器模块实际上主要用的就是一个可调电阻,当我们在旋转电位器时,实际上就是改变可调电器的电阻。我们设置对应电路,将电阻阻值的变化,转换成电压的变化。然后将电压变化通过模块信号端输入到micro:bit主板的模拟输入口检测。

在这实验中,我们keyes 可调电位器模块的信号端接到micro:bit主板的P0,通过读取P0端的模拟值,旋转电位器,模拟值数据改变。我们将所测的模拟值在micro:bit主板上LED点阵或串口监视器上显示。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 可调电位器模块*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传代码,上电,旋转电位器,数据变化。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验二十九 空气中的酒精含量

实验说明

在现实生活中经常出现气体泄漏事件,若是无危害的气体还好,若是有毒或者易燃易爆气体,那就存在了巨大的安全隐患。为此,人们研发了各种传感器来检测空气中的各种气体含量,方便及时发现泄漏的气体,及时报警处理。

实验中,我们用keyes MQ-3 酒精传感器来检测空气在的酒精含量。传感器有两个信号端,模拟口A0和数字口D0。当检测到酒精浓度越高,A0数值越大;当检测到酒精浓度到达一定时,A0到达一定数值时,D0由低电平变为高电平,该数值可由电位器控制。

在这实验中,我们keyes MQ-3 酒精传感器的A0信号端接到micro:bit主板的P0,通过读取P0端的模拟值,检测空气中酒精含量。我们将所测的模拟值在micro:bit主板上LED点阵或串口监视器上显示。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes MQ-3 酒精传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传代码,上电,读取到A0信号端数据,酒精浓度越高,数据越大。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验三十 空气中的可燃气体

实验说明

在上一课程中,我们检测了空气中的酒精浓度情况。这一课程中,我们利用keyes MQ-2 烟雾传感器来检测空气中的可燃气体,如液化气、丙烷、氢气等。keyes MQ-2 烟雾传感器对液化气、丙烷、氢气的灵敏度高,对天然气和其它可燃蒸汽的检测也很理想。它可检测多种可燃性气体,是一款适合多种应用的低成本传感器。

keyes MQ-2 烟雾传感器有两个信号端,模拟口A0和数字口D0。当检测到可燃气体浓度越高,A0数值越大;当检测到可燃气体浓度到达一定时,A0到达一定数值时,D0由低电平变为高电平,该数值可由电位器控制。

在这实验中,keyes MQ-2 烟雾传感器的A0信号端接到micro:bit主板的P0,通过读取P0端的模拟值,检测空气中可燃气体。我们将所测的模拟值在micro:bit主板上LED点阵或串口监视器上显示。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes MQ-2 烟雾传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传代码,上电,读取到A0信号端数据,可燃气体浓度越高,数据越大。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验三十一 测试环境温度

实验说明

在这一课程中,我们利用keyes LM35温度传感器测试出当前环境中的具体温度。keyes LM35温度传感器的信号端的输出电压与摄氏温标呈线性关系,转换公式如式,0时输出为0V,每升高1℃,输出电压增加10mV。

在这实验中,我们将keyes LM35温度传感器的A0信号端接到micro:bit主板的P0,通过读取P0端的模拟值,计算出温度值。我们将所测的温度值在micro:bit主板上LED点阵或串口监视器上显示。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes LM35温度传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传代码,上电后,即可得到当前环境温度数值。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验三十二 TEMT6000测试光线

实验说明

前面课程中,我们用光敏电阻传感器检测环境中光照。这一课程中我们主要用keyes TEMT6000光线传感器测试光线,测试方法类似。但是keyes TEMT6000光线传感器比光敏电阻传感器灵敏度高。

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

在这实验中,我们将keyes TEMT6000光线传感器的信号端接到micro:bit主板的P0,通过读取P0端的模拟值,检测环境中光线。我们将所测的模拟值在micro:bit主板上LED点阵或串口监视器上显示。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes TEMT6000光线传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传代码,上电,读取到信号端数据,光线越强,数据越大。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验三十三 自动浇花系统

实验说明

在生活中,我们养一些花花草草,总要不定时的给他们浇水,防止它们渴死,但是又不能多浇,这些都需要经验。那我们可不可以做一个系统,让机器自动在土壤干燥的时候浇水呢?

可以的,我们首先在单片机上连接一个keyes土壤传感器,它是用来检测土壤中的干湿度,然后又在单片机上连接一个继电器模块,在继电器模块的常开(NO)两端接上抽水泵和抽水泵电源。当检测到土壤过干时,单片机控制继电器开启,NO端连通,抽水泵电源给抽水泵供电,抽水泵开始工作,抽水,给花草浇水;当检测到土壤过湿时,单片机控制继电器关闭,NO端断开,抽水泵电源停止给抽水泵供电,抽水泵停止工作。

在这实验中,我们只是将keyes土壤传感器的信号端接到micro:bit主板的P0,通过读取P0端的模拟值,检测土壤干湿度,湿度越大,模拟值越大。我们将所测的模拟值在micro:bit主板上LED点阵或串口监视器上显示。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes土壤传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传代码,上电,读取到信号端数据,湿度越大,数据越大。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验三十四 水位报警系统

实验说明

在生活中,一遇到大雨,河流或者水库中水位暴涨,到达一定水位时,需要开闸泄洪,解决安全隐患。然而怎么检测河流或者水库中的水位呢?这就需要用到水位传感。

在这个实验中,我们用keyes 水位传感器来模拟检测水杯中的水位,并作出相应报警。我们将keyes 水位传感器的信号端接到micro:bit主板的P0,通过读取P0端的模拟值,检测水位高低,水位越高,模拟值越大。我们将所测的模拟值在micro:bit主板上LED点阵或串口监视器上显示,并且控制当水位到达一定高度时,外接有源蜂鸣器上蜂鸣器响起。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 水位传感器*1

keyes 有源蜂鸣器模块*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传程序,上电,读取到信号端数据,水位越高,数据越大。当模拟值大于400时,keyes 有源蜂鸣器模块上蜂鸣器响起。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验三十五 测试紫外线

实验说明

前面课程中,我们用光敏电阻传感器检测环境中光照。这一课程中我们主要用keyes GUVA-S12SD 3528 紫外线传感器测试光线中的紫外线。

它是一款测试紫外线的传感器,它包含GUVA-S12SD,可以广泛用于智能穿戴设备的紫外线指数检测,如带UV指数检测功能的手表,带UV指数检测的智能手机,户外检测UV指数设备等,还可以用于紫外线消毒时,用来监测紫外线强度、UV火焰探测器等。

在这实验中,我们将keyes GUVA-S12SD 3528 紫外线传感器信号端接到micro:bit主板的P0,通过读取P0端的模拟值,检测光线中紫外线。我们将所测的模拟值在micro:bit主板上LED点阵或串口监视器上显示。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes GUVA-S12SD 3528 紫外线传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传代码,上电,读取到信号端数据,紫外线含量越高,数据越大。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验三十六 空气中的水汽

实验说明

我们的生活被空气包含,空气中包含很多成分,有些是有用的,有些是有害的,有些成分对人体影响重大,有些成分对人体影响轻微。这个课程中我们用keyes 水滴水蒸气传感器来模拟检测空气中的水蒸气含量。当keyes 水滴水蒸气传感器表面的湿度上升,传感器信号端输出电压将增大。

在这实验中,我们将keyes 水滴水蒸气传感器信号端接到micro:bit主板的P0,通过读取P0端的模拟值,检测空气中水蒸气。我们将所测的模拟值在micro:bit主板上LED点阵或串口监视器上显示。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 水滴水蒸气传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传代码,上电,读取到信号端数据,空气中水蒸气含量越高,数据越大。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验三十七 检测压力

实验说明

前面课程中,我们用不同传感器检测了外界的各种信息,如温度、其他、光线、声音等等。这一课程中我们用Keyes 薄膜压力传感器来检测外界的压力。

它是基于新型纳米压敏材料辅以舒适杨式模量的超薄薄膜衬底一次性贴片而成,兼具防水和压敏双重功能。当传感器感知到外界压力时,传感器电阻值发生变化,然后我们通过电路把电阻变化转换测电压变化,然后在信号端输出。

在这实验中,我们将Keyes 薄膜压力传感器信号端接到micro:bit主板的P0,通过读取P0端的模拟值,模拟检测压力数值。我们将所测的模拟值在micro:bit主板上LED点阵或串口监视器上显示。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

Keyes 薄膜压力传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传代码,上电,读取到信号端数据,压力越大,数据越大。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验三十八 震动控灯

实验说明

这一课程中我们主要用到keyes 震动模块传感器,它是用来检测环境中的震动情况的传感器。keyes 震动模块传感器具有无方向性特性,任何角度均可以触发工作,完全密封式封装可以防水、防尘,适用于小电流电路的触发。

这个传感器接上电源后,在静止时为开路(OFF)状态,信号端输出为高电平,传感器上LED变暗;当受到外力碰触而达到适当震动力时,或移动速度达到适当离(偏)心力时,导电接脚会发生瞬间导通(ON)状态,使电气特性改变,信号端输出为低电平,传感器上LED变亮;而当外力消失时电气特性恢复开路(OFF)状态。

在这实验中,我们将keyes 震动模块传感器信号端接到micro:bit主板的P0,通过读取P0端的高低电平变化,控制一个LED模块上LED的亮灭。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 震动模块传感器*1

keyes 食人鱼LED白光模块*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传代码,上电,当keyes 震动模块传感器检测到震动信号时,keyes 食人鱼LED白光模块上LED亮起,否则熄灭。

实验三十九 摇杆模块的使用

实验说明

当我们在做DIY自己物品时,经常需要用到摇杆模块,如游戏手柄。那摇杆模块模块是怎么样工作的呢?

实际上摇杆模块有3个信号端接口,模拟3维空间,其中信号端X、Y模拟空间的X轴和Y轴,接单片机的模拟输入端口,通过控制2个模拟输入值,控制物体在空间X、Y轴的坐标;Z信号端B模拟空间Z轴,它一般接数字口,做按键使用。

在这实验中,我们将keyes 摇杆模块传感器的X Y信号端接到micro:bit主板的P0 P1,B信号端接到micro:bit主板的P2。我们将所测的数值在串口监视器上显示。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

keyes 摇杆模块传感器*1

杜邦线若干

接线图

测试代码

测试结果

按照接线图接好线,上传程序,上电后,我们就可以在串口监视器上看到显示结果(方法参考课程一),显示如下图。

实验四十 舵机的使用

实验说明

当我们在做DIY自己小车时,我们会经常让小车实现个自动避障的功能。在DIY过程中我们需要一个舵机控制超声波模块左右转动,然后检测小车与左右两方障碍物的距离,方便控制小车避障。

当我们在利用其它单片机控制舵机转动时,我们通过设置一定频率、一定宽度的脉冲来控制舵机角度。在利用micro bit主板控制舵机角度时,我们只需要在开发环境中设置控制角度就行了,开发环境中会自动设置对应脉冲,用于控制舵机转动。

在这实验中,我们控制SG90舵机转动,它的最大转动角度为90°,我们控制舵机在0°和90°之间来回转动。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

SG90舵机*1

接线图

测试代码

测试结果

按照接线图接好线,上传代码,上电后,我们就可以看到舵机在0°到90°之间来回转动。

实验四十一 添加一个显示器

实验说明

在生活中,我们可以用显示屏和其他传感器做各种各样的实验,可以DIY各种各样的小物品,如利用温度模块和显示屏可以做一个温度测试仪,利用超声波模块和显示屏可以做一个距离测试仪。

在这里,我们利用一个1602 I2C LCD当做显示屏,它是1602 LCD,可以显示两行,每行16个字符,它利用I2C通信方式。

在这实验中,我们将1602 I2C LCD接到扩展板上I2C通信接口。micro:bit主板I2C通信接口可以参照micro:bit 引脚说明,其中SDA接口为P20,SCL接口为P19。课程中我们让显示屏上第一行显示“Keyes”字符,第二行显示数字,每过1秒,数字加1。

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

1602 I2C LCD*1

杜邦线若干

接线图

测试代码

利用库文件设置代码

在下图模块搜索https://github.com/xuefengedu/pxt-lcd1602_CNsonar

点击下图自动下载库文件了,然后在编辑代码栏目里看到对应模块。

库文件链接为:https://github.com/xuefengedu/pxt-lcd1602_CN

测试结果

按照接线图接好线,上传好代码,上电后,显示屏上第一行显示“Keyes”字符,第二行显示数字,每过1秒,数字加1。

注意:按照接线图接好线,上传好代码,上电后,显示屏没有字符显示时,可以调节

LCD后面的电位器,调节背光,使LCD显示对应字符。

实验四十二 DHT11温湿度测试

实验说明

前面课程中我们介绍了1602 I2C LCD,介绍中说明我们可以将LCD和一些传感器搭配使用,组成一个完整的测试仪。这一课程中,我们将LCD和keyes DHT11温湿度传感器搭配,做一个温湿度测试仪。我们利用keyes DHT11温湿度传感器测试当前环境中的温湿度,并将结果在LCD上显示出来。

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

实验器材

micro:bit主板*1

keyes micro bit 传感器V2扩展板*1

USB线*1

1602 I2C LCD*1

keyes DHT11温湿度传感器*1

杜邦线若干

接线图

测试代码

利用库文件设置代码

在下图模块搜索DHT11

点击下图自动下载库文件了,然后在编辑代码栏目里看到对应模块。

测试结果

按照接线图接好线,上传好代码,上电后,我们就可以在1602 I2C LCD上看到当前环境中的温湿度数值了。

注意:按照接线图接好线,上传好代码,上电后,显示屏没有字符显示时,可以调节

LCD后面的电位器,调节背光,使LCD显示对应字符。

8、相关资料链接

分类
Micro:Bit系列

KE0123 microbit 学习套装

ffg

目录

1. 产品说明 3

2. 产品清单 3

3. micro:bit 驱动安装方法 7

4. micro:bit 使用方法 8

5. micro:bit 引脚说明 10

6. micro bit元件和接口说明 11

7. 实验课程 12

实验一 Hello world! 12

实验二 自带按键控制点阵 15

实验三 测试micro bit自带加速度计和电子罗盘 16

实验四 自带温度传感器测试温度 18

实验五 板载蓝牙测试 19

实验六 LED闪烁实验 27

实验七 广告灯实验 29

实验八 按键控制LED实验 31

实验九 抢答器实验 32

实验十 呼吸灯实验 33

实验十一 电位器调控灯光亮度实验 35

实验十二 RGB灯闪烁实验 36

实验十三 感光灯实验 39

实验十四 有源蜂鸣器实验 40

实验十五 无源蜂鸣器实验 42

实验十六 电位器调控舵机转动实验 44

实验十七 火焰报警实验 45

实验十八 一位数码管显示实验 47

实验十九 魔术光杯实验 49

实验二十 micro bit 模拟量的读取 52

实验二十一 热敏电阻传感器实验 54

实验二十二 LM35 温度传感器实验 56

8. 相关资料链接 58

1. 产品说明

Micro bit是一款由英国BBC 设计的ARM架构的单片机。它仅有信用卡一半大小,板载蓝牙,加速度计,电子罗盘,三个按钮,5 x 5 LED点阵,主要用于青少年的编程教育。

为了方便学习micro bit单片机和一些基础电子知识,我们特别搭配了这个套件。套件主要包含一个micro bit控制板和与控制板搭配使用的配件。其中套机里电池盒里需安装两个1.5V的电池,电池盒上自带拨码开关;使用时可直接连接micro bit控制板供电,电池盒的拨码开关作为电源控制开关。

同时,我们还根据micro bit控制板和相关配件,设计一些特定的学习课程,课程包含接线方法,测试代码等,让你对micro bit单片机和电子知识有个更深刻的认识。

2. 产品清单

编码 规格型号 数量 图片
1 micro:bit主板 黑色 1 1
2 Micro USB线 1米 1 3
3 带开关和接线电池盒 1 2
4 面包板连接线30根 环保 1 21
5 400孔 ZY-60白色 面包板 1 3
6 micro bit T型扩展板 1 8
7 电阻卡 1 9
8 一位数码管 0.56英寸共阴红 1 7
9 SG90 9G 蓝色辉盛 90度 舵机 23*12.2*29mm 1 10
10 有源蜂鸣器 1 15
11 无源蜂鸣器 1 16
12 12*12*7.3MM

插件轻触开关

2
13 A24 黄帽 按键帽 2
14 金属膜色环 1/4W 1% 220R 编带 环保 10  
15 金属膜色环 1/4W 1% 1K 编带 10
16 金属膜色环 1/4W 1% 10K 编带 环保 10
17 F5-红发红-短 环保 5
18 F5-黄发黄-短 环保 5
19 F5-蓝发蓝-短 环保 5
20 F5-绿发绿-短 环保 5 图层 24
21 F5-全彩RGB透明共阴 环保 1 20
22 10K 可调电位器

针长6.5MM 环保

1 6
23 5516 亮电阻5-10KΩ 暗电阻0.2MΩ 光敏电阻 3 18
24 5MM 103 阻值 10K

热敏电阻

1 12
25 LM35DZ 原装 1 13
26 红外接收 5MM 火焰 环保 1 11
27 AETHDX-2801

滚珠开关 环保

2 14

3. micro:bit 驱动安装方法

下面我们给micro:bit开发板安装驱动。首先将micro:bit开发板用USB线连接到电脑上,然后双击驱动文件 mbed USB 2020,点击Install。

driver 1

继续点击Install,安装驱动。

driver 2

点击Finish,安装完成。

driver 4

安装完成后。

点击“Computer” —>“Properties”—> “Device manager”,我们可以看到下图。

driver 5

4. micro:bit 使用方法

micro: bit的编程环境有在线编程工具和本地编程工具两种,这里我们介绍下在谷歌浏览器的编程方法。首先在谷歌浏览器中打开https://makecode.microbit.org/网站进入编程环境。利用网站上模块,开始图形化编程,如下图。

点击JavaScript,你可以看到对应的程序代码,如下图。

将程序命名为LED1,并保存,如下图。

保存或,并在C盘中找到对应文件,如下图。

将micro: bit用USB接到电脑上,然后在C盘找到microbit-LED1文件,并发送到MICROBIT(G)上,就完成程序上传了。

程序上传后,给micro: bit上电后,micro: bit上5 x 5 LED点阵显示对应图案。供电方法有两种,一是直接通过USB线供电;二是用电池盒供电,电池盒接2个1.5V的5号电池,如下图。

1(3) MB0098 micro:bit主板 黑色

USB线供电 电池盒供电

5. micro:bit 引脚说明

在我们开始试验之前,我们需要对micro bit主板的各个引脚需要由一定的了解,具体信息参照下图。

microbit-pins

详细信息请参考官方网站:https://microbit.org/guide/hardware/pins/

6. micro bit元件和接口说明

7. 实验课程

实验一 Hello world!

实验说明

首先先来学习micro:bit主板串口通信功能,只需要一块micro bit主板和一根USB线的简单实验,让我们的micro bit主板说出“Hello World!”,这是一个让micro bit主板和PC 机通信的实验,这也是一个入门试验,希望可以带领大家进入micro bit的世界。

实验中我们要用到一个串口通讯软件,这里我们用的是Arduino IDE。

测试代码

Arduino IDE安装方法

Double click arduino-1.5.6-r2-windows to start.

Select “I Agree”to accept license agreement.

C:\Users\keyess\Desktop\tu\8.png

Select components to install and click “Next”.

C:\Users\keyess\Desktop\tu\9.png

Click “Browse” and select another folder. Click “Install” to start the installation.

C:\Users\keyess\Desktop\tu\10.png

Finally, wait for a few minutes to finish.

C:\Users\keyess\Desktop\tu\11.png

测试结果

将micro bit用micro USB线接在电脑上,上传好代码,打开Arduino IDE,设置要COM口。打开串口监视器,设置波特率为115200(经过测试,micro:bit的USB串口通讯波特率是115200),在串口监视器中输入 “R”字符,点击Send,串口监视器中输出“Hello world!”字符,如下图。

实验二 自带按键控制点阵

实验说明

在micro bit控制板上自带3个按键,其中一个是复位按键,另外两个AB按键作为控制按键。在这一课程中,我们利用控制板自带的两个按键,控制控制板自带的LED点阵。

在这一课程中,我们利用两个测试代码测试,一种是不带循环,一种是带有循环程序。

测试代码

代码1:

microbit-screenshot (7)

代码2:

microbit-screenshot (6)

测试结果

上传好代码1,上电后,按下按键A,控制板LED点阵显示心形;按下按键B,控制板LED点阵显示倒立心形;按下按键A和按键B,控制板LED点阵显示另外图案。

上传好代码2,上电后,按下按键A,控制板LED点阵显示心形;按下按键B,控制

板LED点阵显示倒立心形;按下按键A和按键B,控制板LED点阵循环显示3种图案。

实验三 测试micro bit自带加速度计和电子罗盘

实验说明

在micro bit控制板上自带加速度计和电子罗盘,我们可以利用控制板上该元件测试控制板当前的状态,测试出控制板当前的3轴加速度。

在这一课程中,我们完成两个实验,实验一,是利用控制板加速度计和电子罗盘控制LED点阵显示不同图案;实验二是直接测试出控制板的3轴加速度,并在点阵和串口监视器上显示。

测试代码

代码1:

microbit-screenshot (12)

代码2:

测试结果

上传好代码1,上电后,当我们移动控制板,使控制板金手指朝上时,控制板显示第1个图案;移动控制板,使控制板金手指朝下时,控制板显示第2个图案;水平放置控制板,使控制板点阵朝上时,点阵显示第3个图案;水平放置控制板,使控制板点阵朝下时,点阵显示第4个图案;晃动控制板,控制板震动时,点阵显示第5个图案;向左倾斜控制板时,点阵显示第6个图案;向右倾斜控制板时,点阵显示第7个图案。

上传好代码2,利用micro USB线上电后,我们可以测试出控制板的X Y Z 3轴加速度值,单位为mg。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用Arduino IDE软件串口监视器上看到显示结果,显示如下图。

实验四 自带温度传感器测试温度

实验说明

在micro bit控制板上自带一个温度传感器。在这一课程中,我们利用该传感器测试当前环境中的温度,并将测试结果在控制板自带点阵显示。

测试代码

测试结果

上传好代码,利用micro USB线上电后,我们可以测试出当前环境中的温度值,单位为℃。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用Arduino IDE软件串口监视器上看到显示结果,显示如下图。

实验五 板载蓝牙测试

实验说明

在micro bit控制板自带蓝牙,我们可以通过连接蓝牙,实现无线传输代码功能。试验中,我们利用一个苹果ipad,和micro bit连接,实现无线传输代码功能。安卓系统手机实现无线传输代码方法和苹果ipad类似,这里就不一一介绍了。

试验步骤

1.在App Store中搜索micro:bit,安装对应APP。

2.iPad和micro bit控制板配对连接。

a. APP安装成功后,点击 打开APP,给micro bit控制板上电,选择APP第一

项开始配对蓝牙。

b.点击配对一个新的micro:bit开始配对。

c.根据提示,首先按下micro bit控制板A B按键,然后按下复位按键,然后再松开复

位按键,micro bit控制板上LED点阵会最终显示一个图案。点击下一步。

d.在iPad上设置图案,使图案和micro bit控制板上 显示的图案一样,点击下一步。

e.点击下一步配对,配对成功。

3.连接成功后,开始利用APP编写上传代码。

a.选择第二项,开始编写程序,编写程序OK。

b.点击 ,选择第一项开始课程设置。

c.选择设置第一项,保存设置。

d.点击 图案,设置代码名称,并保存。

e.保存成功,直接开始上传程序,默认选择程序是刚开始保存的程序。

特别注意:上传代码时,需要参考第二步c小步方法,使LED点阵显示密码图案,

才能上传程序成功。

f.程序上传成功,显示如下图。

实验六 LED闪烁实验

实验说明

LED 闪烁实验是比较基础的实验之一,在使用方法中,我们控制的是micro: bit自带的5 x 5 LED点阵。在这个实验中我们利用外接直插LED 灯来完成LED 闪烁实验,实验中我们先关闭5 x 5 LED点阵功能。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

6

测试代码

microbit-screenshot

测试结果

上传完代码,上电后,我们就可以看到IO口外接小灯在闪烁了,实验现象为LED不停闪烁,间隔大约为0.5秒。

实验七 广告灯实验

实验说明

在生活中我们经常会看到一些由各种颜色的led灯组成的广告牌,广告牌上各个位置上癿led灯不断的变话,形成各种效果。本节实验就是利用led灯编程模拟广告灯效果。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*5

220Ω 电阻*5

面包板*1

面包板连接线若干

接线图

测试代码

microbit-screenshot (1)

测试结果

上传完代码,上电后,我们就可以看到IO口外接小灯先逐个变亮,然后逐个变暗,循环交替。

实验八 按键控制LED实验

实验说明

Micro bit自带3个按键,其中2个用户按键和1个复位按键。本实验中,我们只是利用一个micro bit自带的用户按键控制一个外接的LED的亮和灭。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

8

测试代码

microbit-screenshot (2)

测试结果

下载完代码,上电后,当按下micro bit板A按键时小灯亮起,否则小灯不亮。

实验九 抢答器实验

实验说明

上面上面实验中我们用micro bit自带的按键控制LED灯,这个实验它扩展下,做一个抢答器实验。实验中我们用一个自带的按键当做复位按键,另外外接两个轻触按键当做抢答按键,用于控制两个外接的LED灯。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*2

轻触按键*2

220Ω 电阻*2

10KΩ 电阻*2

面包板*1

面包板连接线若干

接线图

9

测试代码

microbit-screenshot (3)

测试结果

下载完代码,上电后,一个简单的抢答器就做好了,我们根据LED灯显示的颜色判断是谁抢答成功。在按下micro bit板A按键复位后,两个LED灯关闭。

实验十 呼吸灯实验

实验说明

上面实验中我们控制LED的亮灭,这个实验中我们利用代码控制LED的亮度,实验中我们模拟呼吸情况,控制灯逐渐亮起和逐渐熄灭。实验中我们分别控制micro bit上5 x 5 LED点阵上LED和外接LED实现呼吸灯的功能,其中外接LED需接在模拟口上。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

10

测试代码

点阵LED

microbit-screenshot (4)

外接LED

microbit-screenshot (5)

测试结果

下载完代码,上电后,LED逐渐变暗和逐渐变亮,循环交替,如呼吸一样。

实验十一 电位器调控灯光亮度实验

实验说明

在上面实验中我们直接在代码中控制LED的亮度,在这个实验中我们用电位器来调节LED的亮度。实验中外接LED和电位器接口都必须接在模拟口上。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*1

220Ω 电阻*1

可调电位器*1

面包板*1

面包板连接线若干

接线图

11

测试代码

microbit-screenshot (6)

测试结果

上传代码,上电后,我们可以通过旋转可调电位器调节外接LED的亮度。

实验十二 RGB灯闪烁实验

实验说明

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

这个实验中我们用一个RGB灯,通过控制R、 G、 B三个引脚的电压输入可以调节三种基色(红/蓝/绿)的强度,从而实现全彩的混色效果。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

F5-全彩RGB透明共阴*1

面包板*1

面包板连接线若干

接线图

12

测试代码

microbit-screenshot (7)

测试结果

按照上图接好线,上传好代码,上电后,RGB灯会陆续显示红色1S,绿色1S,蓝色1S,黄色1S,紫色1S,白色1S,然后循环交替。

实验十三 感光灯实验

实验说明

本次实验我们先进行一个较为简单的光敏电阻的使用实验。光敏电阻可以根据光强改变阻值的元件,本实验可以借鉴电位器调控灯光亮度实验,将电位计换做光敏电阻实现当光强不同时LED 小灯的亮度也会有相应的变化。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*1

220Ω 电阻*1

5MM 光敏电阻*1

10KΩ 电阻*1

面包板*1

面包板连接线若干

接线图

13

测试代码

microbit-screenshot (8)

测试结果

上传完程序,上电后,光敏电阻感应到灯光越亮,小灯越暗;光敏电阻感应到灯光越暗,小灯越亮。

实验十四 有源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了有源蜂鸣器,有源蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号。实验中中我们只需要给蜂鸣器输入一个高电平信号,蜂鸣器响起。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

有源蜂鸣器*1

面包板*1

面包板连接线若干

接线图

14

测试代码

microbit-screenshot (9)

测试结果

上传完代码,上电后,我们可以听到蜂鸣器响0.5秒,停止响起0.5秒,循环交替。

实验十五 无源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了无源蜂鸣器,无源蜂鸣器内部不带振荡源,直流信号无法令其鸣叫,须用方波驱动。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

无源蜂鸣器*1

面包板*1

面包板连接线若干

接线图

15

测试代码

microbit-screenshot (10)

测试结果

上传完代码,上电后,我们可以听到蜂鸣器会想响起《欢乐颂》的曲子。

实验十六 电位器调控舵机转动实验

实验说明

舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测 器所构成。舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红、橙三种颜色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极线,橙色为信号线。

S

VCC

GND

这个实验中,我们用一个电位器调节一个舵机的转动角度,旋转电位器时,舵机也随之转动。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

9G 舵机*1

可调电位器*1

面包板*1

面包板连接线若干

接线图

16

测试代码

microbit-screenshot (11)

测试结果

上传代码,上电后,我们可以通过旋转可调电位器调节舵机的转动角度。

实验十七 火焰报警实验

实验说明

火焰传感器是机器人专门用来搜寻火源的传感器,本传感器对火焰特别灵敏。火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号。

实验中,我们把火焰的亮度转化为高低变化的电平信号输入到micro bit主板中,然后控制蜂鸣器的响起。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

火焰传感器*1

有源蜂鸣器*1

10KΩ 电阻*1

面包板*1

面包板连接线若干

接线图

火焰传感器连接方法

实验12-1

17

测试代码

microbit-screenshot (12)

测试结果

上传代码,上电后,当火焰传感器检测到附近有火焰时,有源蜂鸣器响起,否则有源蜂鸣器不响。

实验十八 一位数码管显示实验

实验说明

数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),本实验所使用的是八段数码管。数码管共有七段显示数字的段,还有一个显示小数点的段。当让数码管显示数字时,只要将相应的段点亮即可。

这个实验中我们用了一个共阴极八段数码管,把a接到了micro bit主板的P13,b接到了P14,c接到了P8,d接到了P9,e接到了P10,f接到了P12,g接到了P11,h接到了P7,只要控制对应接口的高低电平,即可控制数码管的显示。实验中,我们让数码管逐渐显示0-9 10个数字。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

一位数码管*1

面包板*1

面包板连接线若干

接线图

18

测试代码

microbit-screenshot (13)

测试结果

上传代码,上电后,数码管循环显示0~9 10个数字。

实验十九 魔术光杯实验

实验说明

倾斜开关的工作原理是当开关一端低于水平位置倾斜,开关寻通;当另一端低于水平位置倾斜 ,开关停止。魔术光杯实验原理是利用模拟值调光的原理,两个LED的亮度发生变化。

这个实验中倾斜开关提供数字信号,触发模拟值的调节,通过程序的设计,我们就能看到类似于两组装满光的杯子倒来倒去的效果了。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

滚珠开关*2

LED*2

10KΩ 电阻*2

面包板*1

面包板连接线若干

接线图

19

测试代码

microbit-screenshot (14)

测试结果

按照上图接好线,上传好代码,上电后,将两个倾斜开关同时倾斜一边, 一个LED逐渐变暗,同时另一个逐渐变亮,最终一个LED完全熄灭,一个LED最亮。

实验二十 micro bit 模拟量的读取

实验说明

玩过Arduino的朋友都知道,有数字口(D口)和模拟口(A口),分的非常清楚。

在micro:bit中,我们通过引脚说明图也能看清哪几个引脚是支持模拟量读取的。我们

看下图。

TB2DIJTqO0TMKJjSZFNXXa_1FXa_!!143813255

这个实验中我们用一个可调电位器调节P2的模拟量,旋转点位器时,模拟量发生变化,并在串口监视器上显示出来。实验中我们要用到一个串口通讯软件,这里我们用的是Arduino IDE。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

可调电位器*1

面包板*1

面包板连接线若干

接线图

20

测试代码

测试结果

按照上图接好线,上传好代码,上电后,打开Arduino IDE,设置要COM口。打开串口监视器,设置波特率为115200(经过测试,micro:bit的USB串口通讯波特率是115200),串口监视器显示对应数值,旋转可调电位器,数值变化,发现最大是1023,最小是1,如下图。

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

实验说明

热敏电阻能够实时感知周边环境温度的变化,随着温度变化,热敏电阻也发生变化。实验中,我们搭配好电路,把温度变化转换成电压变化,将对应的电压输入到micro bit主板的P2上。实验中我们把P2的模拟量在串口监视器上显示出来。实验中我们要用到一个串口通讯软件,这里我们用的是Arduino IDE。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

5MM 103 阻值 10K 绿色*1

10KΩ 电阻*1

面包板*1

面包板连接线若干

接线图

21

测试代码

测试结果

按照上图接好线,上传好代码,上电后,打开Arduino IDE,设置要COM口。打开串口监视器,设置波特率为115200(经过测试,micro:bit的USB串口通讯波特率是115200),串口监视器显示对应数值,当温度升高,电阻减小,模拟值增大;当人体对准温度电阻呼气时,温度升高,显示如下图。

实验二十二 LM35 温度传感器实验

实验说明

LM35 是很常用且易用的温度传感器元件,在元器件的应用上也只需要一个LM35元件,只利用一个模拟接口就可以测出当前温度。它的输出电压与摄氏温标呈线性关系,转换公式如式,0时输出为0V,每升高1℃,输出电压增加10mV。

实验中我们将它的输出电压输入到micro bit主板的P2上,而后通过相关公式计算出当前环境中的温度值,并在串口监视器上显示出来。实验中我们要用到一个串口通讯软件,这里我们用的是Arduino IDE。实验时,需特别注意LM35的方向,如若接反,会把LM35传感器烧毁,接口方向如下。

LM35

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LM35DZ*1

面包板*1

面包板连接线若干

接线图

22

测试代码

测试结果

按照上图接好线,上传好代码,上电后,打开Arduino IDE,设置要COM口。打开串口监视器,设置波特率为115200(经过测试,micro:bit的USB串口通讯波特率是115200),串口监视器显示当前环境中的温度值,如下图。

相关资料链接

microbit 学习套装

ffg

目录

1. 产品说明 3

2. 产品清单 3

3. micro:bit 驱动安装方法 7

4. micro:bit 使用方法 8

5. micro:bit 引脚说明 10

6. micro bit元件和接口说明 11

7. 实验课程 12

实验一 Hello world! 12

实验二 自带按键控制点阵 15

实验三 测试micro bit自带加速度计和电子罗盘 16

实验四 自带温度传感器测试温度 18

实验五 板载蓝牙测试 19

实验六 LED闪烁实验 27

实验七 广告灯实验 29

实验八 按键控制LED实验 31

实验九 抢答器实验 32

实验十 呼吸灯实验 33

实验十一 电位器调控灯光亮度实验 35

实验十二 RGB灯闪烁实验 36

实验十三 感光灯实验 39

实验十四 有源蜂鸣器实验 40

实验十五 无源蜂鸣器实验 42

实验十六 电位器调控舵机转动实验 44

实验十七 火焰报警实验 45

实验十八 一位数码管显示实验 47

实验十九 魔术光杯实验 49

实验二十 micro bit 模拟量的读取 52

实验二十一 热敏电阻传感器实验 54

实验二十二 LM35 温度传感器实验 56

8. 相关资料链接 58

1. 产品说明

Micro bit是一款由英国BBC 设计的ARM架构的单片机。它仅有信用卡一半大小,板载蓝牙,加速度计,电子罗盘,三个按钮,5 x 5 LED点阵,主要用于青少年的编程教育。

为了方便学习micro bit单片机和一些基础电子知识,我们特别搭配了这个套件。套件主要包含一个micro bit控制板和与控制板搭配使用的配件。其中套机里电池盒里需安装两个1.5V的电池,电池盒上自带拨码开关;使用时可直接连接micro bit控制板供电,电池盒的拨码开关作为电源控制开关。

同时,我们还根据micro bit控制板和相关配件,设计一些特定的学习课程,课程包含接线方法,测试代码等,让你对micro bit单片机和电子知识有个更深刻的认识。

2. 产品清单

编码 规格型号 数量 图片
1 micro:bit主板 黑色 1 1
2 Micro USB线 1米 1 3
3 带开关和接线电池盒 1 2
4 面包板连接线30根 环保 1 21
5 400孔 ZY-60白色 面包板 1 3
6 micro bit T型扩展板 1 8
7 电阻卡 1 9
8 一位数码管 0.56英寸共阴红 1 7
9 SG90 9G 蓝色辉盛 90度 舵机 23*12.2*29mm 1 10
10 有源蜂鸣器 1 15
11 无源蜂鸣器 1 16
12 12*12*7.3MM

插件轻触开关

2
13 A24 黄帽 按键帽 2
14 金属膜色环 1/4W 1% 220R 编带 环保 10 4 4
15 金属膜色环 1/4W 1% 1K 编带 10 4 4
16 金属膜色环 1/4W 1% 10K 编带 环保 10 4 4
17 F5-红发红-短 环保 5 17
18 F5-黄发黄-短 环保 5 17
19 F5-蓝发蓝-短 环保 5 17
20 F5-绿发绿-短 环保 5 图层 24
21 F5-全彩RGB透明共阴 环保 1 20
22 10K 可调电位器

针长6.5MM 环保

1 6
23 5516 亮电阻5-10KΩ 暗电阻0.2MΩ 光敏电阻 3 18
24 5MM 103 阻值 10K

热敏电阻

1 12
25 LM35DZ 原装 1 13
26 红外接收 5MM 火焰 环保 1 11
27 AETHDX-2801

滚珠开关 环保

2 14

3. micro:bit 驱动安装方法

下面我们给micro:bit开发板安装驱动。首先将micro:bit开发板用USB线连接到电脑上,然后双击驱动文件 mbed USB 2020,点击Install。

driver 1

继续点击Install,安装驱动。

driver 2

点击Finish,安装完成。

driver 4

安装完成后。

点击“Computer” —>“Properties”—> “Device manager”,我们可以看到下图。

driver 5

4. micro:bit 使用方法

micro: bit的编程环境有在线编程工具和本地编程工具两种,这里我们介绍下在谷歌浏览器的编程方法。首先在谷歌浏览器中打开https://makecode.microbit.org/网站进入编程环境。利用网站上模块,开始图形化编程,如下图。

点击JavaScript,你可以看到对应的程序代码,如下图。

将程序命名为LED1,并保存,如下图。

保存或,并在C盘中找到对应文件,如下图。

将micro: bit用USB接到电脑上,然后在C盘找到microbit-LED1文件,并发送到MICROBIT(G)上,就完成程序上传了。

程序上传后,给micro: bit上电后,micro: bit上5 x 5 LED点阵显示对应图案。供电方法有两种,一是直接通过USB线供电;二是用电池盒供电,电池盒接2个1.5V的5号电池,如下图。

1(3) MB0098 micro:bit主板 黑色

USB线供电 电池盒供电

5. micro:bit 引脚说明

在我们开始试验之前,我们需要对micro bit主板的各个引脚需要由一定的了解,具体信息参照下图。

microbit-pins

详细信息请参考官方网站:https://microbit.org/guide/hardware/pins/

6. micro bit元件和接口说明

7. 实验课程

实验一 Hello world!

实验说明

首先先来学习micro:bit主板串口通信功能,只需要一块micro bit主板和一根USB线的简单实验,让我们的micro bit主板说出“Hello World!”,这是一个让micro bit主板和PC 机通信的实验,这也是一个入门试验,希望可以带领大家进入micro bit的世界。

实验中我们要用到一个串口通讯软件,这里我们用的是Arduino IDE。

测试代码

Arduino IDE安装方法

Double click arduino-1.5.6-r2-windows to start.

Select “I Agree”to accept license agreement.

C:\Users\keyess\Desktop\tu\8.png

Select components to install and click “Next”.

C:\Users\keyess\Desktop\tu\9.png

Click “Browse” and select another folder. Click “Install” to start the installation.

C:\Users\keyess\Desktop\tu\10.png

Finally, wait for a few minutes to finish.

C:\Users\keyess\Desktop\tu\11.png

测试结果

将micro bit用micro USB线接在电脑上,上传好代码,打开Arduino IDE,设置要COM口。打开串口监视器,设置波特率为115200(经过测试,micro:bit的USB串口通讯波特率是115200),在串口监视器中输入 “R”字符,点击Send,串口监视器中输出“Hello world!”字符,如下图。

实验二 自带按键控制点阵

实验说明

在micro bit控制板上自带3个按键,其中一个是复位按键,另外两个AB按键作为控制按键。在这一课程中,我们利用控制板自带的两个按键,控制控制板自带的LED点阵。

在这一课程中,我们利用两个测试代码测试,一种是不带循环,一种是带有循环程序。

测试代码

代码1:

microbit-screenshot (7)

代码2:

microbit-screenshot (6)

测试结果

上传好代码1,上电后,按下按键A,控制板LED点阵显示心形;按下按键B,控制板LED点阵显示倒立心形;按下按键A和按键B,控制板LED点阵显示另外图案。

上传好代码2,上电后,按下按键A,控制板LED点阵显示心形;按下按键B,控制

板LED点阵显示倒立心形;按下按键A和按键B,控制板LED点阵循环显示3种图案。

实验三 测试micro bit自带加速度计和电子罗盘

实验说明

在micro bit控制板上自带加速度计和电子罗盘,我们可以利用控制板上该元件测试控制板当前的状态,测试出控制板当前的3轴加速度。

在这一课程中,我们完成两个实验,实验一,是利用控制板加速度计和电子罗盘控制LED点阵显示不同图案;实验二是直接测试出控制板的3轴加速度,并在点阵和串口监视器上显示。

测试代码

代码1:

microbit-screenshot (12)

代码2:

测试结果

上传好代码1,上电后,当我们移动控制板,使控制板金手指朝上时,控制板显示第1个图案;移动控制板,使控制板金手指朝下时,控制板显示第2个图案;水平放置控制板,使控制板点阵朝上时,点阵显示第3个图案;水平放置控制板,使控制板点阵朝下时,点阵显示第4个图案;晃动控制板,控制板震动时,点阵显示第5个图案;向左倾斜控制板时,点阵显示第6个图案;向右倾斜控制板时,点阵显示第7个图案。

上传好代码2,利用micro USB线上电后,我们可以测试出控制板的X Y Z 3轴加速度值,单位为mg。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用Arduino IDE软件串口监视器上看到显示结果,显示如下图。

实验四 自带温度传感器测试温度

实验说明

在micro bit控制板上自带一个温度传感器。在这一课程中,我们利用该传感器测试当前环境中的温度,并将测试结果在控制板自带点阵显示。

测试代码

测试结果

上传好代码,利用micro USB线上电后,我们可以测试出当前环境中的温度值,单位为℃。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用Arduino IDE软件串口监视器上看到显示结果,显示如下图。

实验五 板载蓝牙测试

实验说明

在micro bit控制板自带蓝牙,我们可以通过连接蓝牙,实现无线传输代码功能。试验中,我们利用一个苹果ipad,和micro bit连接,实现无线传输代码功能。安卓系统手机实现无线传输代码方法和苹果ipad类似,这里就不一一介绍了。

试验步骤

1.在App Store中搜索micro:bit,安装对应APP。

2.iPad和micro bit控制板配对连接。

a. APP安装成功后,点击 打开APP,给micro bit控制板上电,选择APP第一

项开始配对蓝牙。

b.点击配对一个新的micro:bit开始配对。

c.根据提示,首先按下micro bit控制板A B按键,然后按下复位按键,然后再松开复

位按键,micro bit控制板上LED点阵会最终显示一个图案。点击下一步。

d.在iPad上设置图案,使图案和micro bit控制板上 显示的图案一样,点击下一步。

e.点击下一步配对,配对成功。

3.连接成功后,开始利用APP编写上传代码。

a.选择第二项,开始编写程序,编写程序OK。

b.点击 ,选择第一项开始课程设置。

c.选择设置第一项,保存设置。

d.点击 图案,设置代码名称,并保存。

e.保存成功,直接开始上传程序,默认选择程序是刚开始保存的程序。

特别注意:上传代码时,需要参考第二步c小步方法,使LED点阵显示密码图案,

才能上传程序成功。

f.程序上传成功,显示如下图。

实验六 LED闪烁实验

实验说明

LED 闪烁实验是比较基础的实验之一,在使用方法中,我们控制的是micro: bit自带的5 x 5 LED点阵。在这个实验中我们利用外接直插LED 灯来完成LED 闪烁实验,实验中我们先关闭5 x 5 LED点阵功能。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

6

测试代码

microbit-screenshot

测试结果

上传完代码,上电后,我们就可以看到IO口外接小灯在闪烁了,实验现象为LED不停闪烁,间隔大约为0.5秒。

实验七 广告灯实验

实验说明

在生活中我们经常会看到一些由各种颜色的led灯组成的广告牌,广告牌上各个位置上癿led灯不断的变话,形成各种效果。本节实验就是利用led灯编程模拟广告灯效果。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*5

220Ω 电阻*5

面包板*1

面包板连接线若干

接线图

测试代码

microbit-screenshot (1)

测试结果

上传完代码,上电后,我们就可以看到IO口外接小灯先逐个变亮,然后逐个变暗,循环交替。

实验八 按键控制LED实验

实验说明

Micro bit自带3个按键,其中2个用户按键和1个复位按键。本实验中,我们只是利用一个micro bit自带的用户按键控制一个外接的LED的亮和灭。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

8

测试代码

microbit-screenshot (2)

测试结果

下载完代码,上电后,当按下micro bit板A按键时小灯亮起,否则小灯不亮。

实验九 抢答器实验

实验说明

上面上面实验中我们用micro bit自带的按键控制LED灯,这个实验它扩展下,做一个抢答器实验。实验中我们用一个自带的按键当做复位按键,另外外接两个轻触按键当做抢答按键,用于控制两个外接的LED灯。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*2

轻触按键*2

220Ω 电阻*2

10KΩ 电阻*2

面包板*1

面包板连接线若干

接线图

9

测试代码

microbit-screenshot (3)

测试结果

下载完代码,上电后,一个简单的抢答器就做好了,我们根据LED灯显示的颜色判断是谁抢答成功。在按下micro bit板A按键复位后,两个LED灯关闭。

实验十 呼吸灯实验

实验说明

上面实验中我们控制LED的亮灭,这个实验中我们利用代码控制LED的亮度,实验中我们模拟呼吸情况,控制灯逐渐亮起和逐渐熄灭。实验中我们分别控制micro bit上5 x 5 LED点阵上LED和外接LED实现呼吸灯的功能,其中外接LED需接在模拟口上。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

10

测试代码

点阵LED

microbit-screenshot (4)

外接LED

microbit-screenshot (5)

测试结果

下载完代码,上电后,LED逐渐变暗和逐渐变亮,循环交替,如呼吸一样。

实验十一 电位器调控灯光亮度实验

实验说明

在上面实验中我们直接在代码中控制LED的亮度,在这个实验中我们用电位器来调节LED的亮度。实验中外接LED和电位器接口都必须接在模拟口上。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*1

220Ω 电阻*1

可调电位器*1

面包板*1

面包板连接线若干

接线图

11

测试代码

microbit-screenshot (6)

测试结果

上传代码,上电后,我们可以通过旋转可调电位器调节外接LED的亮度。

实验十二 RGB灯闪烁实验

实验说明

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

这个实验中我们用一个RGB灯,通过控制R、 G、 B三个引脚的电压输入可以调节三种基色(红/蓝/绿)的强度,从而实现全彩的混色效果。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

F5-全彩RGB透明共阴*1

面包板*1

面包板连接线若干

接线图

12

测试代码

microbit-screenshot (7)

测试结果

按照上图接好线,上传好代码,上电后,RGB灯会陆续显示红色1S,绿色1S,蓝色1S,黄色1S,紫色1S,白色1S,然后循环交替。

实验十三 感光灯实验

实验说明

本次实验我们先进行一个较为简单的光敏电阻的使用实验。光敏电阻可以根据光强改变阻值的元件,本实验可以借鉴电位器调控灯光亮度实验,将电位计换做光敏电阻实现当光强不同时LED 小灯的亮度也会有相应的变化。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LED*1

220Ω 电阻*1

5MM 光敏电阻*1

10KΩ 电阻*1

面包板*1

面包板连接线若干

接线图

13

测试代码

microbit-screenshot (8)

测试结果

上传完程序,上电后,光敏电阻感应到灯光越亮,小灯越暗;光敏电阻感应到灯光越暗,小灯越亮。

实验十四 有源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了有源蜂鸣器,有源蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号。实验中中我们只需要给蜂鸣器输入一个高电平信号,蜂鸣器响起。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

有源蜂鸣器*1

面包板*1

面包板连接线若干

接线图

14

测试代码

microbit-screenshot (9)

测试结果

上传完代码,上电后,我们可以听到蜂鸣器响0.5秒,停止响起0.5秒,循环交替。

实验十五 无源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了无源蜂鸣器,无源蜂鸣器内部不带振荡源,直流信号无法令其鸣叫,须用方波驱动。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

无源蜂鸣器*1

面包板*1

面包板连接线若干

接线图

15

测试代码

microbit-screenshot (10)

测试结果

上传完代码,上电后,我们可以听到蜂鸣器会想响起《欢乐颂》的曲子。

实验十六 电位器调控舵机转动实验

实验说明

舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测 器所构成。舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红、橙三种颜色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极线,橙色为信号线。

S

VCC

GND

这个实验中,我们用一个电位器调节一个舵机的转动角度,旋转电位器时,舵机也随之转动。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

9G 舵机*1

可调电位器*1

面包板*1

面包板连接线若干

接线图

16

测试代码

microbit-screenshot (11)

测试结果

上传代码,上电后,我们可以通过旋转可调电位器调节舵机的转动角度。

实验十七 火焰报警实验

实验说明

火焰传感器是机器人专门用来搜寻火源的传感器,本传感器对火焰特别灵敏。火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号。

实验中,我们把火焰的亮度转化为高低变化的电平信号输入到micro bit主板中,然后控制蜂鸣器的响起。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

火焰传感器*1

有源蜂鸣器*1

10KΩ 电阻*1

面包板*1

面包板连接线若干

接线图

火焰传感器连接方法

实验12-1

17

测试代码

microbit-screenshot (12)

测试结果

上传代码,上电后,当火焰传感器检测到附近有火焰时,有源蜂鸣器响起,否则有源蜂鸣器不响。

实验十八 一位数码管显示实验

实验说明

数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),本实验所使用的是八段数码管。数码管共有七段显示数字的段,还有一个显示小数点的段。当让数码管显示数字时,只要将相应的段点亮即可。

这个实验中我们用了一个共阴极八段数码管,把a接到了micro bit主板的P13,b接到了P14,c接到了P8,d接到了P9,e接到了P10,f接到了P12,g接到了P11,h接到了P7,只要控制对应接口的高低电平,即可控制数码管的显示。实验中,我们让数码管逐渐显示0-9 10个数字。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

一位数码管*1

面包板*1

面包板连接线若干

接线图

18

测试代码

microbit-screenshot (13)

测试结果

上传代码,上电后,数码管循环显示0~9 10个数字。

实验十九 魔术光杯实验

实验说明

倾斜开关的工作原理是当开关一端低于水平位置倾斜,开关寻通;当另一端低于水平位置倾斜 ,开关停止。魔术光杯实验原理是利用模拟值调光的原理,两个LED的亮度发生变化。

这个实验中倾斜开关提供数字信号,触发模拟值的调节,通过程序的设计,我们就能看到类似于两组装满光的杯子倒来倒去的效果了。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

滚珠开关*2

LED*2

10KΩ 电阻*2

面包板*1

面包板连接线若干

接线图

19

测试代码

microbit-screenshot (14)

测试结果

按照上图接好线,上传好代码,上电后,将两个倾斜开关同时倾斜一边, 一个LED逐渐变暗,同时另一个逐渐变亮,最终一个LED完全熄灭,一个LED最亮。

实验二十 micro bit 模拟量的读取

实验说明

玩过Arduino的朋友都知道,有数字口(D口)和模拟口(A口),分的非常清楚。

在micro:bit中,我们通过引脚说明图也能看清哪几个引脚是支持模拟量读取的。我们

看下图。

TB2DIJTqO0TMKJjSZFNXXa_1FXa_!!143813255

这个实验中我们用一个可调电位器调节P2的模拟量,旋转点位器时,模拟量发生变化,并在串口监视器上显示出来。实验中我们要用到一个串口通讯软件,这里我们用的是Arduino IDE。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

可调电位器*1

面包板*1

面包板连接线若干

接线图

20

测试代码

测试结果

按照上图接好线,上传好代码,上电后,打开Arduino IDE,设置要COM口。打开串口监视器,设置波特率为115200(经过测试,micro:bit的USB串口通讯波特率是115200),串口监视器显示对应数值,旋转可调电位器,数值变化,发现最大是1023,最小是1,如下图。

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

实验说明

热敏电阻能够实时感知周边环境温度的变化,随着温度变化,热敏电阻也发生变化。实验中,我们搭配好电路,把温度变化转换成电压变化,将对应的电压输入到micro bit主板的P2上。实验中我们把P2的模拟量在串口监视器上显示出来。实验中我们要用到一个串口通讯软件,这里我们用的是Arduino IDE。

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

5MM 103 阻值 10K 绿色*1

10KΩ 电阻*1

面包板*1

面包板连接线若干

接线图

21

测试代码

测试结果

按照上图接好线,上传好代码,上电后,打开Arduino IDE,设置要COM口。打开串口监视器,设置波特率为115200(经过测试,micro:bit的USB串口通讯波特率是115200),串口监视器显示对应数值,当温度升高,电阻减小,模拟值增大;当人体对准温度电阻呼气时,温度升高,显示如下图。

实验二十二 LM35 温度传感器实验

实验说明

LM35 是很常用且易用的温度传感器元件,在元器件的应用上也只需要一个LM35元件,只利用一个模拟接口就可以测出当前温度。它的输出电压与摄氏温标呈线性关系,转换公式如式,0时输出为0V,每升高1℃,输出电压增加10mV。

实验中我们将它的输出电压输入到micro bit主板的P2上,而后通过相关公式计算出当前环境中的温度值,并在串口监视器上显示出来。实验中我们要用到一个串口通讯软件,这里我们用的是Arduino IDE。实验时,需特别注意LM35的方向,如若接反,会把LM35传感器烧毁,接口方向如下。

LM35

实验器材

micro:bit主板*1

micro bit T型扩展板 *1

USB线*1

LM35DZ*1

面包板*1

面包板连接线若干

接线图

22

测试代码

测试结果

按照上图接好线,上传好代码,上电后,打开Arduino IDE,设置要COM口。打开串口监视器,设置波特率为115200(经过测试,micro:bit的USB串口通讯波特率是115200),串口监视器显示当前环境中的温度值,如下图。

8、相关资料链接

分类
Micro:Bit系列

KE0122 microbit 基础套装

ke0122-1

目录

1. 产品说明 2

2. 产品清单 2

3. micro:bit 驱动安装方法 3

4. micro:bit 使用方法 4

5. micro:bit 引脚说明 6

6. micro bit元件和接口说明 7

7. 实验课程 8

实验一 Hello world! 8

实验二 自带按键控制点阵 11

实验三 测试micro bit自带加速度计和电子罗盘 12

实验四 自带温度传感器测试温度 14

实验五 板载蓝牙测试 15

8. 相关资料链接 23

1. 产品说明

Micro bit是一款由英国BBC 设计的ARM架构的单片机。它仅有信用卡一半大小,板载蓝牙,加速度计,电子罗盘,三个按钮,5 x 5 LED点阵,主要用于青少年的编程教育。

为了方便学习micro bit,我们特别搭配了这个套件。套件主要包含一个micro bit控制板、1米长的micro USB线和一个电池盒。电池盒里需安装两个1.5V的电池,电池盒上自带拨码开关;使用时可直接连接micro bit控制板供电,电池盒的拨码开关作为电源控制开关。同时,我们还直接根据micro bit控制板自带元件,简单做几个测试代码,让你对micro bit控制板有个更深刻的认识。

2. 产品清单

编码 规格型号 数量 图片
1 micro:bit主板 黑色 1 1
2 Micro USB线 1米 1 3
3 带开关和接线电池盒 1 2

3. micro:bit 驱动安装方法

下面我们给micro:bit开发板安装驱动。首先将micro:bit开发板用USB线连接到电脑上,然后双击驱动文件 mbed USB 2020,点击Install。

driver 1

继续点击Install,安装驱动。

driver 2

点击Finish,安装完成。

driver 4

安装完成后。

点击“Computer” —>“Properties”—> “Device manager”,我们可以看到下图。

driver 5

4. micro:bit 使用方法

micro: bit的编程环境有在线编程工具和本地编程工具两种,这里我们介绍下在谷歌浏览器的编程方法。首先在谷歌浏览器中打开https://makecode.microbit.org/网站进入编程环境。利用网站上模块,开始图形化编程,如下图。

点击JavaScript,你可以看到对应的程序代码,如下图。

将程序命名为LED1,并保存,如下图。

保存或,并在C盘中找到对应文件,如下图。

将micro: bit用USB接到电脑上,然后在C盘找到microbit-LED1文件,并发送到MICROBIT(G)上,就完成程序上传了。

程序上传后,给micro: bit上电后,micro: bit上5 x 5 LED点阵显示对应图案。供电方法有两种,一是直接通过USB线供电;二是用电池盒供电,电池盒接2个1.5V的5号电池,如下图。

1(3) MB0098 micro:bit主板 黑色

USB线供电 电池盒供电

5. micro:bit 引脚说明

在我们开始试验之前,我们需要对micro bit主板的各个引脚需要由一定的了解,具体信息参照下图。

microbit-pins

详细信息请参考官方网站:https://microbit.org/guide/hardware/pins/

6. micro bit元件和接口说明

7. 实验课程

实验一 Hello world!

实验说明

首先先来学习micro:bit主板串口通信功能,只需要一块micro bit主板和一根USB线的简单实验,让我们的micro bit主板说出“Hello World!”,这是一个让micro bit主板和PC 机通信的实验,这也是一个入门试验,希望可以带领大家进入micro bit的世界。

实验中我们要用到一个串口通讯软件,这里我们用的是Arduino IDE。

测试代码

Arduino IDE安装方法

Double click arduino-1.5.6-r2-windows to start.

Select “I Agree”to accept license agreement.

C:\Users\keyess\Desktop\tu\8.png

Select components to install and click “Next”.

C:\Users\keyess\Desktop\tu\9.png

Click “Browse” and select another folder. Click “Install” to start the installation.

C:\Users\keyess\Desktop\tu\10.png

Finally, wait for a few minutes to finish.

C:\Users\keyess\Desktop\tu\11.png

测试结果

将micro bit用micro USB线接在电脑上,上传好代码,打开Arduino IDE,设置要COM口。打开串口监视器,设置波特率为115200(经过测试,micro:bit的USB串口通讯波特率是115200),在串口监视器中输入 “R”字符,点击Send,串口监视器中输出“Hello world!”字符,如下图。

实验二 自带按键控制点阵

实验说明

在micro bit控制板上自带3个按键,其中一个是复位按键,另外两个AB按键作为控制按键。在这一课程中,我们利用控制板自带的两个按键,控制控制板自带的LED点阵。

在这一课程中,我们利用两个测试代码测试,一种是不带循环,一种是带有循环程序。

测试代码

代码1:

microbit-screenshot (7)

代码2:

microbit-screenshot (6)

测试结果

上传好代码1,上电后,按下按键A,控制板LED点阵显示心形;按下按键B,控制板LED点阵显示倒立心形;按下按键A和按键B,控制板LED点阵显示另外图案。

上传好代码2,上电后,按下按键A,控制板LED点阵显示心形;按下按键B,控制

板LED点阵显示倒立心形;按下按键A和按键B,控制板LED点阵循环显示3种图案。

实验三 测试micro bit自带加速度计和电子罗盘

实验说明

在micro bit控制板上自带加速度计和电子罗盘,我们可以利用控制板上该元件测试控制板当前的状态,测试出控制板当前的3轴加速度。

在这一课程中,我们完成两个实验,实验一,是利用控制板加速度计和电子罗盘控制LED点阵显示不同图案;实验二是直接测试出控制板的3轴加速度,并在点阵和串口监视器上显示。

测试代码

代码1:

microbit-screenshot (12)

代码2:

测试结果

上传好代码1,上电后,当我们移动控制板,使控制板金手指朝上时,控制板显示第1个图案;移动控制板,使控制板金手指朝下时,控制板显示第2个图案;水平放置控制板,使控制板点阵朝上时,点阵显示第3个图案;水平放置控制板,使控制板点阵朝下时,点阵显示第4个图案;晃动控制板,控制板震动时,点阵显示第5个图案;向左倾斜控制板时,点阵显示第6个图案;向右倾斜控制板时,点阵显示第7个图案。

上传好代码2,利用micro USB线上电后,我们可以测试出控制板的X Y Z 3轴加速度值,单位为mg。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用Arduino IDE软件串口监视器上看到显示结果,显示如下图。

实验四 自带温度传感器测试温度

实验说明

在micro bit控制板上自带一个温度传感器。在这一课程中,我们利用该传感器测试当前环境中的温度,并将测试结果在控制板自带点阵显示。

测试代码

测试结果

上传好代码,利用micro USB线上电后,我们可以测试出当前环境中的温度值,单位为℃。我们有两种方法看到测试数据,一是直接在micro:bit主板上LED点阵上看到,二是利用Arduino IDE软件串口监视器上看到显示结果,显示如下图。

实验五 板载蓝牙测试

实验说明

在micro bit控制板自带蓝牙,我们可以通过连接蓝牙,实现无线传输代码功能。试验中,我们利用一个苹果ipad,和micro bit连接,实现无线传输代码功能。安卓系统手机实现无线传输代码方法和苹果ipad类似,这里就不一一介绍了。

试验步骤

1.在App Store中搜索micro:bit,安装对应APP。

2.iPad和micro bit控制板配对连接。

a. APP安装成功后,点击 打开APP,给micro bit控制板上电,选择APP第一

项开始配对蓝牙。

b.点击配对一个新的micro:bit开始配对。

c.根据提示,首先按下micro bit控制板A B按键,然后按下复位按键,然后再松开复

位按键,micro bit控制板上LED点阵会最终显示一个图案。点击下一步。

d.在iPad上设置图案,使图案和micro bit控制板上 显示的图案一样,点击下一步。

e.点击下一步配对,配对成功。

3.连接成功后,开始利用APP编写上传代码。

a.选择第二项,开始编写程序,编写程序OK。

b.点击 ,选择第一项开始课程设置。

c.选择设置第一项,保存设置。

d.点击 图案,设置代码名称,并保存。

e.保存成功,直接开始上传程序,默认选择程序是刚开始保存的程序。

特别注意:上传代码时,需要参考第二步c小步方法,使LED点阵显示密码图案,

才能上传程序成功。

f.程序上传成功,显示如下图。

8、相关资料链接

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

提取码:ngqx

分类
Arduino 学习套件 传感器系列

KE0116 Arduino 电子积木传感器套件

KE0087

目录

1、说明 3

2、清单 3

3、Arduino IDE和驱动的安装 5

4、Arduino IDE的使用方法 11

5、实验课程 13

实验一 草帽LED模块 13

实验二 无源蜂鸣器模块 15

实验三 双色LED模块 18

实验四 5V单路继电器模块 20

实验五 光敏电阻传感器 21

实验六 倾斜模块传感器 22

实验七 麦克风声音传感器 24

实验八 MQ-2 烟雾传感器 25

实验九 热敏电阻传感器 27

实验十 LM35温度传感器 28

实验十一 水位传感器 30

实验十二 土壤传感器 31

实验十三 DHT11温湿度传感器 33

实验十四 超声波传感器 36

实验十五 火焰传感器 38

实验十六 1302时钟传感器 40

实验十七 摇杆模块传感器 43

实验十八 水滴水蒸气传感器 45

实验十九 人体红外热释电传感器 46

6、 相关资料链接 48

1、说明

这个套件包含我们学习Arduino 单片机常用到的21款传感器模块和Arduino控制板。

同时我们为套件里的每一款传感器都编写了资料,资料里介绍了传感器模块基于

Arduino控制板的使用方法,包含了接线方法、测试代码、实验结果等信息。

2、清单

编码 名称 描述 数量 图片
1 扩展板 keyes传感器扩展板 1
2 Keyes模块 keyes 草帽LED白发红模块(焊盘孔) 红色 环保 1 KE0011-红  (2)
3 Keyes模块 keyes 草帽LED白发绿模块(焊盘孔) 红色 环保 1 KE0012-绿  (2)
4 Keyes模块 keyes 草帽LED白发蓝模块(焊盘孔) 红色 环保 1 KE0013 蓝  (2)
5 Keyes模块 keyes 无源蜂3鸣器模块(焊盘孔) 红色 环保 1 KE0022-keyes-无源蜂鸣器  (2)
6 Keyes模块 keyes 双色LED模块(焊盘孔) 红色 环保 1 KE0030-keyes-双色LED模块 (2)
7 Keyes模块 keyes 5V 单路继电器模块(焊盘孔) 红色 环保 1 KE0052 (1)
8 keyes传感器 keyes 光敏电阻传感器(焊盘孔) 红色 环保 1 KE0024 (1)
9 keyes传感器 keyes 倾斜模块传感器(焊盘孔) 红色 环保 1 KE0026 (1)
10 keyes传感器 keyes 麦克风声音传感器(焊盘孔) 红色 环保 1 KE0034 (4)
11 keyes传感器 keyes MQ-2 烟雾传感器(焊盘孔) 红色 环保 1 MQ-2 (1)
12 keyes传感器 keyes 热敏电阻传感器(焊盘孔) 红色 环保 1 KE0023-热敏电阻  (2)
13 keyes传感器 keyes LM35温度传感器(焊盘孔) 红色 环保 1 KE0039 (1)
14 keyes传感器 keyes 水位传感器(焊盘孔) 红色 环保 1 KE0037 (1)
15 keyes传感器 keyes 土壤传感器(焊盘孔) 红色 环保 1 KE0038 (1)
16 keyes传感器 keyes DHT11温湿度传感器(焊盘孔) 红色 环保 1 KE0041 (1)
17 keyes传感器 keyes 超声波传感器 1 MD0017 (1)
18 keyes传感器 keyes 火焰传感器(焊盘孔) 红色 环保 1 KE0045 (1)
19 keyes传感器 keyes 1302时钟传感器(焊盘孔) 红色 环保 1 KE0050 (1)
20 keyes传感器 keyes 摇杆模块传感器(焊盘孔) 红色 环保 1 KE0051 (1)
21 keyes传感器 keyes 水滴水蒸气传感器(焊盘孔) 红色 环保 1 KE0035 (1)
22 keyes传感器 keyes 人体红外热释电传感器(焊盘孔) 红色 环保 1 KE0054 (2)
23 杜邦线 母对母20CM/40P/2.54/12股铜丝24号线 1
24 USB线 AM/BM 透明蓝 OD:5.0 L=50cm 1 fw

KE0115不带开发板 KE0116带官方Arduino UNO R3

25 开发板 Arduino UNO R3 1

3、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文件

然后

然后

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

1.5.6版本安装后的样子。

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

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

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

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

进入下图,选择

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

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

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

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

4、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 的软件,设置板,如下。

设置COM端口,如下

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

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

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

5、实验课程

实验一 草帽LED模块

实验说明

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

草帽LED模块*1

杜邦线若干

接线图

1

测试代码

代码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先逐渐变亮,后逐渐变暗,循环交替。

实验二 无源蜂鸣器模块

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

无源蜂鸣器模块*1

杜邦线若干

接线图

2

测试代码

代码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,上电后,无源蜂鸣器会想响起《欢乐颂》的曲子。

实验三 双色LED模块

实验说明

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

双色LED模块*1

杜邦线若干

接线图

3

测试代码

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秒,循环交替。

实验四 5V单路继电器模块

实验说明

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

5V 单路继电器模块*1

杜邦线若干

接线图

4

测试代码

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灯亮起。

实验五 光敏电阻传感器

实验说明

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

光敏电阻传感器*1

杜邦线若干

接线图

5

测试代码

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秒

}

测试结果

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

实验六 倾斜模块传感器

实验说明

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

倾斜模块传感器*1

杜邦线若干

接线图

6

测试代码

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灯亮。

实验七 麦克风声音传感器

实验说明

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

麦克风声音传感器*1

杜邦线若干

接线图

7

测试代码

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秒

}

测试结果

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

实验八 MQ-2 烟雾传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

MQ-2 烟雾传感器*1

杜邦线若干

接线图

8

测试代码

void setup() {

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

}

void loop() {

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

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

delay(100); //延迟0.1秒

}

测试结果

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

实验九 热敏电阻传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

热敏电阻传感器*1

杜邦线若干

接线图

9

测试代码

#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

}

测试结果

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

实验十 LM35温度传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

LM35温度传感器*1

杜邦线若干

接线图

10

测试代码

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

}

测试结果

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

实验十一 水位传感器

实验说明

本实验我们主要用来检测水位传感器。它是一款简单易用、性价比较高的水位/水滴识别检测传感器,是通过具有一系列的暴露的平行导线线迹测量其水滴/水量大小从而判断水位。

实验中将传感器的信号端接到开发板的模拟口A0,在Arduino IDE的串口监视器上可看到代表当前水位的模拟值。

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

水位传感器*1

杜邦线若干

接线图

11

测试代码

void setup() {

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

}

void loop() {

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

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

delay(100); //延迟0.1秒

}

测试结果

按照上图接好线,上传好代码,上电后,水位传感器上D1灯亮起;打开窗口监视器,显示如图一;将传感器的感应位置放入水中,显示如图二;感应位置放入水中越深,数字越大。

图一

图二

实验十二 土壤传感器

实验说明

本实验我们主要用来检测土壤传感器。它是一个简易的水份传感器可用于检测土壤的水份,当土壤缺水时,传感器输出的模拟值将减小,反之将增大。使用这个传感器可制作一款自动浇花装置。

实验中将传感器的信号端接到开发板的模拟口A0,在Arduino IDE的串口监视器上可看到代表当前土壤湿度的模拟值。

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

土壤传感器*1

杜邦线若干

接线图

12

测试代码

void setup() {

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

}

void loop() {

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

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

delay(100); //延迟0.1秒

}

测试结果

按照上图接好线,上传好代码,上电后,土壤传感器上D1灯亮起;打开窗口监视器,显示如图一;将传感器插入土中,如图二;土壤湿度越大,数字越大。

图一

图二

实验十三 DHT11温湿度传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

DHT11温湿度传感器*1

杜邦线若干

接线图

13

测试代码

#include <dht11.h>

dht11 DHT;

#define DHT11_PIN 3

void setup(){

Serial.begin(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); // READ DATA

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;

}

// DISPLAT DATA

Serial.print(DHT.humidity,1);

Serial.print(“,\t”);

Serial.println(DHT.temperature,1);

delay(1000);

}

库文件下载地址

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

测试结果

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

实验十四 超声波传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

超声波传感器*1

杜邦线若干

接线图

14

测试代码

#define echoPin 7 // Echo Pin

#define trigPin 8 // Trigger Pin

#define LEDPin 13 // Onboard LED

int maximumRange = 200; // Maximum range needed

int minimumRange = 0; // Minimum range needed

long duration, distance; // Duration used to calculate distance

void setup() {

Serial.begin (9600);

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)

}

void loop() {

/* The following trigPin/echoPin cycle is used to determine the

distance of the nearest object by bouncing soundwaves off of it. */

digitalWrite(trigPin, LOW);

delayMicroseconds(2);

digitalWrite(trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);

//Calculate the distance (in cm) based on the speed of sound.

distance = duration/58.2;

if (distance >= maximumRange || distance <= minimumRange){

/* Send a negative number to computer and Turn LED ON

to indicate “out of range” */

Serial.println(“-1”);

digitalWrite(LEDPin, HIGH);

}

else {

/* Send the distance to the computer using Serial protocol, and

turn LED OFF to indicate successful reading. */

Serial.println(distance);

digitalWrite(LEDPin, LOW);

}

//Delay 50ms before next reading.

delay(50);

}

测试结果

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

实验十五 火焰传感器

实验说明

本实验我们主要用来检测火焰传感器。它可以检测火焰或者波长在760纳米~1100纳米范围内的光源,它的探测角度为60度左右,它对火焰光谱特别灵敏并且灵敏度可调,性能稳定,是救火机器人必备部件。

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

火焰传感器*1

杜邦线若干

接线图

15

测试代码

const int flamePin = 3; //定义数字口3

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

// variables will change:

int State = 0; //定义数字变量State,并设为0

void setup()

{

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

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

}

void loop()

{

State = digitalRead(flamePin);//读取到数字口3的数值,并赋值给 State

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

{

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

}

else

{

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

}

}

测试结果

按照上图接好线,上传好代码,上电后,调节模块电位器,使模块上D1处于亮起和关闭临界点,使D1关闭。传感器没有检测到火焰时,传感器上的D1灯关闭,Arduino UNO 板上的 D13 的指示灯关闭;当传感器检测到火焰时,传感器上的D1灯亮起,Arduino UNO 板上的 D13 的指示灯亮起。

实验十六 1302时钟传感器

实验说明

本实验我们主要用来检测1302时钟传感器。DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:(1)RST 复位(2)I/O 数据线(3)SCLK串行时钟。时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信。DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW。

实验中我们用开发板控制1302时钟传感器,让它在软件的串口监视器中显示当前时间日期,并且自动读秒。

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

1302时钟传感器*1

杜邦线若干

接线图

16

测试代码

#include <stdio.h>

#include <string.h>

#include <DS1302.h>

/* 接口定义

CE(DS1302 pin5) -> Arduino D5 (RST)

IO(DS1302 pin6) -> Arduino D6 (DAT)

SCLK(DS1302 pin7) -> Arduino D7 (CLK)

*/

uint8_t CE_PIN = 5;

uint8_t IO_PIN = 6;

uint8_t SCLK_PIN = 7;

/* 日期变量缓存 */

char buf[50];

char day[10];

/* 创建 DS1302 对象 */

DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

void print_time()

{

/* 从 DS1302 获取当前时间 */

Time t = rtc.time();

/* 将星期从数字转换为名称 */

memset(day, 0, sizeof(day));

switch (t.day) {

case 1:

strcpy(day, “Sunday”);

break;

case 2:

strcpy(day, “Monday”);

break;

case 3:

strcpy(day, “Tuesday”);

break;

case 4:

strcpy(day, “Wednesday”);

break;

case 5:

strcpy(day, “Thursday”);

break;

case 6:

strcpy(day, “Friday”);

break;

case 7:

strcpy(day, “Saturday”);

break;

}

/* 将日期代码格式化凑成buf等待输出 */

snprintf(buf, sizeof(buf), “%s %04d-%02d-%02d %02d:%02d:%02d”,

day,

t.yr, t.mon, t.date,

t.hr, t.min, t.sec);

/* 输出日期到串口 */

Serial.println(buf);

}

void setup()

{

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

rtc.write_protect(false);

rtc.halt(false);

/*设置开始时间为2017年12月28日15点32分33秒星期四 */

Time t(2017,12, 28, 15, 32, 33, 5);

rtc.time(t);

}

/* 每一秒循环输出时间 */

void loop()

{

print_time();

delay(1000);

}

库文件下载地址

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

测试结果

按照上图接好线,上传好代码,上电后,通电后,我们可在软件串口监视器中看到当前时间日期,并计时,如下图。

实验十七 摇杆模块传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

摇杆模块传感器*1

杜邦线若干

接线图

17

测试代码

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。

实验十八 水滴水蒸气传感器

实验说明

本实验我们主要用来水滴水蒸气传感器。它是一个模拟传感器,可以制作简单的雨水探测器与液位开关。当传感器表面的湿度上升,输出电压将增大。

实验中将传感器的信号端接到开发板的模拟口A0,在Arduino IDE的串口监视器上可看到代表湿度的模拟值。

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

水滴水蒸气传感器*1

杜邦线若干

接线图

18

测试代码

void setup() {

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

}

void loop() {

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

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

delay(100); //延迟0.1秒

}

测试结果

按照上图接好线,上传好代码,上电后,打开窗口监视器,显示如图一;在传感器的感应位置滴上水滴,显示如图二。

图一

图二

实验十九 人体红外热释电传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

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

杜邦线若干

接线图

19

测试代码

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.5S

}

测试结果

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

6、相关资料链接

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

分类
Arduino 学习套件 传感器系列

KE0115 Arduino 电子积木传感器套件

KE0087

目录

1、说明 3

2、清单 3

3、Arduino IDE和驱动的安装 5

4、Arduino IDE的使用方法 11

5、实验课程 13

实验一 草帽LED模块 13

实验二 无源蜂鸣器模块 15

实验三 双色LED模块 18

实验四 5V单路继电器模块 20

实验五 光敏电阻传感器 21

实验六 倾斜模块传感器 22

实验七 麦克风声音传感器 24

实验八 MQ-2 烟雾传感器 25

实验九 热敏电阻传感器 27

实验十 LM35温度传感器 28

实验十一 水位传感器 30

实验十二 土壤传感器 31

实验十三 DHT11温湿度传感器 33

实验十四 超声波传感器 36

实验十五 火焰传感器 38

实验十六 1302时钟传感器 40

实验十七 摇杆模块传感器 43

实验十八 水滴水蒸气传感器 45

实验十九 人体红外热释电传感器 46

6、 相关资料链接 48

1、说明

这个套件包含我们学习Arduino 单片机常用到的21款传感器模块和Arduino控制板。

同时我们为套件里的每一款传感器都编写了资料,资料里介绍了传感器模块基于

Arduino控制板的使用方法,包含了接线方法、测试代码、实验结果等信息。

2、清单

编码 名称 描述 数量 图片
1 扩展板 keyes传感器扩展板 1
2 Keyes模块 keyes 草帽LED白发红模块(焊盘孔) 红色 环保 1 KE0011-红  (2)
3 Keyes模块 keyes 草帽LED白发绿模块(焊盘孔) 红色 环保 1 KE0012-绿  (2)
4 Keyes模块 keyes 草帽LED白发蓝模块(焊盘孔) 红色 环保 1 KE0013 蓝  (2)
5 Keyes模块 keyes 无源蜂3鸣器模块(焊盘孔) 红色 环保 1 KE0022-keyes-无源蜂鸣器  (2)
6 Keyes模块 keyes 双色LED模块(焊盘孔) 红色 环保 1 KE0030-keyes-双色LED模块 (2)
7 Keyes模块 keyes 5V 单路继电器模块(焊盘孔) 红色 环保 1 KE0052 (1)
8 keyes传感器 keyes 光敏电阻传感器(焊盘孔) 红色 环保 1 KE0024 (1)
9 keyes传感器 keyes 倾斜模块传感器(焊盘孔) 红色 环保 1 KE0026 (1)
10 keyes传感器 keyes 麦克风声音传感器(焊盘孔) 红色 环保 1 KE0034 (4)
11 keyes传感器 keyes MQ-2 烟雾传感器(焊盘孔) 红色 环保 1 MQ-2 (1)
12 keyes传感器 keyes 热敏电阻传感器(焊盘孔) 红色 环保 1 KE0023-热敏电阻  (2)
13 keyes传感器 keyes LM35温度传感器(焊盘孔) 红色 环保 1 KE0039 (1)
14 keyes传感器 keyes 水位传感器(焊盘孔) 红色 环保 1 KE0037 (1)
15 keyes传感器 keyes 土壤传感器(焊盘孔) 红色 环保 1 KE0038 (1)
16 keyes传感器 keyes DHT11温湿度传感器(焊盘孔) 红色 环保 1 KE0041 (1)
17 keyes传感器 keyes 超声波传感器 1 MD0017 (1)
18 keyes传感器 keyes 火焰传感器(焊盘孔) 红色 环保 1 KE0045 (1)
19 keyes传感器 keyes 1302时钟传感器(焊盘孔) 红色 环保 1 KE0050 (1)
20 keyes传感器 keyes 摇杆模块传感器(焊盘孔) 红色 环保 1 KE0051 (1)
21 keyes传感器 keyes 水滴水蒸气传感器(焊盘孔) 红色 环保 1 KE0035 (1)
22 keyes传感器 keyes 人体红外热释电传感器(焊盘孔) 红色 环保 1 KE0054 (2)
23 杜邦线 母对母20CM/40P/2.54/12股铜丝24号线 1
24 USB线 AM/BM 透明蓝 OD:5.0 L=50cm 1 fw

KE0115不带开发板 KE0116带官方Arduino UNO R3

25 开发板 Arduino UNO R3 1

3、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文件

然后

然后

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

1.5.6版本安装后的样子。

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

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

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

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

进入下图,选择

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

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

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

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

4、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 的软件,设置板,如下。

设置COM端口,如下

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

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

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

5、实验课程

实验一 草帽LED模块

实验说明

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

草帽LED模块*1

杜邦线若干

接线图

1

测试代码

代码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先逐渐变亮,后逐渐变暗,循环交替。

实验二 无源蜂鸣器模块

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

无源蜂鸣器模块*1

杜邦线若干

接线图

2

测试代码

代码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,上电后,无源蜂鸣器会想响起《欢乐颂》的曲子。

实验三 双色LED模块

实验说明

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

双色LED模块*1

杜邦线若干

接线图

3

测试代码

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秒,循环交替。

实验四 5V单路继电器模块

实验说明

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

5V 单路继电器模块*1

杜邦线若干

接线图

4

测试代码

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灯亮起。

实验五 光敏电阻传感器

实验说明

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

光敏电阻传感器*1

杜邦线若干

接线图

5

测试代码

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秒

}

测试结果

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

实验六 倾斜模块传感器

实验说明

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

倾斜模块传感器*1

杜邦线若干

接线图

6

测试代码

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灯亮。

实验七 麦克风声音传感器

实验说明

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

麦克风声音传感器*1

杜邦线若干

接线图

7

测试代码

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秒

}

测试结果

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

实验八 MQ-2 烟雾传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

MQ-2 烟雾传感器*1

杜邦线若干

接线图

8

测试代码

void setup() {

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

}

void loop() {

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

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

delay(100); //延迟0.1秒

}

测试结果

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

实验九 热敏电阻传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

热敏电阻传感器*1

杜邦线若干

接线图

9

测试代码

#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

}

测试结果

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

实验十 LM35温度传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

LM35温度传感器*1

杜邦线若干

接线图

10

测试代码

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

}

测试结果

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

实验十一 水位传感器

实验说明

本实验我们主要用来检测水位传感器。它是一款简单易用、性价比较高的水位/水滴识别检测传感器,是通过具有一系列的暴露的平行导线线迹测量其水滴/水量大小从而判断水位。

实验中将传感器的信号端接到开发板的模拟口A0,在Arduino IDE的串口监视器上可看到代表当前水位的模拟值。

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

水位传感器*1

杜邦线若干

接线图

11

测试代码

void setup() {

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

}

void loop() {

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

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

delay(100); //延迟0.1秒

}

测试结果

按照上图接好线,上传好代码,上电后,水位传感器上D1灯亮起;打开窗口监视器,显示如图一;将传感器的感应位置放入水中,显示如图二;感应位置放入水中越深,数字越大。

图一

图二

实验十二 土壤传感器

实验说明

本实验我们主要用来检测土壤传感器。它是一个简易的水份传感器可用于检测土壤的水份,当土壤缺水时,传感器输出的模拟值将减小,反之将增大。使用这个传感器可制作一款自动浇花装置。

实验中将传感器的信号端接到开发板的模拟口A0,在Arduino IDE的串口监视器上可看到代表当前土壤湿度的模拟值。

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

土壤传感器*1

杜邦线若干

接线图

12

测试代码

void setup() {

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

}

void loop() {

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

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

delay(100); //延迟0.1秒

}

测试结果

按照上图接好线,上传好代码,上电后,土壤传感器上D1灯亮起;打开窗口监视器,显示如图一;将传感器插入土中,如图二;土壤湿度越大,数字越大。

图一

图二

实验十三 DHT11温湿度传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

DHT11温湿度传感器*1

杜邦线若干

接线图

13

测试代码

#include <dht11.h>

dht11 DHT;

#define DHT11_PIN 3

void setup(){

Serial.begin(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); // READ DATA

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;

}

// DISPLAT DATA

Serial.print(DHT.humidity,1);

Serial.print(“,\t”);

Serial.println(DHT.temperature,1);

delay(1000);

}

库文件下载地址

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

测试结果

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

实验十四 超声波传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

超声波传感器*1

杜邦线若干

接线图

14

测试代码

#define echoPin 7 // Echo Pin

#define trigPin 8 // Trigger Pin

#define LEDPin 13 // Onboard LED

int maximumRange = 200; // Maximum range needed

int minimumRange = 0; // Minimum range needed

long duration, distance; // Duration used to calculate distance

void setup() {

Serial.begin (9600);

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)

}

void loop() {

/* The following trigPin/echoPin cycle is used to determine the

distance of the nearest object by bouncing soundwaves off of it. */

digitalWrite(trigPin, LOW);

delayMicroseconds(2);

digitalWrite(trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);

//Calculate the distance (in cm) based on the speed of sound.

distance = duration/58.2;

if (distance >= maximumRange || distance <= minimumRange){

/* Send a negative number to computer and Turn LED ON

to indicate “out of range” */

Serial.println(“-1”);

digitalWrite(LEDPin, HIGH);

}

else {

/* Send the distance to the computer using Serial protocol, and

turn LED OFF to indicate successful reading. */

Serial.println(distance);

digitalWrite(LEDPin, LOW);

}

//Delay 50ms before next reading.

delay(50);

}

测试结果

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

实验十五 火焰传感器

实验说明

本实验我们主要用来检测火焰传感器。它可以检测火焰或者波长在760纳米~1100纳米范围内的光源,它的探测角度为60度左右,它对火焰光谱特别灵敏并且灵敏度可调,性能稳定,是救火机器人必备部件。

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

火焰传感器*1

杜邦线若干

接线图

15

测试代码

const int flamePin = 3; //定义数字口3

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

// variables will change:

int State = 0; //定义数字变量State,并设为0

void setup()

{

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

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

}

void loop()

{

State = digitalRead(flamePin);//读取到数字口3的数值,并赋值给 State

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

{

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

}

else

{

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

}

}

测试结果

按照上图接好线,上传好代码,上电后,调节模块电位器,使模块上D1处于亮起和关闭临界点,使D1关闭。传感器没有检测到火焰时,传感器上的D1灯关闭,Arduino UNO 板上的 D13 的指示灯关闭;当传感器检测到火焰时,传感器上的D1灯亮起,Arduino UNO 板上的 D13 的指示灯亮起。

实验十六 1302时钟传感器

实验说明

本实验我们主要用来检测1302时钟传感器。DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:(1)RST 复位(2)I/O 数据线(3)SCLK串行时钟。时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信。DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW。

实验中我们用开发板控制1302时钟传感器,让它在软件的串口监视器中显示当前时间日期,并且自动读秒。

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

1302时钟传感器*1

杜邦线若干

接线图

16

测试代码

#include <stdio.h>

#include <string.h>

#include <DS1302.h>

/* 接口定义

CE(DS1302 pin5) -> Arduino D5 (RST)

IO(DS1302 pin6) -> Arduino D6 (DAT)

SCLK(DS1302 pin7) -> Arduino D7 (CLK)

*/

uint8_t CE_PIN = 5;

uint8_t IO_PIN = 6;

uint8_t SCLK_PIN = 7;

/* 日期变量缓存 */

char buf[50];

char day[10];

/* 创建 DS1302 对象 */

DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

void print_time()

{

/* 从 DS1302 获取当前时间 */

Time t = rtc.time();

/* 将星期从数字转换为名称 */

memset(day, 0, sizeof(day));

switch (t.day) {

case 1:

strcpy(day, “Sunday”);

break;

case 2:

strcpy(day, “Monday”);

break;

case 3:

strcpy(day, “Tuesday”);

break;

case 4:

strcpy(day, “Wednesday”);

break;

case 5:

strcpy(day, “Thursday”);

break;

case 6:

strcpy(day, “Friday”);

break;

case 7:

strcpy(day, “Saturday”);

break;

}

/* 将日期代码格式化凑成buf等待输出 */

snprintf(buf, sizeof(buf), “%s %04d-%02d-%02d %02d:%02d:%02d”,

day,

t.yr, t.mon, t.date,

t.hr, t.min, t.sec);

/* 输出日期到串口 */

Serial.println(buf);

}

void setup()

{

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

rtc.write_protect(false);

rtc.halt(false);

/*设置开始时间为2017年12月28日15点32分33秒星期四 */

Time t(2017,12, 28, 15, 32, 33, 5);

rtc.time(t);

}

/* 每一秒循环输出时间 */

void loop()

{

print_time();

delay(1000);

}

库文件下载地址

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

测试结果

按照上图接好线,上传好代码,上电后,通电后,我们可在软件串口监视器中看到当前时间日期,并计时,如下图。

实验十七 摇杆模块传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

摇杆模块传感器*1

杜邦线若干

接线图

17

测试代码

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。

实验十八 水滴水蒸气传感器

实验说明

本实验我们主要用来水滴水蒸气传感器。它是一个模拟传感器,可以制作简单的雨水探测器与液位开关。当传感器表面的湿度上升,输出电压将增大。

实验中将传感器的信号端接到开发板的模拟口A0,在Arduino IDE的串口监视器上可看到代表湿度的模拟值。

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

水滴水蒸气传感器*1

杜邦线若干

接线图

18

测试代码

void setup() {

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

}

void loop() {

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

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

delay(100); //延迟0.1秒

}

测试结果

按照上图接好线,上传好代码,上电后,打开窗口监视器,显示如图一;在传感器的感应位置滴上水滴,显示如图二。

图一

图二

实验十九 人体红外热释电传感器

实验说明

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

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

实验器材

开发板*1

keyes传感器扩展板*1

USB线*1

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

杜邦线若干

接线图

19

测试代码

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.5S

}

测试结果

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

6、相关资料链接

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

分类
Arduino 学习套件

KE0114 Arduino 终极版学习套件

KE0084

目录

1、说明 3

2、清单 3

3、Arduino IDE和驱动的安装 9

4、Arduino IDE的使用方法 14

5、实验课程 16

实验一 LED 闪烁实验 16

实验二 呼吸灯实验 17

实验三 广告灯实验 19

实验四 按键控制LED实验 20

实验五 抢答器实验 22

实验六 电位器调控灯光亮度实验 24

实验七 感光灯实验 25

实验八 有源蜂鸣器实验 27

实验九 无源蜂鸣器实验 28

实验十 火焰报警实验 31

实验十一 温馨水杯实验 33

实验十二 魔术光杯实验 34

实验十三 红外遥控解码实验 37

实验十四 一位数码管显示实验 39

实验十五 74HC595驱动一位数码管实验 43

实验十六 8*8点阵显示实验 45

实验十七 四位数码管显示数字实验 47

实验十八 1602 LCD显示实验 55

实验十九 超声波测距显示实验 56

实验二十 1302时钟显示实验 59

实验二十一 人体红外感应实验 62

实验二十二 4×4按键显示实验 64

实验二十三 步进电机实验 66

实验二十四 舵机控制实验 68

实验二十五 RFID读卡器实验 71

实验二十六 声控灯实验 86

实验二十七 继电器控灯实验 88

实验二十八 温湿度显示实验 89

实验二十九 气体检测实验 91

实验三十 摇杆模块和电位器控制RGB模块实验 94

实验三十一 TMD27713 距离传感器实验 97

实验三十二 加速度传感器实验 102

实验三十三 太阳光紫外线传感器实验 106

6、 相关资料链接 108

1、说明

这个套件包含我们学习Arduino 单片机常用到的传感器模块、元器件和Arduino控制板。同时我们还会根据这些元器件和传感器模块,提供一些基Arduino控制板的学习课程,课程包含了接线方法、测试代码、实验结果等信息,它让你对这些元器件、传感器模块和Arduino控制板有个初步的了解。

2、清单

编码 名称 描述 数量 图片
1 LED F5-红发红-短 5
2 LED F5-黄发黄-短 5
3 LED F5-蓝发蓝-短 5
4 电阻 碳膜色环 1/4W 1% 220R 编带 8
5 电阻 碳膜色环 1/4W 1% 1K 编带 5
6 电阻 碳膜色环 1/4W 1% 10K 编带 5
7 点阵 20*20MM 1.9MM红色 共阳 1
8 数码管 一位0.56英寸共阴红 1
9 数码管 四位0.36英寸共阴红 3461AH 1
10 IC 74HC595 DIP 1
11 可调电位器
  1. MU 103

(三针直排)

1
12 蜂鸣器 无源 12*8.5MM

5V 普通分体 2K

1
13 蜂鸣器 有源 12*9.5MM 5V 普通分体 2300Hz 1
14 轻触按键 12*12*7.3MM 插件 4
15 按键帽 A24 黄帽(12*12*7.3)圆 4
16 传感器元件 LM35DZ 1
17 传感器元件 5MM 光敏电阻 3

18 传感器元件 红外接收 5MM 火焰 1
19 传感器元件 红外接收 VS1838B 1
20 滚珠开关 HDX-2801 两脚一样 2
21 模块 1602 I2C 蓝屏 1 MD0069  一个电阻 (6)
22 模块 4*4薄膜键盘 1 后2 (1)
23 面包板 ZY-102 830孔 白色 (纸卡包装) 1 2
24 模块 5V步进电机 1 23R23 (18)
25 USB线 AM/BM 透明蓝 OD:5.0 L=50cm 1 fw
26 遥控器 JMP-1 17键86*40*6.5MM 黑色 1 1
27 面包线 面包板连接线65根 1
28 杜邦线 公对母20CM/40P/2.54/10股铜包铝 24号线BL 0.5 OR0006
29 舵机 SG90 9G 23*12.2*29mm 蓝色 辉盛(环保) 1 FWE
30 电池扣 优质型 9V电池扣 实验电源连接线 1 83400039 (5)
31 IC卡 白卡 85.5*54*0.80MM 1 111
32 钥匙扣 TAG-03 41*33*403mm ABS蓝色 1 KE0078 (2)
33 keyes模块 Keyes RFID-RC522 射频模块 (焊盘孔) 红色 环保 1 KE0078 (1)
34 keyes传感器 keyes 麦克风声音传感器(焊盘孔) 红色 环保 1 KE0034 (4)
35 keyes传感器 keyes 超声波传感器 1 MD0017 (1)
36 keyes模块 keyes 插件RGB模块(焊盘孔) 红色 环保 1 1
37 keyes模块 keyes 5V 单路继电器模块(焊盘孔) 红色 环保 1 KE0052 (1)
38 keyes传感器 keyes DHT11温湿度传感器(焊盘孔) 红色 环保 1 KE0041 (1)
39 Keyes模块 keyes 1302时钟模块(焊盘孔) 红色 环保 1 KE0050 (1)
40 keyes传感器 keyes 人体红外热释电传感器(焊盘孔) 红色 环保 1 KE0054 (2)
41 keyes驱动板 Keyes ULN2003步进电机驱动板(焊盘孔) 红色 环保 1 KE0079  (1)
42 keyes传感器 keyes MQ-2 烟雾传感器(焊盘孔) 红色 环保 1 MQ-2 (1)
43 keyes传感器 keyes 摇杆模块传感器(焊盘孔) 红色 环保 1 KE0051 (1)
44 传感器模块 keyes TMD27713 距离传感器 1 3r
45 传感器模块 keyes MMA8452Q 三轴数字加速度传感器 1 5
46 传感器模块 keyes GUVA-S12SD 3528 太阳光紫外线传感器 1 1
47 电阻卡 100*70MM 1 电阻卡

KE0113不带开发板 KE0114带官方Arduino UNO R3

34 开发板 Arduino UNO R3 1

3、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文件

然后

然后

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

1.5.6版本安装后的样子。

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

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

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

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

进入下图,选择

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

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

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

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

4、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 的软件,设置板,如下。

设置COM端口,如下

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

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

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

5、实验课程

实验一 LED 闪烁实验

实验说明

LED 闪烁实验是比较基础的实验之一,上一个“ Hello World!”实验里已经利用到了Arduino 自带的LED,这次我们利用其他I/O 口和外接直插LED 灯来完成这个实验。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

1

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(2000); //延迟2S

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

delay(2000);//延迟2S

}

测试结果

下载完程序就可以看到我们的IO口外接小灯在闪烁了,这样我们的实验现象为LED不停闪烁,间隔大约为两秒。

实验二 呼吸灯实验

实验说明

上一课程中我们只是控制LED的亮和灭,那么我们可以怎么控制LED的亮度呢?本课程中我们把LED接到PWM口中,然后通过改变PWM数值,调节LED亮度,使LED逐渐变亮,和逐渐变暗,从而达到呼吸灯的效果。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

2

测试代码

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.01S

}

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

{

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

delay(10); // 延迟0.01S

}

delay(1000);// 延迟1S

}

测试结果

下载完程序就可以看到我们的IO口外接小灯显示出呼吸灯的效果,小灯先逐渐变亮,后逐渐变暗,循环交替。

实验三 广告灯实验

实验说明

在生活中我们经常会看到一些由各种颜色的led灯组成的广告牌,广告牌上各个位置上癿led灯不断的变话,形成各种效果。本节实验就是利用led灯编程模拟广告灯效果。

实验器材

开发板*1

USB线*1

LED*5

220Ω 电阻*5

面包板*1

面包板连接线若干

接线图

3

测试代码

int BASE = 2 ; //第一个 LED 接的 I/O 口

int NUM = 5; //LED 的总数

void setup()

{

for (int i = BASE; i < BASE + NUM; i ++)

{

pinMode(i, OUTPUT); //设定数字I/O口为输出

}

}

void loop()

{

for (int i = BASE; i < BASE + NUM; i ++)

{

digitalWrite(i, HIGH); //设定数字I/O口输出为”高”,即逐渐开灯

delay(200); //延迟

}

for (int i = BASE; i < BASE + NUM; i ++)

{

digitalWrite(i, LOW); //设定数字I/O口输出为”低”,即逐渐关灯

delay(200); //延迟

}

}

测试结果

下载完程序就可以看到我们的IO口外接小灯先逐渐变亮,然后逐渐变暗,循环交替。

实验四 按键控制LED实验

实验说明

I/O 口的意思即为INPUT 接口和OUTPUT 接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O 口的输出功能,这个实验我们来尝试一下使用Arduino的I/O 口的输入功能即为读取外接设备的输出值,我们用一个按键和一个LED 小灯完成一个输入输出结合使用的实验,让大家能简单了解I/O 的作用。

实验器材

开发板 *1

USB线*1

LED*1

轻触按键*1

220Ω 电阻*1

10KΩ 电阻*1

面包板*1

面包板连接线若干

接线图

4

测试代码

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

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, LOW); // LED变暗

}

else

{

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

}

}

测试结果

下载完程序,上电后,当按键按下时小灯亮起,否则小灯不亮。

实验五 抢答器实验

实验说明

完成上面的实验以后相信已经有很多朋友可以独立完成这个实验了,我们可以将上面的按键控制小灯的实验扩展成4个按键对应3 个小灯,占用7个数字I/O 接口。为方便接线,我们把3个小灯用一个keyes 插件RGB模块代替。keyes 插件RGB模块代替由一个插件全彩LED制成,通过 R、 G、 B三个引脚的PWM电压输入可以调节三种基色(红/蓝/绿)的强度从而实现全彩的混色效果。

本实验中我们利用4个按键控制3个PWM口,控制RGB模块发光颜色从而达到抢答器的效果。

实验器材

开发板*1

USB线*1

keyes 插件RGB模块*1

轻触按键*4

10KΩ 电阻*4

面包板*1

面包板连接线若干

杜邦线若干

接线图

5

测试代码

int redled=11;

int greenled=10;

int blueled=9;

int redpin=5;

int greenpin=4;

int bluepin=3;

int restpin=2;

int red;

int green;

int blue;

void setup()

{

pinMode(redled,OUTPUT);

pinMode(greenled,OUTPUT);

pinMode( blueled,OUTPUT);

pinMode(redpin,INPUT);

pinMode(greenpin,INPUT);

pinMode(bluepin,INPUT);

}

void loop()

{

red=digitalRead(redpin);

green=digitalRead(greenpin);

blue=digitalRead(bluepin);

if(red==LOW)RED_YES();

if(green==LOW)GREEN_YES();

if(blue==LOW)BLUE_YES();

}

void RED_YES()

{

while(digitalRead(restpin)==1)

{

color(255, 0, 0);

}

clear_led();

}

void GREEN_YES()

{

while(digitalRead(restpin)==1)

{

color(0, 255, 0);

}

clear_led();

}

void BLUE_YES()

{

while(digitalRead(restpin)==1)

{

color(0, 0, 255);

}

clear_led();

}

void clear_led()

{

color(0, 0, 0);

}

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

{

analogWrite(redled, red);

analogWrite(greenled,green);

analogWrite(blueled, blue);

}

测试结果

下载完程序,上电后,一个简单的抢答器就做好了,我们根据RGB灯显示的颜色判断是谁抢答成功。在复位后。RGB灯关闭。

实验六 电位器调控灯光亮度实验

实验说明

在第二课程中我们直接通过PWM口控制灯的亮度,从而达到呼吸灯的效果。在这课程中我们通过一个电位器,利用电位器调节PWM值,从而控制灯的亮度。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

可调电位器*1

面包板*1

面包板连接线若干

接线图

6

测试代码

int ledpin=11;//定义数字接口11(PWM 输出)

void setup()

{

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

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

}

void loop()

{

int val=analogRead(0);//读取模拟口A0口的值

val = map(val, 0, 1023, 0, 255);//从0-1023映射到0-255

Serial.println(val);//显示val 变量

analogWrite(ledpin,val);// 打开LED 并设置亮度

delay(100);//延时0.1 秒

}

测试结果

下载完程序后。我们可以通过旋转可调电位器控制小灯的亮度,打开串口监视器,设置波特率为9600,就可看到调节LED亮度的PWM值。

实验七 感光灯实验

实验说明

完成以上的各种实验后,我们对Arduino 的应用也应该有一些认识和了解了,在基本的数字量输入输出和模拟量输入以及PWM 的产生都掌握以后,我们就可以开始进行一些传感器的应用了。

本次实验我们先进行一个较为简单的光敏电阻的使用实验。光敏电阻既然是可以根据光强改变阻值的元件,自然也需要模拟口读取模拟值了,本实验可以借鉴电位器调控灯光亮度实验,将电位计换做光敏电阻实现当光强不同时LED 小灯的亮度也会有相应的变化。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

10KΩ 电阻*1

光敏电阻*1

面包板*1

面包板连接线若干

接线图

7

测试代码

int ledpin=11;//定义数字接口11(PWM 输出)

void setup()

{

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

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

}

void loop()

{

int val=analogRead(0);//读取模拟口A0口的值

Serial.println(val);//显示val 变量

val = map(val, 0, 1023, 0, 255);//从0-1023映射到0-255

analogWrite(ledpin,255-val);// 打开LED 并设置亮度

delay(10);//延时0.01 秒

}

测试结果

下载完程序后,光敏电阻感应到灯光越亮,小灯越暗;光敏电阻感应到灯光越暗,小灯越亮。打开串口监视器,设置波特率为9600,就可看到光敏电阻感应到外界光强所得的模拟值。

实验八 有源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了有源蜂鸣器,有源蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号。实验中中我们只需要给蜂鸣器输入一个高电平信号,蜂鸣器响起。

实验器材

开发板*1

USB线*1

有源蜂鸣器*1

面包板*1

面包板连接线若干

接线图

8

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(1000); //延迟1S

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

delay(1000);//延迟1S

}

测试结果

下载完程序后,我们可以听到蜂鸣器响1秒,停止响起1秒,循环交替。

实验九 无源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了无源蜂鸣器,无源蜂鸣器内部不带振荡源,直流信号无法令其鸣叫,须用方波驱动。

实验器材

开发板 *1

USB线*1

无源蜂鸣器*1

面包板*1

面包板连接线若干

接线图

9

测试代码

code 1:

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

}

}

}

code 2:

#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);

}

测试结果

实验中我们提供了两个例程,上传例程1代码后,蜂鸣器会发出两种不同的声音,实验中,两种声音循环交替。上传例程2中代码后,蜂鸣器会想响起《欢乐颂》的曲子。

实验十 火焰报警实验

实验说明

火焰传感器是机器人专门用来搜寻火源的传感器,本传感器对火焰特别灵敏。火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号。

实验中,我们把火焰的亮度转化为高低变化的电平信号输入到UNO板中,然后控制蜂鸣器的响起。

实验器材

开发板*1

USB线*1

有源蜂鸣器*1

火焰传感器*1

10KΩ 电阻*1

面包板*1

面包板连接线若干

接线图

10

测试代码

int flame=7;//定义火焰接口为数字7 接口

int Beep=9;//定义蜂鸣器接口为数字9 接口

void setup()

{

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

pinMode(flame,INPUT);//定义flame为输入接口

}

void loop()

{

int val=digitalRead(flame);//读取火焰传感器

if(val==HIGH)//当数字口7为高电平时蜂鸣器鸣响

{

digitalWrite(Beep,HIGH);

}else

{

digitalWrite(Beep,LOW);

}

delay(500);

}

测试结果

下载完程序后,我们可以模拟在有火焰时报警的情况,在没有火焰时一切正常,当有火焰时立刻报警做出提示。

实验十一 温馨水杯实验

实验说明

LM35 是很常用且易用的温度传感器元件,将LM35 温度传感器接到开发板上,通过算法可将读取的模拟值转换为实际的温度。

本实验中我们还外接了3个指示灯,在代码中我没设置在不同的温度范围,亮起不同颜色的指示灯。根据这个,我们完全可以做个温馨水杯,通过指示灯,我们就可以知道杯子里的水的冷热情况。

实验器材

开发板 *1

USB线*1

LM35DZ*1

LED*3

220Ω 电阻*3

面包板*1

面包板连接线若干

接线图

11

测试代码

void setup() {

Serial.begin(9600);

pinMode(12, OUTPUT);

pinMode(11, OUTPUT);

pinMode(10, OUTPUT);

}

void loop() {

int vol = analogRead(A0) * (5.0 / 1023.0*100);

Serial.print(“Tep:”);

Serial.print(vol);

Serial.println(“C”);

if (vol<28)

{

digitalWrite(12, HIGH);

digitalWrite(11, LOW);

digitalWrite(10, LOW);

}

else if (vol>=28 && vol<=30)

{

digitalWrite(12, LOW);

digitalWrite(11, HIGH);

digitalWrite(10, LOW);

}

else if (vol>30)

{

digitalWrite(12, LOW);

digitalWrite(11, LOW);

digitalWrite(10, HIGH);

}

}

测试结果

下载完程序后,打开串口监视器,设置波特率为9600,就可看到当前的温度。当温度大于30摄氏度时,红色指示灯亮起,其他指示灯熄灭;当温度大于等于28摄氏度且小于等于30摄氏度时,红色指示灯熄灭,黄色指示灯亮起;当温度小于28摄氏度时,黄色指示灯熄灭,蓝色指示灯亮起。

实验十二 魔术光杯实验

实验说明

倾斜开关的工作原理是当开关一端低于水平位置倾斜,开关寻通;当另一端低于水平位置倾斜 ,开关停止。魔术光杯实验原理是利用 PWM 调光的原理,两个LED的亮度发生变化。

这个实验中倾斜开关提供数字信号,触发 PWM 的调节,通过程序的设计,我们就能看到类似于两组装满光的杯子倒来倒去的效果了。

实验器材

开发板*1

USB线*1

LED*2

倾斜开关*2

220Ω 电阻*2

10KΩ 电阻*2

面包板*1

面包板连接线若干

接线图

12

测试代码

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最亮;在串口监视器中看到对应具体数值变化,如下图。当倾斜另一边中,现象一样,方向相反。

实验十三 红外遥控解码实验

实验说明

通用红外遥控系统由发射和接收两大部分组成。本实验中发射部分就是遥控器,接收部分就是红外接收 VS1838B。红外接收 VS1838B是集接收、放大、解调一体的器件,它内部IC就已经完成了解调,输出的就是数字信号。

图片3

实验器材

开发板*1

USB线*1

红外遥控*1

红外接收 VS1838B*1

面包板*1

面包板连接线若干

接线图

13

测试代码

#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(); // 接收下个数据

}

}

测试结果

下载完程序,上电后,红外遥控对准红外接收传感器发送信号,我们可以在串口监视器总看到相应按键的编码,如下图。

遥控器-1

实验十四 一位数码管显示实验

实验说明

数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),本实验所使用的是八段数码管。数码管共有七段显示数字的段,还有一个显示小数点的段。当让数码管显示数字时,只要将相应的段点亮即可。

实验器材

开发板 *1

USB线*1

一位数码管*1

220Ω 电阻*8

面包板*1

面包板连接线若干

接线图

14

测试代码

//设置控制各段的数字IO 脚

int a=7;//定义数字接口7 连接a 段数码管

int b=6;// 定义数字接口6 连接b 段数码管

int c=5;// 定义数字接口5 连接c 段数码管

int d=10;// 定义数字接口11 连接d 段数码管

int e=11;// 定义数字接口10 连接e 段数码管

int f=8;// 定义数字接口8 连接f 段数码管

int g=9;// 定义数字接口9 连接g 段数码管

int dp=4;// 定义数字接口4 连接dp 段数码管

void digital_1(void) //显示数字1

{

unsigned char j;

digitalWrite(c,HIGH);//给数字接口5 引脚高电平,点亮c 段

digitalWrite(b,HIGH);//点亮b 段

for(j=7;j<=11;j++)//熄灭其余段

digitalWrite(j,LOW);

digitalWrite(dp,LOW);//熄灭小数点DP 段

}

void digital_2(void) //显示数字2

{

unsigned char j;

digitalWrite(b,HIGH);

digitalWrite(a,HIGH);

for(j=9;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

digitalWrite(c,LOW);

digitalWrite(f,LOW);

}

void digital_3(void) //显示数字3

{

unsigned char j;

digitalWrite(g,HIGH);

digitalWrite(d,HIGH);

for(j=5;j<=7;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

digitalWrite(f,LOW);

digitalWrite(e,LOW);

}

void digital_4(void) //显示数字4

{

digitalWrite(c,HIGH);

digitalWrite(b,HIGH);

digitalWrite(f,HIGH);

digitalWrite(g,HIGH);

digitalWrite(dp,LOW);

digitalWrite(a,LOW);

digitalWrite(e,LOW);

digitalWrite(d,LOW);

}

void digital_5(void) //显示数字5

{

unsigned char j;

for(j=7;j<=9;j++)

digitalWrite(j,HIGH);

digitalWrite(c,HIGH);

digitalWrite(d,HIGH);

digitalWrite(dp,LOW);

digitalWrite(b,LOW);

digitalWrite(e,LOW);

}

void digital_6(void) //显示数字6

{

unsigned char j;

for(j=7;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(c,HIGH);

digitalWrite(dp,LOW);

digitalWrite(b,LOW);

}

void digital_7(void) //显示数字7

{

unsigned char j;

for(j=5;j<=7;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

for(j=8;j<=11;j++)

digitalWrite(j,LOW);

}

void digital_8(void) //显示数字8

{

unsigned char j;

for(j=5;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

}

void setup()

{

int i;//定义变量

for(i=4;i<=11;i++)

pinMode(i,OUTPUT);//设置4~11 引脚为输出模式

}

void loop()

{

while(1)

{

digital_1();//显示数字1

delay(2000);//延时2s

digital_2();//显示数字2

delay(1000); //延时1s

digital_3();//显示数字3

delay(1000); //延时1s

digital_4();//显示数字4

delay(1000); //延时1s

digital_5();//显示数字5

delay(1000); //延时1s

digital_6();//显示数字6

delay(1000); //延时1s

digital_7();//显示数字7

delay(1000); //延时1s

digital_8();//显示数字8

delay(1000); //延时1s

}

}

测试结果

下载完程序后,数码管循环显示1~8 数字。

实验十五 74HC595驱动一位数码管实验

实验说明

上一个实验中我们直接把用开发板控制一位数码管,需要占用了较多的数字口,本实验中我们添加了一个74HC595芯片控制一位数码管,只需要用3个数字口就可以控制8个LED灯,具体设置方法可以参照以下表格。

Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0
a b c d e f g dp
0 1 1 1 1 1 1 0 0 252
1 0 1 1 0 0 0 0 0 96
2 1 1 0 1 1 0 1 0 218
3 1 1 1 1 0 0 1 0 242
4 0 1 1 0 0 1 1 0 102
5 1 0 1 1 0 1 1 0 182
6 1 0 1 1 1 1 1 0 190
7 1 1 1 0 0 0 0 0 224
8 1 1 1 1 1 1 1 0 254
9 1 1 1 1 0 1 1 0 246

实验器材

开发板*1

USB线*1

74HC595*1

一位数码管*1

220Ω 电阻*8

面包板*1

面包板连接线若干

接线图

15

测试代码

int latchPin = 4;

int clockPin = 5;

int dataPin = 2; //这里定义了那三个脚

void setup ()

{

pinMode(latchPin,OUTPUT);

pinMode(clockPin,OUTPUT);

pinMode(dataPin,OUTPUT); //让三个脚都是输出状态

}

void loop()

{

int a[10]={

246,254,224,190,182,102,242,218,96,252}; //定义功能数组,数组依次为数码管得定义

for(int x=9; x>-1 ;x– ) //倒数功能循环

{

digitalWrite(latchPin,LOW);

shiftOut(dataPin,clockPin,MSBFIRST,a[x]); //显示数组a[x]

digitalWrite(latchPin,HIGH);

delay(1000);

}

}

测试结果

下载完程序后,数码管循环显示0~9 数字。

实验十六 8*8点阵显示实验

实验说明

点阵在我们生活中很常见,很多都有用到他,比如LED广告显示屏,电梯显示楼层,公交车报站等等。

8*8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置高电平,某一列置低电平,则相应的二极管就亮;如要将第一个点点亮,则7脚接高电平A脚接低电平,则第一个点就亮了;如果要将第一行点亮,则第7脚要接高电平,而A、B、C、D、E、F、G、H这些引脚接低电平,那么第一行就会点亮;如要将第一列点亮,则第A脚接低电平,而0、1、2、3、4、5、6、7接高电平,那么第一列就会点亮。

在本课程中,我们只是让点阵输出一个“0”。

8*8点阵原理图

8 ×8点阵原理图 - cdx19901103@yeah - cdx19901103@yeah的博客

8*8点阵实物图

8 ×8点阵原理图 - cdx19901103@yeah - cdx19901103@yeah的博客 图形111

实验器材

开发板*1

USB线*1

8*8点阵*1

220Ω 电阻*8

面包板*1

面包板连接线若干

接线图

16

测试代码

//定义了一个数组,用来存放“0”字的字模

unsigned char Text[]={0x00,0x1c,0x22,0x22,0x22,0x22,0x22,0x1c};

void Draw_point(unsigned char x,unsigned char y)//画点函数

{

clear_();

digitalWrite(x+2, HIGH);

digitalWrite(y+10, LOW);

delay(1);

}

void show_num(void)//显示函数,最终还是调用了画点函数。

{

unsigned char i,j,data;

for(i=0;i<8;i++)

{

data=Text[i];

for(j=0;j<8;j++)

{

if(data & 0x01)Draw_point(j,i);

data>>=1;

}

}

}

void setup(){

int i = 0 ;

for(i=2;i<18;i++)

{

pinMode(i, OUTPUT);

}

clear_();

}

void loop()

{

show_num();

}

void clear_(void)//清除屏幕

{

for(int i=2;i<10;i++)

digitalWrite(i, LOW);

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

digitalWrite(i+10, HIGH);

}

测试结果

下载完程序后,点阵上显示数字“0”。

实验十七 四位数码管显示数字实验

实验说明

在实验十五中我们使用开发板驱动一个一位数码管,本实验我们使用开发板驱动一个共阴四位数码管。驱动数码管限流电阻肯定是必不可少的,限流电阻有两种接法,一种是在d1-d4阴极接,总共接4颗。这种接法好处是需求电阻比较少,但是会产生每一位上显示不同数字亮度会不一样,1最亮,8最暗。另外一种接法就是在其他8个引脚上接,这种接法亮度显示均匀,但是用电阻较多。本次实验使用8颗220Ω电阻。

四位数码管总共有12个引脚,小数点朝下正放在面前时,左下角为1,其他管脚顺序为逆时针旋转。左上角为最大的12号管脚。

IMGP0049_调整大小.JPG

四位数码管原理图如下

5643b.jpg

实验器材

开发板*1

USB线*1

四位数码管*1

220Ω 电阻*8

面包板*1

面包板连接线若干

接线图

17

测试代码

int a = 1;

int b = 2;

int c = 3;

int d = 4;

int e = 5;

int f = 6;

int g = 7;

int dp = 8;

int d4 = 9;

int d3 = 10;

int d2 = 11;

int d1 = 12;

// set variable

long n = 1230;

int x = 100;

int del = 55; // fine adjustment for clock

void setup()

{

pinMode(d1, OUTPUT);

pinMode(d2, OUTPUT);

pinMode(d3, OUTPUT);

pinMode(d4, OUTPUT);

pinMode(a, OUTPUT);

pinMode(b, OUTPUT);

pinMode(c, OUTPUT);

pinMode(d, OUTPUT);

pinMode(e, OUTPUT);

pinMode(f, OUTPUT);

pinMode(g, OUTPUT);

pinMode(dp, OUTPUT);

}

/////////////////////////////////////////////////////////////

void loop()

{

int a=0;

int b=0;

int c=0;

int d=0;

unsigned long currentMillis = millis();

while(d>=0)

{

while(millis()-currentMillis<1000)

{

Display(1,a);

Display(2,b);

Display(3,c);

Display(4,d);

}

currentMillis = millis();

d++;

if (d>9)

{

c++;

d=0;

}

if (c>9)

{

b++;

c=0;

}

if (b>9)

{

a++;

b=0;

}

if (a>9)

{

a=0;

b=0;

c=0;

d=0;

}

}

}

///////////////////////////////////////////////////////////////

void WeiXuan(unsigned char n)//

{

switch (n)

{

case 1:

digitalWrite(d1, LOW);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

case 2:

digitalWrite(d1, HIGH);

digitalWrite(d2, LOW);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

case 3:

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, LOW);

digitalWrite(d4, HIGH);

break;

case 4:

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, LOW);

break;

default :

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

}

}

void Num_0()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_1()

{

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_2()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, LOW);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_3()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_4()

{

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_5()

{

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_6()

{

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_7()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_8()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_9()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Clear() // clear the screen

{

digitalWrite(a, LOW);

digitalWrite(b, LOW);

digitalWrite(c, LOW);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void pickNumber(unsigned char n)// select number

{

switch (n)

{

case 0: Num_0();

break;

case 1: Num_1();

break;

case 2: Num_2();

break;

case 3: Num_3();

break;

case 4: Num_4();

break;

case 5: Num_5();

break;

case 6: Num_6();

break;

case 7: Num_7();

break;

case 8: Num_8();

break;

case 9: Num_9();

break;

default: Clear();

break;

}

}

void Display(unsigned char x, unsigned char Number)// take x as coordinate and display number

{

WeiXuan(x);

pickNumber(Number);

delay(1);

Clear() ; // clear the screen

}

测试结果

下载完程序后,数码管首先显示“0000”数值,显示跳动,每跳动一下数码管显示数值加1。当显示数值为超过“9999”后,显示数值再次变为“0000”,循环显示。

实验十八 1602 LCD显示实验

实验说明

开发板IO口只有限,加些传感器、继电器等模块多了,IO口就不够用了,原来的1602

LCD屏需要7个IO口才能驱动起来,1602 I2C 蓝屏模块含LCD1602转接板和1602 LCD

屏。它通过I2C通信,只需要2个IO口就能驱动。

1602 LCD屏可以显示2行共32个字符,这个实验我们只是让1602 LCD屏显示对应字符。

实验器材

开发板*1

USB线*1

1602 I2C 蓝屏*1

杜邦线若干

接线方法

18

测试代码

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()

{

lcd.init(); // initialize the lcd

lcd.init();

// Print a message to the LCD.

lcd.backlight();

lcd.setCursor(2,0);

lcd.print(“Hello, world!”);

lcd.setCursor(2,1);

lcd.print(“Hello, keyes!”);

}

void loop()

{

}

测试结果

按照接线方法接好线,烧录好代码,上电后,通电后,旋转模块电位器调节背光,LCD上第一行和第二行分别显示”Hello, world!”和”Hello, keyes!”字符。

实验十九 超声波测距显示实验

实验说明

超声波传感器主要用于测距,它具有高精度、盲区(2cm)超近、性能稳定的特点。本实验中我们主要用到了超声波传感器和1602 I2C 蓝屏。实验中我们通过超声波测到超声波与前方障碍物的距离,然后在1602 I2C 蓝屏上显示测试结果。

实验器材

开发板*1

USB线*1

1602 I2C 蓝屏*1

超声波传感器*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

19

测试代码

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

#define echoPin 9 // Echo Pin

#define trigPin 8 // Trigger Pin

#define LEDPin 13 // Onboard LED

int maximumRange = 200; // Maximum range needed

int minimumRange = 0; // Minimum range needed

long duration, distance; // Duration used to calculate distance

void setup() {

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)

lcd.init(); // initialize the lcd

// Print a message to the LCD.

lcd.init();

lcd.backlight();

lcd.setCursor(0,0);

lcd.print(“The distance is:”);

}

void loop() {

/* The following trigPin/echoPin cycle is used to determine the

distance of the nearest object by bouncing soundwaves off of it. */

digitalWrite(trigPin, LOW);

delayMicroseconds(2);

digitalWrite(trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);

//Calculate the distance (in cm) based on the speed of sound.

distance = duration/58.2;

if (distance >= maximumRange || distance <= minimumRange){

/* Send a negative number to computer and Turn LED ON

to indicate “out of range” */

lcd.setCursor(0,1);

lcd.print(“-1 “);

digitalWrite(LEDPin, HIGH);

}

else {

/* Send the distance to the computer using Serial protocol, and

turn LED OFF to indicate successful reading. */

Serial.println(distance);

if(distance<10)

{

lcd.setCursor(0,1);

lcd.print(distance);

lcd.setCursor(1,1);

lcd.print(” “);

}

if((distance >=10)&&(distance<100))

{

lcd.setCursor(0,1);

lcd.print(distance);

lcd.setCursor(2,1);

lcd.print(” “);

}

if(distance>100)

{

lcd.setCursor(0,1);

lcd.print(distance);

}

digitalWrite(LEDPin, LOW);

}

//Delay 50ms before next reading.

delay(50);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 I2C 蓝屏显示”The distance is:”字符;测试超声波与前方障碍物的距离,测试到数据,则在1602 I2C 蓝屏上显示该数据,若没测试到数据,那么就在1602 I2C 蓝屏上显示”-1”字符。

实验二十 1302时钟显示实验

实验说明

上一实验中我们在1602 I2C 蓝屏上显示超声波距离,这一实验程也是将1602 I2C 蓝屏做显示器。这个实验中我们利用1302时钟模块和1602 I2C 蓝屏自制一个时钟,时钟上包含年、月、日、星期、小时、分钟、秒。初始时间在代码中设置,时钟自动行走,在1602 I2C 蓝屏显示。

实验器材

开发板*1

USB线*1

1602 I2C 蓝屏*1

1302时钟模块*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

20

测试代码

#include <stdio.h>

#include <string.h>

#include <DS1302.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

/* Set the appropriate digital I/O pin connections */

uint8_t CE_PIN = 10; // RST

uint8_t IO_PIN = 9; // DAT

uint8_t SCLK_PIN = 8; // CLK

/* Create buffers */

char buf[50];

char bf[50];

char bu[50];

char uf[50];

char day[10];

/* Create a DS1302 object */

DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

void print_time()

{

/* Get the current time and date from the chip */

Time t = rtc.time();

/* Name the day of the week */

memset(day, 0, sizeof(day)); /* clear day buffer */

switch (t.day) {

case 1:

strcpy(day, “Sunday “);

break;

case 2:

strcpy(day, “Monday “);

break;

case 3:

strcpy(day, “Tuesday “);

break;

case 4:

strcpy(day, “Wednesday”);

break;

case 5:

strcpy(day, “Thursday “);

break;

case 6:

strcpy(day, “Friday “);

break;

case 7:

strcpy(day, “Saturday “);

break;

}

/* Format the time and date and insert into the temporary buffer */

snprintf(buf, sizeof(buf), “%s %04d-%02d-%02d %02d:%02d:%02d”,

day,

t.yr, t.mon, t.date,

t.hr, t.min, t.sec);

Serial.println(buf);

snprintf(bf, sizeof(bf), “%s %04d”,

day, t.yr);

lcd.setCursor(0,0);

lcd.print(bf);

snprintf(bu, sizeof(bu),”%02d:%02d:%02d”,

t.hr, t.min, t.sec);

/* Print the formatted string to serial so we can see the time */

lcd.setCursor(0,1);

lcd.print(bu);

snprintf(uf, sizeof(uf), “%02d-%02d”,

t.mon, t.date);

lcd.setCursor(11,1);

lcd.print(uf);

}

void setup()

{

lcd.init(); // initialize the lcd

// Print a message to the LCD.

lcd.init();

lcd.backlight();

Serial.begin(9600);

/* Initialize a new chip by turning off write protection and clearing the

clock halt flag. These methods needn’t always be called. See the DS1302

datasheet for details. */

rtc.write_protect(false);

rtc.halt(false);

/* Make a new time object to set the date and time */

/* Tuesday, May 19, 2009 at 21:16:37. */

Time t(2017,10,24,10,11,22,3);

/* Set the time and date on the chip */

rtc.time(t);

}

/* Loop and print the time every second */

void loop()

{

print_time();

delay(1000);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 I2C 蓝屏显示当前初始时间,然后时钟开始走动。

实验二十一 人体红外感应实验

实验说明

和上面两个实验一样,这个实验也是用1602 I2C 蓝屏做显示器。实验中,我们用到了人体红外热释电传感器。人体红外热释电传感器是基于红外线技术的自动控制产品。它具有灵敏度高、可靠性强、超低功耗,超低电压工作模式等特点。

当检测到有人有附近移动时,在1602 I2C 蓝屏显示对应字符,当没有检测到人体在附件移动时,1602 I2C 蓝屏显示另一对应字符。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

1602 I2C 蓝屏*1

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

面包板*1

面包板连接线若干

杜邦线若干

接线图

21

测试代码

// include the library code:

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

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

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

void setup()

{

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

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

lcd.init(); // initialize the lcd

// Print a message to the LCD.

lcd.init();

lcd.backlight();

}

void loop()

{

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

digitalWrite(indicator,state);//控制数字口10的状态

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

{

lcd.setCursor(0,0);

lcd.print(“Somebody is”);

lcd.setCursor(0,1);

lcd.print(“in this area!”);

}

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

{

lcd.setCursor(0,0);

lcd.print(“No one! “);

lcd.setCursor(0,1);

lcd.print(“No one! “);

}

delay(500);//延迟0.5S

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,当检测到有人有附近移动时,在1602 LCD第一行显示显示”Somebody is “字符,第二行显示”in this area!”字符,LED亮起;当没有检测到人体在附件移动时,1602 LCD两行都显示”No one!”字符,LED熄灭。

实验二十二 4×4按键显示实验

实验说明

为了节约单片机I/O口,我们将多个按键做成矩阵键盘。本实验中用到了一个4×4按键矩阵,实验中,当我们按下矩阵中按键后,串口监视器中会显示对应字符。

4*4 薄膜按键脚位,请看上图。 其原理图如下

实验器材

开发板 *1

USB线*1

4*4 薄膜按键*1

面包板连接线若干

接线方法

22

测试代码

#include <Keypad.h>

const byte ROWS = 4; //定义 4 行

const byte COLS = 4; //定义 4 列

char keys[ROWS][COLS] = {

{‘1′,’2′,’3′,’A’},

{‘4′,’5′,’6′,’B’},

{‘7′,’8′,’9′,’C’},

{‘*’,’0′,’#’,’D’}

};

//连接 4*4 按键的行位端口,相应控制板的数字 IO 口

byte rowPins[ROWS] = {9,8,7,6};

//连接 4*4 按键的列位端口,相应控制板的数字 IO 口

byte colPins[COLS] = {5,4,3,2};

//调用 Keypad 类库功能函数

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){

Serial.begin(9600);

}

void loop(){

char key = keypad.getKey();

if (key != NO_KEY){

Serial.println(key);

}

}

测试结果

将程序下载到实验板后,打开串口监视器, 此时按下键盘上的某个键, 在串口工具上显示该按键的值,如下图。

实验二十三 步进电机实验

实验说明

步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到

一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。你

可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时你也可以通过

控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

下面这个就是本次实验使用的步进电机
csc
减速步进电机

直径:28mm

电压:5V

步进角度:5.625 x 1/64

减速比:1/64

5线4相 可以用普通uln2003芯片驱动,也可以接成2相使用

该步进电机空载耗电在50mA以下,带64倍减速器,输出力矩比较大,可以驱动重负

载,极适合开发板使用。注意:此款步进电机带有64倍减速器,与不带减速器的步进

电机相比,转速显得较慢,为方便观察,可在输出轴处粘上一片小纸板。

csc

步进电机(五线四相)驱动板(UL2003)试验板

KE0079  (1)

实验器材

开发板*1

USB线*1

减速步进电机*1

UL2003*1

杜邦线若干

接线图

23

测试代码

#include <Stepper.h>

//这里设置步进电机旋转一圈是多少步

#define STEPS 100

//设置步进电机的步数和引脚

Stepper stepper(STEPS, 11, 10, 9, 8);

//定义变量用来存储历史读数

int previous = 0;

void setup()

{

//设置电机每分钟的转速为90步

stepper.setSpeed(90);

}

void loop()

{

//获取传感器读数

int val = analogRead(0);

//移动步数为当前读数减去历史读数

stepper.step(val – previous);

//保存历史读数

previous = val;

}

测试结果

按照上图接好线,烧录好代码,上电后,5V步进电机转动,转动速度很慢。

实验二十四 舵机控制实验

实验说明

舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测

器所构成。舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红、橙三种颜

色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极

线,橙色为信号线。

舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM

(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms

之间,但是,事实上脉宽可由0.5ms 到2.5ms 之间,脉宽和舵机的转角0°~180°相

对应。有一点值得注意的地方,由于舵机牌子不同,对于同一信号,不同牌子的舵机旋

转的角度也会有所不同。

实验器材

开发板*1

USB线*1

舵机*1

面包线若干

接线图

24

测试代码

程序A:

int servopin=9;//定义数字接口9 连接伺服舵机信号线

int myangle;//定义角度变量

int pulsewidth;//定义脉宽变量

int val;

void servopulse(int servopin,int myangle)//定义一个脉冲函数

{

pulsewidth=(myangle*11)+500;//将角度转化为500-2480 的脉宽值

digitalWrite(servopin,HIGH);//将舵机接口电平至高

delayMicroseconds(pulsewidth);//延时脉宽值的微秒数

digitalWrite(servopin,LOW);//将舵机接口电平至低

delay(20-pulsewidth/1000);

}

void setup()

{

pinMode(servopin,OUTPUT);//设定舵机接口为输出接口

Serial.begin(9600);//连接到串行端口,波特率为9600

Serial.println(“servo=o_seral_simple ready” ) ;

}

void loop()//将0 到9 的数转化为0 到180 角度,并让LED 闪烁相应数的次数

{

val=Serial.read();//读取串行端口的值

if(val>=’0’&&val<=’9′)

{

val=val-‘0’;//将特征量转化为数值变量

val=val*(180/9);//将数字转化为角度

Serial.print(“moving servo to “);

Serial.print(val,DEC);

Serial.println();

for(int i=0;i<=50;i++) //给予舵机足够的时间让它转到指定角度

{

servopulse(servopin,val);//引用脉冲函数

}

}

}

程序B:

#include <Servo.h>

Servo myservo;//定义舵机变量名

void setup()

{

myservo.attach(9);//定义舵机接口(9、10 都可以,缺点只能控制2 个)

}

void loop()

{

myservo.write(90);//设置舵机旋转的角度

}

测试结果

程序A 结果:

在串口监视器中输入数字点击发送,舵机转动到所对应的角度数的位置,并将角度打印显示到屏幕上。

程序B结果:

舵机自己转动到90度位置。

实验二十五 RFID读卡器实验

实验说明

射频技术也简称 RFID,RFID 是英文 radio frequency identification”的缩写,叫做射频识

别技术,简称射频技术。本实验只是用RFID模块读取IC卡和钥匙扣中的内容。RFID模块,一定要使用+3.3V 供电,否则会烧掉模块。

实验器材

开发板*1

USB线*1

RFID-RC522 射频模块*1

IC卡*1

钥匙扣*1

杜邦线若干

接线图

25

测试代码

#include <SPI.h>

#define uchar unsigned char

#define uint unsigned int

#define MAX_LEN 16

const int chipSelectPin = 10;//if the controller is UNO,328,168

//const int chipSelectPin = 53;//if the controller is MEGA 2560

const int NRSTPD = 5;

//MF522command word

#define PCD_IDLE 0x00 //NO action; cancel current command

#define PCD_AUTHENT 0x0E //verify key

#define PCD_RECEIVE 0x08 //receive data

#define PCD_TRANSMIT 0x04 //send data

#define PCD_TRANSCEIVE 0x0C //receive and send data

#define PCD_RESETPHASE 0x0F //reset

#define PCD_CALCCRC 0x03 //CRC calculation

//Mifare_One Card command word

#define PICC_REQIDL 0x26 // line-tracking area is dormant #define PICC_REQALL 0x52 //line-tracking area is interfered

#define PICC_ANTICOLL 0x93 //Anti collision

#define PICC_SElECTTAG 0x93 //choose cards

#define PICC_AUTHENT1A 0x60 //Verify A key

#define PICC_AUTHENT1B 0x61 //Verify B key

#define PICC_READ 0x30 // Reader Module

#define PICC_WRITE 0xA0 // letter block

#define PICC_DECREMENT 0xC0

#define PICC_INCREMENT 0xC1

#define PICC_RESTORE 0xC2 //Transfer data to buffer

#define PICC_TRANSFER 0xB0 //Save buffer data

#define PICC_HALT 0x50 //Dormancy

//MF522 Error code returned when communication

#define MI_OK 0

#define MI_NOTAGERR 1

#define MI_ERR 2

//——————MFRC522 Register—————

//Page 0:Command and Status

#define Reserved00 0x00

#define CommandReg 0x01

#define CommIEnReg 0x02

#define DivlEnReg 0x03

#define CommIrqReg 0x04

#define DivIrqReg 0x05

#define ErrorReg 0x06

#define Status1Reg 0x07

#define Status2Reg 0x08

#define FIFODataReg 0x09

#define FIFOLevelReg 0x0A

#define WaterLevelReg 0x0B

#define ControlReg 0x0C

#define BitFramingReg 0x0D

#define CollReg 0x0E

#define Reserved01 0x0F

//Page 1:Command

#define Reserved10 0x10

#define ModeReg 0x11

#define TxModeReg 0x12

#define RxModeReg 0x13

#define TxControlReg 0x14

#define TxAutoReg 0x15

#define TxSelReg 0x16

#define RxSelReg 0x17

#define RxThresholdReg 0x18

#define DemodReg 0x19

#define Reserved11 0x1A

#define Reserved12 0x1B

#define MifareReg 0x1C

#define Reserved13 0x1D

#define Reserved14 0x1E

#define SerialSpeedReg 0x1F

//Page 2:CFG

#define Reserved20 0x20

#define CRCResultRegM 0x21

#define CRCResultRegL 0x22

#define Reserved21 0x23

#define ModWidthReg 0x24

#define Reserved22 0x25

#define RFCfgReg 0x26

#define GsNReg 0x27

#define CWGsPReg 0x28

#define ModGsPReg 0x29

#define TModeReg 0x2A

#define TPrescalerReg 0x2B

#define TReloadRegH 0x2C

#define TReloadRegL 0x2D

#define TCounterValueRegH 0x2E

#define TCounterValueRegL 0x2F

//Page 3:TestRegister

#define Reserved30 0x30

#define TestSel1Reg 0x31

#define TestSel2Reg 0x32

#define TestPinEnReg 0x33

#define TestPinValueReg 0x34

#define TestBusReg 0x35

#define AutoTestReg 0x36

#define VersionReg 0x37

#define AnalogTestReg 0x38

#define TestDAC1Reg 0x39

#define TestDAC2Reg 0x3A

#define TestADCReg 0x3B

#define Reserved31 0x3C

#define Reserved32 0x3D

#define Reserved33 0x3E

#define Reserved34 0x3F

uchar serNum[5];

uchar writeDate[16] ={‘T’, ‘e’, ‘n’, ‘g’, ‘ ‘, ‘B’, ‘o’, 0, 0, 0, 0, 0, 0, 0, 0,0};

uchar sectorKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},

{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},

{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},

};

uchar sectorNewKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},

{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},

{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},

};

void setup() {

Serial.begin(9600); // RFID reader SOUT pin connected to Serial RX pin at 2400bps

// start the SPI library:

SPI.begin();

pinMode(chipSelectPin,OUTPUT); // Set digital pin 10 as OUTPUT to connect it to the RFID /ENABLE pin

digitalWrite(chipSelectPin, LOW); // Activate the RFID reader

pinMode(NRSTPD,OUTPUT); // Set digital pin 10 , Not Reset and Power-down

digitalWrite(NRSTPD, HIGH);

MFRC522_Init();

}

void loop()

{

uchar i,tmp;

uchar status;

uchar str[MAX_LEN];

uchar RC_size;

uchar blockAddr; //Select the address of the operation 0~63

// searching card, return card type

status = MFRC522_Request(PICC_REQIDL, str);

if (status == MI_OK)

{

}

status = MFRC522_Anticoll(str);

memcpy(serNum, str, 5);

if (status == MI_OK)

{

Serial.println(“The card’s number is : “);

Serial.print(serNum[0],BIN);

Serial.print(serNum[1],BIN);

Serial.print(serNum[2],BIN);

Serial.print(serNum[3],BIN);

Serial.print(serNum[4],BIN);

Serial.println(” “);

}

// select card, return card capacity

RC_size = MFRC522_SelectTag(serNum);

if (RC_size != 0)

{}

// write data card

blockAddr = 7; // data block 7

status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], serNum); // authentication

if (status == MI_OK)

{

// write data

status = MFRC522_Write(blockAddr, sectorNewKeyA[blockAddr/4]);

Serial.print(“set the new card password, and can modify the data of the Sector: “);

Serial.print(blockAddr/4,DEC);

// write data

blockAddr = blockAddr – 3 ;

status = MFRC522_Write(blockAddr, writeDate);

if(status == MI_OK)

{

Serial.println(“OK!”);

}

}

// read card

blockAddr = 7; // data block 7

status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr,

sectorNewKeyA[blockAddr/4], serNum); // authentication

if (status == MI_OK)

{

// read data

blockAddr = blockAddr – 3 ;

status = MFRC522_Read(blockAddr, str);

if (status == MI_OK)

{

Serial.println(“Read from the card ,the data is : “);

for (i=0; i<16; i++)

{

Serial.print(str[i]);

}

Serial.println(” “);

}

}

Serial.println(” “);

MFRC522_Halt(); // command card into sleeping mode

}

void Write_MFRC522(uchar addr, uchar val)

{

digitalWrite(chipSelectPin, LOW);

SPI.transfer((addr<<1)&0x7E);

SPI.transfer(val);

digitalWrite(chipSelectPin, HIGH);

}

uchar Read_MFRC522(uchar addr)

{

uchar val;

digitalWrite(chipSelectPin, LOW);

//address format: 1XXXXXX0

SPI.transfer(((addr<<1)&0x7E) | 0x80);

val =SPI.transfer(0x00);

digitalWrite(chipSelectPin, HIGH);

return val;

}

void SetBitMask(uchar reg, uchar mask)

{

uchar tmp;

tmp = Read_MFRC522(reg);

Write_MFRC522(reg, tmp | mask); // set bit mask

}

void ClearBitMask(uchar reg, uchar mask)

{

uchar tmp;

tmp = Read_MFRC522(reg);

Write_MFRC522(reg, tmp & (~mask)); // clear bit mask

}

void AntennaOn(void)

{

uchar temp;

temp = Read_MFRC522(TxControlReg);

if (!(temp & 0x03))

{

SetBitMask(TxControlReg, 0x03);

}

}

void AntennaOff(void)

{

ClearBitMask(TxControlReg, 0x03);

}

void MFRC522_Reset(void)

{

Write_MFRC522(CommandReg, PCD_RESETPHASE);

}

void MFRC522_Init(void)

{

digitalWrite(NRSTPD,HIGH);

MFRC522_Reset();

//Timer: TPrescaler*TreloadVal/6.78MHz = 24ms

Write_MFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler

Write_MFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg

Write_MFRC522(TReloadRegL, 30);

Write_MFRC522(TReloadRegH, 0);

Write_MFRC522(TxAutoReg, 0x40); //100%ASK

Write_MFRC522(ModeReg, 0x3D); //CRC original value 0x6363 ???

AntennaOn(); // open antenna

}

uchar MFRC522_Request(uchar reqMode, uchar *TagType)

{

uchar status;

uint backBits; // bits of data received

Write_MFRC522(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0] ???

TagType[0] = reqMode;

status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);

if ((status != MI_OK) || (backBits != 0x10))

{

status = MI_ERR;

}

return status;

}

uchar MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen)

{

uchar status = MI_ERR;

uchar irqEn = 0x00;

uchar waitIRq = 0x00;

uchar lastBits;

uchar n;

uint i;

switch (command)

{

case PCD_AUTHENT: // card key authentication

{

irqEn = 0x12;

waitIRq = 0x10;

break;

}

case PCD_TRANSCEIVE: // send data in FIFO

{

irqEn = 0x77;

waitIRq = 0x30;

break;

}

default:

break;

}

Write_MFRC522(CommIEnReg, irqEn|0x80); // permission for interrupt request

ClearBitMask(CommIrqReg, 0x80); // clear all bits of the interrupt request

SetBitMask(FIFOLevelReg, 0x80); //FlushBuffer=1, FIFO initialize

Write_MFRC522(CommandReg, PCD_IDLE); //NO action; clear current command ???

// write data into FIFO

for (i=0; i<sendLen; i++)

{

Write_MFRC522(FIFODataReg, sendData[i]);

}

// execute command

Write_MFRC522(CommandReg, command);

if (command == PCD_TRANSCEIVE)

{

SetBitMask(BitFramingReg, 0x80); //StartSend=1,transmission of data starts

}

// wait for the completion of data transmission

i = 2000; // adjust i according to clock frequency, max wait time for M1 card operation 25ms ???

do

{

//CommIrqReg[7..0]

//Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq

n = Read_MFRC522(CommIrqReg);

i–;

}

while ((i!=0) && !(n&0x01) && !(n&waitIRq));

ClearBitMask(BitFramingReg, 0x80); //StartSend=0

if (i != 0)

{

if(!(Read_MFRC522(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr

{

status = MI_OK;

if (n & irqEn & 0x01)

{

status = MI_NOTAGERR; //??

}

if (command == PCD_TRANSCEIVE)

{

n = Read_MFRC522(FIFOLevelReg);

lastBits = Read_MFRC522(ControlReg) & 0x07;

if (lastBits)

{

*backLen = (n-1)*8 + lastBits;

}

else

{

*backLen = n*8;

}

if (n == 0)

{

n = 1;

}

if (n > MAX_LEN)

{

n = MAX_LEN;

}

// read the data received in FIFO

for (i=0; i<n; i++)

{

backData[i] = Read_MFRC522(FIFODataReg);

}

}

}

else

{

status = MI_ERR;

}

}

//SetBitMask(ControlReg,0x80); //timer stops

//Write_MFRC522(CommandReg, PCD_IDLE);

return status;

}

uchar MFRC522_Anticoll(uchar *serNum)

{

uchar status;

uchar i;

uchar serNumCheck=0;

uint unLen;

Write_MFRC522(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0]

serNum[0] = PICC_ANTICOLL;

serNum[1] = 0x20;

status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);

if (status == MI_OK)

{

// verify card sequence number

for (i=0; i<4; i++)

{

serNumCheck ^= serNum[i];

}

if (serNumCheck != serNum[i])

{

status = MI_ERR;

}

}

//SetBitMask(CollReg, 0x80); //ValuesAfterColl=1

return status;

}

void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData)

{

uchar i, n;

ClearBitMask(DivIrqReg, 0x04); //CRCIrq = 0

SetBitMask(FIFOLevelReg, 0x80); // clear FIFO pointer

//Write_MFRC522(CommandReg, PCD_IDLE);

// write data into FIFO

for (i=0; i<len; i++)

{

Write_MFRC522(FIFODataReg, *(pIndata+i));

}

Write_MFRC522(CommandReg, PCD_CALCCRC);

// wait for completion of CRC calculation

i = 0xFF;

do

{

n = Read_MFRC522(DivIrqReg);

i–;

}

while ((i!=0) && !(n&0x04)); //CRCIrq = 1

// read result from CRC calculation

pOutData[0] = Read_MFRC522(CRCResultRegL);

pOutData[1] = Read_MFRC522(CRCResultRegM);

}

uchar MFRC522_SelectTag(uchar *serNum)

{

uchar i;

uchar status;

uchar size;

uint recvBits;

uchar buffer[9];

//ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0

buffer[0] = PICC_SElECTTAG;

buffer[1] = 0x70;

for (i=0; i<5; i++)

{

buffer[i+2] = *(serNum+i);

}

CalulateCRC(buffer, 7, &buffer[7]); //??

status = MFRC522_ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);

if ((status == MI_OK) && (recvBits == 0x18))

{

size = buffer[0];

}

else

{

size = 0;

}

return size;

}

uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum)

{

uchar status;

uint recvBits;

uchar i;

uchar buff[12];

// Verification instructions + block address + sector password + card sequence number

buff[0] = authMode;

buff[1] = BlockAddr;

for (i=0; i<6; i++)

{

buff[i+2] = *(Sectorkey+i);

}

for (i=0; i<4; i++)

{

buff[i+8] = *(serNum+i);

}

status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);

if ((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08)))

{

status = MI_ERR;

}

return status;

}

uchar MFRC522_Read(uchar blockAddr, uchar *recvData)

{

uchar status;

uint unLen;

recvData[0] = PICC_READ;

recvData[1] = blockAddr;

CalulateCRC(recvData,2, &recvData[2]);

status = MFRC522_ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);

if ((status != MI_OK) || (unLen != 0x90))

{

status = MI_ERR;

}

return status;

}

uchar MFRC522_Write(uchar blockAddr, uchar *writeData)

{

uchar status;

uint recvBits;

uchar i;

uchar buff[18];

buff[0] = PICC_WRITE;

buff[1] = blockAddr;

CalulateCRC(buff, 2, &buff[2]);

status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);

if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))

{

status = MI_ERR;

}

if (status == MI_OK)

{

for (i=0; i<16; i++) // write 16Byte data into FIFO

{

buff[i] = *(writeData+i);

}

CalulateCRC(buff, 16, &buff[16]);

status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);

if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))

{

status = MI_ERR;

}

}

return status;

}

void MFRC522_Halt(void)

{

uchar status;

uint unLen;

uchar buff[4];

buff[0] = PICC_HALT;

buff[1] = 0;

CalulateCRC(buff, 2, &buff[2]);

status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);

}

连接MEGA 2560开发板测试时,代码中const int chipSelectPin = 10;//if the controller is UNO,328,168 改为const int chipSelectPin = 53;//if the controller is MEGA 2560

测试结果

把上面的测试代码编译通过,下载到我们的开发板中,当 IC 卡和钥匙扣靠近后,我们可以读取到对应数据,并在监控窗口中显示,如下图。

Ks0077_32-5

实验二十六 声控灯实验

实验说明

麦克风声音传感器是专门用来检测声音的传感器。传感器有S端是模拟输出,是麦克风的电压信号实时输出,通过电位器可调节信号增益。实验中,我通过传感器检测声音大小,从而控制一个LED亮灭。

实验器材

开发板*1

USB线*1

麦克风声音传感器*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

26

测试代码

int MIC=0;//定义声音传感器为模拟0 接口

int LED=9;//定义LED接口为数字9 接口

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

void setup()

{

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

pinMode(MIC,INPUT);//定义声音传感器为输入接口

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

}

void loop()

{

val=analogRead(MIC);//读取声音传感器的模拟值

Serial.println(val);//输出模拟值,并将其打印出来

if(val>=300)//当模拟值大于300 时LED亮起

{

digitalWrite(LED,HIGH);

}else

{

digitalWrite(LED,LOW);

}

delay(500);

}

测试结果

下载完程序后,我们可以检测声音大小,输出模拟值,声音越大,输出越大。当声音大小到达一定数值时,LED亮起,否则LED熄灭。

实验二十七 继电器控灯实验

实验说明

继电器模块是一种用于低电控制高电,保护电路的模块。本实验用到的5V单路继电器模块高电平有效,它有控制指示灯,吸合亮,断开不亮。实验中我们通过控制继电器从而控制一个LED的亮灭。

实验器材

开发板*1

USB线*1

5V 单路继电器模块*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

27

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(2000); //延时2S

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

delay(2000); //延时2S

}

测试结果

按照上图接好线,烧录好代码,上电后,继电器开启(ON端和COM端连通)2S,LED

亮起;停止(NC端和COM端连通)2S,LED熄灭;循环交替。开启时继电器上D2灯

亮起。

实验二十八 温湿度显示实验

实验说明

前面课程中我们在1602 I2C 蓝屏上显示超声波距离,这一实验程也是将1602 I2C 蓝屏做显示器。这个实验中我们主要用到了DHT11温湿度传感器和1602 I2C 蓝屏。DHT11温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。

实验中我们DHT11温湿度传感器测试出当前环境中的温度和湿度,然后在1602 I2C 蓝屏显示测试结果。

实验器材

开发板*1

USB线*1

1602 I2C 蓝屏*1

DHT11温湿度传感器*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

28

测试代码

#include <dht11.h>

// include the library code:

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

dht11 DHT;

#define DHT11_PIN 10

void setup(){

lcd.init(); // initialize the lcd

// Print a message to the LCD.

lcd.init();

lcd.backlight();

lcd.setCursor(0,0);

lcd.print(“Humidity (%):”);

lcd.setCursor(0,1);

lcd.print(“Temp (C):”);

}

void loop(){

int chk;

chk = DHT.read(DHT11_PIN); // READ DATA

switch (chk){

case DHTLIB_OK:

break;

case DHTLIB_ERROR_CHECKSUM:

break;

case DHTLIB_ERROR_TIMEOUT:

break;

default:

break;

}

// DISPLAT DATA

lcd.setCursor(13,0);

lcd.print(DHT.humidity);

lcd.setCursor(9,1);

lcd.print(DHT.temperature);

delay(1000);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 I2C 蓝屏显示当前环境中的温度和湿度值。

实验二十九 气体检测实验

实验说明

这个实验中我们主要用MQ-2烟雾传感器检测空气中的可燃气体,并将结果显示在1602 I2C 蓝屏上。MQ-2烟雾传感器主要适用于液化气、丙烷和氢气等,它有模拟输出和数字输出两个输出口,它的模拟输出电压随检测环境中气体浓度的升高而增大,具有快速的响应恢复、灵敏度可调、信号有输出指示等特性。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

1602 I2C 蓝屏*1

MQ-2烟雾传感器*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

29

测试代码

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

int gas_din=12;

int gas_ain=A0;

int led=9;

int ad_value;

void setup()

{

pinMode(led,OUTPUT);

pinMode(gas_din,INPUT);

pinMode(gas_ain,INPUT);

lcd.init(); // initialize the lcd

lcd.init();

// Print a message to the LCD.

lcd.backlight();

}

void loop()

{

ad_value=analogRead(gas_ain);

if(digitalRead(gas_din)==LOW)

{

digitalWrite(led,HIGH);

lcd.setCursor(0,0);

lcd.print(“Gas leakage! “);

lcd.setCursor(0,1);

lcd.print(“Value:”);

if(ad_value<10)

{

lcd.setCursor(6,1);

lcd.print(ad_value);

lcd.setCursor(7,1);

lcd.print(” “);

}

if((ad_value>=10)&&(ad_value<100))

{

lcd.setCursor(6,1);

lcd.print(ad_value);

lcd.setCursor(8,1);

lcd.print(” “);

}

if( ad_value>=100)

{

lcd.setCursor(6,1);

lcd.print(ad_value);

lcd.setCursor(9,1);

lcd.print(” “);

}

}

else

{

digitalWrite(led,LOW);

lcd.setCursor(0,0);

lcd.print(“Gas not leak! “);

lcd.setCursor(0,1);

lcd.print(“Gas not leak! “);

}

delay(500);

}

测试结果

下载完程序后,上电后,旋转MQ-2烟雾传感器上的电位器,调节灵敏度,将传感器上的一个LED调节到介于不亮与与亮的临界点,灵敏度最好。旋转1602 I2C 蓝屏上电位器调节LCD背光。当没有检测到可燃气体时,1602 I2C 蓝屏第一行和第二行显示”Gas not leak! “字符,插件LED不亮;检测到可燃气体时1602 I2C 蓝屏第一行显示”Gas leakage!”字符,第二行显示”Value:”字符和输出的模拟值。

实验三十 摇杆模块和电位器控制RGB模块实验

实验说明

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色。

这个实验中我们用一个RGB模块,通过调节摇杆模块和电位器,即可调节RGB灯颜色的变化,并将数据显示在1602 I2C 蓝屏上,即可得到所有颜色的叠加方法。例如,实验中我们将R调节至255,G调节至255,B调节至255,RGB灯显示白色,我们就可以知道以RGB 1:1:1的比例叠加就能得到白色。

实验器材

开发板*1

USB线*1

摇杆模块*1

可调电位器*1

1602 I2C 蓝屏*1

keyes 插件RGB模块*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

30

测试代码

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

int redpin = 11; //select the pin for the red LED

int greenpin =10;// select the pin for the green LED

int bluepin =9; // select the pin for the blue LED

int Z =8;

int val;

int value1;

int value2;

int value3;

void setup() {

pinMode(redpin, OUTPUT);

pinMode(bluepin, OUTPUT);

pinMode(greenpin, OUTPUT);

pinMode(Z, INPUT);

lcd.init(); // initialize the lcd

// Print a message to the LCD.

lcd.init();

lcd.backlight();

lcd.setCursor(0,0);

lcd.print(“R;”);

lcd.setCursor(8,0);

lcd.print(“G;”);

lcd.setCursor(0,1);

lcd.print(“B;”);

}

void loop()

{

val=digitalRead(Z);

if(val==HIGH)

{

analogWrite(redpin, 255);

lcd.setCursor(2,0);

lcd.print(“255”);

analogWrite(greenpin, 255);

lcd.setCursor(10,0);

lcd.print(“255”);

analogWrite(bluepin, 255);

lcd.setCursor(2,1);

lcd.print(“255″);

}

else

{

value1=map( analogRead(0),0,1023,0,255);

value2=map( analogRead(1),0,1023,0,255);

value3=map( analogRead(2),0,1023,0,255);

analogWrite(redpin, value1);

if(value1<10)

{

lcd.setCursor(2,0);

lcd.print(value1);

lcd.setCursor(3,0);

lcd.print(” “);

}

if((value1>=10)&&(value1<100))

{

lcd.setCursor(2,0);

lcd.print(value1);

lcd.setCursor(4,0);

lcd.print(” “);

}

if(value1>=100)

{

lcd.setCursor(2,0);

lcd.print(value1);

}

delay(100);

analogWrite(greenpin, value2);

if(value2<10)

{

lcd.setCursor(10,0);

lcd.print(value2);

lcd.setCursor(11,0);

lcd.print(” “);

}

if((value2>=10)&&(value2<100))

{

lcd.setCursor(10,0);

lcd.print(value2);

lcd.setCursor(12,0);

lcd.print(” “);

}

if(value2>=100)

{

lcd.setCursor(10,0);

lcd.print(value2);

}

delay(100);

analogWrite(bluepin, value3);

if(value3<10)

{

lcd.setCursor(2,1);

lcd.print(value3);

lcd.setCursor(3,1);

lcd.print(” “);

}

if((value3>=10)&&(value3<100))

{

lcd.setCursor(2,1);

lcd.print(value3);

lcd.setCursor(4,1);

lcd.print(” “);

}

if(value3>=100)

{

lcd.setCursor(2,1);

lcd.print(value3);

}

delay(100);

}

}

测试结果

下载完程序后,上电后,按下摇杆模块Z方向时,RGB灯显示白色,1602 I2C 蓝屏上

显示的RGB数值都为255。松开摇杆模块Z方向时,调节摇杆模块和电位器,RGB灯

显示不同颜色,并且可以在1602 I2C 蓝屏看到对应数值。

实验三十一 TMD27713 距离传感器实验

实验说明

keyes TMD27713 距离传感器是环境光+接近传感器+红外LED三合一传感器,它主要有两方面的功用,一方面用于来侦测当前环境光亮度(ALS);并且采用软件调节的方式按照当前环境光亮度状况自动调节背光亮度以适应环境亮度;使背光亮度柔和起到保护视力的作用同时可以达到节电的效果;另一功能我们称为接近传感功能(PROX)。

本实验只是简单的测试下这个传感器的基本功能。

实验器材

开发板*1

USB线*1

keyes TMD27713 距离传感器*1

杜邦线若干

接线图

31

测试代码

#define DUMP_REGS

#include <Wire.h>

#include <APDS9930.h>

// Pins

#define APDS9930_INT 2 // Needs to be an interrupt pin

#define LED_PIN 13 // LED for showing interrupt

// Constants

#define PROX_INT_HIGH 600 // Proximity level for interrupt

#define PROX_INT_LOW 0 // No far interrupt

// Global variables

APDS9930 apds = APDS9930();

float ambient_light = 0; // can also be an unsigned long

uint16_t ch0 = 0;

uint16_t ch1 = 1;

uint16_t proximity_data = 0;

volatile bool isr_flag = false;

void setup() {

// Set LED as output

pinMode(LED_PIN, OUTPUT);

pinMode(APDS9930_INT, INPUT);

// Initialize Serial port

Serial.begin(9600);

Serial.println();

Serial.println(F(“——————————“));

Serial.println(F(“APDS-9930 – ProximityInterrupt”));

Serial.println(F(“——————————“));

// Initialize interrupt service routine

attachInterrupt(digitalPinToInterrupt(APDS9930_INT), interruptRoutine, FALLING);

// Initialize APDS-9930 (configure I2C and initial values)

if (apds.init()) {

Serial.println(F(“APDS-9930 initialization complete”));

}

else {

Serial.println(F(“Something went wrong during APDS-9930 init!”));

}

// Adjust the Proximity sensor gain

if (!apds.setProximityGain(PGAIN_2X)) {

Serial.println(F(“Something went wrong trying to set PGAIN”));

}

// Set proximity interrupt thresholds

if (!apds.setProximityIntLowThreshold(PROX_INT_LOW)) {

Serial.println(F(“Error writing low threshold”));

}

if (!apds.setProximityIntHighThreshold(PROX_INT_HIGH)) {

Serial.println(F(“Error writing high threshold”));

}

// Start running the APDS-9930 proximity sensor (interrupts)

if (apds.enableProximitySensor(true)) {

Serial.println(F(“Proximity sensor is now running”));

}

else {

Serial.println(F(“Something went wrong during sensor init!”));

}

// Start running the APDS-9930 light sensor (no interrupts)

if (apds.enableLightSensor(false)) {

Serial.println(F(“Light sensor is now running”));

}

else {

Serial.println(F(“Something went wrong during light sensor init!”));

}

#ifdef DUMP_REGS

/* Register dump */

uint8_t reg;

uint8_t val;

for (reg = 0x00; reg <= 0x19; reg++) {

if ((reg != 0x10) && \

(reg != 0x11))

{

apds.wireReadDataByte(reg, val);

Serial.print(reg, HEX);

Serial.print(“: 0x”);

Serial.println(val, HEX);

}

}

apds.wireReadDataByte(0x1E, val);

Serial.print(0x1E, HEX);

Serial.print(“: 0x”);

Serial.println(val, HEX);

#endif

}

void loop() {

// If interrupt occurs, print out the proximity level

if (isr_flag) {

// Read proximity level and print it out

if (!apds.readProximity(proximity_data)) {

Serial.println(“Error reading proximity value”);

}

else {

Serial.print(“Proximity detected! Level: “);

Serial.print(proximity_data);

Serial.print(” “);

}

apds.readAmbientLightLux(ambient_light);

// Read the light levels (ambient, red, green, blue)

if (!apds.readAmbientLightLux(ambient_light) ||

!apds.readCh0Light(ch0) ||

!apds.readCh1Light(ch1)) {

Serial.println(F(“Error reading light values”));

}

else {

Serial.print(F(“Ambient: “));

Serial.print(ambient_light);

Serial.print(F(” Ch0: “));

Serial.print(ch0);

Serial.print(F(” Ch1: “));

Serial.println(ch1);

}

// Turn on LED for a half a second

digitalWrite(LED_PIN, HIGH);

delay(300);

digitalWrite(LED_PIN, LOW);

// Reset flag and clear APDS-9930 interrupt (IMPORTANT!)

isr_flag = false;

if (!apds.clearProximityInt()) {

Serial.println(“Error clearing interrupt”);

}

}

}

void interruptRoutine() {

isr_flag = true;

}

测试结果

测试时需用arduino-1.8.2版本软件测试,下载完程序后,上电后,打开串口监视器,显

示如下图。

实验三十二 加速度传感器实验

实验说明

MMA8452Q 是一款具有 12位分辨率的智能低功耗、三轴、电容式微机械加速度传感器。这款加速度传感器具有丰富嵌入式功能,带有灵活的用户可编程选项,可以配置多达两个中断引脚。嵌入式中断功能可以节省整体功耗,解除主处理器不断轮询数据的负担。MMA8452Q 具有±2g/±4g/±8g的用户可选量程,可以实时输出高通滤波数据和非滤波数据。该器件可被配置成利用任意组合可配置嵌入式的功能生成惯性唤醒中断信号,这就使MMA8452Q 在监控事件同时,在静止状态保持低功耗模式。

本实验只是利用keyes MMA8452Q 三轴数字加速度传感器测试下物体的三轴加速度。

实验器材

开发板*1

USB线*1

keyes MMA8452Q 三轴数字加速度传感器*1

杜邦线若干

接线图

32

测试代码

#include <Wire.h> // Must include Wire library for I2C

#include <SparkFun_MMA8452Q.h> // Includes the SFE_MMA8452Q library

// Begin using the library by creating an instance of the MMA8452Q

// class. We’ll call it “accel”. That’s what we’ll reference from

// here on out.

MMA8452Q accel;

// The setup function simply starts serial and initializes the

// accelerometer.

void setup()

{

Serial.begin(9600);

Serial.println(“MMA8452Q Test Code!”);

// Choose your adventure! There are a few options when it comes

// to initializing the MMA8452Q:

// 1. Default init. This will set the accelerometer up

// with a full-scale range of +/-2g, and an output data rate

// of 800 Hz (fastest).

accel.init();

// 2. Initialize with FULL-SCALE setting. You can set the scale

// using either SCALE_2G, SCALE_4G, or SCALE_8G as the value.

// That’ll set the scale to +/-2g, 4g, or 8g respectively.

//accel.init(SCALE_4G); // Uncomment this out if you’d like

// 3. Initialize with FULL-SCALE and DATA RATE setting. If you

// want control over how fast your accelerometer produces

// data use one of the following options in the second param:

// ODR_800, ODR_400, ODR_200, ODR_100, ODR_50, ODR_12,

// ODR_6, or ODR_1.

// Sets to 800, 400, 200, 100, 50, 12.5, 6.25, or 1.56 Hz.

//accel.init(SCALE_8G, ODR_6);

}

// The loop function will simply check for new data from the

// accelerometer and print it out if it’s available.

void loop()

{

// Use the accel.available() function to wait for new data

// from the accelerometer.

if (accel.available())

{

// First, use accel.read() to read the new variables:

accel.read();

// accel.read() will update two sets of variables.

// * int’s x, y, and z will store the signed 12-bit values

// read out of the accelerometer.

// * floats cx, cy, and cz will store the calculated

// acceleration from those 12-bit values. These variables

// are in units of g’s.

// Check the two function declarations below for an example

// of how to use these variables.

printCalculatedAccels();

//printAccels(); // Uncomment to print digital readings

// The library also supports the portrait/landscape detection

// of the MMA8452Q. Check out this function declaration for

// an example of how to use that.

printOrientation();

Serial.println(); // Print new line every time.

}

}

// The function demonstrates how to use the accel.x, accel.y and

// accel.z variables.

// Before using these variables you must call the accel.read()

// function!

void printAccels()

{

Serial.print(accel.x, 3);

Serial.print(“\t”);

Serial.print(accel.y, 3);

Serial.print(“\t”);

Serial.print(accel.z, 3);

Serial.print(“\t”);

}

// This function demonstrates how to use the accel.cx, accel.cy,

// and accel.cz variables.

// Before using these variables you must call the accel.read()

// function!

void printCalculatedAccels()

{

Serial.print(accel.cx, 3);

Serial.print(“\t”);

Serial.print(accel.cy, 3);

Serial.print(“\t”);

Serial.print(accel.cz, 3);

Serial.print(“\t”);

}

// This function demonstrates how to use the accel.readPL()

// function, which reads the portrait/landscape status of the

// sensor.

void printOrientation()

{

// accel.readPL() will return a byte containing information

// about the orientation of the sensor. It will be either

// PORTRAIT_U, PORTRAIT_D, LANDSCAPE_R, LANDSCAPE_L, or

// LOCKOUT.

byte pl = accel.readPL();

switch (pl)

{

case PORTRAIT_U:

Serial.print(“Portrait Up”);

break;

case PORTRAIT_D:

Serial.print(“Portrait Down”);

break;

case LANDSCAPE_R:

Serial.print(“Landscape Right”);

break;

case LANDSCAPE_L:

Serial.print(“Landscape Left”);

break;

case LOCKOUT:

Serial.print(“Flat”);

break;

}

}

测试结果

下载完程序后,上电后,打开串口监视器,移动传感器值,有数值变化,显示如下图。

实验三十三 太阳光紫外线传感器实验

实验说明

Keyes GUVA-S12SD 3528 太阳光紫外线传感器是一款测试紫外线的传感器,它包含GUVA-S12SD,可以广泛用于智能穿戴设备的紫外线指数检测,如带UV指数检测功能的手表,带UV指数检测的智能手机,户外检测UV指数设备等,还可以用于紫外线消毒时,用来监测紫外线强度、UV火焰探测器等。

本实验只是利用紫外线传感器检测下当前环境中的紫外线,将结果在1602 LCD上显示。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

1602 I2C 蓝屏*1

GUVA-S12SD 3528 太阳光紫外线传感器*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

33

测试代码

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

int led=9;

void setup()

{

pinMode(led,OUTPUT);

lcd.init(); // initialize the lcd

lcd.init();

// Print a message to the LCD.

lcd.backlight();

lcd.setCursor(0,0);

lcd.print(“Ultra-Violet “);

lcd.setCursor(0,1);

lcd.print(“Detection:”);

}

void loop()

{

int sensorValue = analogRead(A0);

if(sensorValue<10)

{

lcd.setCursor(10,1);

lcd.print(sensorValue);

lcd.setCursor(11,1);

lcd.print(” “);

digitalWrite(led,LOW);

}

if((sensorValue>=10)&&(sensorValue<100))

{

lcd.setCursor(10,1);

lcd.print(sensorValue);

lcd.setCursor(12,1);

lcd.print(” “);

digitalWrite(led,HIGH);

}

if( sensorValue>=100)

{

lcd.setCursor(10,1);

lcd.print(sensorValue);

lcd.setCursor(13,1);

lcd.print(” “);

digitalWrite(led,HIGH);

}

delay(500);

}

测试结果

接上线,烧录程序,上电后,在1602 LCD上显示代表紫外线含量的数值,当数值小于10时,LED熄灭;当数值大于等于10时,LED亮起。

6、相关资料链接

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

分类
Arduino 学习套件

KE0113 Arduino 终极版学习套件

KE0084

目录

1、说明 3

2、清单 3

3、Arduino IDE和驱动的安装 9

4、Arduino IDE的使用方法 14

5、实验课程 16

实验一 LED 闪烁实验 16

实验二 呼吸灯实验 17

实验三 广告灯实验 19

实验四 按键控制LED实验 20

实验五 抢答器实验 22

实验六 电位器调控灯光亮度实验 24

实验七 感光灯实验 25

实验八 有源蜂鸣器实验 27

实验九 无源蜂鸣器实验 28

实验十 火焰报警实验 31

实验十一 温馨水杯实验 33

实验十二 魔术光杯实验 34

实验十三 红外遥控解码实验 37

实验十四 一位数码管显示实验 39

实验十五 74HC595驱动一位数码管实验 43

实验十六 8*8点阵显示实验 45

实验十七 四位数码管显示数字实验 47

实验十八 1602 LCD显示实验 55

实验十九 超声波测距显示实验 56

实验二十 1302时钟显示实验 59

实验二十一 人体红外感应实验 62

实验二十二 4×4按键显示实验 64

实验二十三 步进电机实验 66

实验二十四 舵机控制实验 68

实验二十五 RFID读卡器实验 71

实验二十六 声控灯实验 86

实验二十七 继电器控灯实验 88

实验二十八 温湿度显示实验 89

实验二十九 气体检测实验 91

实验三十 摇杆模块和电位器控制RGB模块实验 94

实验三十一 TMD27713 距离传感器实验 97

实验三十二 加速度传感器实验 102

实验三十三 太阳光紫外线传感器实验 106

6、 相关资料链接 108

1、说明

这个套件包含我们学习Arduino 单片机常用到的传感器模块、元器件和Arduino控制板。同时我们还会根据这些元器件和传感器模块,提供一些基Arduino控制板的学习课程,课程包含了接线方法、测试代码、实验结果等信息,它让你对这些元器件、传感器模块和Arduino控制板有个初步的了解。

2、清单

编码 名称 描述 数量 图片
1 LED F5-红发红-短 5
2 LED F5-黄发黄-短 5
3 LED F5-蓝发蓝-短 5
4 电阻 碳膜色环 1/4W 1% 220R 编带 8
5 电阻 碳膜色环 1/4W 1% 1K 编带 5
6 电阻 碳膜色环 1/4W 1% 10K 编带 5
7 点阵 20*20MM 1.9MM红色 共阳 1
8 数码管 一位0.56英寸共阴红 1
9 数码管 四位0.36英寸共阴红 3461AH 1
10 IC 74HC595 DIP 1
11 可调电位器
  1. MU 103

(三针直排)

1
12 蜂鸣器 无源 12*8.5MM

5V 普通分体 2K

1
13 蜂鸣器 有源 12*9.5MM 5V 普通分体 2300Hz 1
14 轻触按键 12*12*7.3MM 插件 4
15 按键帽 A24 黄帽(12*12*7.3)圆 4
16 传感器元件 LM35DZ 1
17 传感器元件 5MM 光敏电阻 3
18 传感器元件 红外接收 5MM 火焰 1
19 传感器元件 红外接收 VS1838B 1
20 滚珠开关 HDX-2801 两脚一样 2
21 模块 1602 I2C 蓝屏 1 MD0069  一个电阻 (6)
22 模块 4*4薄膜键盘 1 后2 (1)
23 面包板 ZY-102 830孔 白色 (纸卡包装) 1 2
24 模块 5V步进电机 1 23R23 (18)
25 USB线 AM/BM 透明蓝 OD:5.0 L=50cm 1 fw
26 遥控器 JMP-1 17键86*40*6.5MM 黑色 1 1
27 面包线 面包板连接线65根 1
28 杜邦线 公对母20CM/40P/2.54/10股铜包铝 24号线BL 0.5 OR0006
29 舵机 SG90 9G 23*12.2*29mm 蓝色 辉盛(环保) 1 FWE
30 电池扣 优质型 9V电池扣 实验电源连接线 1 83400039 (5)
31 IC卡 白卡 85.5*54*0.80MM 1 111
32 钥匙扣 TAG-03 41*33*403mm ABS蓝色 1 KE0078 (2)
33 keyes模块 Keyes RFID-RC522 射频模块 (焊盘孔) 红色 环保 1 KE0078 (1)
34 keyes传感器 keyes 麦克风声音传感器(焊盘孔) 红色 环保 1 KE0034 (4)
35 keyes传感器 keyes 超声波传感器 1 MD0017 (1)
36 keyes模块 keyes 插件RGB模块(焊盘孔) 红色 环保 1 1
37 keyes模块 keyes 5V 单路继电器模块(焊盘孔) 红色 环保 1 KE0052 (1)
38 keyes传感器 keyes DHT11温湿度传感器(焊盘孔) 红色 环保 1 KE0041 (1)
39 Keyes模块 keyes 1302时钟模块(焊盘孔) 红色 环保 1 KE0050 (1)
40 keyes传感器 keyes 人体红外热释电传感器(焊盘孔) 红色 环保 1 KE0054 (2)
41 keyes驱动板 Keyes ULN2003步进电机驱动板(焊盘孔) 红色 环保 1 KE0079  (1)
42 keyes传感器 keyes MQ-2 烟雾传感器(焊盘孔) 红色 环保 1 MQ-2 (1)
43 keyes传感器 keyes 摇杆模块传感器(焊盘孔) 红色 环保 1 KE0051 (1)
44 传感器模块 keyes TMD27713 距离传感器 1 3r
45 传感器模块 keyes MMA8452Q 三轴数字加速度传感器 1 5
46 传感器模块 keyes GUVA-S12SD 3528 太阳光紫外线传感器 1 1
47 电阻卡 100*70MM 1 电阻卡

KE0113不带开发板 KE0114带官方Arduino UNO R3

34 开发板 Arduino UNO R3 1

3、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文件

然后

然后

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

1.5.6版本安装后的样子。

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

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

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

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

进入下图,选择

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

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

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

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

4、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 的软件,设置板,如下。

设置COM端口,如下

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

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

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

5、实验课程

实验一 LED 闪烁实验

实验说明

LED 闪烁实验是比较基础的实验之一,上一个“ Hello World!”实验里已经利用到了Arduino 自带的LED,这次我们利用其他I/O 口和外接直插LED 灯来完成这个实验。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

1

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(2000); //延迟2S

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

delay(2000);//延迟2S

}

测试结果

下载完程序就可以看到我们的IO口外接小灯在闪烁了,这样我们的实验现象为LED不停闪烁,间隔大约为两秒。

实验二 呼吸灯实验

实验说明

上一课程中我们只是控制LED的亮和灭,那么我们可以怎么控制LED的亮度呢?本课程中我们把LED接到PWM口中,然后通过改变PWM数值,调节LED亮度,使LED逐渐变亮,和逐渐变暗,从而达到呼吸灯的效果。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

2

测试代码

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.01S

}

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

{

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

delay(10); // 延迟0.01S

}

delay(1000);// 延迟1S

}

测试结果

下载完程序就可以看到我们的IO口外接小灯显示出呼吸灯的效果,小灯先逐渐变亮,后逐渐变暗,循环交替。

实验三 广告灯实验

实验说明

在生活中我们经常会看到一些由各种颜色的led灯组成的广告牌,广告牌上各个位置上癿led灯不断的变话,形成各种效果。本节实验就是利用led灯编程模拟广告灯效果。

实验器材

开发板*1

USB线*1

LED*5

220Ω 电阻*5

面包板*1

面包板连接线若干

接线图

3

测试代码

int BASE = 2 ; //第一个 LED 接的 I/O 口

int NUM = 5; //LED 的总数

void setup()

{

for (int i = BASE; i < BASE + NUM; i ++)

{

pinMode(i, OUTPUT); //设定数字I/O口为输出

}

}

void loop()

{

for (int i = BASE; i < BASE + NUM; i ++)

{

digitalWrite(i, HIGH); //设定数字I/O口输出为”高”,即逐渐开灯

delay(200); //延迟

}

for (int i = BASE; i < BASE + NUM; i ++)

{

digitalWrite(i, LOW); //设定数字I/O口输出为”低”,即逐渐关灯

delay(200); //延迟

}

}

测试结果

下载完程序就可以看到我们的IO口外接小灯先逐渐变亮,然后逐渐变暗,循环交替。

实验四 按键控制LED实验

实验说明

I/O 口的意思即为INPUT 接口和OUTPUT 接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O 口的输出功能,这个实验我们来尝试一下使用Arduino的I/O 口的输入功能即为读取外接设备的输出值,我们用一个按键和一个LED 小灯完成一个输入输出结合使用的实验,让大家能简单了解I/O 的作用。

实验器材

开发板 *1

USB线*1

LED*1

轻触按键*1

220Ω 电阻*1

10KΩ 电阻*1

面包板*1

面包板连接线若干

接线图

4

测试代码

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

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, LOW); // LED变暗

}

else

{

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

}

}

测试结果

下载完程序,上电后,当按键按下时小灯亮起,否则小灯不亮。

实验五 抢答器实验

实验说明

完成上面的实验以后相信已经有很多朋友可以独立完成这个实验了,我们可以将上面的按键控制小灯的实验扩展成4个按键对应3 个小灯,占用7个数字I/O 接口。为方便接线,我们把3个小灯用一个keyes 插件RGB模块代替。keyes 插件RGB模块代替由一个插件全彩LED制成,通过 R、 G、 B三个引脚的PWM电压输入可以调节三种基色(红/蓝/绿)的强度从而实现全彩的混色效果。

本实验中我们利用4个按键控制3个PWM口,控制RGB模块发光颜色从而达到抢答器的效果。

实验器材

开发板*1

USB线*1

keyes 插件RGB模块*1

轻触按键*4

10KΩ 电阻*4

面包板*1

面包板连接线若干

杜邦线若干

接线图

5

测试代码

int redled=11;

int greenled=10;

int blueled=9;

int redpin=5;

int greenpin=4;

int bluepin=3;

int restpin=2;

int red;

int green;

int blue;

void setup()

{

pinMode(redled,OUTPUT);

pinMode(greenled,OUTPUT);

pinMode( blueled,OUTPUT);

pinMode(redpin,INPUT);

pinMode(greenpin,INPUT);

pinMode(bluepin,INPUT);

}

void loop()

{

red=digitalRead(redpin);

green=digitalRead(greenpin);

blue=digitalRead(bluepin);

if(red==LOW)RED_YES();

if(green==LOW)GREEN_YES();

if(blue==LOW)BLUE_YES();

}

void RED_YES()

{

while(digitalRead(restpin)==1)

{

color(255, 0, 0);

}

clear_led();

}

void GREEN_YES()

{

while(digitalRead(restpin)==1)

{

color(0, 255, 0);

}

clear_led();

}

void BLUE_YES()

{

while(digitalRead(restpin)==1)

{

color(0, 0, 255);

}

clear_led();

}

void clear_led()

{

color(0, 0, 0);

}

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

{

analogWrite(redled, red);

analogWrite(greenled,green);

analogWrite(blueled, blue);

}

测试结果

下载完程序,上电后,一个简单的抢答器就做好了,我们根据RGB灯显示的颜色判断是谁抢答成功。在复位后。RGB灯关闭。

实验六 电位器调控灯光亮度实验

实验说明

在第二课程中我们直接通过PWM口控制灯的亮度,从而达到呼吸灯的效果。在这课程中我们通过一个电位器,利用电位器调节PWM值,从而控制灯的亮度。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

可调电位器*1

面包板*1

面包板连接线若干

接线图

6

测试代码

int ledpin=11;//定义数字接口11(PWM 输出)

void setup()

{

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

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

}

void loop()

{

int val=analogRead(0);//读取模拟口A0口的值

val = map(val, 0, 1023, 0, 255);//从0-1023映射到0-255

Serial.println(val);//显示val 变量

analogWrite(ledpin,val);// 打开LED 并设置亮度

delay(100);//延时0.1 秒

}

测试结果

下载完程序后。我们可以通过旋转可调电位器控制小灯的亮度,打开串口监视器,设置波特率为9600,就可看到调节LED亮度的PWM值。

实验七 感光灯实验

实验说明

完成以上的各种实验后,我们对Arduino 的应用也应该有一些认识和了解了,在基本的数字量输入输出和模拟量输入以及PWM 的产生都掌握以后,我们就可以开始进行一些传感器的应用了。

本次实验我们先进行一个较为简单的光敏电阻的使用实验。光敏电阻既然是可以根据光强改变阻值的元件,自然也需要模拟口读取模拟值了,本实验可以借鉴电位器调控灯光亮度实验,将电位计换做光敏电阻实现当光强不同时LED 小灯的亮度也会有相应的变化。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

10KΩ 电阻*1

光敏电阻*1

面包板*1

面包板连接线若干

接线图

7

测试代码

int ledpin=11;//定义数字接口11(PWM 输出)

void setup()

{

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

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

}

void loop()

{

int val=analogRead(0);//读取模拟口A0口的值

Serial.println(val);//显示val 变量

val = map(val, 0, 1023, 0, 255);//从0-1023映射到0-255

analogWrite(ledpin,255-val);// 打开LED 并设置亮度

delay(10);//延时0.01 秒

}

测试结果

下载完程序后,光敏电阻感应到灯光越亮,小灯越暗;光敏电阻感应到灯光越暗,小灯越亮。打开串口监视器,设置波特率为9600,就可看到光敏电阻感应到外界光强所得的模拟值。

实验八 有源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了有源蜂鸣器,有源蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号。实验中中我们只需要给蜂鸣器输入一个高电平信号,蜂鸣器响起。

实验器材

开发板*1

USB线*1

有源蜂鸣器*1

面包板*1

面包板连接线若干

接线图

8

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(1000); //延迟1S

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

delay(1000);//延迟1S

}

测试结果

下载完程序后,我们可以听到蜂鸣器响1秒,停止响起1秒,循环交替。

实验九 无源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了无源蜂鸣器,无源蜂鸣器内部不带振荡源,直流信号无法令其鸣叫,须用方波驱动。

实验器材

开发板 *1

USB线*1

无源蜂鸣器*1

面包板*1

面包板连接线若干

接线图

9

测试代码

code 1:

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

}

}

}

code 2:

#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);

}

测试结果

实验中我们提供了两个例程,上传例程1代码后,蜂鸣器会发出两种不同的声音,实验中,两种声音循环交替。上传例程2中代码后,蜂鸣器会想响起《欢乐颂》的曲子。

实验十 火焰报警实验

实验说明

火焰传感器是机器人专门用来搜寻火源的传感器,本传感器对火焰特别灵敏。火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号。

实验中,我们把火焰的亮度转化为高低变化的电平信号输入到UNO板中,然后控制蜂鸣器的响起。

实验器材

开发板*1

USB线*1

有源蜂鸣器*1

火焰传感器*1

10KΩ 电阻*1

面包板*1

面包板连接线若干

接线图

10

测试代码

int flame=7;//定义火焰接口为数字7 接口

int Beep=9;//定义蜂鸣器接口为数字9 接口

void setup()

{

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

pinMode(flame,INPUT);//定义flame为输入接口

}

void loop()

{

int val=digitalRead(flame);//读取火焰传感器

if(val==HIGH)//当数字口7为高电平时蜂鸣器鸣响

{

digitalWrite(Beep,HIGH);

}else

{

digitalWrite(Beep,LOW);

}

delay(500);

}

测试结果

下载完程序后,我们可以模拟在有火焰时报警的情况,在没有火焰时一切正常,当有火焰时立刻报警做出提示。

实验十一 温馨水杯实验

实验说明

LM35 是很常用且易用的温度传感器元件,将LM35 温度传感器接到开发板上,通过算法可将读取的模拟值转换为实际的温度。

本实验中我们还外接了3个指示灯,在代码中我没设置在不同的温度范围,亮起不同颜色的指示灯。根据这个,我们完全可以做个温馨水杯,通过指示灯,我们就可以知道杯子里的水的冷热情况。

实验器材

开发板 *1

USB线*1

LM35DZ*1

LED*3

220Ω 电阻*3

面包板*1

面包板连接线若干

接线图

11

测试代码

void setup() {

Serial.begin(9600);

pinMode(12, OUTPUT);

pinMode(11, OUTPUT);

pinMode(10, OUTPUT);

}

void loop() {

int vol = analogRead(A0) * (5.0 / 1023.0*100);

Serial.print(“Tep:”);

Serial.print(vol);

Serial.println(“C”);

if (vol<28)

{

digitalWrite(12, HIGH);

digitalWrite(11, LOW);

digitalWrite(10, LOW);

}

else if (vol>=28 && vol<=30)

{

digitalWrite(12, LOW);

digitalWrite(11, HIGH);

digitalWrite(10, LOW);

}

else if (vol>30)

{

digitalWrite(12, LOW);

digitalWrite(11, LOW);

digitalWrite(10, HIGH);

}

}

测试结果

下载完程序后,打开串口监视器,设置波特率为9600,就可看到当前的温度。当温度大于30摄氏度时,红色指示灯亮起,其他指示灯熄灭;当温度大于等于28摄氏度且小于等于30摄氏度时,红色指示灯熄灭,黄色指示灯亮起;当温度小于28摄氏度时,黄色指示灯熄灭,蓝色指示灯亮起。

实验十二 魔术光杯实验

实验说明

倾斜开关的工作原理是当开关一端低于水平位置倾斜,开关寻通;当另一端低于水平位置倾斜 ,开关停止。魔术光杯实验原理是利用 PWM 调光的原理,两个LED的亮度发生变化。

这个实验中倾斜开关提供数字信号,触发 PWM 的调节,通过程序的设计,我们就能看到类似于两组装满光的杯子倒来倒去的效果了。

实验器材

开发板*1

USB线*1

LED*2

倾斜开关*2

220Ω 电阻*2

10KΩ 电阻*2

面包板*1

面包板连接线若干

接线图

12

测试代码

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最亮;在串口监视器中看到对应具体数值变化,如下图。当倾斜另一边中,现象一样,方向相反。

实验十三 红外遥控解码实验

实验说明

通用红外遥控系统由发射和接收两大部分组成。本实验中发射部分就是遥控器,接收部分就是红外接收 VS1838B。红外接收 VS1838B是集接收、放大、解调一体的器件,它内部IC就已经完成了解调,输出的就是数字信号。

图片3

实验器材

开发板*1

USB线*1

红外遥控*1

红外接收 VS1838B*1

面包板*1

面包板连接线若干

接线图

13

测试代码

#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(); // 接收下个数据

}

}

测试结果

下载完程序,上电后,红外遥控对准红外接收传感器发送信号,我们可以在串口监视器总看到相应按键的编码,如下图。

遥控器-1

实验十四 一位数码管显示实验

实验说明

数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),本实验所使用的是八段数码管。数码管共有七段显示数字的段,还有一个显示小数点的段。当让数码管显示数字时,只要将相应的段点亮即可。

实验器材

开发板 *1

USB线*1

一位数码管*1

220Ω 电阻*8

面包板*1

面包板连接线若干

接线图

14

测试代码

//设置控制各段的数字IO 脚

int a=7;//定义数字接口7 连接a 段数码管

int b=6;// 定义数字接口6 连接b 段数码管

int c=5;// 定义数字接口5 连接c 段数码管

int d=10;// 定义数字接口11 连接d 段数码管

int e=11;// 定义数字接口10 连接e 段数码管

int f=8;// 定义数字接口8 连接f 段数码管

int g=9;// 定义数字接口9 连接g 段数码管

int dp=4;// 定义数字接口4 连接dp 段数码管

void digital_1(void) //显示数字1

{

unsigned char j;

digitalWrite(c,HIGH);//给数字接口5 引脚高电平,点亮c 段

digitalWrite(b,HIGH);//点亮b 段

for(j=7;j<=11;j++)//熄灭其余段

digitalWrite(j,LOW);

digitalWrite(dp,LOW);//熄灭小数点DP 段

}

void digital_2(void) //显示数字2

{

unsigned char j;

digitalWrite(b,HIGH);

digitalWrite(a,HIGH);

for(j=9;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

digitalWrite(c,LOW);

digitalWrite(f,LOW);

}

void digital_3(void) //显示数字3

{

unsigned char j;

digitalWrite(g,HIGH);

digitalWrite(d,HIGH);

for(j=5;j<=7;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

digitalWrite(f,LOW);

digitalWrite(e,LOW);

}

void digital_4(void) //显示数字4

{

digitalWrite(c,HIGH);

digitalWrite(b,HIGH);

digitalWrite(f,HIGH);

digitalWrite(g,HIGH);

digitalWrite(dp,LOW);

digitalWrite(a,LOW);

digitalWrite(e,LOW);

digitalWrite(d,LOW);

}

void digital_5(void) //显示数字5

{

unsigned char j;

for(j=7;j<=9;j++)

digitalWrite(j,HIGH);

digitalWrite(c,HIGH);

digitalWrite(d,HIGH);

digitalWrite(dp,LOW);

digitalWrite(b,LOW);

digitalWrite(e,LOW);

}

void digital_6(void) //显示数字6

{

unsigned char j;

for(j=7;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(c,HIGH);

digitalWrite(dp,LOW);

digitalWrite(b,LOW);

}

void digital_7(void) //显示数字7

{

unsigned char j;

for(j=5;j<=7;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

for(j=8;j<=11;j++)

digitalWrite(j,LOW);

}

void digital_8(void) //显示数字8

{

unsigned char j;

for(j=5;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

}

void setup()

{

int i;//定义变量

for(i=4;i<=11;i++)

pinMode(i,OUTPUT);//设置4~11 引脚为输出模式

}

void loop()

{

while(1)

{

digital_1();//显示数字1

delay(2000);//延时2s

digital_2();//显示数字2

delay(1000); //延时1s

digital_3();//显示数字3

delay(1000); //延时1s

digital_4();//显示数字4

delay(1000); //延时1s

digital_5();//显示数字5

delay(1000); //延时1s

digital_6();//显示数字6

delay(1000); //延时1s

digital_7();//显示数字7

delay(1000); //延时1s

digital_8();//显示数字8

delay(1000); //延时1s

}

}

测试结果

下载完程序后,数码管循环显示1~8 数字。

实验十五 74HC595驱动一位数码管实验

实验说明

上一个实验中我们直接把用开发板控制一位数码管,需要占用了较多的数字口,本实验中我们添加了一个74HC595芯片控制一位数码管,只需要用3个数字口就可以控制8个LED灯,具体设置方法可以参照以下表格。

Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0
a b c d e f g dp
0 1 1 1 1 1 1 0 0 252
1 0 1 1 0 0 0 0 0 96
2 1 1 0 1 1 0 1 0 218
3 1 1 1 1 0 0 1 0 242
4 0 1 1 0 0 1 1 0 102
5 1 0 1 1 0 1 1 0 182
6 1 0 1 1 1 1 1 0 190
7 1 1 1 0 0 0 0 0 224
8 1 1 1 1 1 1 1 0 254
9 1 1 1 1 0 1 1 0 246

实验器材

开发板*1

USB线*1

74HC595*1

一位数码管*1

220Ω 电阻*8

面包板*1

面包板连接线若干

接线图

15

测试代码

int latchPin = 4;

int clockPin = 5;

int dataPin = 2; //这里定义了那三个脚

void setup ()

{

pinMode(latchPin,OUTPUT);

pinMode(clockPin,OUTPUT);

pinMode(dataPin,OUTPUT); //让三个脚都是输出状态

}

void loop()

{

int a[10]={

246,254,224,190,182,102,242,218,96,252}; //定义功能数组,数组依次为数码管得定义

for(int x=9; x>-1 ;x– ) //倒数功能循环

{

digitalWrite(latchPin,LOW);

shiftOut(dataPin,clockPin,MSBFIRST,a[x]); //显示数组a[x]

digitalWrite(latchPin,HIGH);

delay(1000);

}

}

测试结果

下载完程序后,数码管循环显示0~9 数字。

实验十六 8*8点阵显示实验

实验说明

点阵在我们生活中很常见,很多都有用到他,比如LED广告显示屏,电梯显示楼层,公交车报站等等。

8*8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置高电平,某一列置低电平,则相应的二极管就亮;如要将第一个点点亮,则7脚接高电平A脚接低电平,则第一个点就亮了;如果要将第一行点亮,则第7脚要接高电平,而A、B、C、D、E、F、G、H这些引脚接低电平,那么第一行就会点亮;如要将第一列点亮,则第A脚接低电平,而0、1、2、3、4、5、6、7接高电平,那么第一列就会点亮。

在本课程中,我们只是让点阵输出一个“0”。

8*8点阵原理图

8 ×8点阵原理图 - cdx19901103@yeah - cdx19901103@yeah的博客

8*8点阵实物图

8 ×8点阵原理图 - cdx19901103@yeah - cdx19901103@yeah的博客 图形111

实验器材

开发板*1

USB线*1

8*8点阵*1

220Ω 电阻*8

面包板*1

面包板连接线若干

接线图

16

测试代码

//定义了一个数组,用来存放“0”字的字模

unsigned char Text[]={0x00,0x1c,0x22,0x22,0x22,0x22,0x22,0x1c};

void Draw_point(unsigned char x,unsigned char y)//画点函数

{

clear_();

digitalWrite(x+2, HIGH);

digitalWrite(y+10, LOW);

delay(1);

}

void show_num(void)//显示函数,最终还是调用了画点函数。

{

unsigned char i,j,data;

for(i=0;i<8;i++)

{

data=Text[i];

for(j=0;j<8;j++)

{

if(data & 0x01)Draw_point(j,i);

data>>=1;

}

}

}

void setup(){

int i = 0 ;

for(i=2;i<18;i++)

{

pinMode(i, OUTPUT);

}

clear_();

}

void loop()

{

show_num();

}

void clear_(void)//清除屏幕

{

for(int i=2;i<10;i++)

digitalWrite(i, LOW);

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

digitalWrite(i+10, HIGH);

}

测试结果

下载完程序后,点阵上显示数字“0”。

实验十七 四位数码管显示数字实验

实验说明

在实验十五中我们使用开发板驱动一个一位数码管,本实验我们使用开发板驱动一个共阴四位数码管。驱动数码管限流电阻肯定是必不可少的,限流电阻有两种接法,一种是在d1-d4阴极接,总共接4颗。这种接法好处是需求电阻比较少,但是会产生每一位上显示不同数字亮度会不一样,1最亮,8最暗。另外一种接法就是在其他8个引脚上接,这种接法亮度显示均匀,但是用电阻较多。本次实验使用8颗220Ω电阻。

四位数码管总共有12个引脚,小数点朝下正放在面前时,左下角为1,其他管脚顺序为逆时针旋转。左上角为最大的12号管脚。

IMGP0049_调整大小.JPG

四位数码管原理图如下

5643b.jpg

实验器材

开发板*1

USB线*1

四位数码管*1

220Ω 电阻*8

面包板*1

面包板连接线若干

接线图

17

测试代码

int a = 1;

int b = 2;

int c = 3;

int d = 4;

int e = 5;

int f = 6;

int g = 7;

int dp = 8;

int d4 = 9;

int d3 = 10;

int d2 = 11;

int d1 = 12;

// set variable

long n = 1230;

int x = 100;

int del = 55; // fine adjustment for clock

void setup()

{

pinMode(d1, OUTPUT);

pinMode(d2, OUTPUT);

pinMode(d3, OUTPUT);

pinMode(d4, OUTPUT);

pinMode(a, OUTPUT);

pinMode(b, OUTPUT);

pinMode(c, OUTPUT);

pinMode(d, OUTPUT);

pinMode(e, OUTPUT);

pinMode(f, OUTPUT);

pinMode(g, OUTPUT);

pinMode(dp, OUTPUT);

}

/////////////////////////////////////////////////////////////

void loop()

{

int a=0;

int b=0;

int c=0;

int d=0;

unsigned long currentMillis = millis();

while(d>=0)

{

while(millis()-currentMillis<1000)

{

Display(1,a);

Display(2,b);

Display(3,c);

Display(4,d);

}

currentMillis = millis();

d++;

if (d>9)

{

c++;

d=0;

}

if (c>9)

{

b++;

c=0;

}

if (b>9)

{

a++;

b=0;

}

if (a>9)

{

a=0;

b=0;

c=0;

d=0;

}

}

}

///////////////////////////////////////////////////////////////

void WeiXuan(unsigned char n)//

{

switch (n)

{

case 1:

digitalWrite(d1, LOW);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

case 2:

digitalWrite(d1, HIGH);

digitalWrite(d2, LOW);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

case 3:

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, LOW);

digitalWrite(d4, HIGH);

break;

case 4:

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, LOW);

break;

default :

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

}

}

void Num_0()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_1()

{

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_2()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, LOW);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_3()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_4()

{

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_5()

{

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_6()

{

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_7()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_8()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_9()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Clear() // clear the screen

{

digitalWrite(a, LOW);

digitalWrite(b, LOW);

digitalWrite(c, LOW);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void pickNumber(unsigned char n)// select number

{

switch (n)

{

case 0: Num_0();

break;

case 1: Num_1();

break;

case 2: Num_2();

break;

case 3: Num_3();

break;

case 4: Num_4();

break;

case 5: Num_5();

break;

case 6: Num_6();

break;

case 7: Num_7();

break;

case 8: Num_8();

break;

case 9: Num_9();

break;

default: Clear();

break;

}

}

void Display(unsigned char x, unsigned char Number)// take x as coordinate and display number

{

WeiXuan(x);

pickNumber(Number);

delay(1);

Clear() ; // clear the screen

}

测试结果

下载完程序后,数码管首先显示“0000”数值,显示跳动,每跳动一下数码管显示数值加1。当显示数值为超过“9999”后,显示数值再次变为“0000”,循环显示。

实验十八 1602 LCD显示实验

实验说明

开发板IO口只有限,加些传感器、继电器等模块多了,IO口就不够用了,原来的1602

LCD屏需要7个IO口才能驱动起来,1602 I2C 蓝屏模块含LCD1602转接板和1602 LCD

屏。它通过I2C通信,只需要2个IO口就能驱动。

1602 LCD屏可以显示2行共32个字符,这个实验我们只是让1602 LCD屏显示对应字符。

实验器材

开发板*1

USB线*1

1602 I2C 蓝屏*1

杜邦线若干

接线方法

18

测试代码

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()

{

lcd.init(); // initialize the lcd

lcd.init();

// Print a message to the LCD.

lcd.backlight();

lcd.setCursor(2,0);

lcd.print(“Hello, world!”);

lcd.setCursor(2,1);

lcd.print(“Hello, keyes!”);

}

void loop()

{

}

测试结果

按照接线方法接好线,烧录好代码,上电后,通电后,旋转模块电位器调节背光,LCD上第一行和第二行分别显示”Hello, world!”和”Hello, keyes!”字符。

实验十九 超声波测距显示实验

实验说明

超声波传感器主要用于测距,它具有高精度、盲区(2cm)超近、性能稳定的特点。本实验中我们主要用到了超声波传感器和1602 I2C 蓝屏。实验中我们通过超声波测到超声波与前方障碍物的距离,然后在1602 I2C 蓝屏上显示测试结果。

实验器材

开发板*1

USB线*1

1602 I2C 蓝屏*1

超声波传感器*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

19

测试代码

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

#define echoPin 9 // Echo Pin

#define trigPin 8 // Trigger Pin

#define LEDPin 13 // Onboard LED

int maximumRange = 200; // Maximum range needed

int minimumRange = 0; // Minimum range needed

long duration, distance; // Duration used to calculate distance

void setup() {

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)

lcd.init(); // initialize the lcd

// Print a message to the LCD.

lcd.init();

lcd.backlight();

lcd.setCursor(0,0);

lcd.print(“The distance is:”);

}

void loop() {

/* The following trigPin/echoPin cycle is used to determine the

distance of the nearest object by bouncing soundwaves off of it. */

digitalWrite(trigPin, LOW);

delayMicroseconds(2);

digitalWrite(trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);

//Calculate the distance (in cm) based on the speed of sound.

distance = duration/58.2;

if (distance >= maximumRange || distance <= minimumRange){

/* Send a negative number to computer and Turn LED ON

to indicate “out of range” */

lcd.setCursor(0,1);

lcd.print(“-1 “);

digitalWrite(LEDPin, HIGH);

}

else {

/* Send the distance to the computer using Serial protocol, and

turn LED OFF to indicate successful reading. */

Serial.println(distance);

if(distance<10)

{

lcd.setCursor(0,1);

lcd.print(distance);

lcd.setCursor(1,1);

lcd.print(” “);

}

if((distance >=10)&&(distance<100))

{

lcd.setCursor(0,1);

lcd.print(distance);

lcd.setCursor(2,1);

lcd.print(” “);

}

if(distance>100)

{

lcd.setCursor(0,1);

lcd.print(distance);

}

digitalWrite(LEDPin, LOW);

}

//Delay 50ms before next reading.

delay(50);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 I2C 蓝屏显示”The distance is:”字符;测试超声波与前方障碍物的距离,测试到数据,则在1602 I2C 蓝屏上显示该数据,若没测试到数据,那么就在1602 I2C 蓝屏上显示”-1”字符。

实验二十 1302时钟显示实验

实验说明

上一实验中我们在1602 I2C 蓝屏上显示超声波距离,这一实验程也是将1602 I2C 蓝屏做显示器。这个实验中我们利用1302时钟模块和1602 I2C 蓝屏自制一个时钟,时钟上包含年、月、日、星期、小时、分钟、秒。初始时间在代码中设置,时钟自动行走,在1602 I2C 蓝屏显示。

实验器材

开发板*1

USB线*1

1602 I2C 蓝屏*1

1302时钟模块*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

20

测试代码

#include <stdio.h>

#include <string.h>

#include <DS1302.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

/* Set the appropriate digital I/O pin connections */

uint8_t CE_PIN = 10; // RST

uint8_t IO_PIN = 9; // DAT

uint8_t SCLK_PIN = 8; // CLK

/* Create buffers */

char buf[50];

char bf[50];

char bu[50];

char uf[50];

char day[10];

/* Create a DS1302 object */

DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

void print_time()

{

/* Get the current time and date from the chip */

Time t = rtc.time();

/* Name the day of the week */

memset(day, 0, sizeof(day)); /* clear day buffer */

switch (t.day) {

case 1:

strcpy(day, “Sunday “);

break;

case 2:

strcpy(day, “Monday “);

break;

case 3:

strcpy(day, “Tuesday “);

break;

case 4:

strcpy(day, “Wednesday”);

break;

case 5:

strcpy(day, “Thursday “);

break;

case 6:

strcpy(day, “Friday “);

break;

case 7:

strcpy(day, “Saturday “);

break;

}

/* Format the time and date and insert into the temporary buffer */

snprintf(buf, sizeof(buf), “%s %04d-%02d-%02d %02d:%02d:%02d”,

day,

t.yr, t.mon, t.date,

t.hr, t.min, t.sec);

Serial.println(buf);

snprintf(bf, sizeof(bf), “%s %04d”,

day, t.yr);

lcd.setCursor(0,0);

lcd.print(bf);

snprintf(bu, sizeof(bu),”%02d:%02d:%02d”,

t.hr, t.min, t.sec);

/* Print the formatted string to serial so we can see the time */

lcd.setCursor(0,1);

lcd.print(bu);

snprintf(uf, sizeof(uf), “%02d-%02d”,

t.mon, t.date);

lcd.setCursor(11,1);

lcd.print(uf);

}

void setup()

{

lcd.init(); // initialize the lcd

// Print a message to the LCD.

lcd.init();

lcd.backlight();

Serial.begin(9600);

/* Initialize a new chip by turning off write protection and clearing the

clock halt flag. These methods needn’t always be called. See the DS1302

datasheet for details. */

rtc.write_protect(false);

rtc.halt(false);

/* Make a new time object to set the date and time */

/* Tuesday, May 19, 2009 at 21:16:37. */

Time t(2017,10,24,10,11,22,3);

/* Set the time and date on the chip */

rtc.time(t);

}

/* Loop and print the time every second */

void loop()

{

print_time();

delay(1000);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 I2C 蓝屏显示当前初始时间,然后时钟开始走动。

实验二十一 人体红外感应实验

实验说明

和上面两个实验一样,这个实验也是用1602 I2C 蓝屏做显示器。实验中,我们用到了人体红外热释电传感器。人体红外热释电传感器是基于红外线技术的自动控制产品。它具有灵敏度高、可靠性强、超低功耗,超低电压工作模式等特点。

当检测到有人有附近移动时,在1602 I2C 蓝屏显示对应字符,当没有检测到人体在附件移动时,1602 I2C 蓝屏显示另一对应字符。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

1602 I2C 蓝屏*1

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

面包板*1

面包板连接线若干

杜邦线若干

接线图

21

测试代码

// include the library code:

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

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

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

void setup()

{

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

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

lcd.init(); // initialize the lcd

// Print a message to the LCD.

lcd.init();

lcd.backlight();

}

void loop()

{

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

digitalWrite(indicator,state);//控制数字口10的状态

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

{

lcd.setCursor(0,0);

lcd.print(“Somebody is”);

lcd.setCursor(0,1);

lcd.print(“in this area!”);

}

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

{

lcd.setCursor(0,0);

lcd.print(“No one! “);

lcd.setCursor(0,1);

lcd.print(“No one! “);

}

delay(500);//延迟0.5S

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,当检测到有人有附近移动时,在1602 LCD第一行显示显示”Somebody is “字符,第二行显示”in this area!”字符,LED亮起;当没有检测到人体在附件移动时,1602 LCD两行都显示”No one!”字符,LED熄灭。

实验二十二 4×4按键显示实验

实验说明

为了节约单片机I/O口,我们将多个按键做成矩阵键盘。本实验中用到了一个4×4按键矩阵,实验中,当我们按下矩阵中按键后,串口监视器中会显示对应字符。

4*4 薄膜按键脚位,请看上图。 其原理图如下

实验器材

开发板 *1

USB线*1

4*4 薄膜按键*1

面包板连接线若干

接线方法

22

测试代码

#include <Keypad.h>

const byte ROWS = 4; //定义 4 行

const byte COLS = 4; //定义 4 列

char keys[ROWS][COLS] = {

{‘1′,’2′,’3′,’A’},

{‘4′,’5′,’6′,’B’},

{‘7′,’8′,’9′,’C’},

{‘*’,’0′,’#’,’D’}

};

//连接 4*4 按键的行位端口,相应控制板的数字 IO 口

byte rowPins[ROWS] = {9,8,7,6};

//连接 4*4 按键的列位端口,相应控制板的数字 IO 口

byte colPins[COLS] = {5,4,3,2};

//调用 Keypad 类库功能函数

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){

Serial.begin(9600);

}

void loop(){

char key = keypad.getKey();

if (key != NO_KEY){

Serial.println(key);

}

}

测试结果

将程序下载到实验板后,打开串口监视器, 此时按下键盘上的某个键, 在串口工具上显示该按键的值,如下图。

实验二十三 步进电机实验

实验说明

步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到

一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。你

可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时你也可以通过

控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

下面这个就是本次实验使用的步进电机
csc
减速步进电机

直径:28mm

电压:5V

步进角度:5.625 x 1/64

减速比:1/64

5线4相 可以用普通uln2003芯片驱动,也可以接成2相使用

该步进电机空载耗电在50mA以下,带64倍减速器,输出力矩比较大,可以驱动重负

载,极适合开发板使用。注意:此款步进电机带有64倍减速器,与不带减速器的步进

电机相比,转速显得较慢,为方便观察,可在输出轴处粘上一片小纸板。

csc

步进电机(五线四相)驱动板(UL2003)试验板

KE0079  (1)

实验器材

开发板*1

USB线*1

减速步进电机*1

UL2003*1

杜邦线若干

接线图

23

测试代码

#include <Stepper.h>

//这里设置步进电机旋转一圈是多少步

#define STEPS 100

//设置步进电机的步数和引脚

Stepper stepper(STEPS, 11, 10, 9, 8);

//定义变量用来存储历史读数

int previous = 0;

void setup()

{

//设置电机每分钟的转速为90步

stepper.setSpeed(90);

}

void loop()

{

//获取传感器读数

int val = analogRead(0);

//移动步数为当前读数减去历史读数

stepper.step(val – previous);

//保存历史读数

previous = val;

}

测试结果

按照上图接好线,烧录好代码,上电后,5V步进电机转动,转动速度很慢。

实验二十四 舵机控制实验

实验说明

舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测

器所构成。舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红、橙三种颜

色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极

线,橙色为信号线。

舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM

(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms

之间,但是,事实上脉宽可由0.5ms 到2.5ms 之间,脉宽和舵机的转角0°~180°相

对应。有一点值得注意的地方,由于舵机牌子不同,对于同一信号,不同牌子的舵机旋

转的角度也会有所不同。

实验器材

开发板*1

USB线*1

舵机*1

面包线若干

接线图

24

测试代码

程序A:

int servopin=9;//定义数字接口9 连接伺服舵机信号线

int myangle;//定义角度变量

int pulsewidth;//定义脉宽变量

int val;

void servopulse(int servopin,int myangle)//定义一个脉冲函数

{

pulsewidth=(myangle*11)+500;//将角度转化为500-2480 的脉宽值

digitalWrite(servopin,HIGH);//将舵机接口电平至高

delayMicroseconds(pulsewidth);//延时脉宽值的微秒数

digitalWrite(servopin,LOW);//将舵机接口电平至低

delay(20-pulsewidth/1000);

}

void setup()

{

pinMode(servopin,OUTPUT);//设定舵机接口为输出接口

Serial.begin(9600);//连接到串行端口,波特率为9600

Serial.println(“servo=o_seral_simple ready” ) ;

}

void loop()//将0 到9 的数转化为0 到180 角度,并让LED 闪烁相应数的次数

{

val=Serial.read();//读取串行端口的值

if(val>=’0’&&val<=’9′)

{

val=val-‘0’;//将特征量转化为数值变量

val=val*(180/9);//将数字转化为角度

Serial.print(“moving servo to “);

Serial.print(val,DEC);

Serial.println();

for(int i=0;i<=50;i++) //给予舵机足够的时间让它转到指定角度

{

servopulse(servopin,val);//引用脉冲函数

}

}

}

程序B:

#include <Servo.h>

Servo myservo;//定义舵机变量名

void setup()

{

myservo.attach(9);//定义舵机接口(9、10 都可以,缺点只能控制2 个)

}

void loop()

{

myservo.write(90);//设置舵机旋转的角度

}

测试结果

程序A 结果:

在串口监视器中输入数字点击发送,舵机转动到所对应的角度数的位置,并将角度打印显示到屏幕上。

程序B结果:

舵机自己转动到90度位置。

实验二十五 RFID读卡器实验

实验说明

射频技术也简称 RFID,RFID 是英文 radio frequency identification”的缩写,叫做射频识

别技术,简称射频技术。本实验只是用RFID模块读取IC卡和钥匙扣中的内容。RFID模块,一定要使用+3.3V 供电,否则会烧掉模块。

实验器材

开发板*1

USB线*1

RFID-RC522 射频模块*1

IC卡*1

钥匙扣*1

杜邦线若干

接线图

25

测试代码

#include <SPI.h>

#define uchar unsigned char

#define uint unsigned int

#define MAX_LEN 16

const int chipSelectPin = 10;//if the controller is UNO,328,168

//const int chipSelectPin = 53;//if the controller is MEGA 2560

const int NRSTPD = 5;

//MF522command word

#define PCD_IDLE 0x00 //NO action; cancel current command

#define PCD_AUTHENT 0x0E //verify key

#define PCD_RECEIVE 0x08 //receive data

#define PCD_TRANSMIT 0x04 //send data

#define PCD_TRANSCEIVE 0x0C //receive and send data

#define PCD_RESETPHASE 0x0F //reset

#define PCD_CALCCRC 0x03 //CRC calculation

//Mifare_One Card command word

#define PICC_REQIDL 0x26 // line-tracking area is dormant #define PICC_REQALL 0x52 //line-tracking area is interfered

#define PICC_ANTICOLL 0x93 //Anti collision

#define PICC_SElECTTAG 0x93 //choose cards

#define PICC_AUTHENT1A 0x60 //Verify A key

#define PICC_AUTHENT1B 0x61 //Verify B key

#define PICC_READ 0x30 // Reader Module

#define PICC_WRITE 0xA0 // letter block

#define PICC_DECREMENT 0xC0

#define PICC_INCREMENT 0xC1

#define PICC_RESTORE 0xC2 //Transfer data to buffer

#define PICC_TRANSFER 0xB0 //Save buffer data

#define PICC_HALT 0x50 //Dormancy

//MF522 Error code returned when communication

#define MI_OK 0

#define MI_NOTAGERR 1

#define MI_ERR 2

//——————MFRC522 Register—————

//Page 0:Command and Status

#define Reserved00 0x00

#define CommandReg 0x01

#define CommIEnReg 0x02

#define DivlEnReg 0x03

#define CommIrqReg 0x04

#define DivIrqReg 0x05

#define ErrorReg 0x06

#define Status1Reg 0x07

#define Status2Reg 0x08

#define FIFODataReg 0x09

#define FIFOLevelReg 0x0A

#define WaterLevelReg 0x0B

#define ControlReg 0x0C

#define BitFramingReg 0x0D

#define CollReg 0x0E

#define Reserved01 0x0F

//Page 1:Command

#define Reserved10 0x10

#define ModeReg 0x11

#define TxModeReg 0x12

#define RxModeReg 0x13

#define TxControlReg 0x14

#define TxAutoReg 0x15

#define TxSelReg 0x16

#define RxSelReg 0x17

#define RxThresholdReg 0x18

#define DemodReg 0x19

#define Reserved11 0x1A

#define Reserved12 0x1B

#define MifareReg 0x1C

#define Reserved13 0x1D

#define Reserved14 0x1E

#define SerialSpeedReg 0x1F

//Page 2:CFG

#define Reserved20 0x20

#define CRCResultRegM 0x21

#define CRCResultRegL 0x22

#define Reserved21 0x23

#define ModWidthReg 0x24

#define Reserved22 0x25

#define RFCfgReg 0x26

#define GsNReg 0x27

#define CWGsPReg 0x28

#define ModGsPReg 0x29

#define TModeReg 0x2A

#define TPrescalerReg 0x2B

#define TReloadRegH 0x2C

#define TReloadRegL 0x2D

#define TCounterValueRegH 0x2E

#define TCounterValueRegL 0x2F

//Page 3:TestRegister

#define Reserved30 0x30

#define TestSel1Reg 0x31

#define TestSel2Reg 0x32

#define TestPinEnReg 0x33

#define TestPinValueReg 0x34

#define TestBusReg 0x35

#define AutoTestReg 0x36

#define VersionReg 0x37

#define AnalogTestReg 0x38

#define TestDAC1Reg 0x39

#define TestDAC2Reg 0x3A

#define TestADCReg 0x3B

#define Reserved31 0x3C

#define Reserved32 0x3D

#define Reserved33 0x3E

#define Reserved34 0x3F

uchar serNum[5];

uchar writeDate[16] ={‘T’, ‘e’, ‘n’, ‘g’, ‘ ‘, ‘B’, ‘o’, 0, 0, 0, 0, 0, 0, 0, 0,0};

uchar sectorKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},

{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},

{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},

};

uchar sectorNewKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},

{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},

{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},

};

void setup() {

Serial.begin(9600); // RFID reader SOUT pin connected to Serial RX pin at 2400bps

// start the SPI library:

SPI.begin();

pinMode(chipSelectPin,OUTPUT); // Set digital pin 10 as OUTPUT to connect it to the RFID /ENABLE pin

digitalWrite(chipSelectPin, LOW); // Activate the RFID reader

pinMode(NRSTPD,OUTPUT); // Set digital pin 10 , Not Reset and Power-down

digitalWrite(NRSTPD, HIGH);

MFRC522_Init();

}

void loop()

{

uchar i,tmp;

uchar status;

uchar str[MAX_LEN];

uchar RC_size;

uchar blockAddr; //Select the address of the operation 0~63

// searching card, return card type

status = MFRC522_Request(PICC_REQIDL, str);

if (status == MI_OK)

{

}

status = MFRC522_Anticoll(str);

memcpy(serNum, str, 5);

if (status == MI_OK)

{

Serial.println(“The card’s number is : “);

Serial.print(serNum[0],BIN);

Serial.print(serNum[1],BIN);

Serial.print(serNum[2],BIN);

Serial.print(serNum[3],BIN);

Serial.print(serNum[4],BIN);

Serial.println(” “);

}

// select card, return card capacity

RC_size = MFRC522_SelectTag(serNum);

if (RC_size != 0)

{}

// write data card

blockAddr = 7; // data block 7

status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], serNum); // authentication

if (status == MI_OK)

{

// write data

status = MFRC522_Write(blockAddr, sectorNewKeyA[blockAddr/4]);

Serial.print(“set the new card password, and can modify the data of the Sector: “);

Serial.print(blockAddr/4,DEC);

// write data

blockAddr = blockAddr – 3 ;

status = MFRC522_Write(blockAddr, writeDate);

if(status == MI_OK)

{

Serial.println(“OK!”);

}

}

// read card

blockAddr = 7; // data block 7

status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr,

sectorNewKeyA[blockAddr/4], serNum); // authentication

if (status == MI_OK)

{

// read data

blockAddr = blockAddr – 3 ;

status = MFRC522_Read(blockAddr, str);

if (status == MI_OK)

{

Serial.println(“Read from the card ,the data is : “);

for (i=0; i<16; i++)

{

Serial.print(str[i]);

}

Serial.println(” “);

}

}

Serial.println(” “);

MFRC522_Halt(); // command card into sleeping mode

}

void Write_MFRC522(uchar addr, uchar val)

{

digitalWrite(chipSelectPin, LOW);

SPI.transfer((addr<<1)&0x7E);

SPI.transfer(val);

digitalWrite(chipSelectPin, HIGH);

}

uchar Read_MFRC522(uchar addr)

{

uchar val;

digitalWrite(chipSelectPin, LOW);

//address format: 1XXXXXX0

SPI.transfer(((addr<<1)&0x7E) | 0x80);

val =SPI.transfer(0x00);

digitalWrite(chipSelectPin, HIGH);

return val;

}

void SetBitMask(uchar reg, uchar mask)

{

uchar tmp;

tmp = Read_MFRC522(reg);

Write_MFRC522(reg, tmp | mask); // set bit mask

}

void ClearBitMask(uchar reg, uchar mask)

{

uchar tmp;

tmp = Read_MFRC522(reg);

Write_MFRC522(reg, tmp & (~mask)); // clear bit mask

}

void AntennaOn(void)

{

uchar temp;

temp = Read_MFRC522(TxControlReg);

if (!(temp & 0x03))

{

SetBitMask(TxControlReg, 0x03);

}

}

void AntennaOff(void)

{

ClearBitMask(TxControlReg, 0x03);

}

void MFRC522_Reset(void)

{

Write_MFRC522(CommandReg, PCD_RESETPHASE);

}

void MFRC522_Init(void)

{

digitalWrite(NRSTPD,HIGH);

MFRC522_Reset();

//Timer: TPrescaler*TreloadVal/6.78MHz = 24ms

Write_MFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler

Write_MFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg

Write_MFRC522(TReloadRegL, 30);

Write_MFRC522(TReloadRegH, 0);

Write_MFRC522(TxAutoReg, 0x40); //100%ASK

Write_MFRC522(ModeReg, 0x3D); //CRC original value 0x6363 ???

AntennaOn(); // open antenna

}

uchar MFRC522_Request(uchar reqMode, uchar *TagType)

{

uchar status;

uint backBits; // bits of data received

Write_MFRC522(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0] ???

TagType[0] = reqMode;

status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);

if ((status != MI_OK) || (backBits != 0x10))

{

status = MI_ERR;

}

return status;

}

uchar MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen)

{

uchar status = MI_ERR;

uchar irqEn = 0x00;

uchar waitIRq = 0x00;

uchar lastBits;

uchar n;

uint i;

switch (command)

{

case PCD_AUTHENT: // card key authentication

{

irqEn = 0x12;

waitIRq = 0x10;

break;

}

case PCD_TRANSCEIVE: // send data in FIFO

{

irqEn = 0x77;

waitIRq = 0x30;

break;

}

default:

break;

}

Write_MFRC522(CommIEnReg, irqEn|0x80); // permission for interrupt request

ClearBitMask(CommIrqReg, 0x80); // clear all bits of the interrupt request

SetBitMask(FIFOLevelReg, 0x80); //FlushBuffer=1, FIFO initialize

Write_MFRC522(CommandReg, PCD_IDLE); //NO action; clear current command ???

// write data into FIFO

for (i=0; i<sendLen; i++)

{

Write_MFRC522(FIFODataReg, sendData[i]);

}

// execute command

Write_MFRC522(CommandReg, command);

if (command == PCD_TRANSCEIVE)

{

SetBitMask(BitFramingReg, 0x80); //StartSend=1,transmission of data starts

}

// wait for the completion of data transmission

i = 2000; // adjust i according to clock frequency, max wait time for M1 card operation 25ms ???

do

{

//CommIrqReg[7..0]

//Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq

n = Read_MFRC522(CommIrqReg);

i–;

}

while ((i!=0) && !(n&0x01) && !(n&waitIRq));

ClearBitMask(BitFramingReg, 0x80); //StartSend=0

if (i != 0)

{

if(!(Read_MFRC522(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr

{

status = MI_OK;

if (n & irqEn & 0x01)

{

status = MI_NOTAGERR; //??

}

if (command == PCD_TRANSCEIVE)

{

n = Read_MFRC522(FIFOLevelReg);

lastBits = Read_MFRC522(ControlReg) & 0x07;

if (lastBits)

{

*backLen = (n-1)*8 + lastBits;

}

else

{

*backLen = n*8;

}

if (n == 0)

{

n = 1;

}

if (n > MAX_LEN)

{

n = MAX_LEN;

}

// read the data received in FIFO

for (i=0; i<n; i++)

{

backData[i] = Read_MFRC522(FIFODataReg);

}

}

}

else

{

status = MI_ERR;

}

}

//SetBitMask(ControlReg,0x80); //timer stops

//Write_MFRC522(CommandReg, PCD_IDLE);

return status;

}

uchar MFRC522_Anticoll(uchar *serNum)

{

uchar status;

uchar i;

uchar serNumCheck=0;

uint unLen;

Write_MFRC522(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0]

serNum[0] = PICC_ANTICOLL;

serNum[1] = 0x20;

status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);

if (status == MI_OK)

{

// verify card sequence number

for (i=0; i<4; i++)

{

serNumCheck ^= serNum[i];

}

if (serNumCheck != serNum[i])

{

status = MI_ERR;

}

}

//SetBitMask(CollReg, 0x80); //ValuesAfterColl=1

return status;

}

void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData)

{

uchar i, n;

ClearBitMask(DivIrqReg, 0x04); //CRCIrq = 0

SetBitMask(FIFOLevelReg, 0x80); // clear FIFO pointer

//Write_MFRC522(CommandReg, PCD_IDLE);

// write data into FIFO

for (i=0; i<len; i++)

{

Write_MFRC522(FIFODataReg, *(pIndata+i));

}

Write_MFRC522(CommandReg, PCD_CALCCRC);

// wait for completion of CRC calculation

i = 0xFF;

do

{

n = Read_MFRC522(DivIrqReg);

i–;

}

while ((i!=0) && !(n&0x04)); //CRCIrq = 1

// read result from CRC calculation

pOutData[0] = Read_MFRC522(CRCResultRegL);

pOutData[1] = Read_MFRC522(CRCResultRegM);

}

uchar MFRC522_SelectTag(uchar *serNum)

{

uchar i;

uchar status;

uchar size;

uint recvBits;

uchar buffer[9];

//ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0

buffer[0] = PICC_SElECTTAG;

buffer[1] = 0x70;

for (i=0; i<5; i++)

{

buffer[i+2] = *(serNum+i);

}

CalulateCRC(buffer, 7, &buffer[7]); //??

status = MFRC522_ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);

if ((status == MI_OK) && (recvBits == 0x18))

{

size = buffer[0];

}

else

{

size = 0;

}

return size;

}

uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum)

{

uchar status;

uint recvBits;

uchar i;

uchar buff[12];

// Verification instructions + block address + sector password + card sequence number

buff[0] = authMode;

buff[1] = BlockAddr;

for (i=0; i<6; i++)

{

buff[i+2] = *(Sectorkey+i);

}

for (i=0; i<4; i++)

{

buff[i+8] = *(serNum+i);

}

status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);

if ((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08)))

{

status = MI_ERR;

}

return status;

}

uchar MFRC522_Read(uchar blockAddr, uchar *recvData)

{

uchar status;

uint unLen;

recvData[0] = PICC_READ;

recvData[1] = blockAddr;

CalulateCRC(recvData,2, &recvData[2]);

status = MFRC522_ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);

if ((status != MI_OK) || (unLen != 0x90))

{

status = MI_ERR;

}

return status;

}

uchar MFRC522_Write(uchar blockAddr, uchar *writeData)

{

uchar status;

uint recvBits;

uchar i;

uchar buff[18];

buff[0] = PICC_WRITE;

buff[1] = blockAddr;

CalulateCRC(buff, 2, &buff[2]);

status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);

if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))

{

status = MI_ERR;

}

if (status == MI_OK)

{

for (i=0; i<16; i++) // write 16Byte data into FIFO

{

buff[i] = *(writeData+i);

}

CalulateCRC(buff, 16, &buff[16]);

status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);

if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))

{

status = MI_ERR;

}

}

return status;

}

void MFRC522_Halt(void)

{

uchar status;

uint unLen;

uchar buff[4];

buff[0] = PICC_HALT;

buff[1] = 0;

CalulateCRC(buff, 2, &buff[2]);

status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);

}

连接MEGA 2560开发板测试时,代码中const int chipSelectPin = 10;//if the controller is UNO,328,168 改为const int chipSelectPin = 53;//if the controller is MEGA 2560

测试结果

把上面的测试代码编译通过,下载到我们的开发板中,当 IC 卡和钥匙扣靠近后,我们可以读取到对应数据,并在监控窗口中显示,如下图。

Ks0077_32-5

实验二十六 声控灯实验

实验说明

麦克风声音传感器是专门用来检测声音的传感器。传感器有S端是模拟输出,是麦克风的电压信号实时输出,通过电位器可调节信号增益。实验中,我通过传感器检测声音大小,从而控制一个LED亮灭。

实验器材

开发板*1

USB线*1

麦克风声音传感器*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

26

测试代码

int MIC=0;//定义声音传感器为模拟0 接口

int LED=9;//定义LED接口为数字9 接口

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

void setup()

{

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

pinMode(MIC,INPUT);//定义声音传感器为输入接口

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

}

void loop()

{

val=analogRead(MIC);//读取声音传感器的模拟值

Serial.println(val);//输出模拟值,并将其打印出来

if(val>=300)//当模拟值大于300 时LED亮起

{

digitalWrite(LED,HIGH);

}else

{

digitalWrite(LED,LOW);

}

delay(500);

}

测试结果

下载完程序后,我们可以检测声音大小,输出模拟值,声音越大,输出越大。当声音大小到达一定数值时,LED亮起,否则LED熄灭。

实验二十七 继电器控灯实验

实验说明

继电器模块是一种用于低电控制高电,保护电路的模块。本实验用到的5V单路继电器模块高电平有效,它有控制指示灯,吸合亮,断开不亮。实验中我们通过控制继电器从而控制一个LED的亮灭。

实验器材

开发板*1

USB线*1

5V 单路继电器模块*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

27

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(2000); //延时2S

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

delay(2000); //延时2S

}

测试结果

按照上图接好线,烧录好代码,上电后,继电器开启(ON端和COM端连通)2S,LED

亮起;停止(NC端和COM端连通)2S,LED熄灭;循环交替。开启时继电器上D2灯

亮起。

实验二十八 温湿度显示实验

实验说明

前面课程中我们在1602 I2C 蓝屏上显示超声波距离,这一实验程也是将1602 I2C 蓝屏做显示器。这个实验中我们主要用到了DHT11温湿度传感器和1602 I2C 蓝屏。DHT11温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。

实验中我们DHT11温湿度传感器测试出当前环境中的温度和湿度,然后在1602 I2C 蓝屏显示测试结果。

实验器材

开发板*1

USB线*1

1602 I2C 蓝屏*1

DHT11温湿度传感器*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

28

测试代码

#include <dht11.h>

// include the library code:

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

dht11 DHT;

#define DHT11_PIN 10

void setup(){

lcd.init(); // initialize the lcd

// Print a message to the LCD.

lcd.init();

lcd.backlight();

lcd.setCursor(0,0);

lcd.print(“Humidity (%):”);

lcd.setCursor(0,1);

lcd.print(“Temp (C):”);

}

void loop(){

int chk;

chk = DHT.read(DHT11_PIN); // READ DATA

switch (chk){

case DHTLIB_OK:

break;

case DHTLIB_ERROR_CHECKSUM:

break;

case DHTLIB_ERROR_TIMEOUT:

break;

default:

break;

}

// DISPLAT DATA

lcd.setCursor(13,0);

lcd.print(DHT.humidity);

lcd.setCursor(9,1);

lcd.print(DHT.temperature);

delay(1000);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 I2C 蓝屏显示当前环境中的温度和湿度值。

实验二十九 气体检测实验

实验说明

这个实验中我们主要用MQ-2烟雾传感器检测空气中的可燃气体,并将结果显示在1602 I2C 蓝屏上。MQ-2烟雾传感器主要适用于液化气、丙烷和氢气等,它有模拟输出和数字输出两个输出口,它的模拟输出电压随检测环境中气体浓度的升高而增大,具有快速的响应恢复、灵敏度可调、信号有输出指示等特性。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

1602 I2C 蓝屏*1

MQ-2烟雾传感器*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

29

测试代码

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

int gas_din=12;

int gas_ain=A0;

int led=9;

int ad_value;

void setup()

{

pinMode(led,OUTPUT);

pinMode(gas_din,INPUT);

pinMode(gas_ain,INPUT);

lcd.init(); // initialize the lcd

lcd.init();

// Print a message to the LCD.

lcd.backlight();

}

void loop()

{

ad_value=analogRead(gas_ain);

if(digitalRead(gas_din)==LOW)

{

digitalWrite(led,HIGH);

lcd.setCursor(0,0);

lcd.print(“Gas leakage! “);

lcd.setCursor(0,1);

lcd.print(“Value:”);

if(ad_value<10)

{

lcd.setCursor(6,1);

lcd.print(ad_value);

lcd.setCursor(7,1);

lcd.print(” “);

}

if((ad_value>=10)&&(ad_value<100))

{

lcd.setCursor(6,1);

lcd.print(ad_value);

lcd.setCursor(8,1);

lcd.print(” “);

}

if( ad_value>=100)

{

lcd.setCursor(6,1);

lcd.print(ad_value);

lcd.setCursor(9,1);

lcd.print(” “);

}

}

else

{

digitalWrite(led,LOW);

lcd.setCursor(0,0);

lcd.print(“Gas not leak! “);

lcd.setCursor(0,1);

lcd.print(“Gas not leak! “);

}

delay(500);

}

测试结果

下载完程序后,上电后,旋转MQ-2烟雾传感器上的电位器,调节灵敏度,将传感器上的一个LED调节到介于不亮与与亮的临界点,灵敏度最好。旋转1602 I2C 蓝屏上电位器调节LCD背光。当没有检测到可燃气体时,1602 I2C 蓝屏第一行和第二行显示”Gas not leak! “字符,插件LED不亮;检测到可燃气体时1602 I2C 蓝屏第一行显示”Gas leakage!”字符,第二行显示”Value:”字符和输出的模拟值。

实验三十 摇杆模块和电位器控制RGB模块实验

实验说明

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色。

这个实验中我们用一个RGB模块,通过调节摇杆模块和电位器,即可调节RGB灯颜色的变化,并将数据显示在1602 I2C 蓝屏上,即可得到所有颜色的叠加方法。例如,实验中我们将R调节至255,G调节至255,B调节至255,RGB灯显示白色,我们就可以知道以RGB 1:1:1的比例叠加就能得到白色。

实验器材

开发板*1

USB线*1

摇杆模块*1

可调电位器*1

1602 I2C 蓝屏*1

keyes 插件RGB模块*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

30

测试代码

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

int redpin = 11; //select the pin for the red LED

int greenpin =10;// select the pin for the green LED

int bluepin =9; // select the pin for the blue LED

int Z =8;

int val;

int value1;

int value2;

int value3;

void setup() {

pinMode(redpin, OUTPUT);

pinMode(bluepin, OUTPUT);

pinMode(greenpin, OUTPUT);

pinMode(Z, INPUT);

lcd.init(); // initialize the lcd

// Print a message to the LCD.

lcd.init();

lcd.backlight();

lcd.setCursor(0,0);

lcd.print(“R;”);

lcd.setCursor(8,0);

lcd.print(“G;”);

lcd.setCursor(0,1);

lcd.print(“B;”);

}

void loop()

{

val=digitalRead(Z);

if(val==HIGH)

{

analogWrite(redpin, 255);

lcd.setCursor(2,0);

lcd.print(“255”);

analogWrite(greenpin, 255);

lcd.setCursor(10,0);

lcd.print(“255”);

analogWrite(bluepin, 255);

lcd.setCursor(2,1);

lcd.print(“255″);

}

else

{

value1=map( analogRead(0),0,1023,0,255);

value2=map( analogRead(1),0,1023,0,255);

value3=map( analogRead(2),0,1023,0,255);

analogWrite(redpin, value1);

if(value1<10)

{

lcd.setCursor(2,0);

lcd.print(value1);

lcd.setCursor(3,0);

lcd.print(” “);

}

if((value1>=10)&&(value1<100))

{

lcd.setCursor(2,0);

lcd.print(value1);

lcd.setCursor(4,0);

lcd.print(” “);

}

if(value1>=100)

{

lcd.setCursor(2,0);

lcd.print(value1);

}

delay(100);

analogWrite(greenpin, value2);

if(value2<10)

{

lcd.setCursor(10,0);

lcd.print(value2);

lcd.setCursor(11,0);

lcd.print(” “);

}

if((value2>=10)&&(value2<100))

{

lcd.setCursor(10,0);

lcd.print(value2);

lcd.setCursor(12,0);

lcd.print(” “);

}

if(value2>=100)

{

lcd.setCursor(10,0);

lcd.print(value2);

}

delay(100);

analogWrite(bluepin, value3);

if(value3<10)

{

lcd.setCursor(2,1);

lcd.print(value3);

lcd.setCursor(3,1);

lcd.print(” “);

}

if((value3>=10)&&(value3<100))

{

lcd.setCursor(2,1);

lcd.print(value3);

lcd.setCursor(4,1);

lcd.print(” “);

}

if(value3>=100)

{

lcd.setCursor(2,1);

lcd.print(value3);

}

delay(100);

}

}

测试结果

下载完程序后,上电后,按下摇杆模块Z方向时,RGB灯显示白色,1602 I2C 蓝屏上

显示的RGB数值都为255。松开摇杆模块Z方向时,调节摇杆模块和电位器,RGB灯

显示不同颜色,并且可以在1602 I2C 蓝屏看到对应数值。

实验三十一 TMD27713 距离传感器实验

实验说明

keyes TMD27713 距离传感器是环境光+接近传感器+红外LED三合一传感器,它主要有两方面的功用,一方面用于来侦测当前环境光亮度(ALS);并且采用软件调节的方式按照当前环境光亮度状况自动调节背光亮度以适应环境亮度;使背光亮度柔和起到保护视力的作用同时可以达到节电的效果;另一功能我们称为接近传感功能(PROX)。

本实验只是简单的测试下这个传感器的基本功能。

实验器材

开发板*1

USB线*1

keyes TMD27713 距离传感器*1

杜邦线若干

接线图

31

测试代码

#define DUMP_REGS

#include <Wire.h>

#include <APDS9930.h>

// Pins

#define APDS9930_INT 2 // Needs to be an interrupt pin

#define LED_PIN 13 // LED for showing interrupt

// Constants

#define PROX_INT_HIGH 600 // Proximity level for interrupt

#define PROX_INT_LOW 0 // No far interrupt

// Global variables

APDS9930 apds = APDS9930();

float ambient_light = 0; // can also be an unsigned long

uint16_t ch0 = 0;

uint16_t ch1 = 1;

uint16_t proximity_data = 0;

volatile bool isr_flag = false;

void setup() {

// Set LED as output

pinMode(LED_PIN, OUTPUT);

pinMode(APDS9930_INT, INPUT);

// Initialize Serial port

Serial.begin(9600);

Serial.println();

Serial.println(F(“——————————“));

Serial.println(F(“APDS-9930 – ProximityInterrupt”));

Serial.println(F(“——————————“));

// Initialize interrupt service routine

attachInterrupt(digitalPinToInterrupt(APDS9930_INT), interruptRoutine, FALLING);

// Initialize APDS-9930 (configure I2C and initial values)

if (apds.init()) {

Serial.println(F(“APDS-9930 initialization complete”));

}

else {

Serial.println(F(“Something went wrong during APDS-9930 init!”));

}

// Adjust the Proximity sensor gain

if (!apds.setProximityGain(PGAIN_2X)) {

Serial.println(F(“Something went wrong trying to set PGAIN”));

}

// Set proximity interrupt thresholds

if (!apds.setProximityIntLowThreshold(PROX_INT_LOW)) {

Serial.println(F(“Error writing low threshold”));

}

if (!apds.setProximityIntHighThreshold(PROX_INT_HIGH)) {

Serial.println(F(“Error writing high threshold”));

}

// Start running the APDS-9930 proximity sensor (interrupts)

if (apds.enableProximitySensor(true)) {

Serial.println(F(“Proximity sensor is now running”));

}

else {

Serial.println(F(“Something went wrong during sensor init!”));

}

// Start running the APDS-9930 light sensor (no interrupts)

if (apds.enableLightSensor(false)) {

Serial.println(F(“Light sensor is now running”));

}

else {

Serial.println(F(“Something went wrong during light sensor init!”));

}

#ifdef DUMP_REGS

/* Register dump */

uint8_t reg;

uint8_t val;

for (reg = 0x00; reg <= 0x19; reg++) {

if ((reg != 0x10) && \

(reg != 0x11))

{

apds.wireReadDataByte(reg, val);

Serial.print(reg, HEX);

Serial.print(“: 0x”);

Serial.println(val, HEX);

}

}

apds.wireReadDataByte(0x1E, val);

Serial.print(0x1E, HEX);

Serial.print(“: 0x”);

Serial.println(val, HEX);

#endif

}

void loop() {

// If interrupt occurs, print out the proximity level

if (isr_flag) {

// Read proximity level and print it out

if (!apds.readProximity(proximity_data)) {

Serial.println(“Error reading proximity value”);

}

else {

Serial.print(“Proximity detected! Level: “);

Serial.print(proximity_data);

Serial.print(” “);

}

apds.readAmbientLightLux(ambient_light);

// Read the light levels (ambient, red, green, blue)

if (!apds.readAmbientLightLux(ambient_light) ||

!apds.readCh0Light(ch0) ||

!apds.readCh1Light(ch1)) {

Serial.println(F(“Error reading light values”));

}

else {

Serial.print(F(“Ambient: “));

Serial.print(ambient_light);

Serial.print(F(” Ch0: “));

Serial.print(ch0);

Serial.print(F(” Ch1: “));

Serial.println(ch1);

}

// Turn on LED for a half a second

digitalWrite(LED_PIN, HIGH);

delay(300);

digitalWrite(LED_PIN, LOW);

// Reset flag and clear APDS-9930 interrupt (IMPORTANT!)

isr_flag = false;

if (!apds.clearProximityInt()) {

Serial.println(“Error clearing interrupt”);

}

}

}

void interruptRoutine() {

isr_flag = true;

}

测试结果

测试时需用arduino-1.8.2版本软件测试,下载完程序后,上电后,打开串口监视器,显

示如下图。

实验三十二 加速度传感器实验

实验说明

MMA8452Q 是一款具有 12位分辨率的智能低功耗、三轴、电容式微机械加速度传感器。这款加速度传感器具有丰富嵌入式功能,带有灵活的用户可编程选项,可以配置多达两个中断引脚。嵌入式中断功能可以节省整体功耗,解除主处理器不断轮询数据的负担。MMA8452Q 具有±2g/±4g/±8g的用户可选量程,可以实时输出高通滤波数据和非滤波数据。该器件可被配置成利用任意组合可配置嵌入式的功能生成惯性唤醒中断信号,这就使MMA8452Q 在监控事件同时,在静止状态保持低功耗模式。

本实验只是利用keyes MMA8452Q 三轴数字加速度传感器测试下物体的三轴加速度。

实验器材

开发板*1

USB线*1

keyes MMA8452Q 三轴数字加速度传感器*1

杜邦线若干

接线图

32

测试代码

#include <Wire.h> // Must include Wire library for I2C

#include <SparkFun_MMA8452Q.h> // Includes the SFE_MMA8452Q library

// Begin using the library by creating an instance of the MMA8452Q

// class. We’ll call it “accel”. That’s what we’ll reference from

// here on out.

MMA8452Q accel;

// The setup function simply starts serial and initializes the

// accelerometer.

void setup()

{

Serial.begin(9600);

Serial.println(“MMA8452Q Test Code!”);

// Choose your adventure! There are a few options when it comes

// to initializing the MMA8452Q:

// 1. Default init. This will set the accelerometer up

// with a full-scale range of +/-2g, and an output data rate

// of 800 Hz (fastest).

accel.init();

// 2. Initialize with FULL-SCALE setting. You can set the scale

// using either SCALE_2G, SCALE_4G, or SCALE_8G as the value.

// That’ll set the scale to +/-2g, 4g, or 8g respectively.

//accel.init(SCALE_4G); // Uncomment this out if you’d like

// 3. Initialize with FULL-SCALE and DATA RATE setting. If you

// want control over how fast your accelerometer produces

// data use one of the following options in the second param:

// ODR_800, ODR_400, ODR_200, ODR_100, ODR_50, ODR_12,

// ODR_6, or ODR_1.

// Sets to 800, 400, 200, 100, 50, 12.5, 6.25, or 1.56 Hz.

//accel.init(SCALE_8G, ODR_6);

}

// The loop function will simply check for new data from the

// accelerometer and print it out if it’s available.

void loop()

{

// Use the accel.available() function to wait for new data

// from the accelerometer.

if (accel.available())

{

// First, use accel.read() to read the new variables:

accel.read();

// accel.read() will update two sets of variables.

// * int’s x, y, and z will store the signed 12-bit values

// read out of the accelerometer.

// * floats cx, cy, and cz will store the calculated

// acceleration from those 12-bit values. These variables

// are in units of g’s.

// Check the two function declarations below for an example

// of how to use these variables.

printCalculatedAccels();

//printAccels(); // Uncomment to print digital readings

// The library also supports the portrait/landscape detection

// of the MMA8452Q. Check out this function declaration for

// an example of how to use that.

printOrientation();

Serial.println(); // Print new line every time.

}

}

// The function demonstrates how to use the accel.x, accel.y and

// accel.z variables.

// Before using these variables you must call the accel.read()

// function!

void printAccels()

{

Serial.print(accel.x, 3);

Serial.print(“\t”);

Serial.print(accel.y, 3);

Serial.print(“\t”);

Serial.print(accel.z, 3);

Serial.print(“\t”);

}

// This function demonstrates how to use the accel.cx, accel.cy,

// and accel.cz variables.

// Before using these variables you must call the accel.read()

// function!

void printCalculatedAccels()

{

Serial.print(accel.cx, 3);

Serial.print(“\t”);

Serial.print(accel.cy, 3);

Serial.print(“\t”);

Serial.print(accel.cz, 3);

Serial.print(“\t”);

}

// This function demonstrates how to use the accel.readPL()

// function, which reads the portrait/landscape status of the

// sensor.

void printOrientation()

{

// accel.readPL() will return a byte containing information

// about the orientation of the sensor. It will be either

// PORTRAIT_U, PORTRAIT_D, LANDSCAPE_R, LANDSCAPE_L, or

// LOCKOUT.

byte pl = accel.readPL();

switch (pl)

{

case PORTRAIT_U:

Serial.print(“Portrait Up”);

break;

case PORTRAIT_D:

Serial.print(“Portrait Down”);

break;

case LANDSCAPE_R:

Serial.print(“Landscape Right”);

break;

case LANDSCAPE_L:

Serial.print(“Landscape Left”);

break;

case LOCKOUT:

Serial.print(“Flat”);

break;

}

}

测试结果

下载完程序后,上电后,打开串口监视器,移动传感器值,有数值变化,显示如下图。

实验三十三 太阳光紫外线传感器实验

实验说明

Keyes GUVA-S12SD 3528 太阳光紫外线传感器是一款测试紫外线的传感器,它包含GUVA-S12SD,可以广泛用于智能穿戴设备的紫外线指数检测,如带UV指数检测功能的手表,带UV指数检测的智能手机,户外检测UV指数设备等,还可以用于紫外线消毒时,用来监测紫外线强度、UV火焰探测器等。

本实验只是利用紫外线传感器检测下当前环境中的紫外线,将结果在1602 LCD上显示。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

1602 I2C 蓝屏*1

GUVA-S12SD 3528 太阳光紫外线传感器*1

面包板*1

面包板连接线若干

杜邦线若干

接线图

33

测试代码

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

int led=9;

void setup()

{

pinMode(led,OUTPUT);

lcd.init(); // initialize the lcd

lcd.init();

// Print a message to the LCD.

lcd.backlight();

lcd.setCursor(0,0);

lcd.print(“Ultra-Violet “);

lcd.setCursor(0,1);

lcd.print(“Detection:”);

}

void loop()

{

int sensorValue = analogRead(A0);

if(sensorValue<10)

{

lcd.setCursor(10,1);

lcd.print(sensorValue);

lcd.setCursor(11,1);

lcd.print(” “);

digitalWrite(led,LOW);

}

if((sensorValue>=10)&&(sensorValue<100))

{

lcd.setCursor(10,1);

lcd.print(sensorValue);

lcd.setCursor(12,1);

lcd.print(” “);

digitalWrite(led,HIGH);

}

if( sensorValue>=100)

{

lcd.setCursor(10,1);

lcd.print(sensorValue);

lcd.setCursor(13,1);

lcd.print(” “);

digitalWrite(led,HIGH);

}

delay(500);

}

测试结果

接上线,烧录程序,上电后,在1602 LCD上显示代表紫外线含量的数值,当数值小于10时,LED熄灭;当数值大于等于10时,LED亮起。

6、相关资料链接

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

分类
Arduino 学习套件

KE0112 Arduino 超级版学习套件

KE0082

目录

1、产品介绍 3

2、清单 3

3、Arduino IDE和驱动的安装 8

4、Arduino IDE的使用方法 14

5、实验课程 16

实验一 LED 闪烁实验 16

实验二 呼吸灯实验 17

实验三 广告灯实验 19

实验四 按键控制LED实验 20

实验五 抢答器实验 22

实验六 电位器调控灯光亮度实验 24

实验七 感光灯实验 25

实验八 有源蜂鸣器实验 27

实验九 无源蜂鸣器实验 28

实验十 火焰报警实验 32

实验十一 温馨水杯实验 33

实验十二 魔术光杯实验 35

实验十三 红外遥控解码实验 37

实验十四 一位数码管显示实验 39

实验十五 74HC595驱动一位数码管实验 43

实验十六 舵机控制实验 45

实验十七 四位数码管显示数字实验 47

实验十八 1602液晶显示实验 55

实验十九 超声波测距显示实验 60

实验二十 1302时钟显示实验 63

实验二十一 人体红外感应实验 66

实验二十二 温湿度显示实验 67

实验二十三 摇杆模块数据显示实验 69

实验二十四 继电器控灯实验 72

实验二十五 水蒸气检测显示实验 73

实验二十六 声控灯实验 75

实验二十七 步进电机实验 77

实验二十八 姿态传感器实验 79

实验二十九 震动检测传感器实验 82

6、相关资料链接地址 84

1、产品介绍

Arduino 超级版学习套件包含我们学习Arduino 单片机常用到的传感器模块、元器件和Arduino控制板。同时我们还会根据这些元器件和传感器模块,提供一些基Arduino控制板的学习课程,课程包含了接线方法、测试代码、实验结果等信息,它让你对这些元器件、传感器模块和Arduino控制板有个初步的了解。

2、清单

编码 名称 规格型号 数量 图片
1 遥控器 JMP-1 17键86*40*6.5MM 黑色 1 1
2 keyes传感器 keyes 人体红外热释电传感器 1 KE0054 (2)
3 keyes传感器 keyes 1302时钟传感器 1 KE0050 (1)
4 keyes传感器 keyes 超声波传感器 1 MD0017 (1)
5 keyes传感器 keyes 摇杆模块传感器(焊盘孔) 红色 环保 1 KE0051 (1)
6 keyes模块 keyes 5V 单路继电器模块(焊盘孔) 红色 环保 1 KE0052 (1)
7 keyes传感器 Keyes Steam Seneor 水滴水蒸气传感器 1 KY0135 (2)
8 keyes传感器 keyes 麦克风声音传感器(焊盘孔) 红色 环保 1 KE0034 (4)
9 keyes传感器 keyes DHT11温湿度传感器(焊盘孔) 红色 环保 1 KE0041 (1)
10 keyes驱动板 Keyes ULN2003步进电机驱动板(焊盘孔) 红色 环保 1 KE0079  (1)
11 keyes传感器 keyes 9930 接近和非接触式手势检测RGB和姿态传感器 1 KY0145- 9930  (6)
12 keyes传感器 Keyes Vibration Seneor 震动检测传感器 1 KY0138 Vibration Seneor 震动检测传感器 (5)
13 模块 5V步进电机 1 23R23 (18)
14 舵机 SG90 9G 23*12.2*29mm 蓝色 辉盛(环保) 1 FWE
15 LCD 1602 COB 5V 蓝屏 1 2
16 蜂鸣器 无源 12*8.5MM 5V 普通分体 2K 1
17 蜂鸣器 有源 12*9.5MM 5V 普通分体 2300Hz 1
18 轻触按键 12*12*5MM 插件 10
19 轻触按键 6*6*5MM 插件 4
20 传感器元件 LM35DZ 1
21 传感器元件 5MM 光敏电阻 3
22 传感器元件 红外接收 5MM火焰 1
23 传感器元件 红外接收 VS1838B 1
24 滚珠开关 HDX-2801 两脚一样 2
25 LED F5-红发红-短 5
26 LED F5-黄发黄-短 5
27 LED F5-蓝发蓝-短 5
28 电阻 碳膜色环 1/4W 1% 220R 8
29 电阻 碳膜色环 1/4W 1% 1K 5
30 电阻 碳膜色环 1/4W 1% 10K 5
31 USB线 AM/BM 透明蓝 OD:5.0 L=50cm 1 fw
32 线材 正标线 红 12CM(方头) 5

33 线材 正标线 黄 12CM(方头) 5
34 线材 正标线 黑 12CM(方头) 5
35 线材 正标线 绿 12CM(方头) 5
36 线材 正标线 灰 22CM(方头) 5
37 线材 正标线 蓝 22CM(方头) 5
38 杜邦线 公对母20CM/40P/2.54/10股铜包铝 24号线BL 0.5 30 (7)
39 杜邦线 母对母20CM/40P/2.54/10股铜包铝 24号线BL 0.5 ER
40 数码管 一位0.56英寸共阴红 1
41 数码管 四位0.36英寸共阴红 1
42 可调电位器 16MM 单联 B50K 1
43 IC 74HC595 DIP 1
44 电池盒+插杆 6节5号带线15CM露线 带DC插杆 1 1
45 面包板 ZY-60 400孔白色(纸卡包装) 1 67
46 排针 1*40P 黑色 2.54 针长3.0等边 1
47 电阻卡 100*70MM 1 电阻卡

KE0111不带开发板 KE0112带官方Arduino UNO R3

47 开发板 Arduino UNO R3 1

3、Arduino IDE和驱动的安装

当我们拿到Arduino开发板时,首先我们要安装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文件

然后

然后

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

1.5.6版本安装后的样子。

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

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

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

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

进入下图,选择

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

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

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

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

4、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 的软件,设置板,如下。

设置COM端口,如下

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

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

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

5、实验课程

实验一 LED 闪烁实验

实验说明

LED 闪烁实验是比较基础的实验之一,上一个“ Hello World!”实验里已经利用到了Arduino 自带的LED,这次我们利用其他I/O 口和外接直插LED 灯来完成这个实验。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

正标线若干

接线图

1

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(2000); //延迟2S

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

delay(2000);//延迟2S

}

测试结果

下载完程序就可以看到我们的IO口外接小灯在闪烁了,这样我们的实验现象为LED不停闪烁,间隔大约为两秒。

实验二 呼吸灯实验

实验说明

上一课程中我们只是控制LED的亮和灭,那么我们可以怎么控制LED的亮度呢?本课程中我们把LED接到PWM口中,然后通过改变PWM数值,调节LED亮度,使LED逐渐变亮,和逐渐变暗,从而达到呼吸灯的效果。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

正标线若干

接线图

2

测试代码

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.01S

}

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

{

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

delay(10); // 延迟0.01S

}

delay(1000);// 延迟1S

}

测试结果

下载完程序就可以看到我们的IO口外接小灯显示出呼吸灯的效果,小灯先逐渐变亮,后逐渐变暗,循环交替。

实验三 广告灯实验

实验说明

在生活中我们经常会看到一些由各种颜色的led灯组成的广告牌,广告牌上各个位置上癿led灯不断的变话,形成各种效果。本节实验就是利用led灯编程模拟广告灯效果。

实验器材

开发板*1

USB线*1

LED*5

220Ω 电阻*5

面包板*1

正标线若干

接线图

3

测试代码

int BASE = 2 ; //第一个 LED 接的 I/O 口

int NUM = 5; //LED 的总数

void setup()

{

for (int i = BASE; i < BASE + NUM; i ++)

{

pinMode(i, OUTPUT); //设定数字I/O口为输出

}

}

void loop()

{

for (int i = BASE; i < BASE + NUM; i ++)

{

digitalWrite(i, HIGH); //设定数字I/O口输出为”高”,即逐渐开灯

delay(200); //延迟

}

for (int i = BASE; i < BASE + NUM; i ++)

{

digitalWrite(i, LOW); //设定数字I/O口输出为”低”,即逐渐关灯

delay(200); //延迟

}

}

测试结果

下载完程序就可以看到我们的IO口外接小灯先逐渐变亮,然后逐渐变暗,循环交替。

实验四 按键控制LED实验

实验说明

I/O 口的意思即为INPUT 接口和OUTPUT 接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O 口的输出功能,这个实验我们来尝试一下使用Arduino的I/O 口的输入功能即为读取外接设备的输出值,我们用一个按键和一个LED 小灯完成一个输入输出结合使用的实验,让大家能简单了解I/O 的作用。

实验器材

开发板 *1

USB线*1

LED*1

轻触按键*1

220Ω 电阻*1

10KΩ 电阻*1

面包板*1

正标线若干

接线图

4

测试代码

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

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, LOW); // LED变暗

}

else

{

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

}

}

测试结果

下载完程序,上电后,当按键按下时小灯亮起,否则小灯不亮。

实验五 抢答器实验

实验说明

完成上面的实验以后相信已经有很多朋友可以独立完成这个实验了,我们可以模拟抢答器实验。实验中我们利用4个按键控制3个小灯,一个按键用做复位按键;另外3个按键对应3个小灯,用于抢答。

实验器材

开发板*1

USB线*1

keyes 插件RGB模块*1

轻触按键*4

10KΩ 电阻*4

面包板*1

正标线若干

接线图

5

测试代码

int redled=8; //红色LED 输出

int yellowled=7; //黄色LED输出

int greenled=6; //绿色LED输出

int redpin=5; //红色按键引脚

int yellowpin=4; //黄色按键引脚

int greenpin=3; //绿色按键引脚

int restpin=2; //复位按键引脚定义

int red;

int yellow;

int green;

void setup()

{

pinMode(redled,OUTPUT);

pinMode(yellowled,OUTPUT);

pinMode(greenled,OUTPUT);

pinMode(redpin,INPUT);

pinMode(yellowpin,INPUT);

pinMode(greenpin,INPUT);

}

void loop() //按键循环扫描。

{

red=digitalRead(redpin);

yellow=digitalRead(yellowpin);

green=digitalRead(greenpin);

if(red==LOW)RED_YES();

if(yellow==LOW)YELLOW_YES();

if(green==LOW)GREEN_YES();

}

void RED_YES()//一直执行红灯亮,直到复位键按下,结束循环

{

while(digitalRead(restpin)==1)

{

digitalWrite(redled,HIGH);

digitalWrite(greenled,LOW);

digitalWrite(yellowled,LOW);

}

clear_led();

}

void YELLOW_YES()//一直执行黄灯亮,直到复位键按下,结束循环

{

while(digitalRead(restpin)==1)

{

digitalWrite(redled,LOW);

digitalWrite(greenled,LOW);

digitalWrite(yellowled,HIGH);

}

clear_led();

}

void GREEN_YES()//一直执行绿灯亮,直到复位键按下,结束循环

{

while(digitalRead(restpin)==1)

{

digitalWrite(redled,LOW);

digitalWrite(greenled,HIGH);

digitalWrite(yellowled,LOW);

}

clear_led();

}

void clear_led()//清除LED

{

digitalWrite(redled,LOW);

digitalWrite(greenled,LOW);

digitalWrite(yellowled,LOW);

}

测试结果

下载完程序,上电后,一个简单的抢答器就做好了。

实验六 电位器调控灯光亮度实验

实验说明

在第二课程中我们直接通过PWM口控制灯的亮度,从而达到呼吸灯的效果。在这课程中我们通过一个电位器,利用电位器调节PWM值,从而控制灯的亮度。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

可调电位器*1

面包板*1

正标线若干

接线图

6

测试代码

int ledpin=11;//定义数字接口11(PWM 输出)

void setup()

{

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

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

}

void loop()

{

int val=analogRead(0);//读取模拟口A0口的值

val = map(val, 0, 1023, 0, 255);//从0-1023映射到0-255

Serial.println(val);//显示val 变量

analogWrite(ledpin,val);// 打开LED 并设置亮度

delay(100);//延时0.1 秒

}

测试结果

下载完程序后。我们可以通过旋转可调电位器控制小灯的亮度,打开串口监视器,设置波特率为9600,就可看到调节LED亮度的PWM值。

实验七 感光灯实验

实验说明

完成以上的各种实验后,我们对Arduino 的应用也应该有一些认识和了解了,在基本的数字量输入输出和模拟量输入以及PWM 的产生都掌握以后,我们就可以开始进行一些传感器的应用了。

本次实验我们先进行一个较为简单的光敏电阻的使用实验。光敏电阻既然是可以根据光强改变阻值的元件,自然也需要模拟口读取模拟值了,本实验可以借鉴电位器调控灯光亮度实验,将电位计换做光敏电阻实现当光强不同时LED 小灯的亮度也会有相应的变化。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

10KΩ 电阻*1

光敏电阻*1

面包板*1

正标线若干

接线图

7

测试代码

int ledpin=11;//定义数字接口11(PWM 输出)

void setup()

{

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

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

}

void loop()

{

int val=analogRead(0);//读取模拟口A0口的值

Serial.println(val);//显示val 变量

val = map(val, 0, 1023, 0, 255);//从0-1023映射到0-255

analogWrite(ledpin,255-val);// 打开LED 并设置亮度

delay(10);//延时0.01 秒

}

测试结果

下载完程序后,光敏电阻感应到灯光越亮,小灯越暗;光敏电阻感应到灯光越暗,小灯越亮。打开串口监视器,设置波特率为9600,就可看到光敏电阻感应到外界光强所得的模拟值。

实验八 有源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了有源蜂鸣器,有源蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号。实验中中我们只需要给蜂鸣器输入一个高电平信号,蜂鸣器响起。

实验器材

开发板*1

USB线*1

有源蜂鸣器*1

面包板*1

正标线若干

接线图

8

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(1000); //延迟1S

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

delay(1000);//延迟1S

}

测试结果

下载完程序后,我们可以听到蜂鸣器响1秒,停止响起1秒,循环交替。

实验九 无源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了无源蜂鸣器,无源蜂鸣器内部不带振荡源,直流信号无法令其鸣叫,须用方波驱动。

实验器材

开发板 *1

USB线*1

无源蜂鸣器*1

面包板*1

正标线若干

接线图

9

测试代码

code 1:

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

}

}

}

code 2:

#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);

}

测试结果

实验中我们提供了两个例程,上传例程1代码后,蜂鸣器会发出两种不同的声音,实验中,两种声音循环交替。上传例程2中代码后,蜂鸣器会想响起《欢乐颂》的曲子。

实验十 火焰报警实验

实验说明

火焰传感器是机器人专门用来搜寻火源的传感器,本传感器对火焰特别灵敏。火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号。

实验中,我们把火焰的亮度转化为高低变化的电平信号输入到UNO板中,然后控制蜂鸣器的响起。

实验器材

开发板*1

USB线*1

有源蜂鸣器*1

火焰传感器*1

10KΩ 电阻*1

面包板*1

正标线若干

接线图

10

测试代码

int flame=7;//定义火焰接口为数字7 接口

int Beep=9;//定义蜂鸣器接口为数字9 接口

void setup()

{

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

pinMode(flame,INPUT);//定义flame为输入接口

}

void loop()

{

int val=digitalRead(flame);//读取火焰传感器

if(val==HIGH)//当数字口7为高电平时蜂鸣器鸣响

{

digitalWrite(Beep,HIGH);

}else

{

digitalWrite(Beep,LOW);

}

delay(500);

}

测试结果

下载完程序后,我们可以模拟在有火焰时报警的情况,在没有火焰时一切正常,当有火焰时立刻报警做出提示。

实验十一 温馨水杯实验

实验说明

LM35 是很常用且易用的温度传感器元件,将LM35 温度传感器接到开发板上,通过算法可将读取的模拟值转换为实际的温度。

本实验中我们还外接了3个指示灯,在代码中我没设置在不同的温度范围,亮起不同颜色的指示灯。根据这个,我们完全可以做个温馨水杯,通过指示灯,我们就可以知道杯子里的水的冷热情况。

实验器材

开发板 *1

USB线*1

LM35DZ*1

LED*3

220Ω 电阻*3

面包板*1

正标线若干

接线图

11

测试代码

void setup() {

Serial.begin(9600);

pinMode(12, OUTPUT);

pinMode(11, OUTPUT);

pinMode(10, OUTPUT);

}

void loop() {

int vol = analogRead(A0) * (5.0 / 1023.0*100);

Serial.print(“Tep:”);

Serial.print(vol);

Serial.println(“C”);

if (vol<28)

{

digitalWrite(12, HIGH);

digitalWrite(11, LOW);

digitalWrite(10, LOW);

}

else if (vol>=28 && vol<=30)

{

digitalWrite(12, LOW);

digitalWrite(11, HIGH);

digitalWrite(10, LOW);

}

else if (vol>30)

{

digitalWrite(12, LOW);

digitalWrite(11, LOW);

digitalWrite(10, HIGH);

}

}

测试结果

下载完程序后,打开串口监视器,设置波特率为9600,就可看到当前的温度。当温度大于30摄氏度时,红色指示灯亮起,其他指示灯熄灭;当温度大于等于28摄氏度且小于等于30摄氏度时,红色指示灯熄灭,黄色指示灯亮起;当温度小于28摄氏度时,黄色指示灯熄灭,蓝色指示灯亮起。

实验十二 魔术光杯实验

实验说明

倾斜开关的工作原理是当开关一端低于水平位置倾斜,开关寻通;当另一端低于水平位置倾斜 ,开关停止。魔术光杯实验原理是利用 PWM 调光的原理,两个LED的亮度发生变化。

这个实验中倾斜开关提供数字信号,触发 PWM 的调节,通过程序的设计,我们就能看到类似于两组装满光的杯子倒来倒去的效果了。

实验器材

开发板*1

USB线*1

LED*2

倾斜开关*2

220Ω 电阻*2

10KΩ 电阻*2

面包板*1

正标线若干

接线图

12

测试代码

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最亮;在串口监视器中看到对应具体数值变化,如下图。当倾斜另一边中,现象一样,方向相反。

实验十三 红外遥控解码实验

实验说明

通用红外遥控系统由发射和接收两大部分组成。本实验中发射部分就是遥控器,接收部分就是红外接收 VS1838B。红外接收 VS1838B是集接收、放大、解调一体的器件,它内部IC就已经完成了解调,输出的就是数字信号。

图片3

实验器材

开发板*1

USB线*1

红外遥控*1

红外接收 VS1838B*1

面包板*1

正标线若干

接线图

13

测试代码

#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(); // 接收下个数据

}

}

测试结果

下载完程序,上电后,红外遥控对准红外接收传感器发送信号,我们可以在串口监视器总看到相应按键的编码,如下图。

遥控器-1

实验十四 一位数码管显示实验

实验说明

数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),本实验所使用的是八段数码管。数码管共有七段显示数字的段,还有一个显示小数点的段。当让数码管显示数字时,只要将相应的段点亮即可。

实验器材

开发板 *1

USB线*1

一位数码管*1

220Ω 电阻*8

面包板*1

正标线若干

接线图

14

测试代码

//设置控制各段的数字IO 脚

int a=7;//定义数字接口7 连接a 段数码管

int b=6;// 定义数字接口6 连接b 段数码管

int c=5;// 定义数字接口5 连接c 段数码管

int d=10;// 定义数字接口11 连接d 段数码管

int e=11;// 定义数字接口10 连接e 段数码管

int f=8;// 定义数字接口8 连接f 段数码管

int g=9;// 定义数字接口9 连接g 段数码管

int dp=4;// 定义数字接口4 连接dp 段数码管

void digital_1(void) //显示数字1

{

unsigned char j;

digitalWrite(c,HIGH);//给数字接口5 引脚高电平,点亮c 段

digitalWrite(b,HIGH);//点亮b 段

for(j=7;j<=11;j++)//熄灭其余段

digitalWrite(j,LOW);

digitalWrite(dp,LOW);//熄灭小数点DP 段

}

void digital_2(void) //显示数字2

{

unsigned char j;

digitalWrite(b,HIGH);

digitalWrite(a,HIGH);

for(j=9;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

digitalWrite(c,LOW);

digitalWrite(f,LOW);

}

void digital_3(void) //显示数字3

{

unsigned char j;

digitalWrite(g,HIGH);

digitalWrite(d,HIGH);

for(j=5;j<=7;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

digitalWrite(f,LOW);

digitalWrite(e,LOW);

}

void digital_4(void) //显示数字4

{

digitalWrite(c,HIGH);

digitalWrite(b,HIGH);

digitalWrite(f,HIGH);

digitalWrite(g,HIGH);

digitalWrite(dp,LOW);

digitalWrite(a,LOW);

digitalWrite(e,LOW);

digitalWrite(d,LOW);

}

void digital_5(void) //显示数字5

{

unsigned char j;

for(j=7;j<=9;j++)

digitalWrite(j,HIGH);

digitalWrite(c,HIGH);

digitalWrite(d,HIGH);

digitalWrite(dp,LOW);

digitalWrite(b,LOW);

digitalWrite(e,LOW);

}

void digital_6(void) //显示数字6

{

unsigned char j;

for(j=7;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(c,HIGH);

digitalWrite(dp,LOW);

digitalWrite(b,LOW);

}

void digital_7(void) //显示数字7

{

unsigned char j;

for(j=5;j<=7;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

for(j=8;j<=11;j++)

digitalWrite(j,LOW);

}

void digital_8(void) //显示数字8

{

unsigned char j;

for(j=5;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

}

void setup()

{

int i;//定义变量

for(i=4;i<=11;i++)

pinMode(i,OUTPUT);//设置4~11 引脚为输出模式

}

void loop()

{

while(1)

{

digital_1();//显示数字1

delay(2000);//延时2s

digital_2();//显示数字2

delay(1000); //延时1s

digital_3();//显示数字3

delay(1000); //延时1s

digital_4();//显示数字4

delay(1000); //延时1s

digital_5();//显示数字5

delay(1000); //延时1s

digital_6();//显示数字6

delay(1000); //延时1s

digital_7();//显示数字7

delay(1000); //延时1s

digital_8();//显示数字8

delay(1000); //延时1s

}

}

测试结果

下载完程序后,数码管循环显示1~8 数字。

实验十五 74HC595驱动一位数码管实验

实验说明

上一个实验中我们直接把用开发板控制一位数码管,需要占用了较多的数字口,本实验中我们添加了一个74HC595芯片控制一位数码管,只需要用3个数字口就可以控制8个LED灯,具体设置方法可以参照以下表格。

Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0
a b c d e f g dp
0 1 1 1 1 1 1 0 0 252
1 0 1 1 0 0 0 0 0 96
2 1 1 0 1 1 0 1 0 218
3 1 1 1 1 0 0 1 0 242
4 0 1 1 0 0 1 1 0 102
5 1 0 1 1 0 1 1 0 182
6 1 0 1 1 1 1 1 0 190
7 1 1 1 0 0 0 0 0 224
8 1 1 1 1 1 1 1 0 254
9 1 1 1 1 0 1 1 0 246

实验器材

开发板*1

USB线*1

74HC595*1

一位数码管*1

220Ω 电阻*8

面包板*1

正标接线若干

接线图

15

测试代码

int latchPin = 4;

int clockPin = 5;

int dataPin = 2; //这里定义了那三个脚

void setup ()

{

pinMode(latchPin,OUTPUT);

pinMode(clockPin,OUTPUT);

pinMode(dataPin,OUTPUT); //让三个脚都是输出状态

}

void loop()

{

int a[10]={

246,254,224,190,182,102,242,218,96,252}; //定义功能数组,数组依次为数码管得定义

for(int x=9; x>-1 ;x– ) //倒数功能循环

{

digitalWrite(latchPin,LOW);

shiftOut(dataPin,clockPin,MSBFIRST,a[x]); //显示数组a[x]

digitalWrite(latchPin,HIGH);

delay(1000);

}

}

测试结果

下载完程序后,数码管循环显示0~9 数字。

实验十六 舵机控制实验

实验说明

舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测

器所构成。舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红、橙三种颜

色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极

线,橙色为信号线。

舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM

(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms

之间,但是,事实上脉宽可由0.5ms 到2.5ms 之间,脉宽和舵机的转角0°~180°相

对应。有一点值得注意的地方,由于舵机牌子不同,对于同一信号,不同牌子的舵机旋

转的角度也会有所不同。

实验器材

开发板*1

USB线*1

舵机*1

正标线若干

接线图

16

测试代码

程序A:

int servopin=9;//定义数字接口9 连接伺服舵机信号线

int myangle;//定义角度变量

int pulsewidth;//定义脉宽变量

int val;

void servopulse(int servopin,int myangle)//定义一个脉冲函数

{

pulsewidth=(myangle*11)+500;//将角度转化为500-2480 的脉宽值

digitalWrite(servopin,HIGH);//将舵机接口电平至高

delayMicroseconds(pulsewidth);//延时脉宽值的微秒数

digitalWrite(servopin,LOW);//将舵机接口电平至低

delay(20-pulsewidth/1000);

}

void setup()

{

pinMode(servopin,OUTPUT);//设定舵机接口为输出接口

Serial.begin(9600);//连接到串行端口,波特率为9600

Serial.println(“servo=o_seral_simple ready” ) ;

}

void loop()//将0 到9 的数转化为0 到180 角度,并让LED 闪烁相应数的次数

{

val=Serial.read();//读取串行端口的值

if(val>=’0’&&val<=’9′)

{

val=val-‘0’;//将特征量转化为数值变量

val=val*(180/9);//将数字转化为角度

Serial.print(“moving servo to “);

Serial.print(val,DEC);

Serial.println();

for(int i=0;i<=50;i++) //给予舵机足够的时间让它转到指定角度

{

servopulse(servopin,val);//引用脉冲函数

}

}

}

程序B:

#include <Servo.h>

Servo myservo;//定义舵机变量名

void setup()

{

myservo.attach(9);//定义舵机接口(9、10 都可以,缺点只能控制2 个)

}

void loop()

{

myservo.write(90);//设置舵机旋转的角度

}

测试结果

程序A 结果:

在串口监视器中输入数字点击发送,舵机转动到所对应的角度数的位置,并将角度打印显示到屏幕上。

程序B结果:

舵机自己转动到90度位置。

实验十七 四位数码管显示数字实验

实验说明

在实验十五中我们使用开发板驱动一个一位数码管,本实验我们使用开发板驱动一个共阴四位数码管。驱动数码管限流电阻肯定是必不可少的,限流电阻有两种接法,一种是在d1-d4阴极接,总共接4颗。这种接法好处是需求电阻比较少,但是会产生每一位上显示不同数字亮度会不一样,1最亮,8最暗。另外一种接法就是在其他8个引脚上接,这种接法亮度显示均匀,但是用电阻较多。本次实验使用8颗220Ω电阻。

四位数码管总共有12个引脚,小数点朝下正放在面前时,左下角为1,其他管脚顺序为逆时针旋转。左上角为最大的12号管脚。

IMGP0049_调整大小.JPG

四位数码管原理图如下

5643b.jpg

实验器材

开发板*1

USB线*1

四位数码管*1

220Ω 电阻*8

面包板*1

正标线若干

接线图

17

测试代码

int a = 1;

int b = 2;

int c = 3;

int d = 4;

int e = 5;

int f = 6;

int g = 7;

int dp = 8;

int d4 = 9;

int d3 = 10;

int d2 = 11;

int d1 = 12;

// set variable

long n = 1230;

int x = 100;

int del = 55; // fine adjustment for clock

void setup()

{

pinMode(d1, OUTPUT);

pinMode(d2, OUTPUT);

pinMode(d3, OUTPUT);

pinMode(d4, OUTPUT);

pinMode(a, OUTPUT);

pinMode(b, OUTPUT);

pinMode(c, OUTPUT);

pinMode(d, OUTPUT);

pinMode(e, OUTPUT);

pinMode(f, OUTPUT);

pinMode(g, OUTPUT);

pinMode(dp, OUTPUT);

}

/////////////////////////////////////////////////////////////

void loop()

{

int a=0;

int b=0;

int c=0;

int d=0;

unsigned long currentMillis = millis();

while(d>=0)

{

while(millis()-currentMillis<1000)

{

Display(1,a);

Display(2,b);

Display(3,c);

Display(4,d);

}

currentMillis = millis();

d++;

if (d>9)

{

c++;

d=0;

}

if (c>9)

{

b++;

c=0;

}

if (b>9)

{

a++;

b=0;

}

if (a>9)

{

a=0;

b=0;

c=0;

d=0;

}

}

}

///////////////////////////////////////////////////////////////

void WeiXuan(unsigned char n)//

{

switch (n)

{

case 1:

digitalWrite(d1, LOW);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

case 2:

digitalWrite(d1, HIGH);

digitalWrite(d2, LOW);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

case 3:

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, LOW);

digitalWrite(d4, HIGH);

break;

case 4:

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, LOW);

break;

default :

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

}

}

void Num_0()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_1()

{

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_2()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, LOW);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_3()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_4()

{

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_5()

{

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_6()

{

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_7()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_8()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_9()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Clear() // clear the screen

{

digitalWrite(a, LOW);

digitalWrite(b, LOW);

digitalWrite(c, LOW);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void pickNumber(unsigned char n)// select number

{

switch (n)

{

case 0: Num_0();

break;

case 1: Num_1();

break;

case 2: Num_2();

break;

case 3: Num_3();

break;

case 4: Num_4();

break;

case 5: Num_5();

break;

case 6: Num_6();

break;

case 7: Num_7();

break;

case 8: Num_8();

break;

case 9: Num_9();

break;

default: Clear();

break;

}

}

void Display(unsigned char x, unsigned char Number)// take x as coordinate and display number

{

WeiXuan(x);

pickNumber(Number);

delay(1);

Clear() ; // clear the screen

}

测试结果

下载完程序后,数码管首先显示“0000”数值,显示跳动,每跳动一下数码管显示数值加1。当显示数值为超过“9999”后,显示数值再次变为“0000”,循环显示。

实验十八 1602液晶显示实验

实验说明

本次试验使用keyes UNO R3 直接驱动1602液晶显示文字。1602液晶在应用中非常广泛,它的显示容量为16×2个字符,芯片工作电压为4.5~5.5V。1602液晶在接keyes UNO R3 控制板显示文字时有两种接线法,分别为4位接法和8位接法,本实验中都会有相关说明介绍。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

面包板*1

正标线若干

接线图

四位接法

18

八位接法

18-1

测试代码

四位接法

/*

LiquidCrystal Library – Hello World

Demonstrates the use a 16×2 LCD display. The LiquidCrystal

library works with all LCD displays that are compatible with the

Hitachi HD44780 driver. There are many of them out there, and you

can usually tell them by the 16-pin interface.

This sketch prints “Hello World!” to the LCD

and shows the time.

The circuit:

* LCD RS pin to digital pin 2

* LCD Enable pin to digital pin3

* LCD D4 pin to digital pin 4

* LCD D5 pin to digital pin 5

* LCD D6 pin to digital pin 6

* LCD D7 pin to digital pin 7

* LCD R/W pin to ground

* LCD VSS pin to ground

* LCD VCC pin to 5V

* 10K resistor:

* ends to +5V and ground

* wiper to LCD VO pin

*/

// include the library code:

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

void setup() {

// set up the LCD’s number of columns and rows:

lcd.begin(16, 2);

// Print a message to the LCD.

lcd.setCursor(2,0);

lcd.print(“Hello, world!”);

lcd.setCursor(2,1);

lcd.print(“Hello, keyes!”);

}

void loop() {

}

八位接法

int DI = 12;

int RW = 11;

int DB[] = {3, 4,5, 6,7 ,8, 9, 10};//使用数组来定义总线需要的管脚

int Enable = 2;

void LcdCommandWrite(int value) {

// 定义所有引脚

int i = 0;

for (i=DB[0]; i <= DI; i++) //总线赋值

{

digitalWrite(i,value & 01);//因为1602液晶信号识别是D7-D0(不是D0-D7),这里是用来反转信号。

value >>= 1;

}

digitalWrite(Enable,LOW);

delayMicroseconds(1);

digitalWrite(Enable,HIGH);

delayMicroseconds(1); // 延时1ms

digitalWrite(Enable,LOW);

delayMicroseconds(1); // 延时1ms

}

void LcdDataWrite(int value) {

// 定义所有引脚

int i = 0;

digitalWrite(DI, HIGH);

digitalWrite(RW, LOW);

for (i=DB[0]; i <= DB[7]; i++) {

digitalWrite(i,value & 01);

value >>= 1;

}

digitalWrite(Enable,LOW);

delayMicroseconds(1);

digitalWrite(Enable,HIGH);

delayMicroseconds(1);

digitalWrite(Enable,LOW);

delayMicroseconds(1); // 延时1ms

}

void setup (void) {

int i = 0;

for (i=Enable; i <= DI; i++) {

pinMode(i,OUTPUT);

}

delay(100);

// 短暂的停顿后初始化LCD

// 用于LCD控制需要

LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5×7文字大小

delay(64);

LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5×7文字大小

delay(50);

LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5×7文字大小

delay(20);

LcdCommandWrite(0x06); // 输入方式设定

// 自动增量,没有显示移位

delay(20);

LcdCommandWrite(0x0E); // 显示设置

// 开启显示屏,光标显示,无闪烁

delay(20);

LcdCommandWrite(0x01); // 屏幕清空,光标位置归零

delay(100);

LcdCommandWrite(0x80); // 显示设置

// 开启显示屏,光标显示,无闪烁

delay(20);

}

void loop (void) {

LcdCommandWrite(0x01); // 屏幕清空,光标位置归零

delay(10);

LcdCommandWrite(0x80+2);

delay(10);

// 写入欢迎信息

LcdDataWrite(‘H’);

LcdDataWrite(‘e’);

LcdDataWrite(‘l’);

LcdDataWrite(‘l’);

LcdDataWrite(‘o’);

LcdDataWrite(‘,’);

LcdDataWrite(‘ ‘);

LcdDataWrite(‘w’);

LcdDataWrite(‘o’);

LcdDataWrite(‘r’);

LcdDataWrite(‘l’);

LcdDataWrite(‘d’);

LcdDataWrite(‘!’);

delay(10);

LcdCommandWrite(0xc0+2); // 定义光标位置为第二行第二个位置

delay(10);

LcdDataWrite(‘H’);

LcdDataWrite(‘e’);

LcdDataWrite(‘l’);

LcdDataWrite(‘l’);

LcdDataWrite(‘o’);

LcdDataWrite(‘,’);

LcdDataWrite(‘ ‘);

LcdDataWrite(‘k’);

LcdDataWrite(‘e’);

LcdDataWrite(‘y’);

LcdDataWrite(‘e’);

LcdDataWrite(‘s’);

LcdDataWrite(‘!’);

LcdDataWrite(‘ ‘);

delay(5000);

}

测试结果

无论是四位接法还是八位接法,接好线,烧录程序上电后,通过旋转电位器调节背光,即可在1602 LCD上看到设置的显示字符。四位接法和八位接法显示一样,第一行显示 “Hello, world!”字符,第二行显示”Hello, keyes!”字符。

实验十九 超声波测距显示实验

实验说明

本实验中我们主要用到了超声波传感器和1602 LCD。实验中我们通过超声波测到超声波与前方障碍物的距离,然后在1602 LCD上显示测试结果。

实验器材

开发板 *1

USB线*1

1602 LCD*1

可调电位器*1

超声波传感器*1

面包板*1

正标线若干

杜邦线若干

接线图

19

测试代码

#include <LiquidCrystal.h>

#define echoPin 3 // Echo Pin

#define trigPin 2 // Trigger Pin

#define LEDPin 13 // Onboard LED

LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

int maximumRange = 200; // Maximum range needed

int minimumRange = 0; // Minimum range needed

long duration, distance; // Duration used to calculate distance

void setup() {

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)

lcd.begin(16, 2);

lcd.setCursor(0,0);

lcd.print(“The distance is:”);

}

void loop() {

/* The following trigPin/echoPin cycle is used to determine the

distance of the nearest object by bouncing soundwaves off of it. */

digitalWrite(trigPin, LOW);

delayMicroseconds(2);

digitalWrite(trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);

//Calculate the distance (in cm) based on the speed of sound.

distance = duration/58.2;

if (distance >= maximumRange || distance <= minimumRange){

/* Send a negative number to computer and Turn LED ON

to indicate “out of range” */

lcd.setCursor(0,1);

lcd.print(“-1 “);

digitalWrite(LEDPin, HIGH);

}

else {

/* Send the distance to the computer using Serial protocol, and

turn LED OFF to indicate successful reading. */

Serial.println(distance);

if(distance<10)

{

lcd.setCursor(0,1);

lcd.print(distance);

lcd.setCursor(1,1);

lcd.print(” “);

}

if((distance >=10)&&(distance<100))

{

lcd.setCursor(0,1);

lcd.print(distance);

lcd.setCursor(2,1);

lcd.print(” “);

}

if(distance>100)

{

lcd.setCursor(0,1);

lcd.print(distance);

}

digitalWrite(LEDPin, LOW);

}

//Delay 50ms before next reading.

delay(50);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 LCD显示”The distance is:”字符;测试超声波与前方障碍物的距离,测试到数据,则在1602 LCD上显示该数据,若没测试到数据,那么就在1602 LCD上显示”-1”字符。

实验二十 1302时钟显示实验

实验说明

上一实验中我们在1602 LCD上显示超声波距离,这一实验程也是将1602 LCD做显示器。这个实验相当于我们自制一个时钟,时钟上包含年、月、日、星期、小时、分钟、秒。初始时间在代码中设置,时钟自动行走,在1602 LCD显示。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

1302时钟传感器*1

面包板*1

正标线若干

杜邦线若干

接线图

20

测试代码

#include <stdio.h>

#include <string.h>

#include <DS1302.h>

#include <Wire.h>

#include <LiquidCrystal.h>

LiquidCrystal lcd(5, 6, 7, 8, 9, 10);

/* Set the appropriate digital I/O pin connections */

uint8_t CE_PIN = 4; // RST

uint8_t IO_PIN = 3; // DAT

uint8_t SCLK_PIN = 2; // CLK

/* Create buffers */

char buf[50];

char bf[50];

char bu[50];

char uf[50];

char day[10];

/* Create a DS1302 object */

DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

void print_time()

{

/* Get the current time and date from the chip */

Time t = rtc.time();

/* Name the day of the week */

memset(day, 0, sizeof(day)); /* clear day buffer */

switch (t.day) {

case 1:

strcpy(day, “Sunday “);

break;

case 2:

strcpy(day, “Monday “);

break;

case 3:

strcpy(day, “Tuesday “);

break;

case 4:

strcpy(day, “Wednesday”);

break;

case 5:

strcpy(day, “Thursday “);

break;

case 6:

strcpy(day, “Friday “);

break;

case 7:

strcpy(day, “Saturday “);

break;

}

/* Format the time and date and insert into the temporary buffer */

snprintf(buf, sizeof(buf), “%s %04d-%02d-%02d %02d:%02d:%02d”,

day,

t.yr, t.mon, t.date,

t.hr, t.min, t.sec);

snprintf(bf, sizeof(bf), “%s %04d”,

day, t.yr);

lcd.setCursor(0,0);

lcd.print(bf);

snprintf(bu, sizeof(bu),”%02d:%02d:%02d”,

t.hr, t.min, t.sec);

/* Print the formatted string to serial so we can see the time */

lcd.setCursor(0,1);

lcd.print(bu);

snprintf(uf, sizeof(uf), “%02d-%02d”,

t.mon, t.date);

lcd.setCursor(11,1);

lcd.print(uf);

}

void setup()

{

lcd.begin(16, 2);

/* Initialize a new chip by turning off write protection and clearing the

clock halt flag. These methods needn’t always be called. See the DS1302

datasheet for details. */

rtc.write_protect(false);

rtc.halt(false);

/* Make a new time object to set the date and time */

Time t(2017,7,24,10,12,22,2);

/* Set the time and date on the chip */

rtc.time(t);

}

/* Loop and print the time every second */

void loop()

{

print_time();

delay(1000);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 LCD显示当前初始时间,然后时钟开始走动。

实验二十一 人体红外感应实验

实验说明

和上面两个实验一样,这个实验也是用1602 LCD做显示器。实验中,我们用到了人体红外热释电传感器,当检测到有人有附近移动时,在1602 LCD显示对应字符,当没有检测到人体在附件移动时,1602 LCD显示另一对应字符。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

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

面包板*1

正标线若干

杜邦线若干

接线图

21

测试代码

#include <LiquidCrystal.h>

LiquidCrystal lcd(3, 4, 5, 6, 7, 8);

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

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

void setup()

{

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

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

lcd.begin(16, 2);

}

void loop()

{

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

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

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

{

lcd.setCursor(0,0);

lcd.print(“Somebody is “);

lcd.setCursor(0,1);

lcd.print(“in this area! “);

}

else if(state == 0)

{

lcd.setCursor(0,0);

lcd.print(“No one! “);

lcd.setCursor(0,1);

lcd.print(“No one! “);

}

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,当检测到有人有附近移动时,在1602 LCD第一行显示显示”Somebody is “字符,第二行显示”in this area!”字符;当没有检测到人体在附件移动时,1602 LCD两行都显示”No one!”字符。

实验二十二 温湿度显示实验

实验说明

和上面实验一样,这个实验也是用1602 LCD做显示器。这个实验中我们主要用到了DHT11温湿度传感器和1602 LCD。DHT11温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。

实验中我们DHT11温湿度传感器测试出当前环境中的温度和湿度,然后在1602 LCD 显示测试结果。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

DHT11温湿度传感器*1

面包板*1

正标线若干

杜邦线若干

接线图

22

测试代码

#include <dht11.h>

// include the library code:

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(3, 4, 5, 6, 7, 8);

dht11 DHT;

#define DHT11_PIN 2

void setup(){

lcd.begin(16, 2);

// Print a message to the LCD.

lcd.setCursor(0,0);

lcd.print(“Humidity (%):”);

lcd.setCursor(0,1);

lcd.print(“Temp (C):”);

}

void loop(){

int chk;

chk = DHT.read(DHT11_PIN); // READ DATA

switch (chk){

case DHTLIB_OK:

break;

case DHTLIB_ERROR_CHECKSUM:

break;

case DHTLIB_ERROR_TIMEOUT:

break;

default:

break;

}

// DISPLAT DATA

lcd.setCursor(13,0);

lcd.print(DHT.humidity);

lcd.setCursor(9,1);

lcd.print(DHT.temperature);

delay(1000);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 LCD显示当前环境中的温度和湿度值。

实验二十三 摇杆模块数据显示实验

实验说明

和上面实验一样,这个实验也是用1602 LCD做显示器。这个实验中我们主要用到了摇杆模块和1602 LCD。摇杆模块5V供电,信号端X,Y接模拟口,原始状态下读出电压为2.5V左右,当随箭头方向按下,读出电压值随着增加,最大到5V,箭头相反方向按下,读出电压值减少,最小为0V;信号端B接数字口,原始状态下输出0,按下输出1。

实验中我们读取摇杆模块X、Y、B三个接口数值,然后在1602 LCD 显示测试结果。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

摇杆模块*1

面包板*1

正标线若干

杜邦线若干

接线图

23

测试代码

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(3, 4, 5, 6, 7, 8);

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

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

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

void setup()

{

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

lcd.begin(16, 2);

// Print a message to the LCD.

lcd.setCursor(0,0);

lcd.print(“X:”);

lcd.setCursor(8,0);

lcd.print(“Y:”);

lcd.setCursor(0,1);

lcd.print(“Z:”);}

void loop()

{

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

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

if(x<10)

{

lcd.setCursor(2,0);

lcd.print(x);

lcd.setCursor(3,0);

lcd.print(” “);

}

if((x>=10)&&(x<100))

{

lcd.setCursor(2,0);

lcd.print(x);

lcd.setCursor(4,0);

lcd.print(” “);

}

if((x>=100)&&(x<1000))

{

lcd.setCursor(2,0);

lcd.print(x);

lcd.setCursor(5,0);

lcd.print(” “);

}

if(x>=1000)

{

lcd.setCursor(2,0);

lcd.print(x);

}

delay(100);

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

if(y<10)

{

lcd.setCursor(10,0);

lcd.print(y);

lcd.setCursor(11,0);

lcd.print(” “);

}

if((y>=10)&&(y<100))

{

lcd.setCursor(10,0);

lcd.print(y);

lcd.setCursor(12,0);

lcd.print(” “);

}

if((y>=100)&&(y<1000))

{

lcd.setCursor(10,0);

lcd.print(y);

lcd.setCursor(13,0);

lcd.print(” “);

}

if(y>=1000)

{

lcd.setCursor(2,0);

lcd.print(y);

}

delay(100);

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

lcd.setCursor(2,1);

lcd.print(z);

delay(100);//延迟0.1S

}

测试结果

下载完程序后,上电后,通过电位器调节1602 LCD背光后,我们可以在1602 LCD上看、

到摇杆模块X、Y、Z方向对应的的数值。

实验二十四 继电器控灯实验

实验说明

继电器模块是一种用于低电控制高电,保护电路的模块。本实验用到的5V单路继电器模块高电平有效,它有控制指示灯,吸合亮,断开不亮。实验中我们通过控制继电器从而控制一个LED的亮灭。

实验器材

开发板*1

USB线*1

5V 单路继电器模块*1

LED*1

220Ω 电阻*1

面包板*1

正标线若干

杜邦线若干

接线图

24

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(2000); //延时2S

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

delay(2000); //延时2S

}

测试结果

按照上图接好线,烧录好代码,上电后,继电器开启(ON端和COM端连通)2S,LED

亮起;停止(NC端和COM端连通)2S,LED熄灭;循环交替。开启时继电器上D2灯

亮起。

实验二十五 水蒸气检测显示实验

实验说明

和上面实验一样,这个实验也是用1602 LCD做显示器。这个实验中我们主要用到了水滴水蒸气传感器和1602 LCD。水滴水蒸气传感器是一个模拟传感器,可以制作简单的雨水探测器与液位开关。当传感器表面的湿度上升,输出电压将增大。

实验中我们读取水滴水蒸气传感器信号端的模拟值,然后在1602 LCD 显示测试结果。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

水滴水蒸气传感器*1

面包板*1

正标线若干

杜邦线若干

接线图

25

测试代码

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(3, 4, 5, 6, 7, 8);

void setup() {

lcd.begin(16, 2);

// Print a message to the LCD.

lcd.setCursor(0,0);

lcd.print(“Sensor value:”);

}

void loop() {

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

if(value<10)

{

lcd.setCursor(0,1);

lcd.print(value);

lcd.setCursor(1,1);

lcd.print(” “);

}

if((value>=10)&&(value<100))

{

lcd.setCursor(0,1);

lcd.print(value);

lcd.setCursor(2,1);

lcd.print(” “);

}

if((value>=100)&&(value<1000))

{

lcd.setCursor(0,1);

lcd.print(value);

lcd.setCursor(3,1);

lcd.print(” “);

}

if(value>=1000)

{

lcd.setCursor(2,0);

lcd.print(value);

}

delay(100);

}

测试结果

下载完程序后,上电后,通过电位器调节1602 LCD背光后,我们可以在1602 LCD上看

到水滴水蒸气传感器信号端的模拟值。

实验二十六 声控灯实验

实验说明

麦克风声音传感器是专门用来检测声音的传感器。传感器有S端是模拟输出,是麦克风的电压信号实时输出,通过电位器可调节信号增益。实验中,我通过传感器检测声音大小,从而控制一个LED亮灭。

实验器材

开发板*1

USB线*1

麦克风声音传感器*1

LED*1

220Ω 电阻*1

面包板*1

正标线若干

杜邦线若干

接线图

26

测试代码

int MIC=0;//定义声音传感器为模拟0 接口

int LED=9;//定义LED接口为数字9 接口

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

void setup()

{

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

pinMode(MIC,INPUT);//定义声音传感器为输入接口

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

}

void loop()

{

val=analogRead(MIC);//读取声音传感器的模拟值

Serial.println(val);//输出模拟值,并将其打印出来

if(val>=300)//当模拟值大于300 时LED亮起

{

digitalWrite(LED,HIGH);

}else

{

digitalWrite(LED,LOW);

}

delay(500);

}

测试结果

下载完程序后,我们可以检测声音大小,输出模拟值,声音越大,输出越大。当声音大小到达一定数值时,LED亮起,否则LED熄灭。

实验二十七 步进电机实验

实验说明

步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到

一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。你

可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时你也可以通过

控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

下面这个就是本次实验使用的步进电机
csc
减速步进电机

直径:28mm

电压:5V

步进角度:5.625 x 1/64

减速比:1/64

5线4相 可以用普通uln2003芯片驱动,也可以接成2相使用

该步进电机空载耗电在50mA以下,带64倍减速器,输出力矩比较大,可以驱动重负

载,极适合开发板使用。注意:此款步进电机带有64倍减速器,与不带减速器的步进

电机相比,转速显得较慢,为方便观察,可在输出轴处粘上一片小纸板。

csc

步进电机(五线四相)驱动板(UL2003)试验板

KE0079  (1)

实验器材

开发板*1

USB线*1

减速步进电机*1

UL2003*1

杜邦线若干

接线图

27

测试代码

#include <Stepper.h>

//这里设置步进电机旋转一圈是多少步

#define STEPS 100

//设置步进电机的步数和引脚

Stepper stepper(STEPS, 11, 10, 9, 8);

//定义变量用来存储历史读数

int previous = 0;

void setup()

{

//设置电机每分钟的转速为90步

stepper.setSpeed(90);

}

void loop()

{

//获取传感器读数

int val = analogRead(0);

//移动步数为当前读数减去历史读数

stepper.step(val – previous);

//保存历史读数

previous = val;

}

测试结果

按照上图接好线,烧录好代码,上电后,5V步进电机转动,转动速度很慢。

实验二十八 姿态传感器实验

实验说明

APDS-9930 在单个 8 引脚封装内提供 I2C 接口兼容的环境亮度传感器 (ALS, Ambient Light Sensor) 和带有红外 LED 的接近传感器,其中环境亮度传感器使用双光二极管来近似 0.01 lux 照度下低流明性能的人眼视觉反应,提供的高灵敏度使得器件可以在深色玻璃后运作。接近传感器经过完全调校可进行 100 毫米物体检测,免除终端设备和次组件的工厂校准需求。从明亮的阳光照射到黑暗的房间,接近检测功能都能运作良好。模块中加入微光学透镜提供红外能量的高效 率传送和接收,可降低总体功耗。另外,内部状态机可使器件进入低功耗模式,带来极低的平均功耗。

本实验只是简单的测试下这个传感器的基本功能。

实验器材

开发板*1

USB线*1

keyes 9930 接近和非接触式手势检测RGB和姿态传感器*1

杜邦线若干

接线图

28

测试代码

#include <Wire.h>

#include <SparkFun_APDS9960.h>

// Pins

#define APDS9960_INT 2 // Needs to be an interrupt pin

#define LED_PIN 13 // LED for showing interrupt

// Constants

#define LIGHT_INT_HIGH 1000 // High light level for interrupt

#define LIGHT_INT_LOW 10 // Low light level for interrupt

// Global variables

SparkFun_APDS9960 apds = SparkFun_APDS9960();

uint16_t ambient_light = 0;

uint16_t red_light = 0;

uint16_t green_light = 0;

uint16_t blue_light = 0;

int isr_flag = 0;

uint16_t threshold = 0;

void setup() {

// Set LED as output

pinMode(LED_PIN, OUTPUT);

pinMode(APDS9960_INT, INPUT);

// Initialize Serial port

Serial.begin(9600);

Serial.println();

Serial.println(F(“————————————-“));

Serial.println(F(“SparkFun APDS-9960 – Light Interrupts”));

Serial.println(F(“————————————-“));

// Initialize interrupt service routine

attachInterrupt(0, interruptRoutine, FALLING);

// Initialize APDS-9960 (configure I2C and initial values)

if ( apds.init() ) {

Serial.println(F(“APDS-9960 initialization complete”));

} else {

Serial.println(F(“Something went wrong during APDS-9960 init!”));

}

// Set high and low interrupt thresholds

if ( !apds.setLightIntLowThreshold(LIGHT_INT_LOW) ) {

Serial.println(F(“Error writing low threshold”));

}

if ( !apds.setLightIntHighThreshold(LIGHT_INT_HIGH) ) {

Serial.println(F(“Error writing high threshold”));

}

// Start running the APDS-9960 light sensor (no interrupts)

if ( apds.enableLightSensor(false) ) {

Serial.println(F(“Light sensor is now running”));

} else {

Serial.println(F(“Something went wrong during light sensor init!”));

}

// Read high and low interrupt thresholds

if ( !apds.getLightIntLowThreshold(threshold) ) {

Serial.println(F(“Error reading low threshold”));

} else {

Serial.print(F(“Low Threshold: “));

Serial.println(threshold);

}

if ( !apds.getLightIntHighThreshold(threshold) ) {

Serial.println(F(“Error reading high threshold”));

} else {

Serial.print(F(“High Threshold: “));

Serial.println(threshold);

}

// Enable interrupts

if ( !apds.setAmbientLightIntEnable(1) ) {

Serial.println(F(“Error enabling interrupts”));

}

// Wait for initialization and calibration to finish

delay(500);

}

void loop() {

// If interrupt occurs, print out the light levels

if ( isr_flag == 1 ) {

// Read the light levels (ambient, red, green, blue) and print

if ( !apds.readAmbientLight(ambient_light) ||

!apds.readRedLight(red_light) ||

!apds.readGreenLight(green_light) ||

!apds.readBlueLight(blue_light) ) {

Serial.println(“Error reading light values”);

} else {

Serial.print(“Interrupt! Ambient: “);

Serial.print(ambient_light);

Serial.print(” R: “);

Serial.print(red_light);

Serial.print(” G: “);

Serial.print(green_light);

Serial.print(” B: “);

Serial.println(blue_light);

}

// Turn on LED for a half a second

digitalWrite(LED_PIN, HIGH);

delay(500);

digitalWrite(LED_PIN, LOW);

// Reset flag and clear APDS-9960 interrupt (IMPORTANT!)

isr_flag = 0;

if ( !apds.clearAmbientLightInt() ) {

Serial.println(“Error clearing interrupt”);

}

}

}

void interruptRoutine() {

isr_flag = 1;

}

测试结果

打开串口监视器,显示如下图。

实验二十九 震动检测传感器实验

实验说明

震动检测传感器是基于压电陶瓷片的模拟震动传感器,是利用压电陶瓷给电信号产生震动的反变换过程,当压电陶瓷片震动时就会产生电信号。它可与Arduino专用传感器扩展板结合使用,Arduino模拟口能感知微弱的震动电信号,可实现与震动有相关的互动作品,比如电子鼓互动作品。

这个实验中,我们将模拟电压陶瓷震动传感器依照程序接入Arduino UNO控制器模拟口A0,观察当震动程度不同时,串口的输出值。

实验器材

开发板*1

USB线*1

震动检测传感器*1

杜邦线若干

接线图

29

测试代码

void setup()

{

Serial.begin(9600); //打开串口,设置串口波特率为 9600bps

}

void loop()

{

int val;

val=analogRead(0); //将模拟压电陶瓷震动传感器连接到模拟接口 0

Serial.print(“Vibration is “);

Serial.println(val,DEC);//通过串口打印读取到的模拟值

delay(100);

}

测试结果

当你检测到不同程度震动时,反馈回此时的测量值。如下图所示,此图是当将震动传

感器贴到 A4 纸中央上,绷直 A4 纸,敲击 A4 一边,串口反馈回来的数据示意图。

6、相关资料链接地址

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

分类
Arduino 学习套件

KE0111 Arduino 超级版学习套件

KE0082

目录

1、产品介绍 3

2、清单 3

3、Arduino IDE和驱动的安装 8

4、Arduino IDE的使用方法 14

5、实验课程 16

实验一 LED 闪烁实验 16

实验二 呼吸灯实验 17

实验三 广告灯实验 19

实验四 按键控制LED实验 20

实验五 抢答器实验 22

实验六 电位器调控灯光亮度实验 24

实验七 感光灯实验 25

实验八 有源蜂鸣器实验 27

实验九 无源蜂鸣器实验 28

实验十 火焰报警实验 32

实验十一 温馨水杯实验 33

实验十二 魔术光杯实验 35

实验十三 红外遥控解码实验 37

实验十四 一位数码管显示实验 39

实验十五 74HC595驱动一位数码管实验 43

实验十六 舵机控制实验 45

实验十七 四位数码管显示数字实验 47

实验十八 1602液晶显示实验 55

实验十九 超声波测距显示实验 60

实验二十 1302时钟显示实验 63

实验二十一 人体红外感应实验 66

实验二十二 温湿度显示实验 67

实验二十三 摇杆模块数据显示实验 69

实验二十四 继电器控灯实验 72

实验二十五 水蒸气检测显示实验 73

实验二十六 声控灯实验 75

实验二十七 步进电机实验 77

实验二十八 姿态传感器实验 79

实验二十九 震动检测传感器实验 82

6、相关资料链接地址 84

1、产品介绍

Arduino 超级版学习套件包含我们学习Arduino 单片机常用到的传感器模块、元器件和Arduino控制板。同时我们还会根据这些元器件和传感器模块,提供一些基Arduino控制板的学习课程,课程包含了接线方法、测试代码、实验结果等信息,它让你对这些元器件、传感器模块和Arduino控制板有个初步的了解。

2、清单

编码 名称 规格型号 数量 图片
1 遥控器 JMP-1 17键86*40*6.5MM 黑色 1 1
2 keyes传感器 keyes 人体红外热释电传感器 1 KE0054 (2)
3 keyes传感器 keyes 1302时钟传感器 1 KE0050 (1)
4 keyes传感器 keyes 超声波传感器 1 MD0017 (1)
5 keyes传感器 keyes 摇杆模块传感器(焊盘孔) 红色 环保 1 KE0051 (1)
6 keyes模块 keyes 5V 单路继电器模块(焊盘孔) 红色 环保 1 KE0052 (1)
7 keyes传感器 Keyes Steam Seneor 水滴水蒸气传感器 1 KY0135 (2)
8 keyes传感器 keyes 麦克风声音传感器(焊盘孔) 红色 环保 1 KE0034 (4)
9 keyes传感器 keyes DHT11温湿度传感器(焊盘孔) 红色 环保 1 KE0041 (1)
10 keyes驱动板 Keyes ULN2003步进电机驱动板(焊盘孔) 红色 环保 1 KE0079  (1)
11 keyes传感器 keyes 9930 接近和非接触式手势检测RGB和姿态传感器 1 KY0145- 9930  (6)
12 keyes传感器 Keyes Vibration Seneor 震动检测传感器 1 KY0138 Vibration Seneor 震动检测传感器 (5)
13 模块 5V步进电机 1 23R23 (18)
14 舵机 SG90 9G 23*12.2*29mm 蓝色 辉盛(环保) 1 FWE
15 LCD 1602 COB 5V 蓝屏 1 2
16 蜂鸣器 无源 12*8.5MM 5V 普通分体 2K 1
17 蜂鸣器 有源 12*9.5MM 5V 普通分体 2300Hz 1
18 轻触按键 12*12*5MM 插件 10








19 轻触按键 6*6*5MM 插件 4
20 传感器元件 LM35DZ 1
21 传感器元件 5MM 光敏电阻 3
22 传感器元件 红外接收 5MM火焰 1
23 传感器元件 红外接收 VS1838B 1
24 滚珠开关 HDX-2801 两脚一样 2
25 LED F5-红发红-短 5
26 LED F5-黄发黄-短 5
27 LED F5-蓝发蓝-短 5
28 电阻 碳膜色环 1/4W 1% 220R 8
29 电阻 碳膜色环 1/4W 1% 1K 5
30 电阻 碳膜色环 1/4W 1% 10K 5
31 USB线 AM/BM 透明蓝 OD:5.0 L=50cm 1 fw
32 线材 正标线 红 12CM(方头) 5
33 线材 正标线 黄 12CM(方头) 5
34 线材 正标线 黑 12CM(方头) 5
35 线材 正标线 绿 12CM(方头) 5
36 线材 正标线 灰 22CM(方头) 5
37 线材 正标线 蓝 22CM(方头) 5
38 杜邦线 公对母20CM/40P/2.54/10股铜包铝 24号线BL 0.5 30 (7)
39 杜邦线 母对母20CM/40P/2.54/10股铜包铝 24号线BL 0.5 ER
40 数码管 一位0.56英寸共阴红 1
41 数码管 四位0.36英寸共阴红 1
42 可调电位器 16MM 单联 B50K 1
43 IC 74HC595 DIP 1
44 电池盒+插杆 6节5号带线15CM露线 带DC插杆 1 1
45 面包板 ZY-60 400孔白色(纸卡包装) 1 67
46 排针 1*40P 黑色 2.54 针长3.0等边 1
47 电阻卡 100*70MM 1 电阻卡

KE0111不带开发板 KE0112带官方Arduino UNO R3

47 开发板 Arduino UNO R3 1

3、Arduino IDE和驱动的安装

当我们拿到Arduino开发板时,首先我们要安装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文件

然后

然后

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

1.5.6版本安装后的样子。

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

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

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

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

进入下图,选择

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

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

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

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

4、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 的软件,设置板,如下。

设置COM端口,如下

点击

编译程序,检查程序是否错误;点击

上传程序;Keyes UNO R3 开发板设置OK后右下脚显示如下图,和设备管理器中显示一致。

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

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

5、实验课程

实验一 LED 闪烁实验

实验说明

LED 闪烁实验是比较基础的实验之一,上一个“ Hello World!”实验里已经利用到了Arduino 自带的LED,这次我们利用其他I/O 口和外接直插LED 灯来完成这个实验。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

正标线若干

接线图

1

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(2000); //延迟2S

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

delay(2000);//延迟2S

}

测试结果

下载完程序就可以看到我们的IO口外接小灯在闪烁了,这样我们的实验现象为LED不停闪烁,间隔大约为两秒。

实验二 呼吸灯实验

实验说明

上一课程中我们只是控制LED的亮和灭,那么我们可以怎么控制LED的亮度呢?本课程中我们把LED接到PWM口中,然后通过改变PWM数值,调节LED亮度,使LED逐渐变亮,和逐渐变暗,从而达到呼吸灯的效果。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

正标线若干

接线图

2

测试代码

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.01S

}

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

{

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

delay(10); // 延迟0.01S

}

delay(1000);// 延迟1S

}

测试结果

下载完程序就可以看到我们的IO口外接小灯显示出呼吸灯的效果,小灯先逐渐变亮,后逐渐变暗,循环交替。

实验三 广告灯实验

实验说明

在生活中我们经常会看到一些由各种颜色的led灯组成的广告牌,广告牌上各个位置上癿led灯不断的变话,形成各种效果。本节实验就是利用led灯编程模拟广告灯效果。

实验器材

开发板*1

USB线*1

LED*5

220Ω 电阻*5

面包板*1

正标线若干

接线图

3

测试代码

int BASE = 2 ; //第一个 LED 接的 I/O 口

int NUM = 5; //LED 的总数

void setup()

{

for (int i = BASE; i < BASE + NUM; i ++)

{

pinMode(i, OUTPUT); //设定数字I/O口为输出

}

}

void loop()

{

for (int i = BASE; i < BASE + NUM; i ++)

{

digitalWrite(i, HIGH); //设定数字I/O口输出为”高”,即逐渐开灯

delay(200); //延迟

}

for (int i = BASE; i < BASE + NUM; i ++)

{

digitalWrite(i, LOW); //设定数字I/O口输出为”低”,即逐渐关灯

delay(200); //延迟

}

}

测试结果

下载完程序就可以看到我们的IO口外接小灯先逐渐变亮,然后逐渐变暗,循环交替。

实验四 按键控制LED实验

实验说明

I/O 口的意思即为INPUT 接口和OUTPUT 接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O 口的输出功能,这个实验我们来尝试一下使用Arduino的I/O 口的输入功能即为读取外接设备的输出值,我们用一个按键和一个LED 小灯完成一个输入输出结合使用的实验,让大家能简单了解I/O 的作用。

实验器材

开发板 *1

USB线*1

LED*1

轻触按键*1

220Ω 电阻*1

10KΩ 电阻*1

面包板*1

正标线若干

接线图

4

测试代码

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

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, LOW); // LED变暗

}

else

{

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

}

}

测试结果

下载完程序,上电后,当按键按下时小灯亮起,否则小灯不亮。

实验五 抢答器实验

实验说明

完成上面的实验以后相信已经有很多朋友可以独立完成这个实验了,我们可以模拟抢答器实验。实验中我们利用4个按键控制3个小灯,一个按键用做复位按键;另外3个按键对应3个小灯,用于抢答。

实验器材

开发板*1

USB线*1

keyes 插件RGB模块*1

轻触按键*4

10KΩ 电阻*4

面包板*1

正标线若干

接线图

5

测试代码

int redled=8; //红色LED 输出

int yellowled=7; //黄色LED输出

int greenled=6; //绿色LED输出

int redpin=5; //红色按键引脚

int yellowpin=4; //黄色按键引脚

int greenpin=3; //绿色按键引脚

int restpin=2; //复位按键引脚定义

int red;

int yellow;

int green;

void setup()

{

pinMode(redled,OUTPUT);

pinMode(yellowled,OUTPUT);

pinMode(greenled,OUTPUT);

pinMode(redpin,INPUT);

pinMode(yellowpin,INPUT);

pinMode(greenpin,INPUT);

}

void loop() //按键循环扫描。

{

red=digitalRead(redpin);

yellow=digitalRead(yellowpin);

green=digitalRead(greenpin);

if(red==LOW)RED_YES();

if(yellow==LOW)YELLOW_YES();

if(green==LOW)GREEN_YES();

}

void RED_YES()//一直执行红灯亮,直到复位键按下,结束循环

{

while(digitalRead(restpin)==1)

{

digitalWrite(redled,HIGH);

digitalWrite(greenled,LOW);

digitalWrite(yellowled,LOW);

}

clear_led();

}

void YELLOW_YES()//一直执行黄灯亮,直到复位键按下,结束循环

{

while(digitalRead(restpin)==1)

{

digitalWrite(redled,LOW);

digitalWrite(greenled,LOW);

digitalWrite(yellowled,HIGH);

}

clear_led();

}

void GREEN_YES()//一直执行绿灯亮,直到复位键按下,结束循环

{

while(digitalRead(restpin)==1)

{

digitalWrite(redled,LOW);

digitalWrite(greenled,HIGH);

digitalWrite(yellowled,LOW);

}

clear_led();

}

void clear_led()//清除LED

{

digitalWrite(redled,LOW);

digitalWrite(greenled,LOW);

digitalWrite(yellowled,LOW);

}

测试结果

下载完程序,上电后,一个简单的抢答器就做好了。

实验六 电位器调控灯光亮度实验

实验说明

在第二课程中我们直接通过PWM口控制灯的亮度,从而达到呼吸灯的效果。在这课程中我们通过一个电位器,利用电位器调节PWM值,从而控制灯的亮度。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

可调电位器*1

面包板*1

正标线若干

接线图

6

测试代码

int ledpin=11;//定义数字接口11(PWM 输出)

void setup()

{

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

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

}

void loop()

{

int val=analogRead(0);//读取模拟口A0口的值

val = map(val, 0, 1023, 0, 255);//从0-1023映射到0-255

Serial.println(val);//显示val 变量

analogWrite(ledpin,val);// 打开LED 并设置亮度

delay(100);//延时0.1 秒

}

测试结果

下载完程序后。我们可以通过旋转可调电位器控制小灯的亮度,打开串口监视器,设置波特率为9600,就可看到调节LED亮度的PWM值。

实验七 感光灯实验

实验说明

完成以上的各种实验后,我们对Arduino 的应用也应该有一些认识和了解了,在基本的数字量输入输出和模拟量输入以及PWM 的产生都掌握以后,我们就可以开始进行一些传感器的应用了。

本次实验我们先进行一个较为简单的光敏电阻的使用实验。光敏电阻既然是可以根据光强改变阻值的元件,自然也需要模拟口读取模拟值了,本实验可以借鉴电位器调控灯光亮度实验,将电位计换做光敏电阻实现当光强不同时LED 小灯的亮度也会有相应的变化。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

10KΩ 电阻*1

光敏电阻*1

面包板*1

正标线若干

接线图

7

测试代码

int ledpin=11;//定义数字接口11(PWM 输出)

void setup()

{

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

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

}

void loop()

{

int val=analogRead(0);//读取模拟口A0口的值

Serial.println(val);//显示val 变量

val = map(val, 0, 1023, 0, 255);//从0-1023映射到0-255

analogWrite(ledpin,255-val);// 打开LED 并设置亮度

delay(10);//延时0.01 秒

}

测试结果

下载完程序后,光敏电阻感应到灯光越亮,小灯越暗;光敏电阻感应到灯光越暗,小灯越亮。打开串口监视器,设置波特率为9600,就可看到光敏电阻感应到外界光强所得的模拟值。

实验八 有源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了有源蜂鸣器,有源蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号。实验中中我们只需要给蜂鸣器输入一个高电平信号,蜂鸣器响起。

实验器材

开发板*1

USB线*1

有源蜂鸣器*1

面包板*1

正标线若干

接线图

8

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(1000); //延迟1S

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

delay(1000);//延迟1S

}

测试结果

下载完程序后,我们可以听到蜂鸣器响1秒,停止响起1秒,循环交替。

实验九 无源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了无源蜂鸣器,无源蜂鸣器内部不带振荡源,直流信号无法令其鸣叫,须用方波驱动。

实验器材

开发板 *1

USB线*1

无源蜂鸣器*1

面包板*1

正标线若干

接线图

9

测试代码

code 1:

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

}

}

}

code 2:

#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);

}

测试结果

实验中我们提供了两个例程,上传例程1代码后,蜂鸣器会发出两种不同的声音,实验中,两种声音循环交替。上传例程2中代码后,蜂鸣器会想响起《欢乐颂》的曲子。

实验十 火焰报警实验

实验说明

火焰传感器是机器人专门用来搜寻火源的传感器,本传感器对火焰特别灵敏。火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号。

实验中,我们把火焰的亮度转化为高低变化的电平信号输入到UNO板中,然后控制蜂鸣器的响起。

实验器材

开发板*1

USB线*1

有源蜂鸣器*1

火焰传感器*1

10KΩ 电阻*1

面包板*1

正标线若干

接线图

10

测试代码

int flame=7;//定义火焰接口为数字7 接口

int Beep=9;//定义蜂鸣器接口为数字9 接口

void setup()

{

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

pinMode(flame,INPUT);//定义flame为输入接口

}

void loop()

{

int val=digitalRead(flame);//读取火焰传感器

if(val==HIGH)//当数字口7为高电平时蜂鸣器鸣响

{

digitalWrite(Beep,HIGH);

}else

{

digitalWrite(Beep,LOW);

}

delay(500);

}

测试结果

下载完程序后,我们可以模拟在有火焰时报警的情况,在没有火焰时一切正常,当有火焰时立刻报警做出提示。

实验十一 温馨水杯实验

实验说明

LM35 是很常用且易用的温度传感器元件,将LM35 温度传感器接到开发板上,通过算法可将读取的模拟值转换为实际的温度。

本实验中我们还外接了3个指示灯,在代码中我没设置在不同的温度范围,亮起不同颜色的指示灯。根据这个,我们完全可以做个温馨水杯,通过指示灯,我们就可以知道杯子里的水的冷热情况。

实验器材

开发板 *1

USB线*1

LM35DZ*1

LED*3

220Ω 电阻*3

面包板*1

正标线若干

接线图

11

测试代码

void setup() {

Serial.begin(9600);

pinMode(12, OUTPUT);

pinMode(11, OUTPUT);

pinMode(10, OUTPUT);

}

void loop() {

int vol = analogRead(A0) * (5.0 / 1023.0*100);

Serial.print(“Tep:”);

Serial.print(vol);

Serial.println(“C”);

if (vol<28)

{

digitalWrite(12, HIGH);

digitalWrite(11, LOW);

digitalWrite(10, LOW);

}

else if (vol>=28 && vol<=30)

{

digitalWrite(12, LOW);

digitalWrite(11, HIGH);

digitalWrite(10, LOW);

}

else if (vol>30)

{

digitalWrite(12, LOW);

digitalWrite(11, LOW);

digitalWrite(10, HIGH);

}

}

测试结果

下载完程序后,打开串口监视器,设置波特率为9600,就可看到当前的温度。当温度大于30摄氏度时,红色指示灯亮起,其他指示灯熄灭;当温度大于等于28摄氏度且小于等于30摄氏度时,红色指示灯熄灭,黄色指示灯亮起;当温度小于28摄氏度时,黄色指示灯熄灭,蓝色指示灯亮起。

实验十二 魔术光杯实验

实验说明

倾斜开关的工作原理是当开关一端低于水平位置倾斜,开关寻通;当另一端低于水平位置倾斜 ,开关停止。魔术光杯实验原理是利用 PWM 调光的原理,两个LED的亮度发生变化。

这个实验中倾斜开关提供数字信号,触发 PWM 的调节,通过程序的设计,我们就能看到类似于两组装满光的杯子倒来倒去的效果了。

实验器材

开发板*1

USB线*1

LED*2

倾斜开关*2

220Ω 电阻*2

10KΩ 电阻*2

面包板*1

正标线若干

接线图

12

测试代码

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最亮;在串口监视器中看到对应具体数值变化,如下图。当倾斜另一边中,现象一样,方向相反。

实验十三 红外遥控解码实验

实验说明

通用红外遥控系统由发射和接收两大部分组成。本实验中发射部分就是遥控器,接收部分就是红外接收 VS1838B。红外接收 VS1838B是集接收、放大、解调一体的器件,它内部IC就已经完成了解调,输出的就是数字信号。

图片3

实验器材

开发板*1

USB线*1

红外遥控*1

红外接收 VS1838B*1

面包板*1

正标线若干

接线图

13

测试代码

#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(); // 接收下个数据

}

}

测试结果

下载完程序,上电后,红外遥控对准红外接收传感器发送信号,我们可以在串口监视器总看到相应按键的编码,如下图。

遥控器-1

实验十四 一位数码管显示实验

实验说明

数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),本实验所使用的是八段数码管。数码管共有七段显示数字的段,还有一个显示小数点的段。当让数码管显示数字时,只要将相应的段点亮即可。

实验器材

开发板 *1

USB线*1

一位数码管*1

220Ω 电阻*8

面包板*1

正标线若干

接线图

14

测试代码

//设置控制各段的数字IO 脚

int a=7;//定义数字接口7 连接a 段数码管

int b=6;// 定义数字接口6 连接b 段数码管

int c=5;// 定义数字接口5 连接c 段数码管

int d=10;// 定义数字接口11 连接d 段数码管

int e=11;// 定义数字接口10 连接e 段数码管

int f=8;// 定义数字接口8 连接f 段数码管

int g=9;// 定义数字接口9 连接g 段数码管

int dp=4;// 定义数字接口4 连接dp 段数码管

void digital_1(void) //显示数字1

{

unsigned char j;

digitalWrite(c,HIGH);//给数字接口5 引脚高电平,点亮c 段

digitalWrite(b,HIGH);//点亮b 段

for(j=7;j<=11;j++)//熄灭其余段

digitalWrite(j,LOW);

digitalWrite(dp,LOW);//熄灭小数点DP 段

}

void digital_2(void) //显示数字2

{

unsigned char j;

digitalWrite(b,HIGH);

digitalWrite(a,HIGH);

for(j=9;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

digitalWrite(c,LOW);

digitalWrite(f,LOW);

}

void digital_3(void) //显示数字3

{

unsigned char j;

digitalWrite(g,HIGH);

digitalWrite(d,HIGH);

for(j=5;j<=7;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

digitalWrite(f,LOW);

digitalWrite(e,LOW);

}

void digital_4(void) //显示数字4

{

digitalWrite(c,HIGH);

digitalWrite(b,HIGH);

digitalWrite(f,HIGH);

digitalWrite(g,HIGH);

digitalWrite(dp,LOW);

digitalWrite(a,LOW);

digitalWrite(e,LOW);

digitalWrite(d,LOW);

}

void digital_5(void) //显示数字5

{

unsigned char j;

for(j=7;j<=9;j++)

digitalWrite(j,HIGH);

digitalWrite(c,HIGH);

digitalWrite(d,HIGH);

digitalWrite(dp,LOW);

digitalWrite(b,LOW);

digitalWrite(e,LOW);

}

void digital_6(void) //显示数字6

{

unsigned char j;

for(j=7;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(c,HIGH);

digitalWrite(dp,LOW);

digitalWrite(b,LOW);

}

void digital_7(void) //显示数字7

{

unsigned char j;

for(j=5;j<=7;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

for(j=8;j<=11;j++)

digitalWrite(j,LOW);

}

void digital_8(void) //显示数字8

{

unsigned char j;

for(j=5;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

}

void setup()

{

int i;//定义变量

for(i=4;i<=11;i++)

pinMode(i,OUTPUT);//设置4~11 引脚为输出模式

}

void loop()

{

while(1)

{

digital_1();//显示数字1

delay(2000);//延时2s

digital_2();//显示数字2

delay(1000); //延时1s

digital_3();//显示数字3

delay(1000); //延时1s

digital_4();//显示数字4

delay(1000); //延时1s

digital_5();//显示数字5

delay(1000); //延时1s

digital_6();//显示数字6

delay(1000); //延时1s

digital_7();//显示数字7

delay(1000); //延时1s

digital_8();//显示数字8

delay(1000); //延时1s

}

}

测试结果

下载完程序后,数码管循环显示1~8 数字。

实验十五 74HC595驱动一位数码管实验

实验说明

上一个实验中我们直接把用开发板控制一位数码管,需要占用了较多的数字口,本实验中我们添加了一个74HC595芯片控制一位数码管,只需要用3个数字口就可以控制8个LED灯,具体设置方法可以参照以下表格。

Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0
a b c d e f g dp
0 1 1 1 1 1 1 0 0 252
1 0 1 1 0 0 0 0 0 96
2 1 1 0 1 1 0 1 0 218
3 1 1 1 1 0 0 1 0 242
4 0 1 1 0 0 1 1 0 102
5 1 0 1 1 0 1 1 0 182
6 1 0 1 1 1 1 1 0 190
7 1 1 1 0 0 0 0 0 224
8 1 1 1 1 1 1 1 0 254
9 1 1 1 1 0 1 1 0 246

实验器材

开发板*1

USB线*1

74HC595*1

一位数码管*1

220Ω 电阻*8

面包板*1

正标接线若干

接线图

15

测试代码

int latchPin = 4;

int clockPin = 5;

int dataPin = 2; //这里定义了那三个脚

void setup ()

{

pinMode(latchPin,OUTPUT);

pinMode(clockPin,OUTPUT);

pinMode(dataPin,OUTPUT); //让三个脚都是输出状态

}

void loop()

{

int a[10]={

246,254,224,190,182,102,242,218,96,252}; //定义功能数组,数组依次为数码管得定义

for(int x=9; x>-1 ;x– ) //倒数功能循环

{

digitalWrite(latchPin,LOW);

shiftOut(dataPin,clockPin,MSBFIRST,a[x]); //显示数组a[x]

digitalWrite(latchPin,HIGH);

delay(1000);

}

}

测试结果

下载完程序后,数码管循环显示0~9 数字。

实验十六 舵机控制实验

实验说明

舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测

器所构成。舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红、橙三种颜

色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极

线,橙色为信号线。

舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM

(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms

之间,但是,事实上脉宽可由0.5ms 到2.5ms 之间,脉宽和舵机的转角0°~180°相

对应。有一点值得注意的地方,由于舵机牌子不同,对于同一信号,不同牌子的舵机旋

转的角度也会有所不同。

实验器材

开发板*1

USB线*1

舵机*1

正标线若干

接线图

16

测试代码

程序A:

int servopin=9;//定义数字接口9 连接伺服舵机信号线

int myangle;//定义角度变量

int pulsewidth;//定义脉宽变量

int val;

void servopulse(int servopin,int myangle)//定义一个脉冲函数

{

pulsewidth=(myangle*11)+500;//将角度转化为500-2480 的脉宽值

digitalWrite(servopin,HIGH);//将舵机接口电平至高

delayMicroseconds(pulsewidth);//延时脉宽值的微秒数

digitalWrite(servopin,LOW);//将舵机接口电平至低

delay(20-pulsewidth/1000);

}

void setup()

{

pinMode(servopin,OUTPUT);//设定舵机接口为输出接口

Serial.begin(9600);//连接到串行端口,波特率为9600

Serial.println(“servo=o_seral_simple ready” ) ;

}

void loop()//将0 到9 的数转化为0 到180 角度,并让LED 闪烁相应数的次数

{

val=Serial.read();//读取串行端口的值

if(val>=’0’&&val<=’9′)

{

val=val-‘0’;//将特征量转化为数值变量

val=val*(180/9);//将数字转化为角度

Serial.print(“moving servo to “);

Serial.print(val,DEC);

Serial.println();

for(int i=0;i<=50;i++) //给予舵机足够的时间让它转到指定角度

{

servopulse(servopin,val);//引用脉冲函数

}

}

}

程序B:

#include <Servo.h>

Servo myservo;//定义舵机变量名

void setup()

{

myservo.attach(9);//定义舵机接口(9、10 都可以,缺点只能控制2 个)

}

void loop()

{

myservo.write(90);//设置舵机旋转的角度

}

测试结果

程序A 结果:

在串口监视器中输入数字点击发送,舵机转动到所对应的角度数的位置,并将角度打印显示到屏幕上。

程序B结果:

舵机自己转动到90度位置。

实验十七 四位数码管显示数字实验

实验说明

在实验十五中我们使用开发板驱动一个一位数码管,本实验我们使用开发板驱动一个共阴四位数码管。驱动数码管限流电阻肯定是必不可少的,限流电阻有两种接法,一种是在d1-d4阴极接,总共接4颗。这种接法好处是需求电阻比较少,但是会产生每一位上显示不同数字亮度会不一样,1最亮,8最暗。另外一种接法就是在其他8个引脚上接,这种接法亮度显示均匀,但是用电阻较多。本次实验使用8颗220Ω电阻。

四位数码管总共有12个引脚,小数点朝下正放在面前时,左下角为1,其他管脚顺序为逆时针旋转。左上角为最大的12号管脚。

IMGP0049_调整大小.JPG

四位数码管原理图如下

5643b.jpg

实验器材

开发板*1

USB线*1

四位数码管*1

220Ω 电阻*8

面包板*1

正标线若干

接线图

17

测试代码

int a = 1;

int b = 2;

int c = 3;

int d = 4;

int e = 5;

int f = 6;

int g = 7;

int dp = 8;

int d4 = 9;

int d3 = 10;

int d2 = 11;

int d1 = 12;

// set variable

long n = 1230;

int x = 100;

int del = 55; // fine adjustment for clock

void setup()

{

pinMode(d1, OUTPUT);

pinMode(d2, OUTPUT);

pinMode(d3, OUTPUT);

pinMode(d4, OUTPUT);

pinMode(a, OUTPUT);

pinMode(b, OUTPUT);

pinMode(c, OUTPUT);

pinMode(d, OUTPUT);

pinMode(e, OUTPUT);

pinMode(f, OUTPUT);

pinMode(g, OUTPUT);

pinMode(dp, OUTPUT);

}

/////////////////////////////////////////////////////////////

void loop()

{

int a=0;

int b=0;

int c=0;

int d=0;

unsigned long currentMillis = millis();

while(d>=0)

{

while(millis()-currentMillis<1000)

{

Display(1,a);

Display(2,b);

Display(3,c);

Display(4,d);

}

currentMillis = millis();

d++;

if (d>9)

{

c++;

d=0;

}

if (c>9)

{

b++;

c=0;

}

if (b>9)

{

a++;

b=0;

}

if (a>9)

{

a=0;

b=0;

c=0;

d=0;

}

}

}

///////////////////////////////////////////////////////////////

void WeiXuan(unsigned char n)//

{

switch (n)

{

case 1:

digitalWrite(d1, LOW);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

case 2:

digitalWrite(d1, HIGH);

digitalWrite(d2, LOW);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

case 3:

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, LOW);

digitalWrite(d4, HIGH);

break;

case 4:

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, LOW);

break;

default :

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

}

}

void Num_0()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_1()

{

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_2()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, LOW);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_3()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_4()

{

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_5()

{

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_6()

{

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_7()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_8()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_9()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Clear() // clear the screen

{

digitalWrite(a, LOW);

digitalWrite(b, LOW);

digitalWrite(c, LOW);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void pickNumber(unsigned char n)// select number

{

switch (n)

{

case 0: Num_0();

break;

case 1: Num_1();

break;

case 2: Num_2();

break;

case 3: Num_3();

break;

case 4: Num_4();

break;

case 5: Num_5();

break;

case 6: Num_6();

break;

case 7: Num_7();

break;

case 8: Num_8();

break;

case 9: Num_9();

break;

default: Clear();

break;

}

}

void Display(unsigned char x, unsigned char Number)// take x as coordinate and display number

{

WeiXuan(x);

pickNumber(Number);

delay(1);

Clear() ; // clear the screen

}

测试结果

下载完程序后,数码管首先显示“0000”数值,显示跳动,每跳动一下数码管显示数值加1。当显示数值为超过“9999”后,显示数值再次变为“0000”,循环显示。

实验十八 1602液晶显示实验

实验说明

本次试验使用keyes UNO R3 直接驱动1602液晶显示文字。1602液晶在应用中非常广泛,它的显示容量为16×2个字符,芯片工作电压为4.5~5.5V。1602液晶在接keyes UNO R3 控制板显示文字时有两种接线法,分别为4位接法和8位接法,本实验中都会有相关说明介绍。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

面包板*1

正标线若干

接线图

四位接法

18

八位接法

18-1

测试代码

四位接法

/*

LiquidCrystal Library – Hello World

Demonstrates the use a 16×2 LCD display. The LiquidCrystal

library works with all LCD displays that are compatible with the

Hitachi HD44780 driver. There are many of them out there, and you

can usually tell them by the 16-pin interface.

This sketch prints “Hello World!” to the LCD

and shows the time.

The circuit:

* LCD RS pin to digital pin 2

* LCD Enable pin to digital pin3

* LCD D4 pin to digital pin 4

* LCD D5 pin to digital pin 5

* LCD D6 pin to digital pin 6

* LCD D7 pin to digital pin 7

* LCD R/W pin to ground

* LCD VSS pin to ground

* LCD VCC pin to 5V

* 10K resistor:

* ends to +5V and ground

* wiper to LCD VO pin

*/

// include the library code:

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

void setup() {

// set up the LCD’s number of columns and rows:

lcd.begin(16, 2);

// Print a message to the LCD.

lcd.setCursor(2,0);

lcd.print(“Hello, world!”);

lcd.setCursor(2,1);

lcd.print(“Hello, keyes!”);

}

void loop() {

}

八位接法

int DI = 12;

int RW = 11;

int DB[] = {3, 4,5, 6,7 ,8, 9, 10};//使用数组来定义总线需要的管脚

int Enable = 2;

void LcdCommandWrite(int value) {

// 定义所有引脚

int i = 0;

for (i=DB[0]; i <= DI; i++) //总线赋值

{

digitalWrite(i,value & 01);//因为1602液晶信号识别是D7-D0(不是D0-D7),这里是用来反转信号。

value >>= 1;

}

digitalWrite(Enable,LOW);

delayMicroseconds(1);

digitalWrite(Enable,HIGH);

delayMicroseconds(1); // 延时1ms

digitalWrite(Enable,LOW);

delayMicroseconds(1); // 延时1ms

}

void LcdDataWrite(int value) {

// 定义所有引脚

int i = 0;

digitalWrite(DI, HIGH);

digitalWrite(RW, LOW);

for (i=DB[0]; i <= DB[7]; i++) {

digitalWrite(i,value & 01);

value >>= 1;

}

digitalWrite(Enable,LOW);

delayMicroseconds(1);

digitalWrite(Enable,HIGH);

delayMicroseconds(1);

digitalWrite(Enable,LOW);

delayMicroseconds(1); // 延时1ms

}

void setup (void) {

int i = 0;

for (i=Enable; i <= DI; i++) {

pinMode(i,OUTPUT);

}

delay(100);

// 短暂的停顿后初始化LCD

// 用于LCD控制需要

LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5×7文字大小

delay(64);

LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5×7文字大小

delay(50);

LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5×7文字大小

delay(20);

LcdCommandWrite(0x06); // 输入方式设定

// 自动增量,没有显示移位

delay(20);

LcdCommandWrite(0x0E); // 显示设置

// 开启显示屏,光标显示,无闪烁

delay(20);

LcdCommandWrite(0x01); // 屏幕清空,光标位置归零

delay(100);

LcdCommandWrite(0x80); // 显示设置

// 开启显示屏,光标显示,无闪烁

delay(20);

}

void loop (void) {

LcdCommandWrite(0x01); // 屏幕清空,光标位置归零

delay(10);

LcdCommandWrite(0x80+2);

delay(10);

// 写入欢迎信息

LcdDataWrite(‘H’);

LcdDataWrite(‘e’);

LcdDataWrite(‘l’);

LcdDataWrite(‘l’);

LcdDataWrite(‘o’);

LcdDataWrite(‘,’);

LcdDataWrite(‘ ‘);

LcdDataWrite(‘w’);

LcdDataWrite(‘o’);

LcdDataWrite(‘r’);

LcdDataWrite(‘l’);

LcdDataWrite(‘d’);

LcdDataWrite(‘!’);

delay(10);

LcdCommandWrite(0xc0+2); // 定义光标位置为第二行第二个位置

delay(10);

LcdDataWrite(‘H’);

LcdDataWrite(‘e’);

LcdDataWrite(‘l’);

LcdDataWrite(‘l’);

LcdDataWrite(‘o’);

LcdDataWrite(‘,’);

LcdDataWrite(‘ ‘);

LcdDataWrite(‘k’);

LcdDataWrite(‘e’);

LcdDataWrite(‘y’);

LcdDataWrite(‘e’);

LcdDataWrite(‘s’);

LcdDataWrite(‘!’);

LcdDataWrite(‘ ‘);

delay(5000);

}

测试结果

无论是四位接法还是八位接法,接好线,烧录程序上电后,通过旋转电位器调节背光,即可在1602 LCD上看到设置的显示字符。四位接法和八位接法显示一样,第一行显示 “Hello, world!”字符,第二行显示”Hello, keyes!”字符。

实验十九 超声波测距显示实验

实验说明

本实验中我们主要用到了超声波传感器和1602 LCD。实验中我们通过超声波测到超声波与前方障碍物的距离,然后在1602 LCD上显示测试结果。

实验器材

开发板 *1

USB线*1

1602 LCD*1

可调电位器*1

超声波传感器*1

面包板*1

正标线若干

杜邦线若干

接线图

19

测试代码


#include <LiquidCrystal.h>

#define echoPin 3 // Echo Pin

#define trigPin 2 // Trigger Pin

#define LEDPin 13 // Onboard LED

LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

int maximumRange = 200; // Maximum range needed

int minimumRange = 0; // Minimum range needed

long duration, distance; // Duration used to calculate distance

void setup() {

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)

lcd.begin(16, 2);

lcd.setCursor(0,0);

lcd.print(“The distance is:”);

}

void loop() {

/* The following trigPin/echoPin cycle is used to determine the

distance of the nearest object by bouncing soundwaves off of it. */

digitalWrite(trigPin, LOW);

delayMicroseconds(2);

digitalWrite(trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);

//Calculate the distance (in cm) based on the speed of sound.

distance = duration/58.2;

if (distance >= maximumRange || distance <= minimumRange){

/* Send a negative number to computer and Turn LED ON

to indicate “out of range” */

lcd.setCursor(0,1);

lcd.print(“-1 “);

digitalWrite(LEDPin, HIGH);

}

else {

/* Send the distance to the computer using Serial protocol, and

turn LED OFF to indicate successful reading. */

Serial.println(distance);

if(distance<10)

{

lcd.setCursor(0,1);

lcd.print(distance);

lcd.setCursor(1,1);

lcd.print(” “);

}

if((distance >=10)&&(distance<100))

{

lcd.setCursor(0,1);

lcd.print(distance);

lcd.setCursor(2,1);

lcd.print(” “);

}

if(distance>100)

{

lcd.setCursor(0,1);

lcd.print(distance);

}

digitalWrite(LEDPin, LOW);

}

//Delay 50ms before next reading.

delay(50);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 LCD显示”The distance is:”字符;测试超声波与前方障碍物的距离,测试到数据,则在1602 LCD上显示该数据,若没测试到数据,那么就在1602 LCD上显示”-1”字符。

实验二十 1302时钟显示实验

实验说明

上一实验中我们在1602 LCD上显示超声波距离,这一实验程也是将1602 LCD做显示器。这个实验相当于我们自制一个时钟,时钟上包含年、月、日、星期、小时、分钟、秒。初始时间在代码中设置,时钟自动行走,在1602 LCD显示。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

1302时钟传感器*1

面包板*1

正标线若干

杜邦线若干

接线图

20

测试代码

#include <stdio.h>

#include <string.h>

#include <DS1302.h>

#include <Wire.h>

#include <LiquidCrystal.h>

LiquidCrystal lcd(5, 6, 7, 8, 9, 10);

/* Set the appropriate digital I/O pin connections */

uint8_t CE_PIN = 4; // RST

uint8_t IO_PIN = 3; // DAT

uint8_t SCLK_PIN = 2; // CLK

/* Create buffers */

char buf[50];

char bf[50];

char bu[50];

char uf[50];

char day[10];

/* Create a DS1302 object */

DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

void print_time()

{

/* Get the current time and date from the chip */

Time t = rtc.time();

/* Name the day of the week */

memset(day, 0, sizeof(day)); /* clear day buffer */

switch (t.day) {

case 1:

strcpy(day, “Sunday “);

break;

case 2:

strcpy(day, “Monday “);

break;

case 3:

strcpy(day, “Tuesday “);

break;

case 4:

strcpy(day, “Wednesday”);

break;

case 5:

strcpy(day, “Thursday “);

break;

case 6:

strcpy(day, “Friday “);

break;

case 7:

strcpy(day, “Saturday “);

break;

}

/* Format the time and date and insert into the temporary buffer */

snprintf(buf, sizeof(buf), “%s %04d-%02d-%02d %02d:%02d:%02d”,

day,

t.yr, t.mon, t.date,

t.hr, t.min, t.sec);

snprintf(bf, sizeof(bf), “%s %04d”,

day, t.yr);

lcd.setCursor(0,0);

lcd.print(bf);

snprintf(bu, sizeof(bu),”%02d:%02d:%02d”,

t.hr, t.min, t.sec);

/* Print the formatted string to serial so we can see the time */

lcd.setCursor(0,1);

lcd.print(bu);

snprintf(uf, sizeof(uf), “%02d-%02d”,

t.mon, t.date);

lcd.setCursor(11,1);

lcd.print(uf);

}

void setup()

{

lcd.begin(16, 2);

/* Initialize a new chip by turning off write protection and clearing the

clock halt flag. These methods needn’t always be called. See the DS1302

datasheet for details. */

rtc.write_protect(false);

rtc.halt(false);

/* Make a new time object to set the date and time */

Time t(2017,7,24,10,12,22,2);

/* Set the time and date on the chip */

rtc.time(t);

}

/* Loop and print the time every second */

void loop()

{

print_time();

delay(1000);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 LCD显示当前初始时间,然后时钟开始走动。

实验二十一 人体红外感应实验

实验说明

和上面两个实验一样,这个实验也是用1602 LCD做显示器。实验中,我们用到了人体红外热释电传感器,当检测到有人有附近移动时,在1602 LCD显示对应字符,当没有检测到人体在附件移动时,1602 LCD显示另一对应字符。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

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

面包板*1

正标线若干

杜邦线若干

接线图

21

测试代码

#include <LiquidCrystal.h>

LiquidCrystal lcd(3, 4, 5, 6, 7, 8);

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

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

void setup()

{

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

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

lcd.begin(16, 2);

}

void loop()

{

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

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

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

{

lcd.setCursor(0,0);

lcd.print(“Somebody is “);

lcd.setCursor(0,1);

lcd.print(“in this area! “);

}

else if(state == 0)

{

lcd.setCursor(0,0);

lcd.print(“No one! “);

lcd.setCursor(0,1);

lcd.print(“No one! “);

}

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,当检测到有人有附近移动时,在1602 LCD第一行显示显示”Somebody is “字符,第二行显示”in this area!”字符;当没有检测到人体在附件移动时,1602 LCD两行都显示”No one!”字符。

实验二十二 温湿度显示实验

实验说明

和上面实验一样,这个实验也是用1602 LCD做显示器。这个实验中我们主要用到了DHT11温湿度传感器和1602 LCD。DHT11温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。

实验中我们DHT11温湿度传感器测试出当前环境中的温度和湿度,然后在1602 LCD 显示测试结果。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

DHT11温湿度传感器*1

面包板*1

正标线若干

杜邦线若干

接线图

22

测试代码

#include <dht11.h>

// include the library code:

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(3, 4, 5, 6, 7, 8);

dht11 DHT;

#define DHT11_PIN 2

void setup(){

lcd.begin(16, 2);

// Print a message to the LCD.

lcd.setCursor(0,0);

lcd.print(“Humidity (%):”);

lcd.setCursor(0,1);

lcd.print(“Temp (C):”);

}

void loop(){

int chk;

chk = DHT.read(DHT11_PIN); // READ DATA

switch (chk){

case DHTLIB_OK:

break;

case DHTLIB_ERROR_CHECKSUM:

break;

case DHTLIB_ERROR_TIMEOUT:

break;

default:

break;

}

// DISPLAT DATA

lcd.setCursor(13,0);

lcd.print(DHT.humidity);

lcd.setCursor(9,1);

lcd.print(DHT.temperature);

delay(1000);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 LCD显示当前环境中的温度和湿度值。

实验二十三 摇杆模块数据显示实验

实验说明

和上面实验一样,这个实验也是用1602 LCD做显示器。这个实验中我们主要用到了摇杆模块和1602 LCD。摇杆模块5V供电,信号端X,Y接模拟口,原始状态下读出电压为2.5V左右,当随箭头方向按下,读出电压值随着增加,最大到5V,箭头相反方向按下,读出电压值减少,最小为0V;信号端B接数字口,原始状态下输出0,按下输出1。

实验中我们读取摇杆模块X、Y、B三个接口数值,然后在1602 LCD 显示测试结果。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

摇杆模块*1

面包板*1

正标线若干

杜邦线若干

接线图

23

测试代码

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(3, 4, 5, 6, 7, 8);

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

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

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

void setup()

{

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

lcd.begin(16, 2);

// Print a message to the LCD.

lcd.setCursor(0,0);

lcd.print(“X:”);

lcd.setCursor(8,0);

lcd.print(“Y:”);

lcd.setCursor(0,1);

lcd.print(“Z:”);}

void loop()

{

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

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

if(x<10)

{

lcd.setCursor(2,0);

lcd.print(x);

lcd.setCursor(3,0);

lcd.print(” “);

}

if((x>=10)&&(x<100))

{

lcd.setCursor(2,0);

lcd.print(x);

lcd.setCursor(4,0);

lcd.print(” “);

}

if((x>=100)&&(x<1000))

{

lcd.setCursor(2,0);

lcd.print(x);

lcd.setCursor(5,0);

lcd.print(” “);

}

if(x>=1000)

{

lcd.setCursor(2,0);

lcd.print(x);

}

delay(100);

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

if(y<10)

{

lcd.setCursor(10,0);

lcd.print(y);

lcd.setCursor(11,0);

lcd.print(” “);

}

if((y>=10)&&(y<100))

{

lcd.setCursor(10,0);

lcd.print(y);

lcd.setCursor(12,0);

lcd.print(” “);

}

if((y>=100)&&(y<1000))

{

lcd.setCursor(10,0);

lcd.print(y);

lcd.setCursor(13,0);

lcd.print(” “);

}

if(y>=1000)

{

lcd.setCursor(2,0);

lcd.print(y);

}

delay(100);

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

lcd.setCursor(2,1);

lcd.print(z);

delay(100);//延迟0.1S

}

测试结果

下载完程序后,上电后,通过电位器调节1602 LCD背光后,我们可以在1602 LCD上看、

到摇杆模块X、Y、Z方向对应的的数值。

实验二十四 继电器控灯实验

实验说明

继电器模块是一种用于低电控制高电,保护电路的模块。本实验用到的5V单路继电器模块高电平有效,它有控制指示灯,吸合亮,断开不亮。实验中我们通过控制继电器从而控制一个LED的亮灭。

实验器材

开发板*1

USB线*1

5V 单路继电器模块*1

LED*1

220Ω 电阻*1

面包板*1

正标线若干

杜邦线若干

接线图

24

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(2000); //延时2S

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

delay(2000); //延时2S

}

测试结果

按照上图接好线,烧录好代码,上电后,继电器开启(ON端和COM端连通)2S,LED

亮起;停止(NC端和COM端连通)2S,LED熄灭;循环交替。开启时继电器上D2灯

亮起。

实验二十五 水蒸气检测显示实验

实验说明

和上面实验一样,这个实验也是用1602 LCD做显示器。这个实验中我们主要用到了水滴水蒸气传感器和1602 LCD。水滴水蒸气传感器是一个模拟传感器,可以制作简单的雨水探测器与液位开关。当传感器表面的湿度上升,输出电压将增大。

实验中我们读取水滴水蒸气传感器信号端的模拟值,然后在1602 LCD 显示测试结果。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

水滴水蒸气传感器*1

面包板*1

正标线若干

杜邦线若干

接线图

25

测试代码

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(3, 4, 5, 6, 7, 8);

void setup() {

lcd.begin(16, 2);

// Print a message to the LCD.

lcd.setCursor(0,0);

lcd.print(“Sensor value:”);

}

void loop() {

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

if(value<10)

{

lcd.setCursor(0,1);

lcd.print(value);

lcd.setCursor(1,1);

lcd.print(” “);

}

if((value>=10)&&(value<100))

{

lcd.setCursor(0,1);

lcd.print(value);

lcd.setCursor(2,1);

lcd.print(” “);

}

if((value>=100)&&(value<1000))

{

lcd.setCursor(0,1);

lcd.print(value);

lcd.setCursor(3,1);

lcd.print(” “);

}

if(value>=1000)

{

lcd.setCursor(2,0);

lcd.print(value);

}

delay(100);

}

测试结果

下载完程序后,上电后,通过电位器调节1602 LCD背光后,我们可以在1602 LCD上看

到水滴水蒸气传感器信号端的模拟值。

实验二十六 声控灯实验

实验说明

麦克风声音传感器是专门用来检测声音的传感器。传感器有S端是模拟输出,是麦克风的电压信号实时输出,通过电位器可调节信号增益。实验中,我通过传感器检测声音大小,从而控制一个LED亮灭。

实验器材

开发板*1

USB线*1

麦克风声音传感器*1

LED*1

220Ω 电阻*1

面包板*1

正标线若干

杜邦线若干

接线图

26

测试代码

int MIC=0;//定义声音传感器为模拟0 接口

int LED=9;//定义LED接口为数字9 接口

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

void setup()

{

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

pinMode(MIC,INPUT);//定义声音传感器为输入接口

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

}

void loop()

{

val=analogRead(MIC);//读取声音传感器的模拟值

Serial.println(val);//输出模拟值,并将其打印出来

if(val>=300)//当模拟值大于300 时LED亮起

{

digitalWrite(LED,HIGH);

}else

{

digitalWrite(LED,LOW);

}

delay(500);

}

测试结果

下载完程序后,我们可以检测声音大小,输出模拟值,声音越大,输出越大。当声音大小到达一定数值时,LED亮起,否则LED熄灭。

实验二十七 步进电机实验

实验说明

步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到

一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。你

可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时你也可以通过

控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

下面这个就是本次实验使用的步进电机

csc

减速步进电机

直径:28mm

电压:5V

步进角度:5.625 x 1/64

减速比:1/64

5线4相 可以用普通uln2003芯片驱动,也可以接成2相使用

该步进电机空载耗电在50mA以下,带64倍减速器,输出力矩比较大,可以驱动重负

载,极适合开发板使用。注意:此款步进电机带有64倍减速器,与不带减速器的步进

电机相比,转速显得较慢,为方便观察,可在输出轴处粘上一片小纸板。

csc

步进电机(五线四相)驱动板(UL2003)试验板

KE0079  (1)

实验器材

开发板*1

USB线*1

减速步进电机*1

UL2003*1

杜邦线若干

接线图

27

测试代码

#include <Stepper.h>

//这里设置步进电机旋转一圈是多少步

#define STEPS 100

//设置步进电机的步数和引脚

Stepper stepper(STEPS, 11, 10, 9, 8);

//定义变量用来存储历史读数

int previous = 0;

void setup()

{

//设置电机每分钟的转速为90步

stepper.setSpeed(90);

}

void loop()

{

//获取传感器读数

int val = analogRead(0);

//移动步数为当前读数减去历史读数

stepper.step(val – previous);

//保存历史读数

previous = val;

}

测试结果

按照上图接好线,烧录好代码,上电后,5V步进电机转动,转动速度很慢。

实验二十八 姿态传感器实验

实验说明

APDS-9930 在单个 8 引脚封装内提供 I2C 接口兼容的环境亮度传感器 (ALS, Ambient Light Sensor) 和带有红外 LED 的接近传感器,其中环境亮度传感器使用双光二极管来近似 0.01 lux 照度下低流明性能的人眼视觉反应,提供的高灵敏度使得器件可以在深色玻璃后运作。接近传感器经过完全调校可进行 100 毫米物体检测,免除终端设备和次组件的工厂校准需求。从明亮的阳光照射到黑暗的房间,接近检测功能都能运作良好。模块中加入微光学透镜提供红外能量的高效 率传送和接收,可降低总体功耗。另外,内部状态机可使器件进入低功耗模式,带来极低的平均功耗。

本实验只是简单的测试下这个传感器的基本功能。

实验器材

开发板*1

USB线*1

keyes 9930 接近和非接触式手势检测RGB和姿态传感器*1

杜邦线若干

接线图

28

测试代码

#include <Wire.h>

#include <SparkFun_APDS9960.h>

// Pins

#define APDS9960_INT 2 // Needs to be an interrupt pin

#define LED_PIN 13 // LED for showing interrupt

// Constants

#define LIGHT_INT_HIGH 1000 // High light level for interrupt

#define LIGHT_INT_LOW 10 // Low light level for interrupt

// Global variables

SparkFun_APDS9960 apds = SparkFun_APDS9960();

uint16_t ambient_light = 0;

uint16_t red_light = 0;

uint16_t green_light = 0;

uint16_t blue_light = 0;

int isr_flag = 0;

uint16_t threshold = 0;

void setup() {

// Set LED as output

pinMode(LED_PIN, OUTPUT);

pinMode(APDS9960_INT, INPUT);

// Initialize Serial port

Serial.begin(9600);

Serial.println();

Serial.println(F(“————————————-“));

Serial.println(F(“SparkFun APDS-9960 – Light Interrupts”));

Serial.println(F(“————————————-“));

// Initialize interrupt service routine

attachInterrupt(0, interruptRoutine, FALLING);

// Initialize APDS-9960 (configure I2C and initial values)

if ( apds.init() ) {

Serial.println(F(“APDS-9960 initialization complete”));

} else {

Serial.println(F(“Something went wrong during APDS-9960 init!”));

}

// Set high and low interrupt thresholds

if ( !apds.setLightIntLowThreshold(LIGHT_INT_LOW) ) {

Serial.println(F(“Error writing low threshold”));

}

if ( !apds.setLightIntHighThreshold(LIGHT_INT_HIGH) ) {

Serial.println(F(“Error writing high threshold”));

}

// Start running the APDS-9960 light sensor (no interrupts)

if ( apds.enableLightSensor(false) ) {

Serial.println(F(“Light sensor is now running”));

} else {

Serial.println(F(“Something went wrong during light sensor init!”));

}

// Read high and low interrupt thresholds

if ( !apds.getLightIntLowThreshold(threshold) ) {

Serial.println(F(“Error reading low threshold”));

} else {

Serial.print(F(“Low Threshold: “));

Serial.println(threshold);

}

if ( !apds.getLightIntHighThreshold(threshold) ) {

Serial.println(F(“Error reading high threshold”));

} else {

Serial.print(F(“High Threshold: “));

Serial.println(threshold);

}

// Enable interrupts

if ( !apds.setAmbientLightIntEnable(1) ) {

Serial.println(F(“Error enabling interrupts”));

}

// Wait for initialization and calibration to finish

delay(500);

}

void loop() {

// If interrupt occurs, print out the light levels

if ( isr_flag == 1 ) {

// Read the light levels (ambient, red, green, blue) and print

if ( !apds.readAmbientLight(ambient_light) ||

!apds.readRedLight(red_light) ||

!apds.readGreenLight(green_light) ||

!apds.readBlueLight(blue_light) ) {

Serial.println(“Error reading light values”);

} else {

Serial.print(“Interrupt! Ambient: “);

Serial.print(ambient_light);

Serial.print(” R: “);

Serial.print(red_light);

Serial.print(” G: “);

Serial.print(green_light);

Serial.print(” B: “);

Serial.println(blue_light);

}

// Turn on LED for a half a second

digitalWrite(LED_PIN, HIGH);

delay(500);

digitalWrite(LED_PIN, LOW);

// Reset flag and clear APDS-9960 interrupt (IMPORTANT!)

isr_flag = 0;

if ( !apds.clearAmbientLightInt() ) {

Serial.println(“Error clearing interrupt”);

}

}

}

void interruptRoutine() {

isr_flag = 1;

}

测试结果

打开串口监视器,显示如下图。

实验二十九 震动检测传感器实验

实验说明

震动检测传感器是基于压电陶瓷片的模拟震动传感器,是利用压电陶瓷给电信号产生震动的反变换过程,当压电陶瓷片震动时就会产生电信号。它可与Arduino专用传感器扩展板结合使用,Arduino模拟口能感知微弱的震动电信号,可实现与震动有相关的互动作品,比如电子鼓互动作品。

这个实验中,我们将模拟电压陶瓷震动传感器依照程序接入Arduino UNO控制器模拟口A0,观察当震动程度不同时,串口的输出值。

实验器材

开发板*1

USB线*1

震动检测传感器*1

杜邦线若干

接线图

29

测试代码

void setup()

{

Serial.begin(9600); //打开串口,设置串口波特率为 9600bps

}

void loop()

{

int val;

val=analogRead(0); //将模拟压电陶瓷震动传感器连接到模拟接口 0

Serial.print(“Vibration is “);

Serial.println(val,DEC);//通过串口打印读取到的模拟值

delay(100);

}

测试结果

当你检测到不同程度震动时,反馈回此时的测量值。如下图所示,此图是当将震动传

感器贴到 A4 纸中央上,绷直 A4 纸,敲击 A4 一边,串口反馈回来的数据示意图。

6、相关资料链接地址

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

分类
Arduino 学习套件

KE0110 Arduino 基础入门学习套件

KE0080

目录

1、产品介绍 3

2、清单 3

3、Arduino IDE和驱动的安装 7

4、Arduino IDE的使用方法 12

5、实验课程 14

实验一 LED 闪烁实验 14

实验二 呼吸灯实验 15

实验三 广告灯实验 17

实验四 按键控制LED实验 18

实验五 抢答器实验 19

实验六 电位器调控灯光亮度实验 22

实验七 感光灯实验 23

实验八 有源蜂鸣器实验 25

实验九 无源蜂鸣器实验 26

实验十 火焰报警实验 29

实验十一 温馨水杯实验 30

实验十二 魔术光杯实验 32

实验十三 红外遥控解码实验 35

实验十四 一位数码管显示实验 36

实验十五 74HC595驱动一位数码管实验 40

实验十六 8*8点阵显示实验 42

实验十七 四位数码管显示数字实验 44

实验十八 1602液晶显示实验 52

实验十九 RGB模块显示实验 57

实验二十 超声波测距显示实验 59

实验二十一 1302时钟显示实验 61

实验二十二 人体红外感应实验 64

6、相关资料链接地址 66

1、产品介绍

Arduino 基础入门学习套件是keyes推出的一款Arduino开发板的套件,套件包含各种传感器元件、模块、面包线、UNO R3 控制板等物品,适合爱好电子的初学者使用。我们还会根据这些元件,提供一些基于Arduino开发板的一些学习课程,包含接线方法,测试代码等,让你对这些电子元件和Arduino开发板有个初步的了解。

2、清单

编码 名称 规格型号 数量 图片
1 遥控器 JMP-1 17键86*40*6.5MM 黑色 1 1
2 keyes传感器 keyes 人体红外热释电传感器 1 KE0054 (2)
3 keyes传感器 keyes 1302时钟传感器 1 KE0050 (1)
4 keyes传感器 keyes 超声波传感器 1 MD0017 (1)
5 keyes模块 keyes 插件RGB模块 1 1
6 LCD 1602 COB 5V 蓝屏 1 2
7 蜂鸣器 无源 12*8.5MM 5V 普通分体 2K 1
8 蜂鸣器 有源 12*9.5MM 5V 普通分体 2300Hz 1
9 轻触按键 12*12*7.3MM 插件 4
10 按键帽 A24 黄帽(12*12*7.3)圆 4
11 传感器元件 LM35DZ 1
12 传感器元件 5MM 光敏电阻 3
13 传感器元件 红外接收 5MM火焰 1
14 传感器元件 红外接收 VS1838B 1
15 滚珠开关 HDX-2801 两脚一样 2
16 LED F5-红发红-短 5
17 LED F5-黄发黄-短 5
18 LED F5-蓝发蓝-短 5
19 电阻 碳膜色环 1/4W 1% 220R 8
20 电阻 碳膜色环 1/4W 1% 1K 5
21 电阻 碳膜色环 1/4W 1% 10K 5
22 USB线 AM/BM 透明蓝 OD:5.0 L=50cm 1 fw
23 面包线 面包板连接线65根 1
24 杜邦线 公对母20CM/40P/2.54/10股铜包铝 24号线BL 0.5 OR0006
25 点阵 20*20MM 1.9MM 红色 共阳 1
26 数码管 一位0.56英寸共阴红 1
27 数码管 四位0.36英寸共阴红 1
28 可调电位器 3386 MU 103 1
29 IC 74HC595 DIP 1
30 电池盒+插杆 6节5号带线15CM露线 带DC插杆 1 1
31 面包板 830孔 ZY-102 1 2
32 排针 1*40P 黑色 2.54 针长3.0等边 1
33 电阻卡 100*70MM 1 电阻卡

KE0109不带开发板 KE0110带官方Arduino UNO R3

34 开发板 Arduino UNO R3 1

3、Arduino IDE和驱动的安装

当我们拿到Arduino开发板时,首先我们要安装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文件

然后

然后

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

1.5.6版本安装后的样子。

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

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

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

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

进入下图,选择

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

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

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

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

4、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 的软件,设置板,如下。

设置COM端口,如下

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

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

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

5、实验课程

实验一 LED 闪烁实验

实验说明

LED 闪烁实验是比较基础的实验之一,上一个“ Hello World!”实验里已经利用到了Arduino 自带的LED,这次我们利用其他I/O 口和外接直插LED 灯来完成这个实验。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

1

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(2000); //延迟2S

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

delay(2000);//延迟2S

}

测试结果

下载完程序就可以看到我们的IO口外接小灯在闪烁了,这样我们的实验现象为LED不停闪烁,间隔大约为两秒。

实验二 呼吸灯实验

实验说明

上一课程中我们只是控制LED的亮和灭,那么我们可以怎么控制LED的亮度呢?本课程中我们把LED接到PWM口中,然后通过改变PWM数值,调节LED亮度,使LED逐渐变亮,和逐渐变暗,从而达到呼吸灯的效果。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

面包板*1

面包板连接线若干

接线图

2

测试代码

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.01S

}

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

{

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

delay(10); // 延迟0.01S

}

delay(1000);// 延迟1S

}

测试结果

下载完程序就可以看到我们的IO口外接小灯显示出呼吸灯的效果,小灯先逐渐变亮,后逐渐变暗,循环交替。

实验三 广告灯实验

实验说明

在生活中我们经常会看到一些由各种颜色的led灯组成的广告牌,广告牌上各个位置上癿led灯不断的变话,形成各种效果。本节实验就是利用led灯编程模拟广告灯效果。

实验器材

开发板*1

USB线*1

LED*5

220Ω 电阻*5

面包板*1

面包板连接线若干

接线图

3

测试代码

int BASE = 2 ; //第一个 LED 接的 I/O 口

int NUM = 5; //LED 的总数

void setup()

{

for (int i = BASE; i < BASE + NUM; i ++)

{

pinMode(i, OUTPUT); //设定数字I/O口为输出

}

}

void loop()

{

for (int i = BASE; i < BASE + NUM; i ++)

{

digitalWrite(i, HIGH); //设定数字I/O口输出为”高”,即逐渐开灯

delay(200); //延迟

}

for (int i = BASE; i < BASE + NUM; i ++)

{

digitalWrite(i, LOW); //设定数字I/O口输出为”低”,即逐渐关灯

delay(200); //延迟

}

}

测试结果

下载完程序就可以看到我们的IO口外接小灯先逐渐变亮,然后逐渐变暗,循环交替。

实验四 按键控制LED实验

实验说明

I/O 口的意思即为INPUT 接口和OUTPUT 接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O 口的输出功能,这个实验我们来尝试一下使用Arduino的I/O 口的输入功能即为读取外接设备的输出值,我们用一个按键和一个LED 小灯完成一个输入输出结合使用的实验,让大家能简单了解I/O 的作用。

实验器材

开发板 *1

USB线*1

LED*1

轻触按键*1

220Ω 电阻*1

10KΩ 电阻*1

面包板*1

面包板连接线若干

接线图

4

测试代码

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

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, LOW); // LED变暗

}

else

{

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

}

}

测试结果

下载完程序,上电后,当按键按下时小灯亮起,否则小灯不亮。

实验五 抢答器实验

实验说明

完成上面的实验以后相信已经有很多朋友可以独立完成这个实验了,我们可以将上面的按键控制小灯的实验扩展成4个按键对应3 个小灯,占用7个数字I/O 接口。为方便接线,我们把3个小灯用一个keyes 插件RGB模块代替。keyes 插件RGB模块代替由一个插件全彩LED制成,通过 R、 G、 B三个引脚的PWM电压输入可以调节三种基色(红/蓝/绿)的强度从而实现全彩的混色效果。

本实验中我们利用4个按键控制3个PWM口,控制RGB模块发光颜色从而达到抢答器的效果。

实验器材

开发板*1

USB线*1

keyes 插件RGB模块*1

轻触按键*4

10KΩ 电阻*4

面包板*1

面包板连接线若干

杜邦线若干

接线图

5

测试代码

int redled=11;

int greenled=10;

int blueled=9;

int redpin=5;

int greenpin=4;

int bluepin=3;

int restpin=2;

int red;

int green;

int blue;

void setup()

{

pinMode(redled,OUTPUT);

pinMode(greenled,OUTPUT);

pinMode( blueled,OUTPUT);

pinMode(redpin,INPUT);

pinMode(greenpin,INPUT);

pinMode(bluepin,INPUT);

}

void loop()

{

red=digitalRead(redpin);

green=digitalRead(greenpin);

blue=digitalRead(bluepin);

if(red==LOW)RED_YES();

if(green==LOW)GREEN_YES();

if(blue==LOW)BLUE_YES();

}

void RED_YES()

{

while(digitalRead(restpin)==1)

{

color(255, 0, 0);

}

clear_led();

}

void GREEN_YES()

{

while(digitalRead(restpin)==1)

{

color(0, 255, 0);

}

clear_led();

}

void BLUE_YES()

{

while(digitalRead(restpin)==1)

{

color(0, 0, 255);

}

clear_led();

}

void clear_led()

{

color(0, 0, 0);

}

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

{

analogWrite(redled, red);

analogWrite(greenled,green);

analogWrite(blueled, blue);

}

测试结果

下载完程序,上电后,一个简单的抢答器就做好了,我们根据RGB灯显示的颜色判断是谁抢答成功。在复位后。RGB灯关闭。

实验六 电位器调控灯光亮度实验

实验说明

在第二课程中我们直接通过PWM口控制灯的亮度,从而达到呼吸灯的效果。在这课程中我们通过一个电位器,利用电位器调节PWM值,从而控制灯的亮度。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

可调电位器*1

面包板*1

面包板连接线若干

接线图

6

测试代码

int ledpin=11;//定义数字接口11(PWM 输出)

void setup()

{

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

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

}

void loop()

{

int val=analogRead(0);//读取模拟口A0口的值

val = map(val, 0, 1023, 0, 255);//从0-1023映射到0-255

Serial.println(val);//显示val 变量

analogWrite(ledpin,val);// 打开LED 并设置亮度

delay(100);//延时0.1 秒

}

测试结果

下载完程序后。我们可以通过旋转可调电位器控制小灯的亮度,打开串口监视器,设置波特率为9600,就可看到调节LED亮度的PWM值。

实验七 感光灯实验

实验说明

完成以上的各种实验后,我们对Arduino 的应用也应该有一些认识和了解了,在基本的数字量输入输出和模拟量输入以及PWM 的产生都掌握以后,我们就可以开始进行一些传感器的应用了。

本次实验我们先进行一个较为简单的光敏电阻的使用实验。光敏电阻既然是可以根据光强改变阻值的元件,自然也需要模拟口读取模拟值了,本实验可以借鉴电位器调控灯光亮度实验,将电位计换做光敏电阻实现当光强不同时LED 小灯的亮度也会有相应的变化。

实验器材

开发板*1

USB线*1

LED*1

220Ω 电阻*1

10KΩ 电阻*1

光敏电阻*1

面包板*1

面包板连接线若干

接线图

7

测试代码

int ledpin=11;//定义数字接口11(PWM 输出)

void setup()

{

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

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

}

void loop()

{

int val=analogRead(0);//读取模拟口A0口的值

Serial.println(val);//显示val 变量

val = map(val, 0, 1023, 0, 255);//从0-1023映射到0-255

analogWrite(ledpin,255-val);// 打开LED 并设置亮度

delay(10);//延时0.01 秒

}

测试结果

下载完程序后,光敏电阻感应到灯光越亮,小灯越暗;光敏电阻感应到灯光越暗,小灯越亮。打开串口监视器,设置波特率为9600,就可看到光敏电阻感应到外界光强所得的模拟值。

实验八 有源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了有源蜂鸣器,有源蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号。实验中中我们只需要给蜂鸣器输入一个高电平信号,蜂鸣器响起。

实验器材

开发板*1

USB线*1

有源蜂鸣器*1

面包板*1

面包板连接线若干

接线图

8

测试代码

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

void setup()

{

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

}

void loop()

{

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

delay(1000); //延迟1S

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

delay(1000);//延迟1S

}

测试结果

下载完程序后,我们可以听到蜂鸣器响1秒,停止响起1秒,循环交替。

实验九 无源蜂鸣器实验

实验说明

蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种。本课程中主要用到了无源蜂鸣器,无源蜂鸣器内部不带振荡源,直流信号无法令其鸣叫,须用方波驱动。

实验器材

开发板 *1

USB线*1

无源蜂鸣器*1

面包板*1

面包板连接线若干

接线图

9

测试代码

code 1:

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

}

}

}

code 2:

#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);

}

测试结果

实验中我们提供了两个例程,上传例程1代码后,蜂鸣器会发出两种不同的声音,实验中,两种声音循环交替。上传例程2中代码后,蜂鸣器会想响起《欢乐颂》的曲子。

实验十 火焰报警实验

实验说明

火焰传感器是机器人专门用来搜寻火源的传感器,本传感器对火焰特别灵敏。火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号。

实验中,我们把火焰的亮度转化为高低变化的电平信号输入到UNO板中,然后控制蜂鸣器的响起。

实验器材

开发板*1

USB线*1

有源蜂鸣器*1

火焰传感器*1

10KΩ 电阻*1

面包板*1

面包板连接线若干

接线图

10

测试代码

int flame=7;//定义火焰接口为数字7 接口

int Beep=9;//定义蜂鸣器接口为数字9 接口

void setup()

{

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

pinMode(flame,INPUT);//定义flame为输入接口

}

void loop()

{

int val=digitalRead(flame);//读取火焰传感器

if(val==HIGH)//当数字口7为高电平时蜂鸣器鸣响

{

digitalWrite(Beep,HIGH);

}else

{

digitalWrite(Beep,LOW);

}

delay(500);

}

测试结果

下载完程序后,我们可以模拟在有火焰时报警的情况,在没有火焰时一切正常,当有火焰时立刻报警做出提示。

实验十一 温馨水杯实验

实验说明

LM35 是很常用且易用的温度传感器元件,将LM35 温度传感器接到开发板上,通过算法可将读取的模拟值转换为实际的温度。

本实验中我们还外接了3个指示灯,在代码中我没设置在不同的温度范围,亮起不同颜色的指示灯。根据这个,我们完全可以做个温馨水杯,通过指示灯,我们就可以知道杯子里的水的冷热情况。

实验器材

开发板 *1

USB线*1

LM35DZ*1

LED*3

220Ω 电阻*3

面包板*1

面包板连接线若干

接线图

11

测试代码

void setup() {

Serial.begin(9600);

pinMode(12, OUTPUT);

pinMode(11, OUTPUT);

pinMode(10, OUTPUT);

}

void loop() {

int vol = analogRead(A0) * (5.0 / 1023.0*100);

Serial.print(“Tep:”);

Serial.print(vol);

Serial.println(“C”);

if (vol<28)

{

digitalWrite(12, HIGH);

digitalWrite(11, LOW);

digitalWrite(10, LOW);

}

else if (vol>=28 && vol<=30)

{

digitalWrite(12, LOW);

digitalWrite(11, HIGH);

digitalWrite(10, LOW);

}

else if (vol>30)

{

digitalWrite(12, LOW);

digitalWrite(11, LOW);

digitalWrite(10, HIGH);

}

}

测试结果

下载完程序后,打开串口监视器,设置波特率为9600,就可看到当前的温度。当温度大于30摄氏度时,红色指示灯亮起,其他指示灯熄灭;当温度大于等于28摄氏度且小于等于30摄氏度时,红色指示灯熄灭,黄色指示灯亮起;当温度小于28摄氏度时,黄色指示灯熄灭,蓝色指示灯亮起。

实验十二 魔术光杯实验

实验说明

倾斜开关的工作原理是当开关一端低于水平位置倾斜,开关寻通;当另一端低于水平位置倾斜 ,开关停止。魔术光杯实验原理是利用 PWM 调光的原理,两个LED的亮度发生变化。

这个实验中倾斜开关提供数字信号,触发 PWM 的调节,通过程序的设计,我们就能看到类似于两组装满光的杯子倒来倒去的效果了。

实验器材

开发板*1

USB线*1

LED*2

倾斜开关*2

220Ω 电阻*2

10KΩ 电阻*2

面包板*1

面包板连接线若干

接线图

12

测试代码

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最亮;在串口监视器中看到对应具体数值变化,如下图。当倾斜另一边中,现象一样,方向相反。

实验十三 红外遥控解码实验

实验说明

通用红外遥控系统由发射和接收两大部分组成。本实验中发射部分就是遥控器,接收部分就是红外接收 VS1838B。红外接收 VS1838B是集接收、放大、解调一体的器件,它内部IC就已经完成了解调,输出的就是数字信号。

图片3

实验器材

开发板*1

USB线*1

红外遥控*1

红外接收 VS1838B*1

面包板*1

面包板连接线若干

接线图

13

测试代码

#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(); // 接收下个数据

}

}

测试结果

下载完程序,上电后,红外遥控对准红外接收传感器发送信号,我们可以在串口监视器总看到相应按键的编码,如下图。

遥控器-1

实验十四 一位数码管显示实验

实验说明

数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),本实验所使用的是八段数码管。数码管共有七段显示数字的段,还有一个显示小数点的段。当让数码管显示数字时,只要将相应的段点亮即可。

实验器材

开发板 *1

USB线*1

一位数码管*1

220Ω 电阻*8

面包板*1

面包板连接线若干

接线图

14

测试代码

//设置控制各段的数字IO 脚

int a=7;//定义数字接口7 连接a 段数码管

int b=6;// 定义数字接口6 连接b 段数码管

int c=5;// 定义数字接口5 连接c 段数码管

int d=10;// 定义数字接口11 连接d 段数码管

int e=11;// 定义数字接口10 连接e 段数码管

int f=8;// 定义数字接口8 连接f 段数码管

int g=9;// 定义数字接口9 连接g 段数码管

int dp=4;// 定义数字接口4 连接dp 段数码管

void digital_1(void) //显示数字1

{

unsigned char j;

digitalWrite(c,HIGH);//给数字接口5 引脚高电平,点亮c 段

digitalWrite(b,HIGH);//点亮b 段

for(j=7;j<=11;j++)//熄灭其余段

digitalWrite(j,LOW);

digitalWrite(dp,LOW);//熄灭小数点DP 段

}

void digital_2(void) //显示数字2

{

unsigned char j;

digitalWrite(b,HIGH);

digitalWrite(a,HIGH);

for(j=9;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

digitalWrite(c,LOW);

digitalWrite(f,LOW);

}

void digital_3(void) //显示数字3

{

unsigned char j;

digitalWrite(g,HIGH);

digitalWrite(d,HIGH);

for(j=5;j<=7;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

digitalWrite(f,LOW);

digitalWrite(e,LOW);

}

void digital_4(void) //显示数字4

{

digitalWrite(c,HIGH);

digitalWrite(b,HIGH);

digitalWrite(f,HIGH);

digitalWrite(g,HIGH);

digitalWrite(dp,LOW);

digitalWrite(a,LOW);

digitalWrite(e,LOW);

digitalWrite(d,LOW);

}

void digital_5(void) //显示数字5

{

unsigned char j;

for(j=7;j<=9;j++)

digitalWrite(j,HIGH);

digitalWrite(c,HIGH);

digitalWrite(d,HIGH);

digitalWrite(dp,LOW);

digitalWrite(b,LOW);

digitalWrite(e,LOW);

}

void digital_6(void) //显示数字6

{

unsigned char j;

for(j=7;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(c,HIGH);

digitalWrite(dp,LOW);

digitalWrite(b,LOW);

}

void digital_7(void) //显示数字7

{

unsigned char j;

for(j=5;j<=7;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

for(j=8;j<=11;j++)

digitalWrite(j,LOW);

}

void digital_8(void) //显示数字8

{

unsigned char j;

for(j=5;j<=11;j++)

digitalWrite(j,HIGH);

digitalWrite(dp,LOW);

}

void setup()

{

int i;//定义变量

for(i=4;i<=11;i++)

pinMode(i,OUTPUT);//设置4~11 引脚为输出模式

}

void loop()

{

while(1)

{

digital_1();//显示数字1

delay(2000);//延时2s

digital_2();//显示数字2

delay(1000); //延时1s

digital_3();//显示数字3

delay(1000); //延时1s

digital_4();//显示数字4

delay(1000); //延时1s

digital_5();//显示数字5

delay(1000); //延时1s

digital_6();//显示数字6

delay(1000); //延时1s

digital_7();//显示数字7

delay(1000); //延时1s

digital_8();//显示数字8

delay(1000); //延时1s

}

}

测试结果

下载完程序后,数码管循环显示1~8 数字。

实验十五 74HC595驱动一位数码管实验

实验说明

上一个实验中我们直接把用开发板控制一位数码管,需要占用了较多的数字口,本实验中我们添加了一个74HC595芯片控制一位数码管,只需要用3个数字口就可以控制8个LED灯,具体设置方法可以参照以下表格。

Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0
a b c d e f g dp
0 1 1 1 1 1 1 0 0 252
1 0 1 1 0 0 0 0 0 96
2 1 1 0 1 1 0 1 0 218
3 1 1 1 1 0 0 1 0 242
4 0 1 1 0 0 1 1 0 102
5 1 0 1 1 0 1 1 0 182
6 1 0 1 1 1 1 1 0 190
7 1 1 1 0 0 0 0 0 224
8 1 1 1 1 1 1 1 0 254
9 1 1 1 1 0 1 1 0 246

实验器材

开发板*1

USB线*1

74HC595*1

一位数码管*1

220Ω 电阻*8

面包板*1

面包板连接线若干

接线图

15

测试代码

int latchPin = 4;

int clockPin = 5;

int dataPin = 2; //这里定义了那三个脚

void setup ()

{

pinMode(latchPin,OUTPUT);

pinMode(clockPin,OUTPUT);

pinMode(dataPin,OUTPUT); //让三个脚都是输出状态

}

void loop()

{

int a[10]={

246,254,224,190,182,102,242,218,96,252}; //定义功能数组,数组依次为数码管得定义

for(int x=9; x>-1 ;x– ) //倒数功能循环

{

digitalWrite(latchPin,LOW);

shiftOut(dataPin,clockPin,MSBFIRST,a[x]); //显示数组a[x]

digitalWrite(latchPin,HIGH);

delay(1000);

}

}

测试结果

下载完程序后,数码管循环显示0~9 数字。

实验十六 8*8点阵显示实验

实验说明

点阵在我们生活中很常见,很多都有用到他,比如LED广告显示屏,电梯显示楼层,公交车报站等等。

8*8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置高电平,某一列置低电平,则相应的二极管就亮;如要将第一个点点亮,则7脚接高电平A脚接低电平,则第一个点就亮了;如果要将第一行点亮,则第7脚要接高电平,而A、B、C、D、E、F、G、H这些引脚接低电平,那么第一行就会点亮;如要将第一列点亮,则第A脚接低电平,而0、1、2、3、4、5、6、7接高电平,那么第一列就会点亮。

在本课程中,我们只是让点阵输出一个“0”。

8*8点阵原理图

8 ×8点阵原理图 - cdx19901103@yeah - cdx19901103@yeah的博客

8*8点阵实物图

8 ×8点阵原理图 - cdx19901103@yeah - cdx19901103@yeah的博客 图形111

实验器材

开发板*1

USB线*1

8*8点阵*1

220Ω 电阻*8

面包板*1

面包板连接线若干

接线图

16

测试代码

//定义了一个数组,用来存放“0”字的字模

unsigned char Text[]={0x00,0x1c,0x22,0x22,0x22,0x22,0x22,0x1c};

void Draw_point(unsigned char x,unsigned char y)//画点函数

{

clear_();

digitalWrite(x+2, HIGH);

digitalWrite(y+10, LOW);

delay(1);

}

void show_num(void)//显示函数,最终还是调用了画点函数。

{

unsigned char i,j,data;

for(i=0;i<8;i++)

{

data=Text[i];

for(j=0;j<8;j++)

{

if(data & 0x01)Draw_point(j,i);

data>>=1;

}

}

}

void setup(){

int i = 0 ;

for(i=2;i<18;i++)

{

pinMode(i, OUTPUT);

}

clear_();

}

void loop()

{

show_num();

}

void clear_(void)//清除屏幕

{

for(int i=2;i<10;i++)

digitalWrite(i, LOW);

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

digitalWrite(i+10, HIGH);

}

测试结果

下载完程序后,点阵上显示数字“0”。

实验十七 四位数码管显示数字实验

实验说明

在实验十五中我们使用开发板驱动一个一位数码管,本实验我们使用开发板驱动一个共阴四位数码管。驱动数码管限流电阻肯定是必不可少的,限流电阻有两种接法,一种是在d1-d4阴极接,总共接4颗。这种接法好处是需求电阻比较少,但是会产生每一位上显示不同数字亮度会不一样,1最亮,8最暗。另外一种接法就是在其他8个引脚上接,这种接法亮度显示均匀,但是用电阻较多。本次实验使用8颗220Ω电阻。

四位数码管总共有12个引脚,小数点朝下正放在面前时,左下角为1,其他管脚顺序为逆时针旋转。左上角为最大的12号管脚。

IMGP0049_调整大小.JPG

四位数码管原理图如下

5643b.jpg

实验器材

开发板*1

USB线*1

四位数码管*1

220Ω 电阻*8

面包板*1

面包板连接线若干

接线图

17

测试代码

int a = 1;

int b = 2;

int c = 3;

int d = 4;

int e = 5;

int f = 6;

int g = 7;

int dp = 8;

int d4 = 9;

int d3 = 10;

int d2 = 11;

int d1 = 12;

// set variable

long n = 1230;

int x = 100;

int del = 55; // fine adjustment for clock

void setup()

{

pinMode(d1, OUTPUT);

pinMode(d2, OUTPUT);

pinMode(d3, OUTPUT);

pinMode(d4, OUTPUT);

pinMode(a, OUTPUT);

pinMode(b, OUTPUT);

pinMode(c, OUTPUT);

pinMode(d, OUTPUT);

pinMode(e, OUTPUT);

pinMode(f, OUTPUT);

pinMode(g, OUTPUT);

pinMode(dp, OUTPUT);

}

/////////////////////////////////////////////////////////////

void loop()

{

int a=0;

int b=0;

int c=0;

int d=0;

unsigned long currentMillis = millis();

while(d>=0)

{

while(millis()-currentMillis<1000)

{

Display(1,a);

Display(2,b);

Display(3,c);

Display(4,d);

}

currentMillis = millis();

d++;

if (d>9)

{

c++;

d=0;

}

if (c>9)

{

b++;

c=0;

}

if (b>9)

{

a++;

b=0;

}

if (a>9)

{

a=0;

b=0;

c=0;

d=0;

}

}

}

///////////////////////////////////////////////////////////////

void WeiXuan(unsigned char n)//

{

switch (n)

{

case 1:

digitalWrite(d1, LOW);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

case 2:

digitalWrite(d1, HIGH);

digitalWrite(d2, LOW);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

case 3:

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, LOW);

digitalWrite(d4, HIGH);

break;

case 4:

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, LOW);

break;

default :

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

}

}

void Num_0()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_1()

{

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_2()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, LOW);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_3()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_4()

{

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_5()

{

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_6()

{

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_7()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_8()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_9()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Clear() // clear the screen

{

digitalWrite(a, LOW);

digitalWrite(b, LOW);

digitalWrite(c, LOW);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void pickNumber(unsigned char n)// select number

{

switch (n)

{

case 0: Num_0();

break;

case 1: Num_1();

break;

case 2: Num_2();

break;

case 3: Num_3();

break;

case 4: Num_4();

break;

case 5: Num_5();

break;

case 6: Num_6();

break;

case 7: Num_7();

break;

case 8: Num_8();

break;

case 9: Num_9();

break;

default: Clear();

break;

}

}

void Display(unsigned char x, unsigned char Number)// take x as coordinate and display number

{

WeiXuan(x);

pickNumber(Number);

delay(1);

Clear() ; // clear the screen

}

测试结果

下载完程序后,数码管首先显示“0000”数值,显示跳动,每跳动一下数码管显示数值加1。当显示数值为超过“9999”后,显示数值再次变为“0000”,循环显示。

实验十八 1602液晶显示实验

实验说明

本次试验使用keyes UNO R3 直接驱动1602液晶显示文字。1602液晶在应用中非常广泛,它的显示容量为16×2个字符,芯片工作电压为4.5~5.5V。1602液晶在接keyes UNO R3 控制板显示文字时有两种接线法,分别为4位接法和8位接法,本实验中都会有相关说明介绍。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

面包板*1

面包板连接线若干

接线图

四位接法

18

八位接法

19

测试代码

四位接法

/*

LiquidCrystal Library – Hello World

Demonstrates the use a 16×2 LCD display. The LiquidCrystal

library works with all LCD displays that are compatible with the

Hitachi HD44780 driver. There are many of them out there, and you

can usually tell them by the 16-pin interface.

This sketch prints “Hello World!” to the LCD

and shows the time.

The circuit:

* LCD RS pin to digital pin 2

* LCD Enable pin to digital pin3

* LCD D4 pin to digital pin 4

* LCD D5 pin to digital pin 5

* LCD D6 pin to digital pin 6

* LCD D7 pin to digital pin 7

* LCD R/W pin to ground

* LCD VSS pin to ground

* LCD VCC pin to 5V

* 10K resistor:

* ends to +5V and ground

* wiper to LCD VO pin

*/

// include the library code:

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

void setup() {

// set up the LCD’s number of columns and rows:

lcd.begin(16, 2);

// Print a message to the LCD.

lcd.setCursor(2,0);

lcd.print(“Hello, world!”);

lcd.setCursor(2,1);

lcd.print(“Hello, keyes!”);

}

void loop() {

}

八位接法

int DI = 12;

int RW = 11;

int DB[] = {3, 4,5, 6,7 ,8, 9, 10};//使用数组来定义总线需要的管脚

int Enable = 2;

void LcdCommandWrite(int value) {

// 定义所有引脚

int i = 0;

for (i=DB[0]; i <= DI; i++) //总线赋值

{

digitalWrite(i,value & 01);//因为1602液晶信号识别是D7-D0(不是D0-D7),这里是用来反转信号。

value >>= 1;

}

digitalWrite(Enable,LOW);

delayMicroseconds(1);

digitalWrite(Enable,HIGH);

delayMicroseconds(1); // 延时1ms

digitalWrite(Enable,LOW);

delayMicroseconds(1); // 延时1ms

}

void LcdDataWrite(int value) {

// 定义所有引脚

int i = 0;

digitalWrite(DI, HIGH);

digitalWrite(RW, LOW);

for (i=DB[0]; i <= DB[7]; i++) {

digitalWrite(i,value & 01);

value >>= 1;

}

digitalWrite(Enable,LOW);

delayMicroseconds(1);

digitalWrite(Enable,HIGH);

delayMicroseconds(1);

digitalWrite(Enable,LOW);

delayMicroseconds(1); // 延时1ms

}

void setup (void) {

int i = 0;

for (i=Enable; i <= DI; i++) {

pinMode(i,OUTPUT);

}

delay(100);

// 短暂的停顿后初始化LCD

// 用于LCD控制需要

LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5×7文字大小

delay(64);

LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5×7文字大小

delay(50);

LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5×7文字大小

delay(20);

LcdCommandWrite(0x06); // 输入方式设定

// 自动增量,没有显示移位

delay(20);

LcdCommandWrite(0x0E); // 显示设置

// 开启显示屏,光标显示,无闪烁

delay(20);

LcdCommandWrite(0x01); // 屏幕清空,光标位置归零

delay(100);

LcdCommandWrite(0x80); // 显示设置

// 开启显示屏,光标显示,无闪烁

delay(20);

}

void loop (void) {

LcdCommandWrite(0x01); // 屏幕清空,光标位置归零

delay(10);

LcdCommandWrite(0x80+2);

delay(10);

// 写入欢迎信息

LcdDataWrite(‘H’);

LcdDataWrite(‘e’);

LcdDataWrite(‘l’);

LcdDataWrite(‘l’);

LcdDataWrite(‘o’);

LcdDataWrite(‘,’);

LcdDataWrite(‘ ‘);

LcdDataWrite(‘w’);

LcdDataWrite(‘o’);

LcdDataWrite(‘r’);

LcdDataWrite(‘l’);

LcdDataWrite(‘d’);

LcdDataWrite(‘!’);

delay(10);

LcdCommandWrite(0xc0+2); // 定义光标位置为第二行第二个位置

delay(10);

LcdDataWrite(‘H’);

LcdDataWrite(‘e’);

LcdDataWrite(‘l’);

LcdDataWrite(‘l’);

LcdDataWrite(‘o’);

LcdDataWrite(‘,’);

LcdDataWrite(‘ ‘);

LcdDataWrite(‘k’);

LcdDataWrite(‘e’);

LcdDataWrite(‘y’);

LcdDataWrite(‘e’);

LcdDataWrite(‘s’);

LcdDataWrite(‘!’);

LcdDataWrite(‘ ‘);

delay(5000);

}

测试结果

无论是四位接法还是八位接法,接好线,烧录程序上电后,通过旋转电位器调节背光,即可在1602 LCD上看到设置的显示字符。四位接法和八位接法显示一样,第一行显示 “Hello, world!”字符,第二行显示”Hello, keyes!”字符。

实验十九 RGB模块显示实验

实验说明

本实验中我们主要学习下RGB模块的使用方法。我们可以通过控制 R、 G、 B三个引脚的PWM电压输入可以调节三种基色(红/蓝/绿)的强度从而实现全彩的混色效果。实验中我们通过通过 R、 G、 B三个引脚的PWM电压合成了几种常用颜色灯光。

实验器材

开发板 *1

USB线*1

RGB模块*1

面包板*1

面包板连接线若干

接线图

20

测试代码

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秒,然后循环交替。

实验二十 超声波测距显示实验

实验说明

本实验中我们主要用到了超声波传感器和1602 LCD。实验中我们通过超声波测到超声波与前方障碍物的距离,然后在1602 LCD上显示测试结果。

实验器材

开发板 *1

USB线*1

1602 LCD*1

可调电位器*1

超声波传感器*1

面包板*1

面包板连接线若干

接线图

21

测试代码

#include <LiquidCrystal.h>

#define echoPin 9 // Echo Pin

#define trigPin 8 // Trigger Pin

#define LEDPin 13 // Onboard LED

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

int maximumRange = 200; // Maximum range needed

int minimumRange = 0; // Minimum range needed

long duration, distance; // Duration used to calculate distance

void setup() {

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)

lcd.begin(16, 2);

lcd.setCursor(0,0);

lcd.print(“The distance is:”);

}

void loop() {

/* The following trigPin/echoPin cycle is used to determine the

distance of the nearest object by bouncing soundwaves off of it. */

digitalWrite(trigPin, LOW);

delayMicroseconds(2);

digitalWrite(trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);

//Calculate the distance (in cm) based on the speed of sound.

distance = duration/58.2;

if (distance >= maximumRange || distance <= minimumRange){

/* Send a negative number to computer and Turn LED ON

to indicate “out of range” */

lcd.setCursor(0,1);

lcd.print(“-1 “);

digitalWrite(LEDPin, HIGH);

}

else {

/* Send the distance to the computer using Serial protocol, and

turn LED OFF to indicate successful reading. */

Serial.println(distance);

if(distance<10)

{

lcd.setCursor(0,1);

lcd.print(distance);

lcd.setCursor(1,1);

lcd.print(” “);

}

if((distance >=10)&&(distance<100))

{

lcd.setCursor(0,1);

lcd.print(distance);

lcd.setCursor(2,1);

lcd.print(” “);

}

if(distance>100)

{

lcd.setCursor(0,1);

lcd.print(distance);

}

digitalWrite(LEDPin, LOW);

}

//Delay 50ms before next reading.

delay(50);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 LCD显示”The distance is:”字符;测试超声波与前方障碍物的距离,测试到数据,则在1602 LCD上显示该数据,若没测试到数据,那么就在1602 LCD上显示”-1”字符。

实验二十一 1302时钟显示实验

实验说明

上一实验中我们在1602 LCD上显示超声波距离,这一实验程也是将1602 LCD做显示器。这个实验相当于我们自制一个时钟,时钟上包含年、月、日、星期、小时、分钟、秒。初始时间在代码中设置,时钟自动行走,在1602 LCD显示。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

1302时钟传感器*1

面包板*1

面包板连接线若干

接线图

22

测试代码

#include <stdio.h>

#include <string.h>

#include <DS1302.h>

#include <Wire.h>

#include <LiquidCrystal.h>

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

/* Set the appropriate digital I/O pin connections */

uint8_t CE_PIN = 10; // RST

uint8_t IO_PIN = 9; // DAT

uint8_t SCLK_PIN = 8; // CLK

/* Create buffers */

char buf[50];

char bf[50];

char bu[50];

char uf[50];

char day[10];

/* Create a DS1302 object */

DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

void print_time()

{

/* Get the current time and date from the chip */

Time t = rtc.time();

/* Name the day of the week */

memset(day, 0, sizeof(day)); /* clear day buffer */

switch (t.day) {

case 1:

strcpy(day, “Sunday “);

break;

case 2:

strcpy(day, “Monday “);

break;

case 3:

strcpy(day, “Tuesday “);

break;

case 4:

strcpy(day, “Wednesday”);

break;

case 5:

strcpy(day, “Thursday “);

break;

case 6:

strcpy(day, “Friday “);

break;

case 7:

strcpy(day, “Saturday “);

break;

}

/* Format the time and date and insert into the temporary buffer */

snprintf(buf, sizeof(buf), “%s %04d-%02d-%02d %02d:%02d:%02d”,

day,

t.yr, t.mon, t.date,

t.hr, t.min, t.sec);

snprintf(bf, sizeof(bf), “%s %04d”,

day, t.yr);

lcd.setCursor(0,0);

lcd.print(bf);

snprintf(bu, sizeof(bu),”%02d:%02d:%02d”,

t.hr, t.min, t.sec);

/* Print the formatted string to serial so we can see the time */

lcd.setCursor(0,1);

lcd.print(bu);

snprintf(uf, sizeof(uf), “%02d-%02d”,

t.mon, t.date);

lcd.setCursor(11,1);

lcd.print(uf);

}

void setup()

{

lcd.begin(16, 2);

/* Initialize a new chip by turning off write protection and clearing the

clock halt flag. These methods needn’t always be called. See the DS1302

datasheet for details. */

rtc.write_protect(false);

rtc.halt(false);

/* Make a new time object to set the date and time */

Time t(2017,7,24,10,12,22,2);

/* Set the time and date on the chip */

rtc.time(t);

}

/* Loop and print the time every second */

void loop()

{

print_time();

delay(1000);

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,1602 LCD显示当前初始时间,然后时钟开始走动。

实验二十二 人体红外感应实验

实验说明

和上面两个实验一样,这个实验也是用1602 LCD做显示器。实验中,我们用到了人体红外热释电传感器,当检测到有人有附近移动时,在1602 LCD显示对应字符,当没有检测到人体在附件移动时,1602 LCD显示另一对应字符。

实验器材

开发板*1

USB线*1

1602 LCD*1

可调电位器*1

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

面包板*1

面包板连接线若干

接线图

23

测试代码

#include <LiquidCrystal.h>

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

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

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

void setup()

{

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

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

lcd.begin(16, 2);

}

void loop()

{

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

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

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

{

lcd.setCursor(0,0);

lcd.print(“Somebody is “);

lcd.setCursor(0,1);

lcd.print(“in this area! “);

}

else if(state == 0)

{

lcd.setCursor(0,0);

lcd.print(“No one! “);

lcd.setCursor(0,1);

lcd.print(“No one! “);

}

}

测试结果

按照上图接好线,烧录好代码,旋转电位器调节好背光后,当检测到有人有附近移动时,在1602 LCD第一行显示显示”Somebody is “字符,第二行显示”in this area!”字符;当没有检测到人体在附件移动时,1602 LCD两行都显示”No one!”字符。

6、相关资料链接地址

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