目录
相关资料下载链接
第1小节 简介
- 什么是Arduino?
Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。由一个欧洲开发团队于2005年冬季开发。
其特点有:
跨平台
Arduino IDE可以在Windows、Macintosh OS X、Linux三大主流操作系统上运行,而其他的大多数控制器只能在Windows上开发。
简单清晰
Arduino IDE基于processing IDE开发。对于初学者来说,极易掌握,同时有着足够的灵活性。
开放性
Arduino的硬件原理图、电路图、IDE软件及核心库文件都是开源的,在开源协议范围内里可以任意修改原始设计及相应代码。
编程方式多样代码简洁
Arduino编程主要有以下几种方式:第一种是使用官网Arduino IDE编程环境,这可以在官网下载,支持Windows,MacOS,Linux操作系统。第二如果不太喜欢写代码,或者是教小孩子玩Arduino,也有图形化的编程环境,比如Mixly/Scratch。
型号多样
Arduino主板有很多型号,比如:
Arduino Uno, Arduino Nano, Arduino Nano, Arduino LilyPad, Arduino Mega 2560, Arduino Ethernet, Arduino Due, Arduino Leonardo
!注意:在接下来的课程种我们主要介绍的是Arduino Uno开发板的性能和用法。
第2小节 认识Arduino Uno
本课程以Arduino uno为主板
(1)规格参数
主控芯片:ATMEGA328微控制器
USB转串口芯片:Atmega16U2
USB线供电:5v
外接电源:7-12v,建议用9v
数字输入/输出引脚14个(其中6个支持PWM)
模拟输入引脚 6范围
IO输出电流:20mA
3.3V输出电流:50mA
内置闪存:32K
SRAM : 2k
EPROM:1K
时钟频率:16MH
ICSP接口:给ATMEGA328P-AU烧录固件接口
数字口:D0-D13
串口通信:D0(RX)和D1(TX)
外部中断:D2(中断0)和D3(中断1)
PWM口:D3、D5、D6、D9、D10和D11
SPI通信:D10(SS)、D11(MOSI)、D12(MISO)和D13(SCK)
LED:D13标志“L”的LED
USB接口:用于下载程序与串口调试
DC电源接口:可接入7V-12V范围内电压
电源输出接口:输出3.3V或5V,常用于对外供电或进行共地处理
模拟口A0-A5:IIC通信:A4(SDA)和A5(SCL)
也可当做数字口使用:A0(D14)、A1(D15)、A2(D16)、A3(D17)、A4(D18)和A5(D19)
第3小节 arduino IDE下载方法
我们先到arduino 官方的网站Arduino - Home下载最新版本的arduino开发软件,进入网站之后点击界面上的SOFTWARE,选择DOWNLOADS进入下载页面,如下图:
Arduino 软件有很多版本,有wodows,mac linux系统的(如下图),而且还有过去老的版本,你只需要下载一个适合系统的版本。
这里我们以WINDOWS系统的为例给大家介绍一下下载和安装的步骤。
WINDOWS系统的也有两个版本,一个版本是安装版的,一个是下载版的不用安装,直接下载文件到电脑,解压缩就可以用了。
两个版本都可以正常使用,看你自己的喜好了。选择一个版本,然后将Arduino 开发软件下载到我们的电脑。
一般情况下,我们点击JUST DOWNLOAD就可以下载了,当然如果你愿意,你可以选择小小的赞助,以帮助伟大的ARDUINO 开源事业。
第4小节 驱动的安装方法
接下来是开发板驱动的安装,这次我们安装的是Arduino Uno 开发板的驱动,这个开发板的USB转串口芯片是Atmega16U2。在ARDUINO 开发软件1.8以上的版本里就已经包含了这个芯片的驱动程序,这样我们使用起来会非常方便。一般插上USB,电脑就会识别到硬件,WINDOWS就会自动安装Atmega16U2的驱动。
如果驱动安装不成功,或者你想手动安装驱动,请打开电脑的设备管理器
显示Atmega16U2的驱动没有安装成功,有一个黄色的感叹号。我们双击硬件更新驱动
(目前克隆版的Arduino比较多,如果你的板子是其他驱动可以选择相应的驱动文件,这里还提供了CH340、CP2101驱动)
浏览计算机查找驱动文件。驱动文件的下载链接
我们选择这个文件夹,然后点击确定,驱动安装成功。
这个时候再打开设备管理器,我就可以看到Atmega16U2的驱动程序已经安装成功了,刚刚的那个黄色的感叹号不见了。
第5小节 Arduino IDE设置和工具栏介绍
装好了开发板的驱动,我们下面要了解Arduino开发软件的使用了,首先我们点击电脑桌面上的图标,打开Arduino IDE。
为了避免在将程序上载到板上时出现任何错误,必须选择正确的Arduino板名称,该名称与连接到计算机的电路板相匹配。转到工具→开发板,然后选择你的板。
然后再选择正确的COM口(安装驱动成功后可看到对应COM口)。
我们的程序上传到板之前,我们必须演示Arduino IDE工具栏中出现的每个符号的功能。
A - 用于检查是否存在任何编译错误。
B - 用于将程序上传到Arduino板。
C - 用于创建新草图的快捷方式。
D - 用于直接打开示例草图之一。
E - 用于保存草图。
F - 用于从板接收串行数据并将串行数据发送到板的串行监视器。
启动你的第一个程序
上面我们学习了怎么下载软件和安装开发板的驱动,那下面我们就开始正式开始第一个程序,打开文件选择例子,选择第一个文件BASIC里面的BLINK程序
按照前面方法设置板和COM口,IDE右下角显示对应板和COM口。
点击图标开始编译程序,检查错误,检查无误。
点击点击--->图标开始上传程序,上传成功。
程序上传成功,板载的LED灯亮一秒钟,灭一秒钟,恭喜你的第一个程序完成了!
第6小节 库文件的添加
首先找到arduino库文件夹:
然后把所要用到的库文件复制在这个文件夹下就行了。
第7节 单个传感器实验课程
我们下面的课程是先从简单到复杂学习单个模块/传感器的原理,后面再学习一些模块/传感器的组合应用以巩固加深我们的理解。
特别注意:实验时,模块/传感器连接线材时,必须按照资料里的接线方法及位置,电源与信息脚不能错接,否则会损坏模块/传感器。
实验一 点亮LED
实验说明
LED模块:它的控制方法非常简单,要想点亮LED,只要让它两端有一定的电压就可以。
实验中,我们通过编程控制信号端S的高低电平,从而控制LED的亮灭。我们提供两个实验程序,分别控制LED模块上实现点亮和闪烁的效果。
实验原理
下面附了两个电路原理图,左边我们直接把LED串联一个电阻,负极接地,正极接到单片机的IO口,理论上来说当我们把信号端S输出高电平(5V),LED两端就会有电压,LED就会被点亮,那么我们为什么说这么接不合理呢?原因就是我们单片机IO口输出电流的能力有限(最大20mA),虽然输出了高电平,但是可能达不到控制LED的电流,此时LED可能比较暗。
右边的接法:控制时,GND和VCC上电后,如果信号端S为高电平,那么三极管Q1就会导通,则LED有电流流过,LED即会亮起(注意:此时电流是由VCC电源端流经LED和电阻R3到GND,而不是直接从单片机IO口输出,此时输出电流的能力就比较强),S端为低电平时三极管Q1截止,那么就没有电流流过LED,那么LED就会熄灭。也就是说,我们这里的三极管Q1相当于一个开关作用,而电阻R1,R3都是一个限流电阻,顾名思义就是限制电流的大小,以免烧坏电子元器件。
实验器材
LED模块*1 | Arduino主板*1 | 连接线*1 |
接线图
实验代码
代码1:
/*
LED灯模块
https://sourl.cn/26pdb9
*/
void setup() {
pinMode(3, OUTPUT);//设置模式为输出
}
void loop() {
digitalWrite(3, HIGH); //输出高电平,点亮
}
代码2:
int ledPin = 3; //定义LED管脚接D3
void setup() {
pinMode(ledPin, OUTPUT);//设置模式为输出
}
void loop() {
digitalWrite(ledPin, HIGH); //输出高电平,点亮
delay(1000);//延迟1000毫秒
digitalWrite(ledPin, LOW); //输出低电平,熄灭
delay(1000);
}
代码说明
代码1说明:
- int ledPin = 3;int是变量类型范围为-32,768 ~ 32,767,这条代码语句意思是取个ledpin的变量名然后赋值为3,后面我们需要用到这个引脚时就直接使用ledpin而不用“3”,当我们接的传感器模块多了,引脚多了我们就需要这样设置一个简单易记的变量名方便我们使用。
- pinMode(pin,mode);pin是用于设置模式的Arduino引脚号;mode为模式,可选:输入模式INPUT,输出模式OUTPUT或输入上拉INPUT_PULLUP,在这里我们设置了管脚3为输出模式。
- digitalWrite(pin, value);pin是单片机数字管脚,在这里我们定义了管脚3;value是你将要输出的数字电平(HIGH/LOW);如果使用pinMode()将引脚配置为OUTPUT,则其电压将设置为相应的值:5V(在3.3V板上为3.3V)为HIGH,低电平为0V(接地)。如果没有把pinMode()设置为OUTPUT,而是将LED连接到引脚,则在调用digitalWrite(HIGH)时,LED可能会变暗。因为此时digitalWrite()将启用内部上拉电阻,其作用类似于一个大限流电阻。
代码2说明:
- setup()中代码是只执行一次,而loop()函数里面的代码是一直循环执行。delay(ms);延时函数,ms为暂停的毫秒数,数据类型:unsigned long(范围 0~ 4,294,967,295 (2^32 - 1))。
- 通过整合前面知识。我们再来看代码就清楚明了了,代码中第一条我们把模块信号端接到ledpin也就是数字口D3,设置为高电平,就是点亮模块上LED;第二条延迟1000毫秒,就是让模块上LED点亮1秒。同样第三条第四条代码表示让模块上LED熄灭1秒。代码默认循环,也就是控制模块上LED,循环亮1秒,灭1秒,实现闪烁效果。通过代码设置,我们可以更改模块上LED亮灭的延迟时间,从而使模块上LED实现不同的闪烁效果。
- 更多arduino语法解释与详情请了解官网https://www.arduino.cc/reference/en/
测试结果
代码一:上传实验程序一成功后,上电,模块上白色LED点亮
代码二:上传实验程序二成功后,上电,白色LED亮1秒灭一秒,循环交替闪烁。
实验说明
我想大家都看见过交通灯,就是马路上十字路口的红绿灯。如果您开过车,我想您一定仔细观察过交通灯,如果您还没有驾驶过车,您是否仔细观察过交通灯呢?在我们这个套件中,就包含一个交通灯模块。我们经常会用红绿黄3个LED外接电路来模拟路边的红绿黄灯闪烁。因此我们特别设计了这款模块,模块上自带了红黄绿3个LED灯,我们这个实验就做一个模拟交通灯。
实验原理
前面第一课我们就学习了如何控制一个LED,由原理图容易得知,控制这个模块就好比分别控制3个独立的LED灯(我们这个灯可直接由单片机IO口驱动),给对应颜色灯高电平就亮起对应的颜色。比如,我们给信号“R”输出高电平,也就是5V,则红色LED点亮。
实验器材
交通灯模块*1 | Arduino主板*1 | 连接线*1 |
接线图
实验代码
/*
交通灯模块
https://sourl.cn/26pdb9
*/
int greenPin = 4; //绿色LED接数字口D4
int yellowPin = 3; //黄色LED接数字口D3
int redPin = 2; //红色LED接数字口D2
void setup() {
//LED接口都设置为输出模式
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(redPin, OUTPUT);
}
void loop() {
digitalWrite(greenPin, HIGH); //点亮绿色LED
delay(5000); //延时5秒
digitalWrite(greenPin, LOW); //关闭绿色LED
for (int i = 1; i <= 3; i = i + 1) { //运行三次
digitalWrite(yellowPin, HIGH); //点亮黄色LED
delay(500); //延时0.5秒
digitalWrite(yellowPin, LOW); //关闭黄色LED
delay(500); //延时0.5秒
}
digitalWrite(redPin, HIGH); //点亮红色LED
delay(5000); //延时5s
digitalWrite(redPin, LOW); //关闭红色LED
}
代码说明
- 定义管脚接口,设置引脚模式,延时函数,输出高低电平参考实验一说明,这里就不多说了。
- 这里我们还用到了for()循环:最简单形式为for( ; ; ),我们在此实验中用到for (int i = 1; i <= 3; i = i + 1);表示变量i从1到3,每次自加1,知道不满足 i <= 3这个判断表达式,否则一直执行大括号里的代码,即一共执行3次大括号里的代码;同理:如果是for (int i = 255; i >= 0; i = i - 1);i每次自减1,当不满足i>= 0时,跳出该for()循环,一共执行256次。
测试结果
上传实验程序成功,上电后,模块上绿色LED亮5秒然后熄灭,黄色LED闪烁3秒然后熄灭,再然后红色LED亮5秒,然后熄灭,模块上3个LED自动模拟交通灯循环运行。
实验三 激光头传感器模块发出激光
实验说明
我们都应该经常又听说激光,激光与常见的光不同。
一方面是由于它的来源。当原子被激发,从而电子从低能级跃迁到高能级,再从高能级回落到低能级的时候,能量以特定频率的电磁波向外辐射。由于电子的能级是特定的,因而辐射出的电磁波频率是一致的。由此,一束激光只有一种特定频率的电磁波(光)。这使得激光比起普通光源,激光的单色性好。另一方面,激光发射器内部特定的结构,使得激光能够被聚集成单束光,朝着同一方向射出,亮度高,方向性好。
正是由于这些特性,激光被广泛用于对特定材料进行切割、焊接、表面处理等等。激光的能量非常高,玩具激光笔照射人眼可能导致眩光,长时间可能导致视网膜损害,我国也禁止用激光照射航行的飞机。因此,请注意不要用激光发射器对准人眼。
实验原理
激光头传感器模块主要由激光头组成,激光头由发光管芯、聚光透镜、铜可调套筒三部分组成。我们可以看到此模块电路原理图,可知该模块的控制方法与我们前面学习过的LED非常相似,都是用三极管驱动,在信号端直接输入一个高电平数字信号,传感器开始工作,输入低电平时停止工作。
实验器材
激光模块*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
激光灯模块
https://sourl.cn/26pdb9
*/
int laserPin = 2; //定义激光引脚为D2
void setup() {
pinMode(laserPin, OUTPUT);//定义激光引脚为输出模式
}
void loop() {
digitalWrite(laserPin, HIGH); //打开激光
delay(2000); //延时2秒
digitalWrite(laserPin, LOW); //关闭激光
delay(2000); //延时2秒
}
代码说明
代码设置即说明请参考前面实验一。
测试结果
上传实验程序成功,上电后,模块上激光管发射红色激光信号2秒,停止发射红色激光信号2秒,循环交替。
实验四 按键传感器检测实验
实验说明
单路按键模块,它主要采用1个轻触开关,自带1个黄色按键帽。前面我们学习了怎么让我们单片机的引脚输出一个高电平或者低电平,这节实验我们就来学习怎么读取引脚是高电平(5V)还是低电平(0V)。
实验中,我们通过读取传感器上S端高低电平,判断传感器上按键是否按下;并且,我们在串口监视器上显示测试结果。
实验原理
附原理图,按键有四个引脚,其中1和3是相连的,2和4是相连的,在我们未按下按键时,13与24是断开的,信号端S读取的是被4.7K的上拉电阻R1所拉高的高电平,而当我们按下按键时,13和24连通。信号端S连接到了GND,此时读取到的电平为低电平,即按下按键,传感器信号端为低电平;松开按键时,信号端为高电平。
实验器材
单路按键模块*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
按键模块
https://sourl.cn/26pdb9
*/
int val = 0; //用来存放按键值
int button = 2; //按键的管脚接数字口D2
void setup() {
Serial.begin(9600); //启动串口监视器并设置波特率为9600
pinMode(button, INPUT); //设置按键管脚为输入模式
}
void loop() {
val = digitalRead(button); //读取按键的值并赋给变量val
Serial.print(val); //串口上打印出来
if (val == 0) { //按下按键则读取到低电平,打印按下相关信息
Serial.print(" ");
Serial.println("Press the botton");
delay(100);
}
else { //打印松开按键相关信息
Serial.print(" ");
Serial.println("Loosen the botton");
delay(100);
}
}
代码说明
- pinMode(button, INPUT); 由前面学过的知识我们知道,在这里我们定义按键管脚为数字口2,设置为输入模式。通过pinMode()配置为INPUT的Arduino(ATmega)引脚处于高阻抗状态。配置为INPUT的引脚对要采样的电路的要求极小,相当于该引脚前面的100MΩ串联电阻。这使它们对于读取传感器很有用。将引脚配置为INPUT,并且正在读取开关,则当开关处于断开状态时,输入引脚将处于“悬空状态”,从而导致不可预测的结果。为了确保开关断开时的读数正确,必须使用上拉或下拉电阻(我们的模块已经使用上拉电阻R1)。该电阻的目的是在开关断开时将引脚拉至已知状态。通常选择一个4.7K/10 K欧姆的电阻,因为它的阻值足够低,可以可靠地防止输入悬空,同时,该阻值也要足够高,以使开关闭合时不会消耗太多电流。如果使用下拉电阻,则当开关断开时,输入引脚将为低电平;当开关闭合时,输入引脚将为高电平。如果使用上拉电阻,则当开关断开时,输入引脚将为高电平;当开关闭合时,输入引脚将为低电平。
2. Serial.begin(9600);初始化串口通信,并设置波特率为9600.
3. digitalRead(button);读取按键的数字电平,高HIGH或者低LOW。如果该引脚未连接任何东西,则digitalRead()可以返回HIGH或LOW(并且可以随机更改)。UNO R3模拟输入引脚可以用作数字引脚:A0、A1、A2、A3、A4、A5,我们的plus开发板多出两个模拟引脚A6及A7。
4. if..else..语句:当if后面()的逻辑判断为真时,执行大括号里的代码;否则执行else后面{}里的代码。
5. 代码逻辑是传感器感应到按键按下时,信号端为低电平,D2口为低电平,即val为
0。这时我们在串口监视器显示对应的数字值和字符;否则(传感器感应到按键松开时),val为1,窗口监视器显示1和另外的字符。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。串口监视器显示对应数据和字符。实验中,当传感器按下按键时,val为0,串口监视器显示“Press the button”字符;松开按键时,val为1,串口监视器显示“Loosen the button”字符,如下图。
实验五 电容触摸传感器检测实验
实验说明
电容触摸模块:主要采用1个TTP223-BA6芯片。它是触摸检测芯片,提供一个触摸按键,功能是用可变面积的按键取代传统按键。当我们上电之后,传感器需要约0.5秒的稳定时间,此时间段内不要对键进行触摸,此时所有功能都被禁止,始终进行自校准,校准周期约为4秒。
我们在串口监视器上显示测试结果。
实验原理
当我们用手指触摸模块时,信号端S输出高电平,板载红色LED点亮,我们通过读取传感器上S端高低电平,判断传感器上按键是否按下(上一实验学习的单路按键模块刚好相反,按下为低电平)。
实验器材
电容触摸模块*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
触摸模块
https://sourl.cn/26pdb9
*/
int val = 0;
int button = 3; //按键的PIN
void setup() {
Serial.begin(9600);//波特率为9600
pinMode(button, INPUT);//设置输入模式
}
void loop() {
val = digitalRead(button);//读取按键的值
Serial.print(val);//打印出来按键值
if (val == 1) {//按下为高电平
Serial.print(" ");
Serial.println("Press the button");
delay(100);
}
else {//松开为低电平
Serial.print(" ");
Serial.println("Loosen the button");
delay(100);
}
}
代码说明
与实验四不同的是:当我们触摸传感器时,单片机会读取到高电平,即val == 1打印“Press the button”,否则打印“Loosen the button”。细节请参考实验四的代码说明。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。串口监视器显示对应数据和字符。实验中,当传感器按下按键时,板载红色LED点亮,val为1,串口监视器显示“Press the button”字符;松开按键时,板载红色LED熄灭,val为0,串口监视器显示“Loosen the button”字符,如下图。
实验六 避障传感器检测障碍物
实验说明
避障传感器,它主要采用一对红外线发射与接收管元件。实验中,我们通过读取传感器上S端高低电平,判断是否存在障碍物;并且,我们在串口监视器上显示测试结果。
实验原理
原理就是NE555时基电路提供发射管TX发射出一定频率的红外信号,红外信号会随着传送距离的加大逐渐衰减,如果遇到障碍物,就会形成红外反射。当检测方向RX遇到反射回来的信号比较弱时,接收检测引脚输出高电平,说明障碍物比较远;当反射回来的信号比较强,接收检测引脚输出低电平,说明障碍物比较近了,接收检测引脚输出低电平,此时指示灯亮起。传感器上有两个电位器,一个用于调节发送功率,一个用于调节接收频率,通过调节2个电位器,我们可以调节它的有效距离。
实验器材
避障传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
避障传感器
https://sourl.cn/26pdb9
*/
int val = 0;
void setup() {
Serial.begin(9600);//设置波特率为9600
pinMode(3, INPUT);//设置引脚3为输入模式
}
void loop() {
val = digitalRead(3);//读取数字电平
Serial.print(val);//打印读取的电平信号
if (val == 0) {//检测到障碍物
Serial.print(" ");
Serial.println("There are obstacles");
delay(100);
}
else {//没检测到障碍物
Serial.print(" ");
Serial.println("All going well");
delay(100);
}
}
代码说明
我们这里使用一款传感器,所以没有定义管脚名称变量了,直接使用引脚“3”,其它设置方法和实验四类似,这里就不多做介绍了。
特别注意
烧录好实验程序,按照接线图连接好线,上电后,我们开始调节两个电位器调节感应距
离。
1.调节发射功率调节电位器,先将电位器顺时针到尽头,然后回调一些,使传感器上
P LED介于不亮与亮之间的零界点。
2.调节接收频率调节电位器,顺时针调节时,频率增大。调节使它产生38KHz频率的方波,调节时,也观察传感器上S LED,使它介于不亮与亮之间的零界点。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。串口监视器显示对应数据和字符。实验中,当传感器检测到障碍物时,val为0,串口监视器显示“There are obstacles”字符;没有检测到障碍物时,val为1,串口监视器显示“All going well”字符,如下图。
实验七 巡线传感器检测黑白线
实验说明
单路循线传感器:它主要采用1个TCRT5000 反射型 黑白线识别传感器元件。
实验中,我们通过读取模块上S端高低电平,判断传感器检测到的物体颜色(黑白);并且,我们在串口监视器上显示测试结果。
实验原理
上个实验我们学习了避障传感器的原理,其实巡线传传感器的原理也是相同的。是利用红外线对颜色的反射率不一样,将反射信号的强弱转化成电流信号。上电时,发射二极管发射红外光,RP1 是一个电位器,我们通过调整电位器给 电压比较器LM393 的 2 脚提供一个阈值电压,这个电压值的大小可以根据实际情况来调试确定。而红外光敏二极管收到红外光的时候,会产生电流,并且随着红外光的从弱变强,电流会从小变大。当没有红外光或者说红外光很弱的时候,3 脚的电压就会接近 VCC,即信号R3电压接近VCC,如果 3 脚比 2 脚的电压高的话,通过 LM393 比较器后,接收检测引脚输出一个高电平。当随着光强变大,电流变大,3 脚的电压值等于 VCC-I*R3,电压就会越来越小,当小到一定程度,比 2 脚的电压还小的时候,接收检测引脚就会变为低电平。当红外信号发送到黑色轨道时,黑色因为吸光能力比较强,红外信号发送出去后就会被吸收掉,反射部分很微弱。白色轨道就会把大部分红外信号反射回来。
也就是说检测到黑色或没检测到物体时,信号端为高电平;检测到白色物体时,信号端为低电平;它的检测高度为 0—3cm。我们可以通过旋转传感器上电位器,调节灵敏度,即调节检测高度。当旋转电位器,是传感器上红色 LED介于不亮与亮之间的临界点时,灵敏度最好。
实验器材
单路循线传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
黑白巡线传感器
https://sourl.cn/26pdb9
*/
int val = 0;
void setup() {
Serial.begin(9600);//设置波特率为9600
pinMode(3, INPUT);//设置传感器引脚为输入模式
}
void loop() {
val = digitalRead(3);//读取巡线传感器输出的数字电平
Serial.print(val);//串口打印值
if (val == 0) {//检测到白色val为0
Serial.print(" ");
Serial.println("White");
delay(100);
}
else {//检测到黑色val为1
Serial.print(" ");
Serial.println("Black");
delay(100);
}
}
代码说明
设置方法和实验六类似,这里就不多做介绍了,具体详细请看代码注释。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。串口监视器显示对应数据和字符。实验中,当传感器没有检测到物体或者检测到黑色物体时,val为1,串口监视器显示“Black”字符;检测到白色物体(能够反光)时,val为0,串口监视器显示“White”字符,如下图。
实验八 光折断计数
实验说明
光折断模块:它主要采用1个ITR-9608光电开关。它属于对射遮断式光电开关光学开关传感器。
在这里,我们不仅与前面的课程一样只打印信号端的电平信号,而是通过代码设置,模拟出流水线上利用类似传感器,对产品进行计数。
实验原理
如原理图:当用纸片挡住传感器凹槽后,C与VCC导通,传感器信号端S为高电平,自带红色 LED熄灭;否则传感器信号端为被R2拉低为低电平,自带红色LED亮起。
实验器材
光折断模块*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
光折断模块
https://sourl.cn/26pdb9
*/
int PushCounter = 0; //计数变量赋初值0
int State = 0; //存放传感器输出当前的状态
int lastState = 0; //存放传感器上一次输出的状态
void setup() {
Serial.begin(9600);//设置波特率为9600
pinMode(3, INPUT);//设置光折断传感器管脚为输入模式
}
void loop() {
State = digitalRead(3);//读取当前状态
if (State != lastState) {//如果与上一次读取的状态不相同
if (State == 1) {//挡住光线
PushCounter = PushCounter + 1;//计数加1
Serial.println(PushCounter);//打印计数
}
}
lastState = State;//更新状态
}
代码说明
通过以下表格,我们可以了解这个代码的逻辑设置,这个编程技巧我们在后面还会用到。
初始设置 | PushCounter设置为0(累计通过物体数目) | |
State设置为0(传感信号端数值) | ||
lastState设置为0(传感器信号端上一循环数值) | ||
当物体开始穿过传感器凹槽时 | lastState为0,State检测到变为1,两个数据不相等,lastState变为1。 | PushCounter设置为 PushCounter加1 打印PushCounter值 |
当物体离开传感器凹槽时 | lastState为1,State检测到变为0,两个数据不相等,lastState变为0。 | PushCounter不变 不打印PushCounter值 |
当物体再次穿过传感器凹槽时 | lastState为0,State检测到变为1,两个数据不相等,lastState变为1。 | PushCounter设置为 PushCounter加1 打印PushCounter值 |
当物体再次离开传感器凹槽时 | lastState为1,State检测到变为0,两个数据不相等,lastState变为0。 | PushCounter不变 不打印PushCounter值 |
... |
测试结果
上传实验程序成功,按照接线图接好线,利用USB上电后,打开串口监视器,设置波特率为9600;串口监视器显示PushCounter数据,每次物体穿过传感器凹槽,PushCounter数据不断加1,如下图。
实验九 倾斜模块的原理
实验说明
倾斜传感器:倾斜开关可以依据模块是否倾斜而输出不同电平信号。其内部带有一颗滚珠,因此可以监测倾斜情况。当开关高于水平位置倾斜时开关导通,低于水平位置时开关断开。倾斜模块可用于倾斜检测、报警器制作或者其他检测。
实验中我们用串口监视器打印出信号端检测到的数字电平信号。
实验原理
它的原理非常简单,附原理图,主要是利用滚珠在开关内随不同倾斜角度的发化使滚珠开关P1的引脚1和2导通或者不导通,当1和2导通时,因为1教接GND,所以信号端S为低电平,此时红色LED形成回路,将会点亮;当1和2不导通时,引脚2被4.7K的上拉电阻R1拉高而使信号端S为高电平,模块上的LED将熄灭。
实验器材
倾斜传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
https://sourl.cn/26pdb9
倾斜传感器
*/
int val; //存放倾斜传感器输出的电平值
void setup() {
Serial.begin(9600);
pinMode(3, INPUT); //倾斜传感器管脚接数字口3,设置D3为输入模式
}
void loop() {
val = digitalRead(3); //读取模块的电平信号
Serial.println(val); //换行打印出来
delay(100); //延时100毫秒
}
代码说明
PW代码设置与实验四相同,详情请看代码注释与实验四代码说明。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。将倾斜模块倾斜一边, 模块上的红色LED不亮,串口监视器打印数字电平信号“1”;将倾斜模块倾斜另一边, 模块上的红色LED点亮,串口监视器打印数字电平信号“0”。
实验十 碰撞传感器的原理
实验说明
碰撞传感器。其实我们前面学习了这么多的数字传感器,很多原理都是大同小异,基本上只要搞懂了一款传感器,其余都能触类旁通。大家可以先试着自己看原理图,自己去写代码,看是否能理解,然后再结合课程的介绍,查漏补缺,这样不仅可以使我们对电子有更深的理解也可以提高我们的学习效率。
倾斜模块用的是滚珠开关,而碰撞传感器用的是轻触开关,我们在学习的过程中应该经常使用到对比的学习方法,这样可以加深我们对问题的理解。该传感器常用于3D打印机内做限位开关。
实验中,我们通过读取模块上S端高低电平,判断传感器弹片是否下压;并且,我们在串口监视器上显示测试结果。
实验原理
我们来看看碰撞传感器的原理,它主要采用1个轻触开关,当物体碰到轻触开关弹片,下压时,2和3导通,传感器信号端S为低电平,模块上自带的红色 LED点亮;当没有物体碰撞轻触开关时,2和3不导通,3被4.7K的电阻R1上拉为高电平,即传感器信号端S为高电平,此时自带红色LED将熄灭。大家是不是感觉原理似曾相识,因为与倾斜模块的电路原理几乎一样,不一样的只是导通方式不同。
实验器材
碰撞传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
https://sourl.cn/26pdb9
碰撞传感器
*/
int val = 0;
void setup() {
Serial.begin(9600);//设置波特率为9600
pinMode(3, INPUT);//设置碰撞传感器引脚D3为输入模式
}
void loop() {
val = digitalRead(3);//读取碰撞传感器的值
Serial.print(val);//换行打印出来
if (val == 0) {//碰撞到了val为0
Serial.print(" ");
Serial.println("The end of his!");
delay(100);
}
else {//没碰撞val为1
Serial.print(" ");
Serial.println("All going well");
delay(100);
}
}
代码说明
设置方法和实验九类似,这里就不多做介绍了。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。串口监视器显示对应数据和字符。实验中,传感器上弹片下压时,val为0,模块红色LED点亮,串口监视器显示“The end of his!”字符;当松开弹片时,val为1,模块红色LED熄灭,串口监视器显示“All going well!”字符,如下图。
实验十一 霍尔传感器检测南极磁场
实验说明
霍尔传感器,它主要采用A3144线性霍尔元件。该元件P1是由电压调整器、霍尔电压发生器、差分放大器、史密特触发器,温度补偿电路和集电极开路的输出级组成的磁敏传感电路,其输入为磁感应强度,输出是一个数字电压讯号。它是单极开关型的霍尔传感器,只感应南极磁场。
实验中,我们利用霍尔传感器检测南极磁场,将测试结果在串口监视器上显示。
实验原理
传感器感应到无磁场或北极磁场时,信号端为高电平;感应到南极磁场时,信号端为低电平。当感应磁场强度越强时,感应距离越长。
实验器材
霍尔传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
https://sourl.cn/26pdb9
霍尔传感器
*/
int val = 0;
int hallPin = 3; //霍尔传感器管脚接数字口3
void setup() {
Serial.begin(9600);//设置波特率为9600
pinMode(hallPin, INPUT);//设置管脚模式为输入模式
}
void loop() {
val = digitalRead(hallPin);//读取霍尔传感器的电平值
Serial.print(val);//打印val
if (val == 0) {//存在南极磁场
Serial.println(" The magnetic field at the South Pole!");
}
else {//否则
Serial.println(" Just be all normal!");
}
}
代码说明
设置方法和实验四类似,这里就不多做介绍了。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。当传感器感应到无磁场或北极磁场时,串口监视器显示“1 Just be all normal!”,并且传感器上的LED处于熄灭状态,当传感器感应到南极磁场时,传感器监视器显示“0 The magnetic field at the South Pole!”,并且模块上的LED被点亮。
实验十二 干簧管检测附近磁场
实验说明
干簧管模块:它主要采用MKA10110 绿色磁簧元件元件。簧管是干式舌簧管的简称,是一种有触点的无源电子开关元件,具有结构简单,体积小便于控制等优点。它的外壳是一根密封的玻璃管,管中装有两个铁质的弹性簧片电板,还灌有一种惰性气体。与前面我们学习到霍尔传感器不同,霍尔传感器检测南极磁场,而干簧管传感器检测附近有无磁场。
实验中,我们通过读取模块上S端高低电平,判断模块附近是否存在磁场;并且,我们在串口监视器上显示测试结果。
实验原理
平时状态下,玻璃管中的两个由特殊材料制成的簧片是分开的,此时信号端S被R2拉为高电平,LED熄灭。当有磁性物质靠近玻璃管时,在磁场磁力线的作用下,管内的两个簧片被磁化而互相吸引接触,簧片就会吸合在一起,使结点所接的电路连通,即信号端S连通GND,此时LED点亮。外磁力消失后,两个簧片由于本身的弹性而分开,线路也就断开了。该传感器就是利用元件这一特性,搭建电路将磁场信号转换为高低电平变换信号。
实验器材
干簧管模块*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
https://sourl.cn/26pdb9
干簧管模块
*/
int val = 0;
int reedPin = 5; //定义干簧管模块信号管脚接数字口D5
void setup() {
Serial.begin(9600);//设置波特率为9600
pinMode(reedPin, INPUT);//设置模式为输入
}
void loop() {
val = digitalRead(reedPin);//读取数字电平
Serial.print(val);//串口显示出来
if (val == 0) {//附近存在磁场
Serial.print(" ");
Serial.println("A magnetic field");
delay(100);
}
else {//无磁场
Serial.print(" ");
Serial.println("There is no magnetic field");
delay(100);
}
}
代码说明
设置方法和前面实验类似,需要区分的是,这里是检测磁场,前面实验是检测南极磁场。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。串口监视器显示对应数据和字符。实验中,当传感器检测到磁场时,val为0且模块红色LED点亮,串口监视器显示“A magnetic field”字符;没有检测到磁场时,val为1,模块上LED熄灭,串口监视器显示“There is no magnetic field”字符,如下图。
实验十三 附近有人吗
实验说明
人体红外热释传感器:它主要采用RE200B-P传感器元件。它是一款基于热释电效应的人体热释运动传感器,能检测到人体或动物身上发出的红外线,配合菲涅尔透镜能使传感器探测范围更远更广。
实验中,我们通过读取模块上S端高低电平,判断附近是否有人在运动;并且,我们在串口监视器上显示测试结果。
实验原理
这个原理图可能较前面的模块稍复杂,我们一个个来看。左上角那部分是电压转换,5V转3.3V,因为我们模块上用到的传感器工作电压为3.3V,不能直接用5V供电,所以需要一个电压转换电路。当传感器附近没有检测到人即没有接收到红外信号时,传感器1脚输出低电平,此时模块上LED两端有电压就会点亮,此时MOS管Q1导通,信号端S检测到低电平。当传感器附近检测到人即接收到红外信号时,传感器1脚输出高电平,此时模块上LED两端没有电压就会熄灭,此时MOS管Q1不导通,信号端S则检测到被10K上拉电阻R5拉高的高电平。
实验器材
人体红外热释传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
人体红外热释传感器
https://sourl.cn/26pdb9
*/
int val = 0;
int pirPin = 8; //定义人体红外传感器管脚为数字口8
void setup() {
Serial.begin(9600); //设置波特率为9600
pinMode(pirPin, INPUT); //设置传感器为输入模式
}
void loop() {
val = digitalRead(pirPin); //读取传感器的值
Serial.print(val);//打印val值
if (val == 1) {//附近有人运动,输出高电平
Serial.print(" ");
Serial.println("Some body is in this area!");
delay(100);
}
else {//没检测到人体运动,则输出低电平
Serial.print(" ");
Serial.println("No one!");
delay(100);
}
}
代码说明
设置方法和实验四类似,这里就不多做介绍了。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。
串口监视器显示对应数据和字符。实验中,传感器检测到附近有人在运动时,val为1,模块上LED熄灭,串口监视器显示“Somebody is in this area!”字符;没有检测到人运动时,item为0,模块上LED点亮,串口监视器显示“No one!”字符,如下图。
实验十四 有源蜂鸣器模块播放声音
实验说明
有源蜂鸣器模块:一个无源蜂鸣器模块(功放模块)。这个实验中,我们控制有源蜂鸣器发出声音。有源蜂鸣器元件内部自带震荡电路,控制时,我们只需要给蜂鸣器元件足够的电压,蜂鸣器就自动响起。
实验中,我们只是控制这个模块上有源蜂鸣器的循环响起声音。
实验原理
正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消从原理图中可以看出来在,蜂鸣器一端通过串联一个电阻R2连接到电压正极,另一端通过一个NPN三极管Q1连接到GND,所以只要导通这个三极管,让蜂鸣器一端连通GND,有缘蜂鸣器就会响起来。三极管控制端基极也就是连接到R1电阻一端为高电平,三极管Q1就导通了,三极管基极被下拉电阻R3拉低,所以常态为不导通,当我们用单片机IO口输出一个高电平到基极三极管就导通了。
即S信号端设置为高电平时,三极管导通,模块上蜂鸣器响起;设置为低电平时,三极管不导通,模块上蜂鸣器没有声音。
实验器材
有源蜂鸣器模块*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
有源蜂鸣器模块
https://sourl.cn/26pdb9
*/
int buzzer = 3; //定义蜂鸣器接管脚D3
void setup() {
pinMode(buzzer, OUTPUT);//设置输出模式
}
void loop() {
digitalWrite(buzzer, HIGH); //发声
delay(1000);
digitalWrite(buzzer, LOW); //停止发声
delay(1000);
}
代码说明
在实验中,我们把管脚设置为3,设置为高时,模块上有源蜂鸣器响起;设置为低时,模块上有源蜂鸣器关闭声音。
测试结果
上传实验程序成功,上电后,模块上有源蜂鸣器响起1秒,关闭1秒,循环交替。
实验十五 8002b功放 喇叭模块
实验说明
8002b功放 喇叭传感器,这个模块主要的元件有一个可调电位器,一个喇叭,一个音频放大芯片;前面课程中我们介绍了套件中的有源蜂鸣器模块的使用方法。在这里我们介绍下套件中的8002b功放 喇叭模块,这个模块主要功能是:可以对输出的小音频信号进行放大,大概放大倍数为8.5倍,并且可以通过自带的小功率喇叭播放出来,也可以用来播放音乐,作为一些音乐播放设备的外接扩音设备。
实验中,我们利用8002b功放 喇叭模块上发出各种频率的声音。
实验原理
其实它就类似于于一个无源蜂鸣器,前面我们介绍过,有缘蜂鸣器自带振荡源,只要我们给它足够的电压就能响起来,而无源蜂鸣器元件内部不带震荡电路,控制时我们需要在元件正极输入不同频率的方波(电压5V),负极接地,从而控制蜂鸣器响起不同频率的声音。
实验器材
8002b功放 喇叭模块*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
功放喇叭模块
https://sourl.cn/26pdb9
*/
int beeppin = 3; //定义喇叭引脚为D3
void setup() {
pinMode(beeppin, OUTPUT);//定义功放喇叭模块数字口为输出模式
}
void loop() {
tone(beeppin, 262);//DO播放1000ms
delay(1000);
tone(beeppin, 294);//Re播放750ms
delay(750);
tone(beeppin, 330);//Mi播放625ms
delay(625);
tone(beeppin, 349);//Fa播放500ms
delay(500);
tone(beeppin, 392);//So播放375ms
delay(375);
tone(beeppin, 440);//La播放250ms
delay(250);
tone(beeppin, 494);//Si播放125ms
delay(125);
noTone(beeppin);//停止播放一秒
delay(1000);
}
代码说明
在本实验中,我们用到了函数tone()。tone(pin, frequency);pin为生成音调的arduino引脚,我们设置了3;frequency为音调频率,单位为Hz,数据类型为unsigned int(范围0 ~ 65,535 ((2^16) - 1))。tone函数在引脚上生成指定频率(和50%占空比)的方波。 直到调用noTone()(停止生成音调)为止。该引脚可以连接到压电蜂鸣器或其他扬声器以播放音调。tone()一次只能产生一种音调。 如果某个音色已经在其他引脚上播放,则对tone()的调用将无效。使用tone()函数将干扰引脚3和11(Mega以外的板上)上的PWM输出(我们会在后面的课程中讲到PWM)。同时tone()不能产生低于31Hz的音调。如果要在多个引脚上演奏不同的音高,则需要在一个引脚上调用noTone(),然后在下一个引脚上调用tone()。
测试结果
当我们上传实验程序成功,上电后,功放喇叭模块循环播放对应频率对应节拍的声音:DO一拍,Re0.75拍,Mi0.625拍,Fa半拍,So0.375拍,La四分之一拍,Si0.125拍。
实验十六 130电机模块
实验说明
在生活中,我们经常需要驱动一个风扇转动或者或者一个小水泵。为了方便接线,我们特别设计了这个130电机驱动模块。模块设计有两个定位孔,与伺服电机控制兼容。该模块效率高,风扇质量好。
该电机控制模块采用HR1124S电机控制芯片。HR1124S是应用于直流电机方案的单通道H桥驱动器芯片。HR1124S的H桥驱动部分采用低导通电阻的PMOS和NMOS功率管。低导通电阻保证芯片低的功率损耗,使得芯片安全工作更长时间。此外HR1124S拥有低待机电流,低静态工作电流,这些性能使HR1124S易用于玩具方案。
该模块兼容各种单片机控制板,如arduino系列单片机。模块上自带的防反插红色端子间距为2.54mm,实验中,我们可通过输出到两个信号端IN+和IN-的电压方向来控制电机的转动方向,让电机转动起来。
实验原理
芯片是助于驱动电机,电机所需电流较大,我们无法用三极管驱动更无法直接用IO口驱动,让电机转动起来很简单,给电机两端电压即可,不同电压方向电机转向也不相同,额度电压内,电压越大,电机转动得越快;反之电压越低,电机转动得越慢,甚至无法转动。所以我们可以用PWM口来控制电机的转速,我们这里还没有学到PWM,所以先用高低电平来控制电机。
实验器材
130电机模块*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
130电机模块
https://sourl.cn/26pdb9
*/
//定义电机的两个管脚接口,分别为3, 4
int INA = 3;
int INB = 4;
void setup() {
//设置电机引脚为输出
pinMode(INA, OUTPUT);
pinMode(INB, OUTPUT);
}
void loop() {
//逆时针转
digitalWrite(INA, HIGH);
digitalWrite(INB, LOW);
delay(2000);
//停止
digitalWrite(INA, LOW);
digitalWrite(INB, LOW);
delay(1000);
//顺时针转
digitalWrite(INA, LOW);
digitalWrite(INB, HIGH);
delay(2000);
//停止
digitalWrite(INA, LOW);
digitalWrite(INB, LOW);
delay(1000);
}
代码说明
将管脚设置为3、4,当3输出为低电平即INA输入低电平,4输出为高电平即INB输入高电平时(输入与输出是相对的,这个实验中对于我们单片机的引脚来说,单片机输出高低电平,自然模块就为输入了,即从单片机输出到模块;例如按键模块则相反,是模块输出到单片机),电机顺时针旋转;当3输出为高电平,4输出为低电平时,电机逆时针旋转;当两个管脚都设置为低电平时,电机停止转动。
测试结果
烧录好测试130电机代码,按照接线图连接好线;上电后,风扇顺时针转动2秒;停止1秒;逆时针转动2秒;停止1秒;循环交替。
实验十七 插件RGB模块调节LED颜色
实验说明
共阴RGB模块,它采用F10-全彩RGB雾状共阴LED元件。控制时,我们需要将模块R G B连接单片机PWM口,剩下那个管脚接GND(共阳RGB的话剩下那个管脚接VCC)。那么什么是PWM呢?PWM是使用数字手段来控制模拟输出的一种手段。使用数字控制产生占空比不同的方波(一个不停在高电平与低电平之间切换的信号)来控制模拟输出。一般来说端口的输入电压只有两个0V与5V,也就是低电平和高电平。如果想要改变灯的亮度怎么办呢个?有同学说串联电阻,对,这个方法是正确的。但是,如果想要得到不同的亮度,且在不同亮度之间来回变动怎么办呢?不可能不停地切换电阻吧。这种情况下就需要使用PWM了,那它是怎么控制的呢?
对于Arduino的数字端口电压输出只有LOW与HIGH两个,对应的就是0V与5V的电压输出,可以把LOW定义为0,HIGH定义为1,1秒内让Arduino输出500个0或者1的信号。如果这500个全部为1,那就是完整的5V,如果全部为0,那就是0V。如果010101010101这样输出,刚好一半,端口输出的平均电压就为2.5V了。这个和放映电影是一个道理,咱们所看的电影并不是完全连续的,它其实是每秒输出25张图片。在这种情况下,人的肉眼是分辨不出来的,看上去就是连续的了。PWM也是同样的道理,如果想要不同的电压,就控制0与1的输出比例控制就可以了。当然这和真实的连续输出还是有差别的,单位时间内输出的0,1信号越多,控制的就越精确。
实验中,我们通过实验程序,控制模块上RGB LED显示几个常用颜色。
实验原理
那么我们这个实验就是要通过调节3个PWM值,控制LED元件显示红光、绿光和蓝光的比例,从而控制RGB模块上LED显示不同颜色灯光。当设置的PWM值越大,对应显示的颜色比例越重。理论上来说,通过调节这3中颜色光的混合比例,可以模拟出所有颜色的灯光。
实验器材
共阴RGB模块*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
RGB红绿蓝闪烁
https://sourl.cn/26pdb9
*/
int redPin = 9; //定义红色接D9
int greenPin = 10; //定义绿色接D10
int bluePin = 11; //定义蓝色接D11
void setup(){
//输出口都设置为输出模式
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop(){
//红色
digitalWrite(redPin,HIGH);
digitalWrite(greenPin,LOW);
digitalWrite(bluePin,LOW);
delay(1000);
//绿色
digitalWrite(redPin,LOW);
digitalWrite(greenPin,HIGH);
digitalWrite(bluePin,LOW);
delay(1000);
//蓝色
digitalWrite(redPin,LOW);
digitalWrite(greenPin,LOW);
digitalWrite(bluePin,HIGH);
delay(1000);
}
代码2:
/*
RGB七彩灯闪烁
https://sourl.cn/26pdb9
*/
int redPin = 9; //定义红色接D9
int greenPin = 10; //定义绿色接D10
int bluePin = 11; //定义蓝色接D11
void setup() {
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop() {
//红色(255, 0, 0)
analogWrite(9, 255);
analogWrite(10, 0);
analogWrite(11, 0);
delay(1000);
//橙色(255, 97, 0)
analogWrite(9, 255);
analogWrite(10, 97);
analogWrite(11, 0);
delay(1000);
//黄色(255, 255, 0)
analogWrite(9, 255);
analogWrite(10, 255);
analogWrite(11, 0);
delay(1000);
//绿色(0, 255, 0)
analogWrite(9, 0);
analogWrite(10, 255);
analogWrite(11, 0);
delay(1000);
//蓝色(0, 0, 255)
analogWrite(9, 0);
analogWrite(10, 0);
analogWrite(11, 255);
delay(1000);
//青色(0, 255, 255)
analogWrite(9, 0);
analogWrite(10, 255);
analogWrite(11, 255);
delay(1000);
//紫色(160, 32, 240)
analogWrite(9, 160);
analogWrite(10, 32);
analogWrite(11, 240);
delay(1000);
}
代码1:
代码说明
代码1说明:
- 代码1中,R G B代表控制模块上 LED对应的红绿蓝3种颜色对应的端口,根据接线图我们接到了D9 D10 D11,设置为9 10 11,后面设置对应高低,设置GRB LED中红绿蓝3个灯是否会亮,设置为高(对应数字口为高电平),对应的颜色就亮。
- 现在观察代码,这个代码非常简单,只是简单的控制模块上RGB LED显示红色1秒、
绿色1秒、蓝色1秒,循环交替。
代码2说明:
1.代码2中,我们使用到了PWM输出,根据接线图我们接到了D9 D10
D11,设置为9 10 11。后面设置数据代表设置模块上LED 红绿蓝颜色的比例,设置的
数据越大(对应的PWM值越大),设置该颜色的比例越大。
2.实验中我们通过设置对应数值,调节RGB LED上红绿蓝颜色比例,从而控制RGB LED显示对应颜色。所以理论上来说可以设置的颜色有256*256*256种(详细可参考下面常用RGB颜色表)。
常用RGB颜色表
R | G | B | R | G | B | R | G | B | |||
黑色 | 0 | 0 | 0 | 黄色 | 255 | 255 | 0 | 浅灰蓝色 | 176 | 224 | 230 |
象牙黑 | 41 | 36 | 33 | 香蕉色 | 227 | 207 | 87 | 品蓝 | 65 | 105 | 225 |
灰色 | 192 | 192 | 192 | 镉黄 | 255 | 153 | 18 | 石板蓝 | 106 | 90 | 205 |
冷灰 | 128 | 138 | 135 | dougello | 235 | 142 | 85 | 天蓝 | 135 | 206 | 235 |
石板灰 | 112 | 128 | 105 | forum gold | 255 | 227 | 132 | ||||
暖灰色 | 128 | 128 | 105 | 金黄色 | 255 | 215 | 0 | 青色 | 0 | 255 | 255 |
黄花色 | 218 | 165 | 105 | 绿土 | 56 | 94 | 15 | ||||
白色 | 255 | 255 | 255 | 瓜色 | 227 | 168 | 105 | 靛青 | 8 | 46 | 84 |
古董白 | 250 | 235 | 215 | 橙色 | 255 | 97 | 0 | 碧绿色 | 127 | 255 | 212 |
天蓝色 | 240 | 255 | 255 | 镉橙 | 255 | 97 | 3 | 青绿色 | 64 | 224 | 208 |
白烟 | 245 | 245 | 245 | 胡萝卜色 | 237 | 145 | 33 | 绿色 | 0 | 255 | 0 |
白杏仁 | 255 | 235 | 205 | 桔黄 | 255 | 128 | 0 | 黄绿色 | 127 | 255 | 0 |
cornsilk | 255 | 248 | 220 | 淡黄色 | 245 | 222 | 179 | 钴绿色 | 61 | 145 | 64 |
蛋壳色 | 252 | 230 | 201 | 翠绿色 | 0 | 201 | 87 | ||||
花白 | 255 | 250 | 240 | 棕色 | 128 | 42 | 42 | 森林绿 | 34 | 139 | 34 |
gainsboro | 220 | 220 | 220 | 米色 | 163 | 148 | 128 | 草地绿 | 124 | 252 | 0 |
ghostWhite | 248 | 248 | 255 | 锻浓黄土色 | 138 | 54 | 15 | 酸橙绿 | 50 | 205 | 50 |
蜜露橙 | 240 | 255 | 240 | 锻棕土色 | 135 | 51 | 36 | 薄荷色 | 189 | 252 | 201 |
象牙白 | 250 | 255 | 240 | 巧克力色 | 210 | 105 | 30 | 草绿色 | 107 | 142 | 35 |
亚麻色 | 250 | 240 | 230 | 肉色 | 255 | 125 | 64 | 暗绿色 | 48 | 128 | 20 |
navajoWhite | 255 | 222 | 173 | 黄褐色 | 240 | 230 | 140 | 海绿色 | 46 | 139 | 87 |
old lace | 253 | 245 | 230 | 玫瑰红 | 188 | 143 | 143 | 嫩绿色 | 0 | 255 | 127 |
海贝壳色 | 255 | 245 | 238 | 肖贡土色 | 199 | 97 | 20 | ||||
雪白 | 255 | 250 | 250 | 标土棕 | 115 | 74 | 18 | 紫色 | 160 | 32 | 240 |
乌贼墨棕 | 94 | 38 | 18 | 紫罗蓝色 | 138 | 43 | 226 | ||||
红色 | 255 | 0 | 0 | 赫色 | 160 | 82 | 45 | jasoa | 160 | 102 | 211 |
砖红 | 156 | 102 | 31 | 马棕色 | 139 | 69 | 19 | 湖紫色 | 153 | 51 | 250 |
镉红 | 227 | 23 | 13 | 沙棕色 | 244 | 164 | 96 | 淡紫色 | 218 | 112 | 214 |
珊瑚色 | 255 | 127 | 80 | 棕褐色 | 210 | 180 | 140 | 梅红色 | 221 | 160 | 221 |
耐火砖红 | 178 | 34 | 34 | ||||||||
印度红 | 176 | 23 | 31 | 蓝色 | 0 | 0 | 255 | ||||
栗色 | 176 | 48 | 96 | 钴色 | 61 | 89 | 171 | ||||
粉红 | 255 | 192 | 203 | dodger blue | 30 | 144 | 255 | ||||
草莓色 | 135 | 38 | 87 | jackie blue | 11 | 23 | 70 | ||||
橙红色 | 250 | 128 | 114 | 锰蓝 | 3 | 168 | 158 | ||||
蕃茄红 | 255 | 99 | 71 | 深蓝色 | 25 | 25 | 112 | ||||
桔红 | 255 | 69 | 0 | 孔雀蓝 | 51 | 161 | 201 | ||||
深红色 | 255 | 0 | 255 | 土耳其玉色 | 0 | 199 | 140 |
测试结果
上传实验程序1成功,上电后,模块上RGB LED循环显示红绿蓝3种颜色,间隔时间为1秒。上传实验程序2成功,上电后,模块上RGB LED显示红橙黄绿蓝青紫白7种颜色,循环不止,间隔时间为1秒。
实验十八 旋转电位器传感器读取模拟值
实验说明
前面我们学习过的传感器,都是数字传感器,,有一个旋转电位器传感器,它与我们前面学到的传感器不同,它是一个模拟传感器,意思是例如我们前面学习的按键模块,当按键没有按下去时,我们读取到高电平(5V),当按键按下去时,我们读取到低电平(0V),而在0~5V中间的电压值,我们数字IO口无法读取到,当然按键模块也只能输出高低电平。而模拟传感器就可以通过我们UNO板上的模拟口(A0~A5)读取。
实验中,我们利用这个模块测试对应的模拟值;并且,我们在串口监视器上显示测试结果。
实验原理
我们学过滑动变阻器的就很好理解,随着滑动变阻器上的滑片移动,滑片上的电压随着改变。我们的旋转电位器原理也是如此,它主要采用一个10K可调电阻。通过旋转电位器,我们可以改变电阻大小,信号端S检测到电压变化(0~5V),而这个电压变化是一个连续变化的模拟量,也就是在0~5V内可以取任意值,我们必须先对这个模拟量进行ADC采集,来测量连续的这些模拟量,A/D 是模拟量到数字量的转换,依靠的是模数转换器(Analog to Digital Converter),简称ADC。我们的UNO板已经集成了ADC采集,我们直接使用就可以。
我们UNO开发板的ADC位数都是10位,一个 n 位的 ADC 表示这个 ADC 共有 2 的 n 次方个刻度。10 位的 ADC,输出的是从 0~1023 一共 1024 个数字量,也就是 2 的 10 次方个数据刻度,那么每个刻度就是5V/1024=0.0049V,这个也叫分辨率。
实验器材
旋转电位器传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
旋转电位器
https://sourl.cn/26pdb9
*/
int analogVal = 0;
int resPin = A0;
void setup() {
Serial.begin(9600);//设置波特率为9600
}
void loop() {
analogVal = analogRead(resPin);//读取电位器的值
Serial.println(analogVal);//打印模拟值
delay(100);//延时100毫秒
}
代码说明
- 在实验中,我们定义管脚变量名为analogVal,意思就是模拟值,前面我们又是用到数字传感器,我们这个实验用到的旋转电位器,它输出的是模拟值(0~1023),所以我们把管脚设置为模拟口,这里我们接A0。
- 实验四,我们讲到digitalRead()函数,我们这里讲讲analogRead()函数。analogRead(pin)这个函数从指定的模拟引脚pin读取值。 Arduino 板包含一个多通道、10 位模数转换器。 这意味着它会将 0 和工作电压(5V 或 3.3V我们这里是5V)之间的输入电压映射为 0 和 1023 之间的整数值。例如,在 Arduino UNO 上,这会产生以下读数之间的分辨率:5 伏/1024 单位即每单位 0.0049 伏 (4.9 mV)。在基于 ATmega 的板卡(UNO、Nano、Mini、Mega)上,读取模拟输入大约需要 100 微秒(0.0001 s),因此最大读取速率约为每秒 10,000 次。
- pin:要读取的模拟输入引脚的名称(大多数板上的A0到A5,Mega2560上的A0到A15)。设置1个整数变量item,将所测结果赋值给item。函数返回值为引脚上的模拟读数。虽然它受限于模数转换器的分辨率(0-1023 为 10 位或 0-4095 为 12 位)。数据类型:int。
- 串口监视器显示analogVal 的值,显示前需设置波特率(我们默认设置为9600,可更改)。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。串口监视器显示对应模拟值。实验中,顺时针旋转电位器,模拟值增大,逆时针旋转电位器,模拟值减小,范围为0-1023,如下图。
实验十九 水滴水蒸气传感器
实验说明
这是一个水滴传感器。它是一个模拟(数字)输入模块,也叫雨水、雨量传感器。可用于各种天气状况的监测,检测是否下雨及雨量的大小,转成数字信号(DO)和模拟信号(AO)输出,并广泛应用于Arduino 机器人套件,雨滴,下雨传感器,可用于各种天气状况的监测,并转成数定信号和 AO 输出,也可用于汽车自动刮水系统、智能灯光系统和智能天窗系统等。
实验中,我们将传感器信号端(S端)输入到plus 开发板的模拟口,感知模拟值的变化,并在串口监视器上显示出对应的模拟值。
实验原理
它的原理是通过电路板上裸露的印刷平行线检测水量的大小。水量越多,就会有更多的导线被联通,随着导电的接触面积增大,2脚输出的电压就会逐步上升。信号端S检测的模拟值就越大。除了可以检测水量的大小,它还可以检测空气中的水蒸气。传感器自带2个直径为4.8mm的定位孔,方便你将传感器固定在其他设备。
实验器材
水滴传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
水滴水蒸气传感器
https://sourl.cn/26pdb9
*/
int val = 0;
int Water = A0; //水蒸气传感器的PIN为A0
void setup() {
Serial.begin(9600);//设置波特率为9600
}
void loop() {
val = analogRead(A0); //读取水蒸气传感器的值
Serial.print("Water:");
Serial.println(val);
delay(100);
}
代码说明
设置方法和实验十八类似,这里就不多做介绍了。
测试结果
烧录好实验程序,按照接线图连接好线;利用USB接口上电后,进入串口监视器,设置波特率为9600。当水蒸气传感器上检测到水分时,输出的模拟值在串口监视器显示出来,水量越多输出的电压越大,模拟值越大,如下图。
实验二十 声音传感器检测声量
实验说明
声音传感器,实验中,我们利用这个传感器测试当前环境中的声音大小对应的模拟值,声音越大,模拟值越大;并且,我们在串口监视器上显示测试结果。
实验原理
它主要采用一个高感度麦克风元件和LM386芯片。高感度麦克风元件用于检测外界的声音。利用LM386芯片搭建合适的电路,我们对高感度麦克风检测到的声音进行放大,最大倍数为200倍。使用时我们可以通过旋转传感器上电位器,调节声音的放大倍数。调节时,顺时针调节电位器到尽头,放大倍数最大。
实验器材
声音传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
声音传感器
https://sourl.cn/26pdb9
*/
int val = 0;
int Microphone = A0; //麦克风传感器接A0
void setup() {
Serial.begin(9600);//设置波特率9600
}
void loop() {
val = analogRead(Microphone); //读取传感器的值赋给变量val
Serial.println(val); //换行打印传感器输出的模拟值
delay(100); //加延时100MS
}
代码说明
设置方法和实验十八类似,这里就不多做介绍了。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。串口监视器显示对应模拟值。实验中,我们顺时针旋转电位器和对准MIC头大声说话,可以看到模拟值数据变大,如下图。
实验二十一 光敏电阻传感器
实验说明
光敏电阻传感器,这是一个常用的光敏电阻传感器,它主要采用光敏电阻元件。该电阻元件电阻大小随着光照强度的变化而变化,该传感器就是利用光敏电阻元件这一特性,搭建电路将电阻变化转换为电压变化。光敏电阻传感器可以模拟人对环境光线的强度的判断,从而方便做出与人友好互动的应用。
接线时,我们将传感器信号端(S端)输入到arduino系列单片机的模拟口,感知模拟值的变化,并在串口监视器上显示出对应的模拟值。
实验原理
当没有亮光时,电阻大小为0.2MΩ,信号端(2点)检测的电压接近0,当随着光照抢度增大,光线传感器的电阻值越来越小,所以信号端检测的电压越来越小。
实验器材
光敏电阻传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
光敏电阻传感器
https://sourl.cn/26pdb9
*/
int val = 0;
int photoPin = A0; //光敏电阻传感器接模拟口A0
void setup() {
Serial.begin(9600);//设置波特率9600
}
void loop() {
val = analogRead(photoPin);//读取传感器器的值
Serial.println(val);//打印值
delay(100);//延时100MS
}
代码说明
设置方法和实验十八类似,这里就不多做介绍了。
测试结果
烧录好实验程序,按照接线图连接好线,利用USB线上电后,打开软件串口监视器,设置波特率为9600,我们可以看到对应光照强度的模拟值,光照越强,模拟值越大,如下图。
实验二十二 NTC-MF52AT模拟温度传感器
实验说明
NTC-MF52AT模拟温度传感器,它的原理像光敏电阻传感器,只是感应的器件不同,实验中,我们将传感器信号端接到Keyes Uno Plus 开发板模拟口,读出对应的模拟值。我们可以利用模拟值,通过特定公式,计算出当前环境的温度。由于温度计算公式比较复杂,这里就不多介绍了。实验中,我们只是读取对应的模拟值。
实验原理
这个模块主要采用NTC-MF52AT热敏电阻元件。NTC-MF52AT热敏电阻元件能够时感知周边环境温度的变化,电阻大小随着温度的变化而变化,从而引起信号端S的电压变化。该传感器就是利用NTC-MF52AT热敏电阻元件这一特性,搭建电路将电阻变化转换为电压变化。
实验器材
Keyes DIY电子积NTC-MF52AT模拟温度传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
模拟温度传感器
https://sourl.cn/26pdb9
*/
int val;
int ntcPin = A0; //设置NTC-MF52AT模拟温度传感器接模拟口A0
void setup() {
Serial.begin(9600);//设置波特率为9600
}
void loop() {
val = analogRead(ntcPin); //读取温度模拟值
Serial.println(val); //读取并打印热敏电阻模拟值
delay(100);//延时100毫秒
}
代码说明
设置方法和实验十八类似,这里就不多做介绍了。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。串口监视器显示对应的模拟值,温度越高,模拟值越大。
实验二十三 薄膜压力传感器
正
实验说明
薄膜压力传感器,薄膜压力传感器是基于新型纳米压敏材料辅以舒适杨式模量的超薄薄膜衬底一次性贴片而成,兼具防水和压敏双重功能。
实验中,我们通过采集模块上S端模拟信号,判断压力大小,模拟值越小,压力越大;并且,我们在串口监视器上显示测试结果。
实验原理
当传感器感知到外界压力时,传感器电阻值发生变化,我们采用电路将传感器感知压力变化的压力信号转换成相应变化强度的电信号输出。这样我们就可以通过检测电压信号变化就可以得到压力变化情况。
实验器材
薄膜压力传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
薄膜压力传感器
https://sourl.cn/26pdb9
*/
int val = 0;
int Film = A0; //薄膜压力传感器接A0
void setup() {
Serial.begin(9600);//设置波特率为9600
}
void loop() {
val = analogRead(Film);//读取模拟值
Serial.println(val);//打印模拟值
delay(100);//延时100MS
}
代码说明
设置方法和实验十八类似,这里就不多做介绍了。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。当我们用手挤压薄膜时,可以看到我们在串口监视器打印的模拟值变小,如下图。
实验说明
火焰传感器,它对火焰光谱特别灵敏并且灵敏度可调,性能稳定,是救火机器人必备部件,在机器人比赛中,远红外火焰探头起着非常重要的作用,它可以用作机器人的眼睛来寻找火源或足球。利用它可以制作灭火机器人、足球机器人等。
该传感器有两个信号输出端,分别可输出数字信号与模拟信号。实验中,我们分别读取模块传感器数字信号与模拟信号,将测试结果在串口监视器上显示。
实验原理
红外火焰传感器能够探测到波长在700纳米~1000纳米范围内的红外光,探测角度为60,其中红外光波长在880纳米附近时,其灵敏度达到最大。从电路原理图我们可以看到,上电后红色LED2先点亮,红色LED1处于熄灭状态,检测到火焰时,数字信号端D0输出低电平,红色LED1将点亮。红外火焰探头将外界红外光的强弱变化转化为电流的变化,通过A/D转换器反映为0~1023范围内数值的变化。外界红外光越强,数值越小;红外光越弱,数值越大。
实验器材
火焰传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
火焰传感器
https://sourl.cn/26pdb9
*/
//火焰传感器两个管脚,分别接A0、A1,这里A0作为数字口用
int digitalPin = A0;
int analogPin = A1;
//以下两个变量分别存放数字信号与模拟信号
int analogVal = 0;
int digitalVal = 0;
void setup() {
Serial.begin(9600); //设置波特率为9600
pinMode(digitalPin, INPUT); //数字引脚A0设置为输入模式
}
void loop() {
analogVal = analogRead(analogPin); //读取模拟信号
digitalVal = digitalRead(digitalPin); //读取数字信号
Serial.print(analogVal); //打印模拟值
Serial.print(" "); //空格隔开,方便观察
Serial.println(digitalVal); //打印数字值
delay(100); //延时100毫秒
}
代码说明
我们这里用到两个管脚,我们根据接线分别定义到A0,A1,然后我们前面介绍过了,模拟口也可作为数字口使用,我们这里就把A0当做数字口来使用。
测试结果
上传实验程序成功,利用USB线上电后,传感器模块上的红色LED2点亮,红色LED1熄灭,打开串口监视器,设置波特率为9600。当传感器检测到火焰时,红色LED1点亮,数字值由1变为0,模拟值变小,如下图。
实验二十五 MQ-3 酒精传感器
实验说明
MQ-3酒精传感器,它跟我们前面介绍的烟雾传感器原理几乎相同,就是检测器件不同而已,主要用到了MQ-3 酒精、乙醇蒸汽传感器元件。该元件所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在酒精蒸汽时,传感器的电导率随空气中酒精气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。 MQ-3气体传感器对酒精的灵敏度高,可以抵抗汽油、烟雾、水蒸气的干扰。这种传感器可检测多种浓度酒精气氛,是一款适合多种应用的特种传感器。
实验中,我们读取传感器A0端模拟值,和D0端数字值,判断空气中酒精蒸汽的含量,以及它们是否超标。
实验原理
MQ-3属于表面电阻控制型酒精气体浓度气敏传感器,其敏感材料是活性很高的金属氧化物半导体,最常用的如SnO2(二氧化锡)。当N型半导体的表面,在高温下遇到离解能力较小(易失去电子)的还原性气体时,气体分子中的电子将向MQ3气敏电阻表面转移,使气敏电阻中的自由电子浓度增加,电阻率降低,电阻减小。半导体式传感器是利用一些金属氧化物半导体材料,在一定温度下,电导率随着环境气体成份的变化而变化的原理制造的,MQ-3酒精传感器就是其中一种,它是利用二氧化锡在高温下遇到酒精气体时,电阻会急剧减小的原理制造的。
使用时,A0端读取对应酒精蒸汽的模拟值;D0端连接一个LM393芯片(比较器),我们可以通过电位器调节测量酒精蒸汽报警临界点,在D0输出数字值。当测量酒精蒸汽含量超过临界点时,D0端输出低电平;测量酒精蒸汽含量没超过临界点时,D0端输出高电平。
实验器材
MQ-3酒精传感器*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
课程 26
MQ-3酒精传感器
*/
//酒精传感器两个管脚,分别接A0、A1,这里A0作为数字口用
int digitalPin = A0;
int analogPin = A1;
//以下两个变量分别存放数字信号与模拟信号
int analogVal = 0;
int digitalVal = 0;
void setup() {
Serial.begin(9600); //设置波特率为9600
pinMode(digitalPin, INPUT); //数字引脚A0设置为输入模式
}
void loop() {
analogVal = analogRead(analogPin); //读取模拟信号
digitalVal = digitalRead(digitalPin); //读取数字信号
Serial.print(analogVal);
if (digitalVal == 1) {
Serial.println(" Normal");
}
else {
Serial.println(" Exceeding");
}
delay(100); //延时100毫秒
}
代码说明
设置方法和实验二十四类似,这里就不多做介绍了。
测试结果
上传实验程序成功,利用USB线上电后,模块上红LED点亮,打开串口监视器,设置波特率为9600。串口监视器显示对应数据和字符。实验中,我们可以看到当测试的模拟值小于等于646时,气体含量没有超过临界点,黄绿色LED处于熄灭状态;当测试的模拟值大于等于650时,气体含量超过临界点,黄绿色LED点亮;那么就代表酒精蒸汽含量临界点对于的模拟值在646-650之间,我们可以通过旋转传感器上电位器,调节临界点。
实验二十六 SK6812 RGB模块
实验说明
前面我们学习了插件RGB模块,利用PWM信号对模块的三个引脚进行调色。6812 RGB模块,但是这个SK6812 RGB 模块驱动原理不与我们前面学习过的插件RGB模块相同,而且只需要一个引脚就能控制,这是一个集控制电路与发光电路于一体的智能外控LED光源。每个LED原件其外型与一个5050LED灯珠相同,每个元件即为一个像素点,我们这个模块上有四个灯珠即四个像素,
实验中,我们分别使不同的灯亮出不同的颜色。
实验原理
从原理图中我们可以看出,这四个像素点灯珠都是串联起来的,其实不论多少个,我们都可以用一个引脚控制任一一个灯,并且让它显示任一种颜色。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和12V高压可编程定电流控制部分,有效保证了像素点光的颜色高度一致。
数据协议采用单线归零码的通讯方式,像素点在上电复位以后,S端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器。这个6812RGB通讯协议与驱动已经在底层封装好了,我们直接调用函数的接口就可以使用,简单方便,LED具有低电压驱动,环保节能,亮度高,散射角度大,一致性好,超低功率,超长寿命等优点。
实验器材
6812 RGB模块*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
6812RGB模块
https://sourl.cn/26pdb9
*/
//添加RGB6812库文件
#include <Wire.h>
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel rgb_display(8); //定义一个像素的类
void setup() {
rgb_display.begin(); //启动6812RGB
rgb_display.setPin(8); //设置6812管脚接数字口8
rgb_display.setBrightness(100); //设置亮度为100,范围为0~255
}
void loop() {
rgb_display.setPixelColor(0, 255, 0, 0); //第一颗灯珠亮红色
rgb_display.setPixelColor(1, 0, 255, 0); //第二颗灯珠亮绿色
rgb_display.setPixelColor(2, 0, 0, 255); //第三颗灯珠亮蓝色
rgb_display.setPixelColor(3, 255, 255, 255); //第四颗灯珠亮白色
rgb_display.show(); //显示灯珠颜色
}
代码说明
这里使用到两个库函数库函数的添加方法请查看第三章第六小节。
我们介绍下主要的几个函数接口及功能:
rgb_display.begin();这个函数用来初始化6812RGB,这是必要的
rgb_display.setPin(8);这个函数用来设置6812RGB所连接的引脚,是必要的
rgb_display.setBrightness(100);这个函数用来设置6812RGB显示的亮度,范围是(0~255),值越大,灯珠越亮,如果我们没有设置亮度,那么默认255,也就是最亮。
rgb_display.setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b);这个函数用来设置6812RGB的灯珠号也就是位置,及每颗灯珠的颜色。
rgb_display.show();这个函数用来设置显示6812RGB,是必要的,如果没有这条语句,灯珠将不刷新显示
测试结果
烧录好实验程序,按照接线图连接好线,上电后,我们可以看到模块上的四个灯珠分别亮红绿蓝白色,如下图所示。
实验二十七 红外遥控与接收
实验说明
我们前面也接触了红外信号了,红外线是波长介于微波和可见光之间的电磁波,波长在 760 纳米到 1 毫米之间,是波形比红光长的非可见光。自然界中的一切物体,只要它的温度高于绝对零度(-273)就存在分子和原子的无规则运动,其表面就会不停的辐射红外线。当然了,虽然是都辐射红外线,但是不同的物体辐射的强度是不一样的,而我们正是利用了这一点把红外技术应用到我们的实际开发中。
红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、 空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、 辐射、 有毒气体、 粉尘等环境下, 采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波;红外接收电路由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器。
这一实验中,我们了解下红外接收传感器的使用方法。红外接收传感器主要采用VS1838B红外接收传感器元件。该元件是集接收、放大、解调一体的器件,内部IC就已经完成了解调,输出的就是数字信号。它可接收标准38KHz调制的遥控器信号。
实验中,我们利用红外接收传感器接收外部红外发射设备发射的红外信号,并将接收信号在串口监视器上显示。
实验原理
在实际的通信领域,发出来的信号一般有较宽的频谱,而且都是在比较低的频率段分布大量的能量,所以称之为基带信号,这种信号是不适合直接在信道中传输的。为便于传输、提高抗干扰能力和有效的利用带宽,通常需要将信号调制到适合信道和噪声特性的频率范围内进行传输,这就叫做信号调制。在通信系统的接收端要对接收到的信号进行解调,恢复出原来的基带信号。这部分通信原理的内容,大家了解一下即可。我们用到的红外遥控器里的红外通信,通常是使用 38K 左右的载波进行调制的。
红外遥控系统的主要部分为调制、发射和接收。红外遥控是以调制的方式发射数据,就是把数据和一定频率的载波进行“与”操作,这样既可以提高发射效率又可以降低电源功耗。调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,如图2所示,这是由发射端所使用的455kHz晶振决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。38KH载波发射(完整的发射)如下图。
实验器材
红外接收模块*1 | Arduino主板*1 | 连接线*1 |
接线图
实验程序
/*
红外接收模块
https://sourl.cn/26pdb9
*/
#include <IRremote.h>
int RECV_PIN = 10;//定义数字口10
IRrecv irrecv(RECV_PIN);
decode_results results;//声明一个IRremote库函数独有的变量类型(decode_resultc)
void setup() {
Serial.begin(9600);//设置波特率
irrecv.enableIRIn();// 使能红外接收
}
void loop() {
if (irrecv.decode(&results)) { //是否接收到红外遥控信号
Serial.println(results.value, HEX); //显示数据
irrecv.resume(); //接收下个数据
}
}
代码说明
编译上传之前我们先导入库文件IRremote.h,导入方法请看前面库文件的添加方法。
下图是红外遥控的键值:
测试结果
按照接线图接线,上传实验程序成功,利用USB线上电后,打开串口监视器,里面就会显示红外接收传感器接收到的数据。
找到红外遥控器,拔出绝缘片,对准红外接收传感器的接收头按下按键。接收到信号后,红外接收传感器上的LED也开始闪烁,串口监视器显示如下图。
第8节 传感器/模块组合实验课程
前面课程中,我们单独测试了传感器/模块的功能,功能比较单一。在此,我们可以将多个传感器/模块搭配使用,组合出各种各样的功能。传感器/模块种类比较多,我们只是选择几款比较经典的组合实验。你们也可以根据自己的想法,自己设置代码,组合出你想要的特别的功能。
实验二十八 呼吸灯
实验说明
在第一课我们就学习了如何点亮LED灯及让LED闪烁。但是LED的玩法远不仅如此,例如有时候我们看到灯光的慢慢变亮或者慢慢变暗,这个就叫呼吸灯。所谓呼吸灯,就是控制LED首先逐渐变亮,然后逐渐变暗,循环交替,如人体呼吸一样。我们前面是直接用高电平点亮LED,用低电平熄灭LED,如果要让LED不那么亮但又不完全熄灭,那怎么办呢?这个也很简单,我们控制流过LED的电流就可以,电流小了,LED自然就暗了,也就是LED两端的电压小了LED就暗了。如何控制电压呢?前面我们已经学习的插件RGB就是利用PWM原理进行调色,所以我们使用PWM口就可以了,我们PLUS板的PWM口与UNO R3板的PWM口是相同的(D3,D5, D6, D9, D10, D11)。
实验器材
| ||
Arduino主板*1 | 连接线*1 | 白色LED模块*1 |
接线图
实验程序
/*
呼吸灯
https://sourl.cn/26pdb9
*/
int LED = 3; //LED管脚接数字口3
void setup() {
pinMode(LED, OUTPUT); //设置LED引脚为输出模式
}
void loop() {
for (int i = 0; i <= 255; i++) { //从0到255,每次加1
analogWrite(LED, i);
delay(10);//延时10ms
}
for (int i = 255; i >= 0; i--) { //从255到0,每次减1
analogWrite(LED, i);
delay(10);//延时10ms
}
}
代码说明
我们在此实验中用到for (int i = 0; i <= 255; i = i + 1);表示变量i从0到255,每次自加1,直到不满足 i <= 255这个判断表达式,否则一直执行大括号里的代码,即一共执行256次大括号里的代码;同理for (int i = 255; i >= 0; i = i - 1);i每次自减1,当不满足i>= 0时,跳出该for()循环,一共执行256次。
代码中,我们通过利用keyes UNO PLUS开发板上PWM口,设置PWM值,控制模块上LED亮度。keyes UNO PLUS开发板上只有D3 D5 D6 D9 D10 D11数字口是PWM口,也就是说如果要控制LED的亮度,信号端就只能接着几个接口。实验中,我们将模块信号端接在D3脚,属于PWM口。设置时我们设置PWM数值越小,模块上LED越暗,数值越大,模块上LED越亮,范围为0-255。analogWrite(pin,value),pin为PWM口,value是要输出的PWM值(0~255)。
通过整合前面知识,我们再来看代码,就清楚多了。将D3的PWM值设置为i,i刚开始由0增加到255,每次加1,每加一次延迟10毫秒,模块上LED逐渐变亮。PWM为255后,i开始由255减小到0,每次减1,每减一次延迟10毫秒,模块上LED逐渐变暗。然后又逐渐变亮,循环交替,如人体呼吸一样。
如果我们感觉逐渐变亮 或者逐渐变暗的时间过长,我们可以更改代码设置。有两种方法,一种是将每次加1减1的延迟时间降低;另一种是更改步长,注意这个步长必须能被255整除,如3 5。步长改为3 -3代表i每次增加3或减小3。
测试结果
上传实验程序成功,上电后,模块上LED逐渐变暗。然后又逐渐变亮,循环交替,如人体呼吸一样。
实验二十九 按键控制LED灯
实验说明
从前面的实验课程中我们了解到按键模块按下我们的单片机读取到低电平,松开读取到高电平。在这一实验课程中,我们利用按键和LED做一个扩展,当按键按下时即读取到低电平时我们点亮LED,松开按键时即读取到高电平时我们熄灭LED,这样就可以通过一个模块控制另一个模块了。
实验器材
Uno 开发板*1 | 连接线*1 | 白色LED模块*1 | 单路按键模块*1 |
接线图
实验程序
/*
按键控制LED灯
https://sourl.cn/26pdb9
*/
int button = 0;
void setup() {
pinMode(8, INPUT); //按键的管脚接数字口8并设置为输入模式
pinMode(3, OUTPUT); //LED的管脚接数字口3并设置为输出模式
}
void loop() {
button = digitalRead(8);//读取按键值
if (button == 0) { //按下按键
digitalWrite(3, HIGH); //点亮LED
} else { //松开按键
digitalWrite(3, LOW); //熄灭LED
}
}
代码说明
- 我们需要跟前面学习的课程一样,根据接线设置传感器/模块连接的IO口,然后配置引脚模式。
- 我们前面已经知道,按下按键我们读取的值为0,那么我们通过if...else...语句判断按键值为0if (button == 0)来点亮LEDdigitalWrite(3, HIGH)。
测试结果
上传实验程序成功,按照接线图接好线,利用USB上电后,当我们按下按键,LED被点亮,松开按键,LED熄灭。
实验三十 障碍物报警实验
实验说明
在前面实验课程中中,我们利用一个输入模块控制另一个输出模块。在这一实验中,我们还是用一个模块控制另一个模块,当避障传感器检测到障碍物时有源蜂鸣器响起。
生活中,我们可以利用一个检测传感器控制一个有源蜂鸣器响起或者LED点亮,做声光报警设备,如检测磁场(霍尔传感器)、检测倾斜(倾斜模块)等等。
实验器材
Arduino主板*1 | 连接线*1 | 避障传感器*1 | 有源蜂鸣器模块*1 |
接线图
实验程序
/*
障碍物报警
https://sourl.cn/26pdb9
*/
int item = 0;
void setup() {
pinMode(8, INPUT); //避障传感器接数字口8并设置为输入模式
pinMode(3, OUTPUT); //蜂鸣器接数字口3并设置为输出模式
}
void loop() {
item = digitalRead(8);//读取避障传感器输出的电平值
if (item == 0) {//检测到障碍物
digitalWrite(3, HIGH);//蜂鸣器响起
} else {//没有检测到障碍物
digitalWrite(3, LOW);//蜂鸣器关闭
}
delay(100);//延时100ms
}
代码说明
实验中代码设置和上一课中实验四十四类似,只是将控制LED亮灭换成了控制有源蜂鸣器的响起。
测试结果
上传实验程序成功,按照接线图接好线,上电后,检测到障碍物时,外接的有源蜂鸣器响起声音,否则有源蜂鸣器停止响音。
实验三十一 紫外线报警
实验说明
想一想,我们出门在外难免有紫外线伤害,有些智能穿戴设备上就有紫外线提示,我们也可以利用我们学习到的模块做一个紫外线报警设备。在前面实验中,我们利用避障传感器检测前方障碍物控制一个有源蜂鸣器响起。那么我们这个实验就使用一个紫外线传感器来控制有缘蜂鸣器,达到紫外线报警的效果。
实验器材
Arduino主板*1 | 连接线*2 | 太阳光紫外线传感器*1 | 有源蜂鸣器模块*1 |
接线图
实验程序
/*
紫外线报警
https://sourl.cn/26pdb9
*/
int item = 0;
void setup() {
pinMode(3, OUTPUT); //蜂鸣器接数字口3并设置为输出模式
}
void loop() {
item = analogRead(A3);//读取紫外线传感器输出的模拟值
if (item >= 20) {//强度高于20
digitalWrite(3, HIGH);//蜂鸣器响起
} else {//否则
digitalWrite(3, LOW);//蜂鸣器关闭
}
delay(100);//延时100ms
}
代码说明
实验中代码设置和前面实验类似,这次我们输入的模块用成了模拟传感器,通过设置一个阈值,超过阈值报警,这里是与前面不同的地方。
测试结果
上传实验程序成功,按照接线图接好线,上电后,我们用紫外线传感器模块检测紫外线,当紫外线达到我们设置的强度时,有源蜂鸣器响起声音。
实验三十二 人体红外报警
实验说明
在上一课实验中,我们利用紫外线传感器检测紫外线强度进行报警,在这一实验中,我们利用人体红外热释传感器检测结果控制一个有源蜂鸣器响起。
实验器材
Arduino主板*1 | 连接线*2 | 人体红外热释传感器*1 | 有源蜂鸣器模块*1 |
接线图
实验程序
/*
人体红外报警
https://sourl.cn/26pdb9
*/
int item = 0;
void setup() {
pinMode(9, INPUT); //人体红外传感器接数字口9并设置为为输入模式
pinMode(3, OUTPUT);//有缘蜂鸣器接数字口3并设置为为输出模式
}
void loop() {
item = digitalRead(9);//读取红外热释传感器输出的数字电平信号
if (item == 1) { //检测到有人运动
digitalWrite(3, HIGH); //打开蜂鸣器
} else { //没有检测到
digitalWrite(3, LOW); //关闭蜂鸣器
}
}
代码说明
实验中代码设置与前面实验相同,这里就不多说了。
测试结果
上传实验程序成功,按照接线图接好线,上电后,传感器检测到附近有人运动时,外接的有源蜂鸣器响起声音,否则有源蜂鸣器停止响声。
实验三十三 音乐播放
实验说明
在前面的单个模块是学校中,我们学习了让8002b功放 喇叭模块发出特定频率的声音、播放的节拍以及调节喇叭的声音大小,其实每首音乐就是由一个个特定的节拍与音调(频率)组合而成的。在这一实验中,我们利用这个喇叭模块播放一首音乐。
要演奏出音乐,我们首先需要搞清楚各音调的频率,具体见下表:
低音:
音调 音符 | 1# | 2# | 3# | 4# | 5# | 6# | 7# |
A | 221 | 248 | 278 | 294 | 330 | 371 | 416 |
B | 248 | 278 | 294 | 330 | 371 | 416 | 467 |
C | 131 | 147 | 165 | 175 | 196 | 221 | 248 |
D | 147 | 165 | 175 | 196 | 221 | 248 | 278 |
E | 165 | 175 | 196 | 221 | 248 | 278 | 312 |
F | 175 | 196 | 221 | 234 | 262 | 294 | 330 |
G | 196 | 221 | 234 | 262 | 294 | 330 | 371 |
中音:
音调 音符 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
A | 441 | 495 | 556 | 589 | 661 | 742 | 833 |
B | 495 | 556 | 624 | 661 | 742 | 833 | 935 |
C | 262 | 294 | 330 | 350 | 393 | 441 | 495 |
D | 294 | 330 | 350 | 393 | 441 | 495 | 556 |
E | 330 | 350 | 393 | 441 | 495 | 556 | 624 |
F | 350 | 393 | 441 | 495 | 556 | 624 | 661 |
G | 393 | 441 | 495 | 556 | 624 | 661 | 742 |
高音:
音调 音符 | 1# | 2# | 3# | 4# | 5# | 6# | 7# |
A | 882 | 990 | 1112 | 1178 | 1322 | 1484 | 1665 |
B | 990 | 1112 | 1178 | 1322 | 1484 | 1665 | 1869 |
C | 525 | 589 | 661 | 700 | 786 | 882 | 990 |
D | 589 | 661 | 700 | 786 | 882 | 990 | 1112 |
E | 661 | 700 | 786 | 882 | 990 | 1112 | 1248 |
F | 700 | 786 | 882 | 935 | 1049 | 1178 | 1322 |
G | 786 | 882 | 990 | 1049 | 1178 | 1322 | 1484 |
我们知道了音调的频率后,下一步就是控制音符的演奏时间。每个音符都会播放一定的时间,这样才能构成一首优美的曲子,而不是生硬的一个调的把所有的音符一股脑的都播放出来。音符节奏分为一拍、半拍、1/4拍、1/8拍,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125……,所以我们可以为每个音符赋予这样的拍子播放出来,音乐就成了。
这里我们具体以《生日快乐》为例:
实验器材
Arduino主板*1 | 连接线*1 | 8002b功放 喇叭模块*1 |
接线图
实验程序
/*
音乐播放
https://sourl.cn/26pdb9
*/
#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[] = //根据简谱列出各频率
{
D5, D5, D6, D5, M1, D7,
D5, D5, D6, D5, M2, M1,
D5, D5, M5, M3, M1, D7, D6,
M4, M4, M3, M1, M2, M1
};
float durt[] = //根据简谱列出各节拍
{
0.5, 0.5, 1, 1, 1, 1 + 1,
0.5, 0.5, 1, 1, 1, 1 + 1,
0.5, 0.5, 1, 1, 1, 1, 1,
0.5, 0.5, 1, 1, 1, 1 + 1
};
int beeppin = 3; //功放喇叭引脚接D3
int length;
void setup() {
pinMode(beeppin, OUTPUT); //设置蜂鸣器引脚输出模式
length = sizeof(tune) / sizeof(tune[0]); //计算长度
}
void loop() {
for (int x = 0; x < length; x++)
{
tone(beeppin, tune[x]);
delay(500 * durt[x]); //这里用来根据节拍调节延时,500这个指数可以自己调整,在该音乐中,我发现用500比较合适。
noTone(beeppin);
}
delay(2000);
}
代码说明
我们先是列出了所有D调的频率,方便后面使用。然后根据简谱列出各频率,再列出各节拍,我们用到的一个节拍为500ms,这个可以自己调整,然后循环响起音调与对应节拍就成了一首歌曲。
测试结果
上传实验程序成功,按照接线图接好线,功放喇叭模块播放出生日快乐歌曲。
实验三十四 灭火机器人的原理
实验说明
我们应该经常有听说灭火机器人,那么灭火机器人到底是什么原理呢?根据国家犯罪记录局(NCRB)的估计,从2010年至2014年,印度发生的火灾事故已造成超过120万死亡。即使为火灾事故采取了许多预防措施,但这些自然/人为灾难确实时有发生。发生火灾时,为了营救人员和灭火,我们被迫使用不安全的人力资源。随着技术的进步,尤其是机器人技术的发展,很有可能用机器人代替人来灭火。这将提高消防员的效率,也将防止他们冒着生命危险。今天,我们将使用Arduino模拟构建消防机器人,该机器人将自动感应火势并启动风扇。
在这个项目中,我们将学习如何使用Arduino构建一个非常简单的机器人,(用火焰传感器检测火焰,用风扇吹灭蜡烛)可以教给我们有关机器人技术的基本概念。了解以下基本知识后,您就可以构建更复杂的机器人。因此,让我们开始吧…
实验器材
Arduino主板*1 | 连接线*1 | 130电机模块*1 | 火焰传感器*1 |
接线图
实验程序
/*
灭火机器人
https://sourl.cn/26pdb9
*/
int item = 0;
void setup() {
Serial.begin(9600);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
}
void loop() {
item = analogRead(A5);//火焰传感器接A5,读取火焰传感器的模拟值赋给item
Serial.println(item);//串口显示模拟值
if (item < 200) {//低于200
digitalWrite(A0, LOW);//打开风扇
digitalWrite(A1, HIGH);
} else {//否则关闭风扇
digitalWrite(A0, LOW);
digitalWrite(A1, LOW);
}
delay(100);
}
代码说明
在代码中我们设置了阈值为200,当火焰传感器检测到模拟值低于这个阈值,风扇将自动开启;否则关闭,风扇的驱动方式请查看前面实验十六130电机。
测试结果
上传实验程序成功,按照接线图接好线,上电后,打开串口监视器,设置波特率为9600.串口监视器上打印火焰模拟,当这个值低于200时打开风扇灭火,否则关闭。这个值根据实际情况去设置就行。
实验三十五 旋转编码器模块控制RGB模块
实验说明
在前面课程的实验三十一中,我们利用旋转编码器计数。在这里我们将它扩展一下,通过得出的计数,我们用来控制RGB模块上LED显示不同颜色。
设计代码时,我们需要对所得数据取绝对值。然后我们将数据除以3,得到余数,余数为0控制插件RGB模块上LED亮红光,余数为1,RGB模块上LED亮绿光,余数为2,RGB模块上LED亮蓝光。
实验器材
Arduino主板*1 | 连接线*1 | 共阴RGB模块*1 | 旋转编码器模块*1 |
接线图
实验程序
/*
旋转编码器控制RGB模块
https://sourl.cn/26pdb9
*/
#include <Encoder.h>
Encoder encoder(2, 3);
int redPin = 9; //定义红色接D9
int greenPin = 10; //定义绿色接D10
int bluePin = 11; //定义蓝色接D11
int i;
int val;
void setup() {
Serial.begin(9600);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop() {
i = encoder.read();
val = i % 3;
Serial.println(val);
if (val == 0) {
//红色(255, 0, 0)
analogWrite(9, 255);
analogWrite(10, 0);
analogWrite(11, 0);
} else if (val == 1) {
//绿色(255, 0, 0)
analogWrite(9, 0);
analogWrite(10, 255);
analogWrite(11, 0);
} else {
//蓝色(255, 0, 0)
analogWrite(9, 0);
analogWrite(10, 0);
analogWrite(11, 255);
}
delay(100);
}
代码说明
- 在实验中我们将val设置为i除以3的余数,i是编码器的值。得到余数后根据接线设置管脚为9(红灯)、10(绿灯)和11(蓝灯)。参考前面实验学习的控制方法,利用余数控制模块上LED显示对应灯光颜色,任何数对3进行取余得到的值都是0或1或2,我们就利用这三个值来判断,并显示对应的颜色。
测试结果
上传实验程序成功,按照接线图接好线,上电后,打开串口监视器,设置波特率为9600。旋转编码器,串口监视器显示对应余数。即可控制外接的RGB模块上的LED的颜色(红绿蓝)。
实验说明
在生活中我们可以看到户外有很多公共灯光。这些灯白天不亮,一到晚上,阳光暗下的时候,自动亮起;当阳光变亮时,这些灯就自动关闭。难道是有人在手动控制这些灯光?实际上不是的,实际上这些灯光上都安装有光敏传感器,这些传感器将外界阳光的亮暗,转换成对应数值。然后设置一个临界点,当超过临界点时,控制灯光熄灭,没有超过时,控制灯光亮起。
在这个实验中,我们利用套件中自带的光敏电阻传感器和LED模块模拟这一现象。
实验器材
Arduino主板*1 | 连接线*2 | 光敏电阻传感器*1 | 白色LED模块*1 |
接线图
实验程序
/*
模拟户外灯
https://sourl.cn/26pdb9
*/
int val = 0;
void setup() {
Serial.begin(9600);//设置波特率为9600
pinMode(3, OUTPUT);//LED管脚接D3
}
void loop() {
val = analogRead(A1);//光敏电阻接A1
Serial.println(val);//串口监视器打印光敏模拟值
if (val < 150) {//模拟值低于150
digitalWrite(3, HIGH);//点亮LED
}
else {//否则模拟值高于150
digitalWrite(3, LOW);//熄灭LED
}
delay(100);//延时100ms
}
代码说明
在实验中,我们设置了当模拟值低于150时LED亮起,否则熄灭。
测试结果
上传实验程序成功,利用USB线上电后,打开串口监视器,设置波特率为9600。串口监视器显示对应模拟值。实验中,我们把光线传感器用手握住,数据变小,小于150时,LED模块上LED亮起,否则熄灭。
实验三十七 火焰报警
实验说明
在前面实验四十九中,我们制作了一个利用火焰传感器检测火焰,用风扇模块模拟灭火的一个场景。在这一实验中,我们制作一个火灾报警系统。原理很简单,同样利用火焰传感器检测结果控制一个有源蜂鸣器响起。
生活中,火灾的危害是相当大的,这个实验虽然简单,但是它是非常具有意义的。
实验器材
Arduino主板*1 | 连接线*1 | 火焰传感器*1 | 有源蜂鸣器模块*1 |
接线图
实验程序
/*
火焰报警
*/
int item = 0;
void setup() {
Serial.begin(9600);
pinMode(A0, INPUT);//火焰传感器数字管脚接A0
pinMode(3, OUTPUT);//蜂鸣器管脚接D3
}
void loop() {
item = digitalRead(A0);//读取火焰传感器输出的数字电平
Serial.println(item);//换行打印电平信号
if (item == 0) {//检测到火焰
digitalWrite(3, HIGH);//打开蜂鸣器
} else {//否则,关闭蜂鸣器
digitalWrite(3, LOW);
}
delay(100);//延时100ms
}
代码说明
实验中代码设置和实验四十九类似,四十九是设置一个模拟值的阈值,达到这个阈值进行灭火,在前面单个传感器模块中我们学到,这个火焰传感器有使用到一个模拟管脚和一个数字管脚,当检测到火焰时,数字管脚输出低电平。前面我们使用到模拟口,这个实验我们就使用数字口。
测试结果
上传实验程序成功,按照接线图接好线,上电后,传感器检测到火焰,外接的有源蜂鸣器响起声音,否则有源蜂鸣器不响。
实验三十八 6812花样彩灯
实验说明
晚上的时候,我们可以看到各种各样的非常漂亮,炫目的灯光。城市的夜景也是是一个个霓虹灯组成,其实这么美丽炫目的灯光,我们也可以用我们的模块来完成。在前面实验三十,我们学会了使用6812RGB模块,我们知道这个模块只用到一个管脚便可点亮任何一个灯的任何一种颜色;我们这个实验就通过制作一个炫目的灯光来加深对这个灯的印象。(注意,灯光的亮度可能过高,避免用眼睛长时间直视灯珠!以免损害我们的眼睛。)
实验器材
正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消 | 正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消 | |||
Arduino主板*1 | 连接线*1 | 6812 RGB模块*1 | 3P XH-2.54mm 黑红蓝硅胶线*1 | USB线*1 |
接线图
实验程序
/*
6812花样彩灯
https://sourl.cn/26pdb9
*/
#include <Wire.h>
#include <Adafruit_NeoPixel.h>
//用来储存RGB颜色的变量
int R = 0;
int G = 0;
int B = 0;
int num = 0;//存放灯号
Adafruit_NeoPixel rgb_display(8);//创建一个6812类实例
void setup() {
rgb_display.begin();
rgb_display.setPin(8);//6812管脚接数字口8
}
void loop() {
//取0~255之间的随机整数
R = random(0, 255);
G = random(0, 255);
B = random(0, 255);
if (num < 4) { //num在1~4之间
num = num + 1;
} else {
num = 1;
}
rgb_display.setPixelColor(num - 1, R, G, B); //设置num-1灯号颜色
rgb_display.show();//显示
delay(150);//150ms刷新颜色
rgb_display.setPixelColor(num - 1, 0, 0, 0); //关闭num-1灯号颜色
rgb_display.show();//显示
}
代码说明
random(0, 255):在0~255之间取随机数
.setPixelColor(num - 1, R, G, B):设置num-1位置灯珠显示RGB颜色
.show():显示,如果没有这个函数,我们前面设置的将不起作用
测试结果
上传代码成功后,按照接线图接好线,上电,我们就能看到我们6812RGB模块。四个灯珠以随机颜色显示流水灯。
实验三十九 红外遥控灯
实验说明
大家生活中不知道有没有这个场景,当我们快要入睡的时候,还没有关灯,然而灯的开关又比较远,当我们起床去关灯,又影响了我们入睡,这个时候大家是不是希望有个遥控器能遥控电视一样来控制灯光,这样就方便多了。在前面实验中,我们学会了点亮或熄灭LED、利用PWM技术调节灯光的亮度;实验三十四,我们学会了使用红外接收模块,并把接收到的遥控器的信息打印了出来。那么在这个实验中,我们就用红外遥控接控制我们的LED模块亮灭和亮度。
当我们接收到一个按键值时,我们通过对应按键值来设置输出的PWM值,这样就可以设置亮度了,控制LED亮灭也一样,但是如果说,在控制LED亮灭这里,我们用同一个按键来控制LED的亮与灭,就需要一个灵活的编程技巧了。我们可以先自己思考,再来看程序。
实验器材
Uno 开发板*1 | 传感器扩展板*1 | 白色LED模块*1 | |
遥控器*1 | 红外接收模块*1 |
接线图
实验程序
/*
红外遥控灯
https://sourl.cn/26pdb9
*/
#include <IRremote.h> //导入红外接收库文件
boolean flag = true;//LED标志位
long ir_rec;
IRrecv irrecv(8);
decode_results results;
void setup() {
Serial.begin(9600);
pinMode(5, OUTPUT);//LED管脚接PWM口5
irrecv.enableIRIn();//使能红外接收
}
void loop() {
if (irrecv.decode(&results)) {//接收到信号
ir_rec = results.value; //信号赋给变量ir_rec
Serial.print(ir_rec, HEX); //以十六进制打印变量ir_rec
if (ir_rec == 0xFF02FD && flag == true) { //按下OK键并且flag为true
digitalWrite(5, HIGH); //点亮LED
Serial.print(" LED on"); //打印" LED on"
flag = false;//flag改为false,以便下次熄灭
} else if (ir_rec == 0xFF02FD && flag == false) { //按下OK键并且flag为false
digitalWrite(5, LOW); //关闭LED
Serial.print(" LED Off"); //打印" LED Off"
flag = true;//flag改为true,以便下次点亮
} else if (ir_rec == 0xFF6897) { //按下1
analogWrite(5, 80);
} else if (ir_rec == 0xFF9867) { //按下1
analogWrite(5, 160);
} else if (ir_rec == 0xFFB04F) { //按下1
analogWrite(5, 240);
}
Serial.println();//换行
irrecv.resume();//下次接收
}
}
代码说明
1. 与前面定义变量不同,这里我们定义一个布尔变量,布尔变量的值只有两个,真(true)或者假(false),boolean flag = true。
2. 我们按下OK键时,红外接收的值为0xFF02FD,此时我们需要设置一个布尔变量flag,flag为真(true)的时候点亮LED,为假(false)的时候熄灭LED,点亮LED后我们又把它设置为假,这样当下次按下OK键时,LED将熄灭。
3. 通过按“1”,“2”,“3”来设置输出PWM值,这个很好理解。
测试结果
上传实验程序成功,按照接线图接好线,上电后,打开串口监视器,设置波特率为9600.按下遥控器按钮,串口监视器显示我们按下的值,按下ok键点亮LED,再次按下LED熄灭LED,按下按键“1”,LED较暗,按下按下按键“2”,LED中等亮度,按下按键“3”,LED较亮。