在本教程中,我们将通过示例代码和示例程序学习如何进行基本的Arduino编程。对于希望通过简单易懂的语言掌握基础知识的所有新手来说,本教程将是一门非常有价值的课程。
介绍
根据维基百科微控制器相当于一台内置于单个IC芯片内的微型计算机,拥有自己的核心处理器、可编程输入、存储器和输出外围设备。
微控制器对于用户来说非常有用,因为它提供了内置处理器、内存和输入/输出端口(也称为GPIO或通用输入/输出引脚),用户可以根据任何期望的规范控制这些端口。
在本教程中,我们将与Arduino Uno董事会合作学习和测试程序。为了测试和集成硬件组件,我们将使用一个试验板。
现在让我们快速学习如何开始Arduino编程。
1.2安装软件(Windows)
为此,您需要访问internet,很明显,您的计算机中会有internet。请转到以下链接并下载IDE软件:
下载后,您将在下载文件夹中找到Arduino安装图标,如下所示:
获取此项后,您可以简单地单击它并在计算机中安装Arduino Integrated开发环境(IDE)。完整的过程可以在以下视频中可视化:
1.4从我们的第一条赛道开始
在我们开始学习实际的编程技术之前,对于任何新手来说,先从LED等基本组件开始,并了解如何将其与Arduino连接是非常有用的。
正如我们所知,LED是一种具有极性的发光二极管,如果未连接到正确的电源极,则不会发光。
LED的另一个方面是,这些设备在低电流下工作,如果适当计算的电阻器未与其引脚之一串联,可能会立即损坏。
根据经验,330欧姆1/4瓦对于电源输入的每5伏上升非常理想,可以将电流限制在所需的安全水平。因此,对于5伏,它可能是330欧姆,对于10伏,它可能是680欧姆,依此类推。
使用试验板进行装配
请确保您知道如何使用面包板在尝试本章中介绍的教程之前,因为我们将使用一个试验板进行所有的实验。
基本的LED连接设置如下:
您可以在上面看到3个基本组件:
- 一个5毫米,20毫安的LED
- 330欧姆1/4瓦电阻器
- 一Arduino董事会
只需按照图组装系统。
接下来,将5V电源从计算机USB插入Arduino。一旦您这样做,您将看到LED灯亮起。
我知道这很基本,但从头开始总是好的。放心,随着我们前进,事情会变得越来越有趣。
1.5使用Arduino控制LED
现在我们将学习如何使用Arduino程序控制LED。
要编写程序,我们必须在每个程序中至少有2个功能。
一个函数可以被理解为一系列的编程语句,这些语句可以被赋上一个名字,如下所示:
- 设置()在程序的开始期间调用或执行这一点。
- 循环()这在Arduino的整个运营期间重复地调用或执行。
因此,尽管它可能没有实际功能,但从技术上讲,最短合法的Arduino程序可以写成:
最简单程序
无效设置()
{
}
void循环()
{
}
您可能已经注意到,在许多编程语言中,系统首先在显示屏上显示一个简单的打印“Hello,World”
在微控制器的解释中,这个短语的电子对等物是闪烁一个LED开关。
这是人们可以编写和实现的最基本的程序,用于指示系统的正确运行。
我们将尝试通过以下代码实现并理解该过程:
清单1.2:led1/led1.pde
常数int kPinLed=13;
无效设置()
{
pinMode (kPinLed、输出);
}
void循环()
{
DigitalWrite(kpinled,高);
延迟(500);
数字写入(kPilled,低位);
延迟(500);
}
好的,现在让我们了解每一行代码的含义以及它如何执行函数:
常数int kPinLed=13;
这是一个常量,它允许我们在完整的编程过程中使用它,而无需使用符合它的实际值。
根据标准规则,此类常数以起始字母识别K. 尽管这不是强制性的,但只要您想查看代码细节,它就可以让事情变得更清楚、更容易理解。
无效设置()
{
pinMode (kPinLed、输出);
}
这段代码配置了LED连接到的特定引脚。换句话说,代码告诉Arduino控制这个大头针的“写入”方面,而不是“读取”它。
void循环()
{
DigitalWrite(kpinled,高);
延迟(500);
数字写入(kPilled,低位);
延迟(500);
}
上面的几行表示应用程序的实际执行。代码首先在相关的LED连接上写入并呈现高输出,然后打开LED。
这里,术语“高”只是指在Arduino的相关引脚上获得+5V电压。补充术语LOW仅表示指定引脚上的零或0V。
接下来,我们称之为延迟()
其功能是通过毫秒(1/1000秒)创建延迟。由于输入了图500,实现的延迟将为1/2秒。
一旦这1/2秒的时间是过去的,下一行被执行,这将把LED OFF与低项在同一引脚。
随后的线路再次产生1/2秒的延迟,以允许LED保持OFF 1/2秒。
只要Arduino保持通电状态,这个过程就会通过执行代码行无限地继续下去。
在进入下一级之前,我建议您对上述代码进行编程,并检查您是否能够正确执行LED ON/OF序列。
由于Arduino中的默认LED与插脚#13连接,它应立即响应上述程序并开始闪烁。但是,如果您发现外部LED不闪烁,则可能是LED连接故障,您可以尝试反转LED的极性,并希望看到它也闪烁。
您可以通过将“500”数字更改为其他值来播放延迟时间,并发现LED“正在收听”命令,并根据指定的延迟值使其闪烁。
但请记住,如果您看到LED没有以恒定的1秒速率闪烁,无论延迟时间如何变化,这可能表明代码由于某些错误而不工作。因为默认情况下,Arduino将以1秒的闪烁速率编程。因此,此速率必须随您的代码而变化,以确认其正确工作。
1.7评论
我们理解的代码线是专门为计算机软件编写的。
然而,为了确保用户能够参考这些行的含义并理解它们,在所需的代码行旁边写解释通常是有用和明智的。
这些被称为评论仅为人类或用户参考而编写,并进行编码以使计算机能够安全地忽略它。
这些评论的语言有两种格式:
- 注释的块样式,其中注释描述包含在开始符号/*和结束符号下*/
- 这并不需要限制在一行中,而是可以根据注释或描述的长度扩展到下一行,如下面的示例所示:
/*这是一个评论*/
/*这也是*/
/*及
*这个
*为
*嗯*/
要编写注释的快速单行说明,开头的两个斜杠//符号就足够了。这会告诉计算机这一行与实际代码无关,必须忽略。例如:
//这是一个计算机将忽略的评论。
以下是一个供参考的示例:
/*
*程序名称:闪烁
*作者:艾伦·史密斯
*说明:
*将LED打开一半,然后反复关闭一半。
*/
/*引脚定义*/
常数int kPinLed=13;
/*
*功能名称:设置
*用途:系统通电时运行一次。
*/
无效设置()
{
pinMode (kPinLed、输出);
}
/*
*函数名:loop
*目的:只要Arduino有动力,就可以反复运行
*/
void循环()
{
DigitalWrite(kpinled,高);
延迟(500);
数字写入(kPilled,低位);
延迟(500);
}
1.8故障排除
如果您发现您的程序在编译时显示一个“错误”,或其他问题,以下提示可能会帮助您重新检查您的代码,以摆脱障碍。
- 您的程序语言将区分大小写。例如表达式迈瓦尔不能写成迈瓦尔。
- 可以由键盘键盘执行的所有类型的白色空间最终呈现为单个空间,只能通过您可见或理解,计算机将不会考虑到这一点。简而言之,任何类型的免费空间对代码结果没有任何影响。
- 每个代码块必须用左括号和右括号括起来,"{"和"}"
- 数字不能用逗号分隔。例如,1000不能写成1,000。
- 用花括号括起来的每一行代码必须以分号结尾;
使用Arduino创建有趣的LED光线序列
在上一章中,我们学习了如何以恒定的延迟率连续闪烁LED的开/关。
现在我们将学习如何通过升级程序代码在同一个LED上执行不同的延迟模式。
我们不会使用外部LED,而是使用Arduino板引脚13处内置的默认LED。您可以在USB接口后面找到这个微型SMD LED。
2.2理解IF语句
在本节中,我们将学习控制结构如何使我们能够运行单个代码,有时甚至可以根据需要重复运行。
声明如果成为第一个控制结构。以下实现说明了如何使用它:
常数int kPinLed=13;
无效设置()
{
pinMode (kPinLed、输出);
}
int delayTime = 1000;
void循环()
{
delayTime=delayTime-100;
if(delayTime <= 0){//如果延迟时间小于等于零,则重置延迟时间。
延迟时间=1000;
}
DigitalWrite(kpinled,高);
延迟(时延);
数字写入(kPilled,低位);
延迟(时延);
}
我们将尝试逐步理解上述代码,并了解如何将其用于其他类似的执行。
第1行和第7行之间的代码与我们最初的程序完全相似。
第一次修改实际上发生在第8行。
int delayTime = 1000;
您可以发现这与第1行的代码类似,除非它缺少术语康斯特。
这只是因为,这段代码不是一个常量。它被定义为a变量,在编程过程中具有可变值的特性。
在上面的示例中,您可以看到此变量的属性值为1000。请记住,封闭在花括号内的此类变量必须严格地写在成对的花括号内,并称为“局部”变量。
另外,那些应该在花括号外的变量,比如我们现在讨论的那个,会被识别为“全局变量”,可以在程序代码中的任何地方执行。
继续往下看,你可以看到第9行和第11行之间的代码也与第一个程序相似,尽管如此,在第11行之后,事情开始变得有趣起来。让我们看看如何!
delayTime=delayTime-100;
在这段代码中,我们看到延迟时间正在通过从中减去100进行修改。
这意味着从其初始值1000中减去100,并提供一个新的值900。
通过下图,我们将尝试理解Arduino语言中使用的一些数学运算符。
现在让我们评估第13行和第15行之间的代码。
if(delayTime <= 0){//如果延迟时间小于等于零,则重置延迟时间。
延迟时间=1000;
}
上述代码的主要目的是确保LED持续闪烁而不中断。
由于从原始金额中扣除100延迟时间,它防止LED闪烁达到零,并允许持续闪烁。
下图显示了我们将在代码中使用的几个比较运算符:
在上面的代码中,我们可以测试代码是否正确if(delaytime == 0)
.
然而,因为消极的数字可能同样糟糕,所以我们没有这样做,这是一个推荐的做法。
想一想如果我们试图从中扣除300而不是100,结果会是什么延迟时间
?
所以现在你可能已经意识到如果延迟时间
写为小于或等于零,则延迟时间将设置回原始图1000。
DigitalWrite(kpinled,高);
延迟(时延);
数字写入(kPilled,低位);
延迟(时延);
如上图所示,代码的最后4行负责连续打开/关闭LED。
在这里,您可以清楚地注意到,我们没有使用数字,而是使用了一个变量来分配延迟时间,这样我们就可以在代码运行期间根据需要对其进行调整。这很酷,对吗?
2.3否则陈述
在这里,我们将了解如果这个词可以有一个从句其他的这样它就能决定万一发生的情况如果这种说法是错误的。
很抱歉,如果这听起来太混乱,请不要担心,我们将尝试通过以下示例来理解它:
常数int kPinLed=13;
无效设置()
{
pinMode (kPinLed、输出);
}
int delayTime = 1000;
void循环()
{
如果(delayTime<=100){//如果它小于或等于100,则重置它
延迟时间=1000;
}
否则{
delayTime=delayTime-100;
}
DigitalWrite(kpinled,高);
延迟(时延);
数字写入(kPilled,低位);
延迟(时延);
}
在上面的代码中,您可以很好地看到,第10行代码只在延迟时间
小于或等于100,如果不小于或等于100,则执行第13行中的代码,但两者不能同时发生,第10行或第13行代码将被实现,不能同时执行。
您可能已经注意到,与我们在前面的第2.2节中所做的不同,这里我们没有将其与0进行比较,而是与100进行比较。这是因为在这个例子中,我们在减去100之前进行了比较,相反,在第2.2节中,我们在减去100之后进行了比较。你能告诉我如果我们比较0而不是100会发生什么吗?
2.4 WHILE语句
A.虽然声明与如果声明,除了它导致重复执行到代码块(可能是在花束括号之间)的真实性,因为这种情况很长,那么这就是没有一个其他的陈述
下面的示例将帮助您更好地理解这一点
常数int kPinLed=13;
无效设置()
{
pinMode (kPinLed、输出);
}
int delayTime = 1000;
void循环()
{
while(delayTime>0){//whiledelaytime大于0
DigitalWrite(kpinled,高);
延迟(时延);
数字写入(kPilled,低位);
延迟(时延);
delayTime=delayTime-100;
}
while(delayTime<1000){//whiledelaytime小于1000
delayTime=delayTime+100;//首先执行此操作,这样我们就不会有delayTime=0的循环
DigitalWrite(kpinled,高);
延迟(时延);
数字写入(kPilled,低位);
延迟(时延);
}
}
你能猜出上面的代码是用来做什么的吗?嗯,它的设计是让LED闪烁的速度先快后慢。
2.5什么是真与假?
在编程语言中,错误的指零(0)。实际上,不使用“true”,而是假设当没有任何内容是false时,那么包含的所有内容都是true。
它看起来有点奇怪,但是它做得很好。
我们将通过下面的例子来了解情况。
您有时可能会遇到以下代码:
而(1){
DigitalWrite(kpinled,高);
延迟(100);
数字写入(kPilled,低位);
延迟(100);
}
这是编码的,看起来只要电源可用,LED执行将永远保持循环。
但是,当用户意外地应用了=而不是==时,这类代码的一个缺点可能会出现。
我相信您已经知道=表示赋值,这意味着它用于为变量指定选定的值,而a==用于在值相同时强制执行测试。
例如,假设您需要一个LED以顺序加速模式重复闪烁,但错误地使用了=而不是==。
然后,代码将显示为:
int delayTime = 1000;
void循环()
{
如果(延迟时间)=0){//错误!!!应该是==
延迟时间=1000;
}
DigitalWrite(kpinled,高);
延迟(时延);
数字写入(kPilled,低位);
延迟(时延);
delayTime=delayTime-100;
}
该错误将0分配给延迟时间
,并导致如果用于检查0是否为真的语句。由于0引用了false,它将认为它不是真的,并将停止强制执行滞后时间= 1000
,而是函数延迟时间
在循环()过程中保持为0。
这看起来很不受欢迎!!
所以,一定要仔细检查你的程序,确保你没有犯过这样愚蠢的错误。
2.6组合
有时您可能会觉得需要同时测试多个项目。例如,您可能希望检查变量是否在两个数字之间。虽然可以多次使用if语句来实现这一点,但使用逻辑组合可能更方便,以便更好、更容易地阅读。
可以使用3种方法实现逻辑术语的组合,如下表所示:
很有意思的是,NOT运算符可以作为变量的切换器,该变量可以指定为符合事实的或错误的(或低或高)。
以下示例说明了该条件:
int-ledState=低;
void循环()
{
ledState=!ledState;//切换ledState的值
数字写入(kPinLed、ledState);
延迟(1000);
}
这是莱德州
会很低,随后会很快ledState=!ledState
,它将变高。以下循环将导致莱德州
高高在上ledState=!ledState
很低。
2.7关于报表
现在我们将尝试了解另一种控制结构,即对于环当您想多次实现某个东西时,这会非常方便。
让我们通过以下示例来理解这一点:
常数int kPinLed=13;
无效设置()
{
pinMode (kPinLed、输出);
}
void循环()
{
对于(int i=0;i<4;i++){
DigitalWrite(kpinled,高);
延迟(200);
数字写入(kPilled,低位);
延迟(200);
}
延迟(1000);//1秒
}
你可以在这一行找到一些独特的东西对于
这是代码i++?.这对于那些相当懒惰并且希望通过方便快捷方式实施编码的程序员是有用的
上述术语称为复合运算符,因为它们的作用是将一个赋值运算符与另一个赋值运算符组合在一起。下表显示了其中最常用的运算符:
您会发现for语句中有3个子语句。其结构如下所示:
for(语句1;条件;语句2){
//声明
}
语句#1正好出现在开头,而且只出现一次。在循环过程中,每次都会测试该条件。无论何时符合事实的在花括号内,后面的语句#2被强制执行错误的,系统跳转到下一个代码块。
连接更多的发光二极管
好的,现在我们来看看如何连接更多的LED以获得更有趣的效果。
请按如下所示连接LED和Arduino。实际上不需要红线,但由于将两个供电轨都包括在试验板中始终是一个好主意,因此设置是有意义的。
现在让我们修复一个程序,它将使我们能够检查硬件是否配置正确。
始终建议逐步编写和执行少量程序,以检查各硬件接线是否正确。
这有助于快速排除可能的错误。
下面的代码示例以循环方式逐个转动LED 2至5,从而为LED 2至5提供特定图案。
const int kPinLed1 = 2;
常数int kPinLed2=3;
常数int kPinLed3=4;
const int kPinLed4 = 5;
无效设置()
{
pinMode (kPinLed1、输出);
pinMode(kPinLed2,输出);
pinMode(kPinLed3,输出);
pinMode(kPinLed4,输出);
}
void循环()
{
//按顺序打开每个指示灯
数字写入(kPilled1,高);
延迟(100);
数字写入(kPilled2,高);
延迟(100);
digitalWrite (kPinLed3、高);
延迟(100);
数字写入(kPilled4,高);
延迟(100);
//按顺序关闭每个指示灯
数字写入(kPilled1,低);
延迟(100);
数字写入(kPilled2,低);
延迟(100);
数字写入(kPilled3,低);
延迟(100);
数字写入(kPilled4,低);
}
正如您可能注意到的,代码没有任何错误,只是看起来很长,因此容易出错。
当然,有更好的方法来编写上述代码,下面的部分将介绍它。
2.9介绍阵列
数组可以是一组变量,可以用索引号索引。下面的示例将帮助我们更好地理解它。
const int k_numLEDs = 4;
const int kPinLeds[k_numLEDs] = {2,3,4,5};// led连接到引脚2-5
无效设置()
{
For (int I = 0;我< k_numLEDs;我+ +){
pinMode(kPilleds[i],输出);
}
}
void循环()
{
For (int I = 0;我< k_numLEDs;我+ +){
DigitalWrite(Kpinleds [i],高);
延迟(100);
}
对于(int i=k_numLEDs-1;i>=0;i--){
数字写入(kPilleds[i],低);
延迟(100);
}
}
好了,现在我们来看看每一部分,了解一下它们是如何工作的。
const int k_numLEDs = 4;
上面的代码定义了我们在数组中应该拥有的最大元素数。这段代码在后面的章节中帮助我们确保数组中的所有内容都被写入,而数组结束后什么都没有。
const int kPinLeds[k_numLEDs] = {2,3,4,5};// led连接到引脚2-5
在下一行中,我们设置了数组结构。括号内的数字表示数组中元素的数量。虽然实际的量可以写成,但写成常数更好。这些值通常可以在带逗号的方括号中看到,并将这些值指定给数组。
当您找到使用数字0索引的数组时,这表示阵列中的第一个元素,如图所示代码:k_LEDPins是k_LEDPins[0]
.
类似地,最后一个元素将显示为k_LEDPins [3]
,因为从0到3的计数是4。
无效设置()
{
For (int I = 0;我< k_numLEDs;我+ +){
pinMode(kPilleds[i],输出);
}
}
上面的代码显示了循环的使用以进行通过每个数组元素,并将其设置为输出。我们将方括号与索引一起实现以达到数组中的每个元素。
如果您想知道是否可以在没有阵列的情况下使用管脚2到管脚5,答案是肯定的,这是可能的。但在本例中,由于我们没有这样做,所以没有这样做。在以下部分中,如果所选输出管脚不在一条线上,您可以取消阵列方法。
继续,让我们看看下一个代码块做什么:
For (int I = 0;我< k_numLEDs;我+ +){
DigitalWrite(Kpinleds [i],高);
延迟(100);
}
在这里,代码继续通过每个LED以100毫秒的间隔或延迟顺序打开它们。
对于(int i=k_numLEDs-1;i>=0;i--){
数字写入(kPilleds[i],低);
延迟(100);
}
使用上面的代码展示了for循环可以用于在循环中移动,即使以相反的顺序。
它始于k_numLEDs-1
因为阵列归零索引。我们没有开始k_LEDPins [4]
因为这将导致穿过阵列的终点。
代码使用> = 0来检查,以便不会错过或忽略索引0处的第一个元素。
第三章
什么是输入
因此,我们学习了如何使用Arduino操作事物。在本章中,我们将讨论如何通过连接外部参数的输入来感知现实世界。
3.1使用按钮
我们都知道按钮是什么以及它是如何工作的。它是一种开关或按钮,当信号处于抑制状态时,它将信号从一个电路级瞬时连接到另一个电路级,并在释放时断开信号。
3.1.1一键+一LED
我们将按照上面显示的细节,用按钮将Arduino与Arduino连接起来,并学习设置的基本工作和实现。
指示的按钮也称为微动开关按钮,共有4个引脚(每侧2对)。推压时,每对插脚都在内部连接,并在它们之间启用连接或传导。
在本例中,我们仅使用一对插脚或触点,另一对不相关,因此被忽略。
让我们继续应用下面的代码并检查它是否工作!
常数int kPinButton1=2;
常数int kPinLed=9;
无效设置()
{
引脚模式(kPinButton1,输入);
digitalWrite (kPinButton1、高);//打开上拉电阻
pinMode (kPinLed、输出);
}
void循环()
{
if(数字读取(kPinButton1)=低){
DigitalWrite(kpinled,高);
}
否则{
数字写入(kPilled,低位);
}
}
你可能会发现一些不寻常的事情。让我们逐步解决它们。
无效设置()
{
引脚模式(kPinButton1,输入);
digitalWrite (kPinButton1、高);//打开上拉电阻
pinMode (kPinLed、输出);
}
我们要做的第一件事就是钮扣随着输入我知道,这很基本。
接下来,我们分配高的到输入别针。你是一个奇迹,如何在输入时写任何东西?当然,这可能是有趣的。
实际上,为Arduino输入指定一个高电平会打开内部20k欧姆的上拉电阻器(该引脚上的低电平会关闭)。
另一个问题是什么是上拉电阻。我已经覆盖了一个全面的帖子上拉起电阻,你学习在这里.
好的,继续,现在让我们看看主循环代码:
void循环()
{
if(数字读取(kPinButton1)=低){
DigitalWrite(kpinled,高);
}
否则{
数字写入(kPilled,低位);
}
}
当你按下按钮,电线引脚连接到地,这将呈现一个低的当处于未加压状态时,相同的销保持在高的或通过20K内部上拉电阻器+5V。
在这里,我们希望Arduino在按下按钮(低)时点亮LED,因此在按下按钮时,我们为按钮的每个低响应的输出写入高。
3.1.2两个按钮和一个LED
嗯,你可能会想,如果没有Arduino,上面所示的动作也可以完成。我明白,不过,这是一块学习按钮如何与Arduno一起使用的基石。
到目前为止,我们已经研究了为LED的开启(高)或关闭(低)编写代码。
现在让我们看看如何用Arduino控制LED的亮度。
可以使用两种方法:
- 通过限制LED的电流量
- 利用脉宽调制或脉冲宽度调制,其中LED的电源以某个期望的速率非常快速地打开/关闭,产生平均照明,其强度取决于PWM。
在Arduino电路板中,在标有波浪号(~)的引脚上提供PWM支持,这些引脚是500Hz(每秒500次)下的引脚3、4、5、9、10和11)。用户可以提供0到255之间的任何值,其中0表示不高或不+5V,255告诉Arduino始终获得高或+5V。要启动这些命令,必须使用所需的值访问analogWrite()。
您可以假设PWM为x/255,其中x是您希望通过发送的所需值模拟写入()
.
如上所示设置Arduino和其他参数。
常数int kPinButton1=2;
const int kPinButton2 = 3;
常数int kPinLed=9;
无效设置()
{
引脚模式(kPinButton1,输入);
引脚模式(kPinButton2,输入);
pinMode (kPinLed、输出);
数字写入(kPinButton1,高);//接通上拉电阻器
数字写入(kPinButton2,高);//打开上拉电阻器
}
int led亮度= 128;
void循环()
{
if(数字读取(kPinButton1)=低){
LED亮度--;
}
否则如果(数字读取(kPinButton2)=低){
LED亮度++;
}
LED亮度=约束(LED亮度,0,255);
模拟写入(kPilled、LED亮度);
延迟(20);
}
你可能会发现这里有3行需要解释。
LED亮度=约束(LED亮度,0,255);
25模拟写入(kPilled,LED亮度);
26日延迟(20);
该行:LED亮度=约束(LED亮度,0,255)
;说明了Arduino中名为CONSTRAINT()的唯一函数。
这个内部函数包含类似于以下代码:
int约束(int值、int最小值、int最大值){
如果(值>最大值){
值=最大值;
}
如果(值<最小值){
值=最小值;
}
返回值;
}
在此之前讨论的所有规范均始于无效的,这意味着不返回任何内容(无效)。而上述代码以int,这表示它返回一个整数。我们将在后面的部分中详细讨论,现在只需记住整数没有任何小数部分。
对,所以这意味着,代码:LED亮度=约束(LED亮度,0,255);
分配LED亮度应在0和255之间
.
下一行使用analogWrite
命令Arduino以具有所需值的选定引脚对选定PWM应用。
下一行创建了20毫秒的延迟,这是为了确保我们调整ate的速度不会超过50 Hz或每秒50次。这是因为人类可以比Arduino慢得多。因此,如果没有延迟,程序可能会让我们感觉按下第一个按钮关闭LED,按下第二个按钮关闭it打开(请自己尝试确认)。
3.2电位计
让我们继续前进,学习如何使用Arduino电位器。
要知道电位计或电位器是如何工作的,你可以阅读下面的文章.
如上所示,将所示参数与Arduino连接。
一个pot将有3个端子。中间端子ASL将连接Arduino上的模拟输入0。其他两个外部端子可连接到+5V和0V电源轨。
让我们编程并查看结果:
const int kPinPot = A0;
常数int kPinLed=9;
无效设置()
{
pinMode(kPinPot,输入);
pinMode (kPinLed、输出);
}
void循环()
{
int ledBrightness;
int-sensorValue=0;
sensorValue = analogRead (kPinPot);
LEDBrightness = MAP(SensorValue,0,1023,0,255);
模拟写入(kPilled、LED亮度);
}
你会发现一些东西看起来是全新的,没有包含在我们以前的代码中。
- 常数
kPinPot
被指定为A0,其中A是描述其中一个模拟管脚的快捷方式。但是A0也指管脚#14、A1到管脚#15等等,这样可以在实验管脚用完时用作数字输入/输出。但请记住,不能将数字管脚用作模拟管脚。 - 该行:
LEDBrightness = MAP(SensorValue,0,1023,0,255);
在Arduino中提供了一个新的内部函数,称为map()。此功能从给定范围重新校准到另一个范围,称为映射(值、从低到高、从低到高、从低到高)。这可能变得至关重要,因为Analmueread.
给出0-1023范围内的值,但是analogWrite能够接受0-255范围内的值。
你可能会想,既然可以通过改变电阻来控制LED的亮度,那么一个罐子就足够了,为什么要使用Arduino呢。再一次,它仅仅是基础,展示一个罐子可以用一个阿杜伊诺配置。
没问题,现在我们要做一些没有Arduino做不到的事情。
在这个实验中,我们将看到如何利用壶的变化电阻来控制LED的闪烁速度或速率。
程序是这样的:
const int kPinPot = A0;
常数int kPinLed=9;
无效设置()
{
pinMode (kPinLed、输出);
}
void循环()
{
int值;
sensorValue = analogRead (kPinPot);
DigitalWrite(kpinled,高);
延迟(传感器值);
数字写入(kPilled,低位);
延迟(传感器值);
}
3.2.3避免延误()
上面的代码看起来不错,但LED在每个完整周期内都无法检查pot值。由于延迟时间较长,用户在移动pot时必须等待更长的时间才能看到pot响应。这种延迟可以通过一些智能编程来避免,因此它允许用户在没有最小延迟的情况下检查值。她这是密码。
const int kPinPot = A0;
常数int kPinLed=9;
无效设置()
{
pinMode (kPinLed、输出);
}
长时间=0;
int ledvalue =低;
void循环()
{
int值;
sensorValue = analogRead (kPinPot);
如果(毫秒()>lastTime+sensorValue){
if(LEDValue ==低){
ledValue=高;
}
否则{
ledValue=低;
}
lastTime=millis();
数字写入(kPilled、ledValue);
}
}
那么,在上面的代码中有什么不同呢?下面这一行就是区别所在。
长时间=0;
在本节之前,我们已经讨论了变量int。但是,您可以访问更多类型的变量。列表如下:
目前,可能只需要知道,对于存储相对较大的数据以供int变量,您可以使用长的或者长整型。
在这里,您可以看到另一个有趣的函数,名为米利斯()。
这将产生Arduino从开始运行过程中以毫秒为单位的时间跨度(这将在每50天后重置为0)。这里它返回一个long,因为如果它返回int,可能无法长时间计算。你能准确地回答多久吗?答案是32.767秒。
因此,我们不使用delay(),而是检查millis(),一旦特定的毫秒数过去,我们就改变LED。因此,我们将上次更改的时间存储在上次变量,因此它允许我们在需要时再次检查它。
3.3 RGB发光二极管
到目前为止,我们已经使用了单色LED。虽然LED颜色可以通过用另一种颜色替换LED来改变,但是使用RGB LED如何改变LED颜色不更换LED灯?
RGB LED基本上是一个嵌入红色、绿色和蓝色LED并合并为单个LED的LED。它有一根公共引线接地或0V供电轨,而其他3根引线则通过各种PWM正极信号供电,以实现预期的功能混色.
您可以按如下方式连线设置:
它可能看起来有点复杂,但实际上它是我们早期使用PWM的LED控制设计的复制品。
下面是一个练习程序代码:
常数int kPinPot1=A0;
常数int kPinPot2=A1;
常数int kPinPot3=A2;
常数int kPinLed_R=6;
常数int kPinLed_G=10;
常数int kPinLed_B=11;
无效设置()
{
pinMode(输入、输出);
pinMode(输入、输出);
pinMode(kPilled_B,输出);
}
void循环()
{
int potvalue;
智力价值;
potValue = analogRead (kPinPot1);
map(potValue, 0, 1023, 0, 255);
模拟写入(kPilled_R,ledValue);
potValue=analogRead(kInput2);
map(potValue, 0, 1023, 0, 255);
模拟写入(kPilled_G,ledValue);
potValue = analogRead (kPinPot3);
map(potValue, 0, 1023, 0, 255);
模拟写入(kPilled_B,ledValue);
}
上传此代码后,只需了解罐调整如何为RGB创造有趣的光线影响,这可能是一个真正的乐趣。
你会发现,当所有3个罐子都移动到最大位置时,你会看到红色,而不是白色。这是因为红色是3种颜色中最突出的颜色,因此在这种情况下占主导地位。不过,你可以尝试这个功能地图(),然后再执行到LED的红色部分,以创建更合理的平衡。
音频与Arduino
在本节中,我们将学习如何将基本声音和音乐添加到Arduino设置中。
我们将看到如何将信号切换到具有所需频率的连接扬声器。
更准确地说,将尝试中间a音符,即频率为440 Hz的音符。
要做到这一点,我们只需播放一个中间音符,并用方波优化正弦波信号。
此外,我们将通过起诉公式计算扬声器可以保持的时间量:
时间延迟=1秒/2 x音调频率。
timedelay = 1秒/ 2 x 440
时间延迟=1136微秒
4.1让我们连接Arduino板
4.2添加一个简单的纸币
我们已经讨论了这个功能延迟()当单位为毫秒(秒/1000)时,您将发现另一个函数延迟微秒()
其中单位为微秒(毫秒/1000)。
对于目前的设置,我们编写了一个代码,以440脉冲每秒的速度在与扬声器连接的选定引脚上切换+5V ON/OFF。
回想一下,在上一次讨论中,我们确定了预期音频注释的值1136微秒。
这是一个程序,它可以让你在连接扬声器的情况下对arduino进行编程后,立即听到440 Hz的音频提示。
常数int kPinSpeaker=9;
const int k_timeDelay=1136;
无效设置()
{
pinMode(kPinSpeaker,输出);
}
void循环()
{
数字写入(kPinSpeaker,高);
延迟微秒(k_时间延迟);
数字写入(kPinSpeaker,低电平);
延迟微秒(k_时间延迟);
}
使用上述应用程序可以制作音频备忘,这也意味着我们可以根据自己的选择制作音乐。
从我们理解的代码中,Arduino包含几个集成功能,该功能还有助于创建音乐。
第一个是语气()与2个元素一起使用,以及3rd可选元素,指定为音调(pin、频率、持续时间)。或音调(pin、频率)
两者都被指定执行您指定的各自时间段。
在没有时间周期的情况下,音乐将继续播放,直到呼叫结束语气()再次执行,或直到执行诺通()。
这需要使用延迟函数来完成,因为音乐播放是你执行的唯一基本内容。
持续时间可能很关键,因为它可以提供播放音乐的时间,因此您可以自由地做其他事情。一旦持续时间过期,音乐就会停止。
下一个函数诺通()处理单个参数并在指定的特定管脚上停止所选音调。
一个特别的警告:任何时候语气()功能执行后,针脚3和11上的PWM功能将停止工作。
因此,每当节目中使用扬声器附件时,请确保不要为扬声器使用上述pin,而应尝试为扬声器附件使用其他pin。
这是一个在扬声器上实现音乐的程序,虽然它不是一个真正的音乐,而是一个基本音阶的C音符。
#定义注释_C4262
#定义NOTE_D4 294
#定义注释4 330
#定义注释F4 349
#定义注释4 392
#定义NOTE_A4 440
#定义注释4 494
#定义NOTE_C5 523
常数int kPinSpeaker=9;
无效设置()
{
pinMode(kPinSpeaker,输出);
}
void循环()
{
音调(kPinSpeaker,音符C4500);
延迟(500);
音调(kPinSpeaker,音符4,500);
延迟(500);
音调(kPinSpeaker,注4,500);
延迟(500);
音调(kPinSpeaker,音符F4,500);
延迟(500);
音调(kPinSpeaker,音符4,500);
延迟(500);
音调(kPinSpeaker,音符A4,500);
延迟(500);
音调(Kpinspeaker,Note_b4,500);
延迟(500);
音调(kPinSpeaker,音符C5500);
延迟(500);
诺通(克宾斯派克);
延迟(2000年);
}
在上面的代码中,您可能已经注意到了新的东西#定义.
该术语的工作原理类似于编译时计算机的搜索和替换命令。
每当它在空格前找到第一个内容时,就会用行的剩余部分(称为宏)替换它。
在这个例子中,当计算机看到附注4它很快将其替换为数量330。
有关更多说明和自定义信息,请参考U盘中名为投球,其中大部分频率可供您选择。
4.4具有多种功能的音乐
上面的代码看起来很好,但似乎有很多重复,应该有一些方法来缩短这些重复,对吗?
到目前为止,我们已经使用了Arduino包含的两个基本功能。现在可能是我们创建自己的功能的时候了。
每个函数必须以它可能关联的变量的类型开始。例如函数无效的指不返回任何内容的类型,因此名称为void。注意,我们在前面的章节中已经讨论了变量列表,您可能希望引用这些变量。
因此,特定的函数名会得到一个开括号”(“其次是逗号分隔参数列表。
每个参数都需要它的类型、名称,最后是一个close")"括号。
这些参数可以以变量的形式应用于函数中。
下面我们来看一个例子,其中我们开发了一个名为ourTone ()旨在合并语气()和延迟()行,函数停止返回,直到音符完成音调播放。
我们在前面的代码中实现了这些函数,并获得以下程序,请参见最后几行:
#定义注释_C4262
#定义NOTE_D4 294
#定义注释4 330
#定义注释F4 349
#定义注释4 392
#定义NOTE_A4 440
#定义注释4 494
#定义NOTE_C5 523
常数int kPinSpeaker=9;
无效设置()
{
pinMode(kPinSpeaker,输出);
}
void循环()
{
音调(kPinSpeaker,音符C4500);
延迟(500);
音调(kPinSpeaker,音符4,500);
延迟(500);
音调(kPinSpeaker,注4,500);
延迟(500);
音调(kPinSpeaker,音符F4,500);
延迟(500);
音调(kPinSpeaker,音符4,500);
延迟(500);
音调(kPinSpeaker,音符A4,500);
延迟(500);
音调(Kpinspeaker,Note_b4,500);
延迟(500);
音调(kPinSpeaker,音符C5500);
延迟(500);
诺通(克宾斯派克);
延迟(2000年);
}
无效音调(整数频率,整数持续时间)
{
音调(kPinSpeaker、频率、持续时间);
延迟(持续时间);
}
函数可以非常方便地使程序更容易理解。
下面是一个例子,我们可以使用两个数组指定要播放的音调的选择。一组保留音符,另一组保留节拍。
# include“pitches.h”
int kPinSpeaker = 9;
#定义NUM_NOTES 15
const int notes[NUM_notes]=//0表示一个rest
{
注4,注4,注4,注4,注4,
注释A4,注释A4,注释G4,注释F4,
注4,注4,注4,注4,注4,
注4,注4,注0
};
常量整数节拍[NUM_NOTES]={
1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
Const int beat_length = 300;
无效设置()
{
pinMode(kPinSpeaker,输出);
}
void循环()
{
对于(int i=0;i
延迟(拍[i]*拍长);//休息
}
否则{
ourTone(音符[i],节拍[i]*节拍长度);
}
//在音符之间停顿
诺通(克宾斯派克);
延迟(拍长/2);
}
}
无效音调(整数频率,整数持续时间)
{
音调(kPinSpeaker、频率、持续时间);
延迟(持续时间);
}
你可以清楚地看到第一行的介绍#包括语句。此语句的任务是在引号之间拾取整个文件,并将其放置在#包括声明。根据标准规则,这些严格放在课程开始时。
第五章
测温
回想一下,记住不要完全编写大型程序,编写和分析代码的小部分总是明智的,这有助于快速跟踪错误。
5.1串行监视器
到目前为止,我们讨论的代码似乎并不容易实现快速故障排除。在这里,我们将尝试使监视和解决可能出现的问题变得更容易。
Arduino具有一项功能,可使其与计算机“对话”。您可能会注意到,pin0和pin1在彼此旁边被标记为RX和TX。这些管脚实际上由Arduino内的一个单独IC跟踪,该IC将其升级为在插入PC时通过USB电缆读取。
下面的部分展示了一个完整的程序,请浏览一下,我们将了解代码中的新条目。该代码与第2.2节所述代码相同,只是它包含一些额外的数据,以便我们识别代码的目的。
常数int kPinLed=13;
无效设置()
{
pinMode (kPinLed、输出);
Serial.begin (9600);
}
int delayTime = 1000;
void循环()
{
delayTime=delayTime-100;
if(delayTime <= 0){//如果它是0或更小,重置它。
延迟时间=1000;
}
Serial.print(“delayTime=”);
Serial.println(延迟时间);
DigitalWrite(kpinled,高);
延迟(时延);
数字写入(kPilled,低位);
延迟(时延);
}
您可以在这里识别两个新事物,在设置()功能。
Serial.begin (9600);
这一行简单地表达了使用连载1用9600波特强制执行的代码。(此处序列号指位一个接一个地发送,波特率表示发送的速率)。此波特率值和串行监视器内的波特率值(我们将在后面了解)必须相等,否则串行监视器中的数据将显示垃圾。9600作为标准,使用起来更加方便。
第二个新条目如下:
Serial.print(“delayTime=”);
Serial.println(延迟时间);
在这里,第二行表明从串口出来的后续物品将从下一行开始。这就是第二行与拳头线不同的方式。
您还可以看到引号(“)。这被称为字符串,在这里只能像常量一样使用,因为关于这个主题的进一步讨论可能过于详细,超出了范围。
好的,我们现在可以在Arduino中上传上面的代码,看看会发生什么。
哎呀,似乎什么都没发生,Arduino pin#13 LED闪烁并停止,而Tx LED一直闪烁。
那是因为串行监视器窗口还没有修复。
如上图所示,您需要单击IDE中的串行监视器框。请不要忘记检查位于右下角的波特率,默认情况下波特率应为9600,并将与代码匹配。如果不匹配,请确保选择9600。
下面的视频片段解释了如何做到这一点。
现在让我们前进,了解上述串行监视器功能如何帮助处理使用Arduino测量温度
我们将使用IC TMP36作为温度传感器,温度范围为-40到150摄氏度。
设置如下所示:
下面的代码将通过读取TMP36传感器的输出来开始温度测量,并将它们发送到ID的串行监视器。
常数int kPinTemp=A0;
无效设置()
{
Serial.begin (9600);
}
void循环()
{
浮动温度c=getTemperatureC();
连续打印(温度);
串行打印项次(“摄氏度”);
//现在转换为华氏温度
FLOAT温度= CONVERTTOF(锻炼);
连续打印(温度f);
序列号。println(“华氏度”);
延迟(500);
}
浮点数getTemperatureC()
{
int reading=模拟读取(kPINTEP);
浮动电压=(读数*5.0)/1024;
//从每度10毫伏转换到500毫伏偏移
//至度((电压-500mV)*100)
返回(电压 - 0.5)* 100;
}
浮动转换器TOF(浮动温度C)
{
返回(温度* 9.0 / 5.0)+ 32.0;
}
让我们从头开始理解代码。
浮动温度c=getTemperatureC();
在这里您可以看到,我们已经包含了变量类型浮动
这是唯一一种变量类型,其特点是存储除整数(没有小数或小数部分的数字)以外的所有内容。
浮点变量的精度可高达6至7位。
相邻代码getTemperatureC()
是我们自己的函数,它通过数学计算将TMP36传感器感应到的电压差转换为摄氏度。
浮点数getTemperatureC()
{
int reading=模拟读取(kPINTEP);
浮动电压=(读数*5.0)/1024;
//从每度10毫伏转换到500毫伏偏移
//至度((电压-500mV)*100)
返回(电压 - 0.5)* 100;
}
在代码的下一节中,由于analogIn ()
如果指定返回一个介于1到1023之间的数字,我们就可以通过将读数乘以5,然后除以1024来评估传感器的电压。
传感器TMP36被指定在0摄氏度时产生0.5V电压,随后每升高一次摄氏度就产生10mV电压。
以下是我们通过计算得出的近似值:
你可以考虑第一个返回值的函数(注意,到目前为止,所有剩下的函数都没有返回任何值,因为它们都是该类型的无效的).
您可以理解,为了从函数中获取值,只需添加回来后面是你想要返回的数字。
当我们说回来这意味着无论何时调用该函数,该函数都会返回一个响应或回复,这可以应用于变量。
当它被发送到串行监视器时,读数通过convertToF()。
浮动转换器TOF(浮动温度C)
{
返回(温度* 9.0 / 5.0)+ 32.0;
}
此函数用于拾取摄氏度范围并将其转换为华氏度。
为了将华氏温度转换为摄氏温度,我们实现了以下公式华氏温度=9/5摄氏度+32摄氏度。
5.3液晶显示器的接口
现在,让我们研究如何接口或连接液晶显示器使用Arduino可获得所需输出的视觉显示。
在我们的应用中,我们将采用84x48图形LCD,其水平分辨率为84像素或点,垂直分辨率为48像素。由于所有LCD都需要专用控制器,因此目前的设备还包括一个PCD8544控制器。
在本教程中,我们将使用Arduino连接上述指定的LCD模块,并应用某些例程在显示屏上创建文本消息。
在下图中,您可以找到有关LCD接口的详细信息,以及一个小屏幕3.3V电压调节器.此调节器是必要的,因为LCD指定使用3.3V电源。
您还可以从LCD模块中看到8个引脚,从下表中可以研究引脚钻头规格:
现在,让我们看看如何将LCD和相关参数与我们的Arduino连接起来。下图显示了详细信息:
5.4与LCD的通信
虽然可以用来自Arduino的液晶显示器编写精细的衣物,但我们宁愿学习如何使用库做同样的事情。
库包含一系列代码,可快速应用于选定的Arduino程序。
这使用户能够轻松地调用函数而无需通过复杂的编码工作。
5.4.1如何安装库
为此,您必须在计算机Arduino IDE中创建一个名为libraries的目录,如前所述在这里
5.4.2实施LCD操作
与前面的方法一样,我们将首先检出整个代码,然后尝试理解每一行的细节。
#include
常数int kPin_CLK=5;
const int kPin_DIN = 6;
常数int kPin_DC=7;
常数int kPin_RESET=8;
PCD8544 lcd(kPin_CLK, kPin_DIN, kPin_DC, kPin_RESET);
无效设置()
{
lcd.init();
lcd.setCursor(0,0);
打印(“你好,世界!”);
}
void循环()
{
lcd.setCursor(0,1);
lcd.print(millis());
}
该行包括代码#include
代码#include指示PC在程序编译过程中拾取所提到的文件并用文件内容替换#include元素。
#include元素可以具有尖括号,表示在库目录中搜索,也可以具有引号,表示在程序所在的同一目录中搜索。
随后的代码行表示LCD引脚,然后我们编写一种新形式的变量:
PCD8544 lcd(kPin_CLK, kPin_DIN, kPin_DC, kPin_RESET);
在这里,我们用名称为lcd的变量来表示类型为PCD8544的变量,并指示PC重新调整与Arduino相关联的pinout。
在这个过程中,我们通过指示pin clk、din、dc和reset如何与Arduino接口来向PC描述变量。
无效设置()
{
lcd.init();
lcd.setCursor(0,0);
打印(“你好,世界!”);
}
这条线lcd.init();
初始化LCD操作。一旦执行此操作,下一行将在显示屏的左上角强制执行光标。下一行将努力打印消息“Hello,World”。
这与我们在串行监视器上发送消息的技术相同。唯一的区别是使用代码lcd.print
代替并。
实际上重复调用下一个代码块。
void循环()
{
lcd.setCursor(0,1);
lcd.print(millis());
}
用这条线lcd.setCursor(0,1);
在LCD显示屏上,我们将光标固定到第1行左侧的第0列。
下一行使用快捷方式:lcd.print(millis());
如果你还记得我们合作过的米利斯()
在我们之前的代码中,我们也可以通过代码在这里应用相同的代码:
长numillis=millis();
lcd.打印(numMillis);
然而,由于这里不涉及毫秒的时间段,因此我们只需发送米利斯()
直接作用于lcd.print()
.
5.5将整件事结合起来
好的,现在让我们结合上面学习的所有代码来制作LCD温度电路,让我们看看它的外观:
#include
常数int kPin_CLK=5;
const int kPin_DIN = 6;
常数int kPin_DC=7;
常数int kPin_RESET=8;
常数int kPin_Temp=A0;
PCD8544 lcd(kPin_CLK, kPin_DIN, kPin_DC, kPin_RESET);
无效设置()
{
lcd.init();
lcd.setCursor(10,0);
液晶显示。打印(“温度:”);
}
void循环()
{
浮动温度c=getTemperatureC();
//现在转换为华氏温度
FLOAT温度= CONVERTTOF(锻炼);
lcd.setCursor(21日1);
液晶显示器。打印(温度);
液晶显示。打印(“C”);
lcd.setCursor(21,2);
lcd.打印(温度f);
液晶显示器。打印(“F”);
延迟(100);
}
浮点数getTemperatureC()
{
int reading=模拟读数(kPin_Temp);
浮动电压=(读数*5.0)/1024;
//从每度10毫伏转换到500毫伏偏移
//至度((电压-500mV)*100)
返回(电压 - 0.5)* 100;
}
浮动转换器TOF(浮动温度C)
{
返回(温度* 9.0 / 5.0)+ 32.0;
}
在上面的程序中,除了函数的使用之外,所有内容看起来都是标准的setCursor(). 这用于将文本尽可能围绕显示屏中心对齐。
太好了!恭喜你,你刚刚用Arduino为自己的小LCD温度指示器编程。
实际Arduino程序
既然我们已经全面详细地介绍了各种编程技术,现在是时候通过将它们应用到一些有用的实际实现中来测试它们了。
我们将从传感器开始,通过执行一些示例代码,了解传感器设备如何与Arduino一起使用。
7.1传感器简介
在本教程中,我们将学习Arduino可使用的各种传感器。这些传感器可能包括光传感器LDR、磁霍尔效应传感器、倾斜传感器、振动传感器、压力传感器等设备。
我们将从的接口开始光传感器,如下图所示:
众所周知,LDR是一种依赖于光的电阻器件,其电阻取决于环境入射到其表面的强度。
光的强度与LDR的电阻读数成反比。
这里我们将学习如何将这个属性与Arduino集成,以执行一个有用的应用程序:
完整的程序代码可以可视化,如下所示:
常数int kPin_光电管=A0;
无效设置()
{
Serial.begin (9600);
}
void循环()
{
int value = analogRead(kpin_光电管);
系列。print("模拟读数= ");
串行打印(值);
如果(值<200){
系列。println(”——黑暗”);
}否则如果(值<400){
Serial.println(“-Dim”);
}
否则如果(值<600){
Serial.println(“-Light”);
}
否则if(value <800){
Serial.println(“-Bright”);
}
否则{
serial.println(“ - 非常明亮”);
}
延迟(1000);
}
代码中使用的所有参数都已经在我们的课程中讨论过了,我们已经学习过了。您可以参考相关章节检查代码行。
这些值是随机选择的,您可以根据自己的喜好轻松更改。
倾斜传感器
倾斜传感器是一种简单的装置,可用于检测任何物体上的倾斜动作。该装置内部基本上有一个金属球,当它倾斜时,会在一对触点上滚动,从而在这些触点上产生传导。这些触点作为倾斜开关的引线端接,与外部电路一起用于检测倾斜动作引起的导通,并激活所需的输出应用程序。
现在让我们来看看倾斜传感器设备可以连接起来。下面的图片给了我们一个关于完整配置的想法:
const int kPin_Tilt = 3;
常数int kPin_LED=13;
无效设置()
{
pinMode(kPin_倾斜,输入);
数字写入(kPin_倾斜,高);//打开内置上拉电阻器
pinMode(kPin_发光二极管,输出);
}
void循环()
{
如果(数字读取(kPin_倾斜)=高){
数字写入(kPin_发光二极管,低电平);
}
否则{
数字写入(kPin_发光二极管,高电平);
}
}
在本例中,默认引脚#13 LED用作倾斜指示器。
您可以清楚地看到在这里包含上拉电阻,我们在第3.1节中所做的相似。因此,术语低表示未触发倾斜函数。
7.4簧片开关继电器(微型磁激活继电器)
现在让我们看看如何用Arduino连接继电器开关或磁场传感器。簧片继电器是一种开关,当磁场或磁铁靠近它时,它会激活或传导。基本上,它在一个微型玻璃外壳内有一对铁磁触点,每当磁铁移动时,通过磁拉力连接或接触tic离它很近。当这种情况发生时,由于触点闭合,触点的端子显示导通。
这里我们也使用引脚#13 LED指示响应。根据我们之前的解释,如果需要,您可以从该引脚连接外部LED。
常数int kPinReedSwitch=2;
常数int kPinLed=13;
无效设置()
引脚模式(kPinReedSwitch,输入);
digitalWrite(kPinReedSwitch,高);//打开上拉电阻器
pinMode (kPinLed、输出);
}
void循环()
{
if(数字读取(kPinReedSwitch)=低){
DigitalWrite(kpinled,高);
}
否则{
数字写入(kPilled,低位);
}
}
代码术语应该是熟悉的和自解释的。
7.5使用压电传感器的振动传感器
在下一个示例程序中,我们将看到压电换能器可作为振动传感器,通过Arduino点亮LED。
压电元件实际上是一种装置,当在其端子上施加频率时,它会产生振动或振荡。然而,同样的压电元件也可以用于反向过程中,用于产生电脉冲对施加在其身上的振动作出响应。这种振动可能以敲击或撞击压电元件表面的形式出现。
按照下图设置Arduino和压电元件
常数int kPinSensor=A5;
常数int kPinLed=13;
常数int k_阈值=100;
int-ledState=低;//用于存储最后一个LED状态的变量,用于切换灯
无效设置()
{
pinMode (kPinLed、输出);//将ledPin声明为OUTPUT
}
void循环()
{
int val=模拟读数(kPinSensor);
if(val> = k_threshold){
ledState=!ledState;//切换ledState的值
数字写入(kPinLed、ledState);
延迟(20);//用于去抖动
}
}
引入阈值100只是为了确保Arduino仅对通过敲击产生的真实振动做出响应,而不是其他较小的振动,如响声或喇叭。
A5引脚的选择不是强制性的,您可以选择任何其他模拟输入,根据您的偏好,并通过匹配它在程序代码。
采用Arduino伺服电机
伺服电机是一种直流电机,可根据特定应用的要求旋转至精确角度。可通过对电机的相关输入应用计算命令,在电机180度范围内产生精确的旋转或转动角度。
通常,伺服电机有3条导线或输入。正极导线通常为红色,负极或接地线为黑色,而命令线或信号线通常为白色或黄色。
Arduino通过内置的支持语言方便了伺服电机的控制,使控制非常方便,是伺服电机的理想选择。
以下示例将向我们展示通过Arduino实现伺服电机控制的基本设置程序:
代码如下:
#包括
伺服伺服1;
const int kPinPot = A0;
常数int kPinServo1=9;
无效设置()
{
伺服1.连接(kPinServo1);
}
void循环()
{
int val=模拟读取(kPinPot);
val =地图(Val,0,1023,0,180);
伺服1.写入(val);
延迟(15);
}
我们可以在这里看到一些新条目。一个告诉伺服连接线分配到哪个引脚的装置。另一个是代码,该代码为销提供0到180之间的值,用于确定伺服上的旋转角度。
结论
Arduino主题可能非常长,因此超出了本文的范围。但是,我希望以上教程一定能够帮助您学习Arduino的基本知识,并通过各种示例应用程序代码理解重要的参数。
希望更多的信息可以随时在这里更新,只要它是可用的。
与此同时,享受您的编程课程,快乐arduinoing给您!