首页 arduino基础入门教程

arduino基础入门教程

举报
开通vip

arduino基础入门教程 第 1 章 进入 Arduino 的世界 欢迎来到 Arduino的世界!Arduino是一个开源的开发平台,在全世界范围内成千上万的人正 在用它开发制作一个又一个电子产品,这些电子产品包括从平时生活的小物件到时下流行的 3D打 印机,它降低了电子开发的门槛,即使是从零开始的入门者也能迅速上手,制作有趣的东西,这便 是开源 Arduino的魅力。通过本书的介绍,读者对 Arduino会有一个更全面的认识。 本章知识点:  Arduino的起源与发展  Arduino的特点 ...

arduino基础入门教程
第 1 章 进入 Arduino 的世界 欢迎来到 Arduino的世界!Arduino是一个开源的开发平台,在全世界范围内成千上万的人正 在用它开发制作一个又一个电子产品,这些电子产品包括从平时生活的小物件到时下流行的 3D打 印机,它降低了电子开发的门槛,即使是从零开始的入门者也能迅速上手,制作有趣的东西,这便 是开源 Arduino的魅力。通过本书的介绍,读者对 Arduino会有一个更全面的认识。 本章 知识点 高中化学知识点免费下载体育概论知识点下载名人传知识点免费下载线性代数知识点汇总下载高中化学知识点免费下载 :  Arduino的起源与发展  Arduino的特点  Arduino开发板简介  Arduino的未来展望 1.1 什么是 Arduino 什么是 Arduino?相信很多读者会有这个疑问,也需要一个全面而准确的答案。不仅是读者, 很多使用 Arduino 的人也许对这个问题都难以给出一个准确的说法,甚至认为手中的开发板就是 Arduino,其实这并不准确。那么,Arduino究竟该如何理解呢? 1.1.1 Arduino 不只是电路板 Arduino 是一种开源的电子平台,该平台最初主要基于 AVR 单片机的微控制器[1]和相应的开 发软件,目前在国内正受到电子发烧友的广泛关注。自从 2005 年 Arduino腾空出世以来,其硬件 和开发环境一直进行着更新迭代。现在 Arduino 已经有将近十年的发展历史,因此市场上称为 Arduino的电路板已经有各式各样的版本了。Arduino开发团队正式发布的是Arduino Uno和Arduino Mega 2560,如图 1-1和图 1-2所示。 [1] 关于 AVR单片机的内容会在第 3章进行介绍。 Arduino 开发从零开始学 ·2· 图 1-1 Arduino Uno R3 图 1-2 Arduino Mega 2560 R3 图 1-1和图 1-2所示的开发板就是所谓的Arduino I/O印刷电路板(Printed Circuit Board, PCB)。 Arduino项目起源于意大利,该名字在意大利是男性用名,音译为“阿尔杜伊诺”,意思为“强 壮的朋友”,通常作为专有名词,在拼写时首字母需要大写。其创始团队成员包括:Massimo Banzi、 David Cuartielles、Tom Igoe、Gianluca Martino、David Mellis和 Nicholas Zambetti 6人。Arduino的 出现并不是偶然,Arduino最初是为一些非电子工程专业的学生设计的。设计者最初为了寻求一个 廉价好用的微控制器开发板从而决定自己动手制作开发板,Arduino一经推出,因其开源、廉价、 简单易懂的特性迅速受到了广大电子迷的喜爱和推崇。几乎任何人,即便不懂电脑编程,利用这个 开发板也能用 Arduino做出炫酷有趣的东西,比如对感测器探测做出一些回应、闪烁灯光、控制马 达等。 Arduino 的硬件设计电路和软件都可以在官方网站上获得,正式的制作商是意大利的 SmartProjects(www.smartprj.com), 许多制造商也在生产和销售他们自己的与 Arduino兼容的电路 板和扩展板,但是由 Arduino团队设计和支持的产品需要始终保留着 Arduino的名字。所以,Arduino 更加准确的说法是一个包含硬件和软件的电子开发平台,具有互助和奉献的开源精神以及团队力 量。 1.1.2 Arduino 程序的开发过程 由于 Arduino主要是为了非电子专业和业余爱好者使用而设计的,所以 Arduino被设计成一个 小型控制器的形式,通过连接到计算机进行控制。Arduino开发过程是: (1)开发者设计并连接好电路; (2)将电路连接到计算机上进行编程; (3)将编译通过的程序下载到控制板中进行观测; (4)最后不断修改代码进行调试以达到预期效果。 进入 Arduino 的世界 第 1 章 ·3· 1.2 为什么要使用 Arduino 在嵌入式开发中,根据不同的功能开发者会用到各种不同的开发平台。而 Arduino作为新兴开 发平台,在短时间内受到很多人的欢迎和使用,这跟其设计的原理和思想是密切相关的。 首先,Arduino无论是硬件还是软件都是开源的,这就意味着所有人都可以查看和下载其源码、 图表、设计等资源,并且用来做任何开发都可以。用户可以购买克隆开发板和基于 Arduino的开发 板,甚至可以自己动手制作一个开发板。但是自己制作的不能继续使用 Arduino这个名称,可以自 己命名,比如 Robotduino。 其次,正如林纳斯·本纳第克特·托瓦兹的 Linux操作系统一样,开源还意味着所有人可以下 载使用并且参与研究和改进 Arduino,这也是 Arduino更新换代如此迅速的原因。全世界各种电子 爱好者用 Arduino开发出各种有意思的电子互动产品。有人用它制作了一个自动除草机,去上班的 时候打开,不久花园里的杂草就被清除干净了!有人用它制作微博机器人,配合一些传感器监测植 物的状态,并及时发微博来提醒主人,植物什么时间该浇水、施肥、除草等,非常有趣。 图 1-3所示为日本一开发者用 Arduino和 Kinect制作的可以自己接住丢掉垃圾的智能垃圾桶。 图 1-3 智能垃圾桶 Arduino可以和 LED、点阵显示板、电机、各类传感器、按钮、以太网卡等各类可以输出输入 数据或被控制的任何东西连接,在互联网上各种资源十分丰富,各种案例、资料可以帮助用户迅速 制作自己想要制作的电子设备。 在应用方面,Arduino突破了传统的依靠键盘、鼠标等外界设备进行交互的局限,可以更方便 地进行双人或者多人互动,还可以通过 Flash、Processing等应用程序与 Arduino进行交互。 Arduino与 Flash、Processing的交互将在第 6章介绍。 1.3 Arduino 硬件的分类 在了解 Arduino起源以及使用 Arduino制作的各种电子产品之后,接下来对 Arduino硬件和开 Arduino 开发从零开始学 ·4· 发板,以及其他扩展硬件进行初步的了解和学习。 1.3.1 Arduino 开发板 Arduino开发板设计得非常简洁,一块 AVR单片机、一个晶振或振荡器和一个 5V的直流电源。 常见的开发板通过一条 USB 数据线连接计算机。Arduino 有各式各样的开发板,其中最通用的是 Arduino UNO。另外,还有很多小型的、微型的、基于蓝牙和Wi-Fi的变种开发板。还有一款新增 的开发板叫做 Arduino Mega 2560,它提供了更多的 I/O引脚和更大的存储空间,并且启动更加迅 速。以 Arduino UNO为例,Arduino UNO的处理器核心是 ATmega 328,同时具有 14路数字输入/ 输出口(其中 6路可作为 PWM输出),6路模拟输入,一个 16MHz的晶体振荡器,一个 USB口, 一个电源插座,一个 ICSP header和一个复位按钮。因为Arduino UNO开发板的基础构成在一个表 里显示不下,所以这里特意设计了两个表来展示,如表 1-1和表 1-2所示。 表 1-1 Arduino UNO 开发板基本概要构成(ATmega328)1 处理器 工作电压 输入电压 数字 I/O脚 模拟输入脚 串口 ATmega328 5V 6-20V 14 6 1 表 1-2 Arduino UNO 开发板基本概要构成(ATmega328)2 IO 脚直流电流 3.3V 脚直流电流 程序存储器 SRAM EEPROM 工作时钟 40 mA 50 mA 32 KB 2 KB 1 KB 16 MHz 图 1-4对一块 Arduino UNO开发板功能进行了详细标注。 图 1-4 Arduino UNO R3功能标注 Arduino UNO可以通过以下三种方式供电,能自动选择供电方式:  外部直流电源通过电源插座供电;  电池连接电源连接器的 GND和 VIN引脚;  USB接口直接供电,图 1-4所示的稳压器可以把输入的 7V~12V电压稳定到 5V。 进入 Arduino 的世界 第 1 章 ·5· 在电源接口上方,一个右侧引出 3 个引脚,左侧一个比较大的引脚细看会发现上面有 AMST1117的字样,其实这个芯片是个三端 5V稳压器,电源口的电源经过它稳压之后才给板子输 入,其实电源适配器内已经有稳压器,但是电池没有。可以理解为它是一个安检员,一切从电源口 经过的电源都必须过它这一关,这个“安检员”对不同的电源会进行区别对待。 首先,AMS1117的片上微调把基准电压调整到 1.5%的误差以内,而且电流限制也得到了调整, 以尽量减少因稳压器和电源电路超载而造成的压力。再者根据输入电压的不同而输出不同的电压, 可提供 1.8V、2.5V、2.85V、3.3V、5V 稳定输出,电流最大可达 800mA,内部的工作原理这里不 必去探究,读者只需要知道,当输入 5V 的时候输出为 3.3V,输入 9V 的时候输出才为 5V,所以 用 9V(9V~12V均可,但是过高的电源会烧坏板子)电源供电的原因就在这,如使用 5V的适配器 与 Arduino 连接,之后连接外设做实验,会发现一些传感器没有反应,这就是某些传感器需要 5V 的信号源,可是板子最高输出只能达到 3.3V,必然有问题。 重置按钮和重置接口都用于重启单片机,就像重启电脑一样。若利用重置接口来重启单片机, 应暂时将接口设置为 0V即可重启。 GND 引脚为接地引脚,也就是 0V。A0~A5 引脚为模拟输入的 6 个接口,可以用来测量连接 到引脚上的电压,测量值可以通过串口显示出来。当然也可以用作数字信号的输入输出。 Arduino同样需要串口进行通信,图 1-4所示的串口指示灯在串口工作的时候会闪烁。Arduino 通信在编译程序和下载程序时进行,同时还可以与其他设备进行通信。而与其他设备进行通信时则 需要连接 RX(接收)和 TX(发送)引脚。ATmega 328芯片中内置的串口通信硬件是可以通过同 步和异步模式工作的。同步模式需要专用的信号来表示时钟信息,而 Arduino 的串口(USART 外 围设备,即通用同步/异步接收发送装置)工作在异步模式下,这和大多数 PC的串口是一致的。数 字引脚 0和 1分别标注着 RX和 TX,表明这两个可以当做串口的引脚是异步工作的,即可以只接 收、发送,或者同时接收和发送信号。 1.3.2 Arduino 扩展硬件 与 Arduino相关的硬件除了核心开发板外,各种扩展板也是重要的组成部分。Arduino开发板 设计的可以安装扩展板,即盾板进行扩展。它们是一些电路板,包含其他的元件,如网络模块、 GPRS模块、语音模块等。在图 1-4所示的开发板两侧可以插其他引脚的地方就是可以用于安装其 他扩展板的地方。它被设计为类似积木、通过一层层的叠加而实现各种各样的扩展功能。例如 Arduino UNO同W5100网络扩展板可以实现上网的功能,堆插传感器扩展板可以扩展 Arduino连 接传感器的接口。图 1-5和图 1-6为 Arduino同扩展板连接的例子。 图 1-5 Arduino UNO与一块原型扩展板连接 Arduino 开发从零开始学 ·6· 图 1-6 Arduino UNO与网络扩展板连接 虽然 Arduino开发板支持很多扩展板来扩展功能,但其扩展插座中引脚的间距并不严格规整。 仔细观察开发板会发现上面两个最远的引脚之间距离为 4.064mm,这与 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的 2.54mm网格的面包 板及其他扩展工具并不兼容,尽管要求改正的呼声很强烈,但是这个误差却很难改正,一旦改正将 使得原来的大量扩展板变得不兼容,所以这个误差便没有去改动。 虽然这个误差没有改动,但是很多公司和个人在生产 Arduino兼容的产品时兼顾增加了额外两 行 2.54mm 的针孔来解决这个问题,另外美国 Gravitech(www.gravitech.us)公司完全舍弃了扩展 板兼容来解决这个问题。 1.4 Arduino 展望未来 Arduino自诞生以来,简单、廉价的特点使得 Arduino如同雨后春笋般迅速风靡全球,在不断 发展的同时,Arduino也在发挥着更重要的作用。本节将对 Arduino发展的特点和未来发展做一点 总结和展望。 1.4.1 创客文化 在介绍 Arduino发展前景之前,首先需要了解逐渐兴起的“创客”文化。什么是“创客”?“创 客”一词来源于英文单词“Maker”,指的是不以盈利为目标,努力把各种创意转变为现实的人。 其实就是热爱生活,愿意亲手创新为生活增加乐趣的一群人。他们精力旺盛,坚信世界会因为自己 的创意而改变。 创客文化兴起于国外,经过一段时间红红火火的发展,如今已经成为一种潮流。国内也不示 弱,一些硬件发烧友了解到国外的创客文化后被其深深吸引,经过圈子中的口口相传,大量的硬件、 软件、创意人才聚集在了一起。各种社区、空间、论坛的建立使得创客文化在中国真正流行起来。 北京、上海、深圳已经发展成为中国创客文化的三大中心。 那么,是什么推动创客文化如此迅猛发展呢?众所周知,硬件的学习和开发是有一定的难度 的,人人都想通过简单的方式实现自己的创意,于是开源硬件应运而生。而开源硬件平台中知名度 较高的应该就是日渐强大的 Arduino了。 Arduino作为一款开源硬件平台,一开始被设计的目标人群就是非电子专业尤其是艺术家学习 使用的,让他们更容易实现自己的创意。当然,这不是说 Arduino性能不强、有些业余,而是表明 Arduino 很简单,易上手。Arduino 内部封装了很多函数和大量的传感器函数库,即使不懂软件开 发和电子设计的人也可以借助 Arduino很快创作出属于自己的作品。可以说 Arduino与创客文化是 进入 Arduino 的世界 第 1 章 ·7· 相辅相成的。 一方面,Arduino简单易上手、成本低廉这两大优势让更多的人都能有条件和能力加入创客大 军;另一方面,创客大军的日益扩大也促进了 Arduino的发展。各种各样的社区、论坛的完善,不 同的人、不同的环境、不同的创意每时每刻都在对Arduino进行扩展和完善。在2011年举行的Google I/O开发者大会上,Google公司发布了基于 Arduino的 Android Open Accessory标准和 ADK工具, 这使得大家对 Arduino的巨大的发展前景十分看好。 Arduino发展潜力巨大,既可以让创客根据创意改造成为一个小玩具,也可以大规模制作成工 业产品。国内外 Arduino社区良好的运作和维护使得几乎每一个创意都能找到实现的理论和实验基 础,相信随着城市的不断发展,人们对生活创新的不断追求,会有越来越多的人听说 Arduino、了 解 Arduino、玩转 Arduino。 1.4.2 快速原型设计 纵观计算机语言的发展,从 0和 1相间的二进制语言到汇编语言,从K&R的 C语言到现在各式 各样的高级语言,计算机语言正在逐渐变成更自由、更易学易懂的大众化语言。硬件的发展已经逐渐 降低软件开发的复杂性,编程的门槛正在逐渐降低。曾有人预言:未来的时代,程序员将要消失,编 程不再是局限人们思维和灵感的桎梏。在软件行业飞速发展的现在,几乎任何具有良好逻辑思维能力 的人只要对某些产品感兴趣,就可以通过互联网获得足够的资源从而成为一名软件开发人员。 而 Arduino的出现,让人们看到了不仅是软件,硬件的开发也越来越简单和廉价。不必从底层 开始学习开发计算机的特性让更多的人从零上手,将自己的灵感用最快的速度转化成现实。以 Arduino为其中代表的开源硬件,降低了入行的门槛,从而设计电子产品不再是专业领域电子工程 师的专利,“自学成才”的电子工程师正在逐渐成为可能。 开源硬件将会使得软件同硬件、互联网产业更好的结合到一起,在未来的一段时间里,开源 硬件将会有非常好的发展,最终形成硬件产品少儿化、平民化、普及化的趋势。同时,Arduino的 简单易学也会成为一些电子爱好者进入电子行业的一块基石,随着使用 Arduino制作电子产品的深 入,相应的也会对硬件进行更深层次的探索。在简单易学的前提下,比一开始就学习单片机、汇编 入行要简单有趣得多。 Arduino开源和自由的设计无疑是全世界电子爱好者的福音,大量的资源和资料让很多人快速 学习 Arduino,开发一个电子产品开始变得简单。互联网的飞速发展让科技的脚步加快,互联网产 品正在变得更简单。利用 Arduino,电子爱好者们可以快速设计出原型,从而根据反馈改进出更加 稳定可靠的版本。 1.5 本章小结 本章主要介绍了 Arduino的起源和概念,分析了应用现状并对未来的发展进行展望。  Arduino是包括了开发板等硬件和开发环境等软件在内的开源电子平台。  Arduino开发板核心是 Atmel公司生产的 AVR单片机。  Arduino容易上手,适合快速开发,具有广阔的发展潜力。 第 2 章 开始 Arduino 之旅 经过上一章的简单介绍,读者已经对 Arduino有了一些了解。本章开始进行 Arduino入门级学 习,从安装 IDE环境开始,逐步开始第一次编写程序、下载程序。本章还将学习 Arduino语言和语 法,并帮助读者熟练地使用 Arduino编程完成一些小实验项目。 本章知识点:  在三种操作系统下安装 Arduino IDE  了解与 Arduino相关的软件  制作第一个 Arduino程序  用示例的形式学习 Arduino语法 2.1 搭建开发环境 在安装 IDE(Integrated Development Environment),即集成开发环境之前,需要了解一些有 关嵌入式软件的相关知识。 2.1.1 交叉编译 Arduino做好的电子产品不能直接运行,需要利用电脑将程序烧到单片机里面。很多嵌入式系 统需要从一台计算机上编程,将写好的程序下载到开发板中进行测试和实际运行。因此跨平台开发 在嵌入式系统软件开发中很常见。所谓交叉编译,就是在一个平台上生成另一个平台上可以执行的 代码。开发人员在电脑上将程序写好,编译生成单片机执行的程序,就是一个交叉编译的过程。 编译器最主要的一个功能就是将程序转化为执行该程序的处理器能够识别的代码,因为单片 机上不具备直接编程的环境,因此利用 Arduino编程需要两台计算机:Arduino单片机和 PC。这里 的 Arduino 单片机叫做目标计算机,而 PC 则被称为宿主计算机,也就是通用计算机。Arduino 用 的开发环境被设计成在主流的操作系统上均能运行,包括 Windows、Linux、Mac OS 三个主流操 作系统平台。 2.1.2 在 Windows 上安装 IDE 给 Arduino编程需要用到 IDE(集成开发环境),这是一款免费的软件。在这款软件上编程需 要使用 Arduino的语言,这是一种解释型语言,写好的程序被称为 sketch,编译通过后就可以下载 到开发板中。在 Arduino的官方网站上可以下载这款官方设计的软件及源码、教程和文档。Arduino IDE的官方下载地址为:http://arduino.cc/en/Main/Software。 开始 Arduino 之旅 第 2 章 ·9· 打开网页后,根据提示可以选择相应的操作系统版本。截止到 2014年 3月 1日,可供下载的 稳定版本为 Arduino 1.0.5。详细安装步骤如下所示。 (1)Windows操作系统的用户只需单击Windows Installer,在弹出的对话框中单击“运行” 或“保存”按钮即可下载安装 IDE,如图 2-1所示。 图 2-1 下载 Arduino IDE 安装包 (2)下载完成后,双击鼠标打开安装包,等待进入安装界面,如图 2-2所示,此时单击 I Agree 按钮。 图 2-2 安装界面 (3)此时显示安装选项,如图 2-3所示。从上至下的选项复选框依次为:  安装 Arduino软件;  安装 USB驱动;  创建开始菜单快捷方式;  创建桌面快捷方式;  关联.ino文件。 Arduino 通过 USB 串口与计算机相连接,所以安装 USB 驱动选项需要选择。写好的 Arduino 程序保存文件类型为.ino文件,因此需要关联该类型文件。中间两项创建快捷方式则可选可不选。 选择完成后单击 Next按钮。 图 2-3 安装选项 Arduino 开发从零开始学 ·10· (4)根据提示选择安装目录,如图 2-4所示。安装文件默认的目录为 C:\Program Files (x86) \Arduino,也可以自行选择其他的安装目录,之后单击 Install按钮即可进行安装,如图 2-5所示。 图 2-4 选择安装目录 图 2-5 安装过程中 (5)安装完成后关闭安装对话框。双击 Arduino应用程序即可进入 IDE-sketch初始界面,如 图 2-6所示。 图 2-6 Arduino IDE 1.0.5界面 至此,Arduino IDE已经成功地安装到了 PC上。在将开发板用 USB连接到 PC上后,Windows 会自动安装 Arduino的驱动,如果安装不成功则需要手动设置驱动目录,指定驱动目录位置为安装 过程中所选择的 Arduino安装文件夹。驱动安装成功后,开发板绿色的电源指示灯会亮起来,此时 说明开发板可用。关于 IDE的介绍会在 2.1.5小节进行,2.1.3小节和 2.1.4小节将会讲解 Linux和 Mac OS上的 IDE安装。 2.1.3 在 Linux 上安装 IDE 不少嵌入式开发者或电子爱好者喜欢使用Linux操作系统。本小节介绍在Linux上安装Arduino IDE的过程。 开始 Arduino 之旅 第 2 章 ·11· 在 Linux上安装 Arduino IDE可以通过两种方式:一种是打开终端,输入命令安装 Arduino开 发环境;另一种则是去官网下载安装。 1.通过终端命令行安装 下面以 Linux的一个发行版本 Fedora为例,介绍如何安装 Arduino IDE开发环境。 (1)首先通过命令行直接安装,打开终端(一般快捷键为 Alt+Ctrl+T)后输入语句: sudo yum –y install arduino 不同的发行版本安装的命令不同,如 Ubuntu安装的命令为 sudo apt-get install Arduino。 (2)系统提示输入密码后即可安装,安装过程如图 2-7所示。 图 2-7 Fedora安装 IDE过程 (3)安装完成后,在终端中输入 arduino,即可打开安装环境,如图 2-8所示。 图 2-8 Arduino Sketch 2.通过官网下载安装 用命令行方式安装 IDE 非常方便,但版本可能不是最新的,如果想安装最新版本的 Arduino IDE,可以通过火狐浏览器打开官方软件下载网站 http://arduino.cc/en/Main/Software。 Arduino 开发从零开始学 ·12· 下载之前,需要了解使用的操作系统是 32位机还是 64位机,可以通过在终端中输入 file /bin/ls来查看,如图 2-9所示。 图 2-9 查看操作系统处理器位数 图 2-9中所示的操作系统为 32位,因此需要下载 32位安装包。 安装包下载完成后,双击解压缩或者在终端中使用 tar 命令解压缩,进入目录,双击 Arduino 应用程序或在终端中输入“./arduino”命令打开即可,如图 2-10所示。 图 2-10 运行 Arduino客户端 2.1.4 在 Mac OS 上安装 IDE 在苹果公司的 Mac 系统中安装 IDE 也非常简单,在官方网站下载后缀名为.zip 的安装包后, 解压缩到目标文件夹,如图 2-11所示。 图 2-11 解压缩安装包 开始 Arduino 之旅 第 2 章 ·13· 此时用鼠标将 Arduino 应用程序拖动到系统的应用程序菜单中,便安装成功了,如图 2-12 所 示。 图 2-12 将程序添加到应用程序中 如果打开 Arduino IDE时提示要安装 Java SE 6,则根据提示单击“安装”按钮进行安装,如 图 2-13所示。安装完毕即可打开 IDE。 图 2-13 提示安装 JAVA SE 6 2.1.5 Arduino IDE 介绍 在安装完 Arduino IDE后,进入 Arduino安装目录,打开 arduino.exe文件,进入初始界面。打 开软件会发现这个开发环境非常简洁(上面提到的三个操作系统 IDE 的界面基本一致),依次显 示为菜单栏、图形化的工具条、中间的编辑区域和底部的状态区域。Arduino IDE用户界面的区域 功能如图 2-14所示。 图 2-14 Arduino IDE用户界面 Arduino 开发从零开始学 ·14· 图 2-15为 Arduino IDE界面工具栏,从左至右依次为编译、上传、新建程序(sketch)、打开 程序(sketch)、保存程序(sketch)和串口监视器(Serial Monitor)。 一定要熟记这 6个小按钮,后面的介绍我们不再给图示了,只说明是哪个按钮。 图 2-15 Arduino IDE工具栏 编辑器窗口选用一致的选项卡结构来管理多个程序 ,编辑器光标所在的行号在当前屏幕的左 下角。 1.文件菜单 写好的程序通过文件的形式保存在计算机时,需要使用文件(File)菜单,文件菜单常用的选 项包括:  新建文件(New);  打开文件(Open);  保存文件(Save);  文件另存为(Save as);  关闭文件(Close);  程序示例(Examples);  打印文件(Print)。 其他选项,如“程序库”是打开最近编辑和使用的程序,“参数设置”可以设置程序库的位置、 语言、编辑器字体大小、输出时的详细信息、更新文件后缀(用后缀名.ino代替原来的.pde后缀)。 “上传”选项是对绝大多数支持的 Arduino I/O电路板使用传统的 Arduino引导装载程序来上传。 工具栏中的“上传”按钮菜单项用于跳过引导装载程序,直接把程序烧写到 AVR 单 片机里面。 开始 Arduino 之旅 第 2 章 ·15· 2.编辑菜单 紧邻文件菜单右侧的是编辑(Edit)菜单,编辑菜单顾名思义是编辑文本时常用的选项集合。 常用的编辑选项为恢复(Undo)、重做(Redo)、剪切(Cut)、复制(Copy)、粘贴(Paste)、 全选(Select all)和查找(Find)。这些选项的快捷键也和Microsoft Windows应用程序的编辑快 捷键相同。恢复为 Ctrl+Z、剪切为 Ctrl+X、复制为 Ctrl+C、粘贴为 Ctrl+V、全选为 Ctrl+A、查找 为 Ctrl+F。此外,编辑菜单还提供了其他选项,如“注释(Comment)”和“取消注释(Uncomment)”, Arduino 编辑器中使用“//”代表注释。还有“增加缩进”和“减少缩进”选项、“复制到论坛” 和“复制为 HTML”等选项。 3.程序菜单 程序(Sketch)菜单包括与程序相关功能的菜单项。主要包括:  “编译/校验(Verify)”,和工具条中的编译相同。  “显示程序文件夹(Show Sketch Folder)”,会打开当前程序的文件夹。  “增加文件(Add File)”,可以将一个其他程序复制到当前程序中,并在编辑器窗口的新 选项卡中打开。  “导入库(Import Library)”,导入所引用的 Arduino库文件。 4.工具菜单 工具(Tools)菜单是一个与 Arduino开发板相关的工具和设置集合。主要包括:  “自动格式化(Auto Format)”,可以整理代码的格式,包括缩进、括号,使程序更易读 和规范。  “程序打包(Archive Sketch)”,将程序文件夹中的所有文件均整合到一个压缩文件中, 以便将文件备份或者分享。  “修复编码并重新装载(Fix Encoding & Reload)”,在打开一个程序时发现由于编码问题 导致无法显示程序中的非英文字符时使用的,如一些汉字无法显示或者出现乱码时,可 以使用另外的编码方式重新打开文件。  “串口监视器(Serial Monitor)”,是一个非常实用而且常用的选项,类似即时聊天的通 讯工具,PC 与 Arduino 开发板连接的串口“交谈”的内容会在该串口显示器中显示出来, 如图 2-16 所示。在串口监视器运行时,如果要与 Arduino 开发板通信,需要在串口监视 器顶部的输入栏中输入相应的字符或字符串,再单击发送(Send)按钮就能发送信息给 Arduino。在使用串口监视器时,需要先设置串口波特率,当 Arduino与 PC的串口波特率 相同时,两者才能够进行通讯。Windows PC的串口波特率的设置在计算机设备管理器中 的端口属性中设置。  “串口”,需要手动设置系统中可用的串口时选择的,在每次插拔一个 Arduino电路板时, 这个菜单的菜单项都会自动更新,也可手动选择哪个串口接开发板。  “板卡”,用来选择串口连接的 Arduino开发板型号,当连接不同型号的开发板时需要根 据开发板的型号到“板卡”选项中选择相应的开发板。 Arduino 开发从零开始学 ·16·  “烧写 Bootloader”,将 Arduino 开发板变成一个芯片编程器,也称为 AVRISP 烧写器, 读者可以到 Arduino中文社区查找相关内容。 图 2-16 Arduino串口监视器 5.帮助菜单 帮助(Help)菜单是使用 Arduino IDE时可以迅速查找帮助的选项集合。包括快速入门、问题 排查和参考手册,可以及时帮助了解开发环境,解决一些遇到的问题。访问 Arduino官方网站的快 速链接也在帮助菜单中,下载 IDE后首先查看帮助菜单是个不错的习惯。 2.2 常用的 Arduino 第三方软件介绍 Arduino开发环境安装完成之后,一些第三方软件可以帮助读者更好地学习和使用 Arduino制 作电子产品。 2.2.1 图形化编程软件 ArduBlock ArduBlock是一款专门为 Arduino设计的图形化编程软件,由上海新车间创客研制开发。这是 一款第三方 Arduino官方编程环境软件,目前必须在 Arduino IDE的软件下运行。但是区别于官方 文本编辑环境,ArduBlock是以图形化积木搭建的方式进行编程的。就如同小孩子玩的积木玩具一 样,这种编程方式使得编程的可视化和交互性大大增强,而且降低了编程的门槛,让没有编程经验 的人也能够给 Arduino编写程序,让更多的人投身到新点子新创意的实现中来。 上海新车间是国内第一家创客空间,新车间网址为:http://xinchejian.com/。新车间开发的 ArduBlock 受到了国际同道的好评,尤其在 Make 杂志主办的 2011 年纽约 Maker Faire 展会上 Arduino 的核心开发团队成员 Massimo 特别感谢了上海新车间创客开发的图形化编程环境 ArduBlock。ArduBlock的官方下载网址为:http://blog.ardublock.com/zh/。 ArduBlock软件界面如图 2-17所示。 开始 Arduino 之旅 第 2 章 ·17· 图 2-17 ArduBlock软件界面截图 2.2.2 Arduino 仿真软件 Virtual breadboard Virtual breadboard 是一款专门的 Arduino 仿真软件,简称 VBB,中文名为“虚拟面包板”。 这款软件主要通过单片机实现嵌入式软件的模拟和开发环境,它不但包括了所有 Arduino的样例电 路,可以实现对面包板电路的设计和布置,非常直观地显示出面包板电路,还可实现对程序的仿真 调试。VBB还支持 PIC系列芯片、Netduino,以及 Java、VB、C++等主流的编程环境。 Virtual breadboard软件界面如图 2-18所示。 图 2-18 VBB软件截图 VBB 可以模拟 Arduino 连接各种电子模块,例如液晶屏、舵机、逻辑数字电路、各种传感器 以及其他的输入/输出设备。这些部件都可以直接使用,也可以通过组合,设计出更复杂的电路和 模块。 Arduino 开发从零开始学 ·18· 使用 VBB可以更加直观的了解电路设计,能够在设计出原型后快速实现。而且虚拟面板具有 的可视性和模拟交互效果,可以实时地在软件上看到 LED、LCD 等可视模块的变化,同时可以确 保安全,因为不是实物操作不会引起触电或者烧毁芯片等问题。另外,用 VBB设计出的作品也可 以更快速的分享和整理,使学习和使用更加方便、简单。 VBB的版本更新很频繁,其官方网站为:http://www.virtualbreadboard.com/。截至到目前为止, 官方版本已经更新到了 4.45。随着用户的增多,VBB 由原来的免费下载变更为收费,想要学习的 读者需要购买使用。 还有其他不错的第三方软件如 Proteus,既可以进行 Arduino 的仿真,又能画出标准的电路图 和 PCB图样,在国内外使用的人很多。读者如果有兴趣可以自行查阅资料下载学习。 2.3 第一次上手 Arduino 在下载安装好 IDE之后,下一步就可以实践了。通过编写和上传第一个程序,正式进入 Arduino 的世界。在本节中,需要做的不仅是实现编写和上传程序,更要考虑这些事情背后是如何实现的, 通过学习和总结 Arduino编程的技巧,快速上手 Arduino。 2.3.1 加载第一个程序 在学习一些语言时,比如 C语言,经典的入门程序就是鼎鼎有名的 Hello World!简短的两个单 词敲开了 C 语言的大门,让学习 C语言者感觉非常简单而有趣,同时这个简单的程序延伸了很多 深刻的话题,比如主函数、输入输出、编译过程等等。程序 2-1便是 C语言著名的敲门砖。 程序 2-1:C语言的向世界问好 #include main() { printf(“hello world\n”); } Arduino语言也像 C语言一样,同样追随 C语言的脚步,在硬件的世界里,使用灯光的闪烁代 表 hello world,下面我们编写第一个 Sketch! 打开 Arduino IDE后,需要新建一个空的 Sketch。之后就可以在编辑器上编写第一个 Sketch, 如程序 2-2所示。 程序 2-2:Arduino向世界问好 void setup() { pinMode(13,OUTPUT); //将 13引脚设置为输出引脚 } void loop() { 开始 Arduino 之旅 第 2 章 ·19· digitalWrite(13,HIGH); //13引脚输出高电平,即将小灯点亮 delay(1000); digitalWrite(13,LOW); //13引脚输出低电平,即将小灯熄灭 delay(1000); } 这个例子是 Arduino示例 Basics中的 Blink程序,也可以通过图 2-19所示的操作打开该程序。 Blink 作为 Arduino 入门的初始程序非常简洁易懂,在每句话的后面作者都给出了注释,官方示例 中的程序如图 2-20所示。 图 2-19 Blink所在位置 图 2-20 Blink程序 编写或者打开 Blink之后,便可以连接 Arduino开发板,将开发板的 USB接口连接到电脑上, 当系统提示安装成功,并且开发板的绿色“ON”指示灯亮起时,就可以进行 Blink 的上传。单击 “上传”按钮,再经过短暂的几秒烧写之后,会发现开发板的串口指示灯闪烁了数次,提示成功之 Arduino 开发从零开始学 ·20· 后,开发板装载的 LED灯便开始不停闪烁。 之后再来看状态区域,状态区域显示“下载成功”和“二进制程序大小 1018字节”的字样。 我们第一个 Arduino程序就下载并成功运行了。 2.3.2 用 Arduino IDE 开发程序 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 当程序编写好之后,关闭前需要将文件保存到一个目录中。如果是开发一个项目,编写的 Sketch 可能不止一个,负责不同部分和模块开发的人员都各自编写好 Sketch,最后综合 Sketeh 时发现程 序特别难以阅读,并且很多变量名称不一致,修改起来非常麻烦,这就需要一个规范的开发流程。 在软件工程中,软件项目开发有很多不同的模型适用于不同的开发需求,例如瀑布模型、螺 旋模型等。由于嵌入式项目 bug排查起来比较费力,为了开发一个稳定的嵌入式系统,往往采用“增 量”式模型,即在功能最简单、最基本的系统基础上逐渐扩展其功能。 因此,在编写程序之前,必须对程序所实现的功能有一个详细的规划,对整个系统的基本功 能需求有一个清晰的定义。在编写程序时应当约定好各种变量、函数名称,并做好注释和文档记录。 不同的模块在开发过程中需要不断的测试,也要做好详细的开发和测试记录。 编写程序时也是同样道理,增量式模型要求迅速将系统整体的基本功能实现出来,对于不同 的功能可以利用不同的函数进行实现和测试,而不必在主程序中直接定义和实现,这样既快捷又清 晰易读。 2.3.3 函数库和程序架构介绍 Arduino程序的架构大体可分为 3个部分。 (1)声明变量及接口的名称。 (2)setup()。在 Arduino 程序运行时首先要调用 setup()函数,用于初始化变量、设置针脚的 输出/输入类型、配置串口、引入类库文件等等。每次 Arduino 上电或重启后,setup()函数只运行 一次。 (3)loop()。在 setup()函数中初始化和定义变量,然后执行 loop()函数。顾名思义,该函数在 程序运行过程中不断地循环,根据反馈,相应地改变执行情况。通过该函数动态控制 Arduino主控 板。 程序 2-3中包含了完整的 Arduino基本程序框架。 程序 2-3:闪灯程序 int LEDPin = 3; void setup() { pinMode(LEDPin, OUTPUT); //将 3引脚设置为输出引脚 } void loop() { digitalWrite(LEDPin, HIGH); //3引脚输出高电平,即将小灯点亮 delay(1000); digitalWrite(LEDPin, LOW); //3引脚输出低电平,即将小灯熄灭 开始 Arduino 之旅 第 2 章 ·21· delay(1000); } 这是一个简单的实现 LED灯闪烁的程序,在这个程序里,int LEDPin = 3;就是上面架构的第 一部分,用来声明变量及接口。void setup()函数则将LEDPin引脚的模式设为输出模式。在 void loop() 中则循环执行点亮熄灭 LED灯,实现 LED灯的闪烁。 Arduino官方团队提供了一套标准的 Arduino函数库,如表 2-1所示。 表 2-1 Arduino 标准库文件 库文件名 说明 EEPROM 读写程序库 Ethernet 以太网控制器程序库 LiquidCrystal LCD控制程序库 Servo 舵机控制程序库 SoftwareSerial 任何数字 IO口模拟串口程序库 Stepper 步进电机控制程序库 Matrix LED矩阵控制程序库 Sprite LED矩阵图象处理控制程序库 Wire TWI/I2C总线程序库 在标准函数库中,有些函数会经常用到。如小灯闪烁的数字 I/O 口输入输出模式定义函数 pinMode(pin,mode),时间函数中的延时函数 delay(ms)、串口定义波特率函数 Serial.begin(speed)和 串口输出数据函数 Serial.print(data)。了解和掌握这些常用函数可以帮助开发人员使用 Arduino实现 各种各样的功能。 2.3.4 Hello World 做了什么 在 2.3.1小节中实现了第一个 Arduino闪灯程序,这个程序不只是让开发板上的 LED灯进行闪 烁。在程序的背后,再思考一下,IDE是如何用编写好的程序来驱动单片机工作的呢,是不是开发 板在 Arduino的语言驱动下直接工作? 在解决这个问题之前,先来了解一下计算机语言的工作原理。对于计算机来说,进行开发的 语言并不是计算机直接可以读懂的。那么计算机能够看懂什么语言呢?有经验的读者肯定会说,二 进制语言。是的,计算机的脑子只能看懂两个字符,即 0和 1。以一个最简单的说明为例,假如计 算机会说话,那么它的启动方式可看做是两种可能:一种是通电,一种是断电。可以把通电看成是 1,断电看作是 0。那么计算机中的很多零部件也是一样,工作起来的状态为 1,不工作的状态为 0。 计算机中的数据通过存储器储存起来,处理器通过一串 0和 1组成的地址,找到存储器中数据的位 置,对数据进行一系列操作,从而有条不紊的完成了各个程序的执行任务。 因此,在 Arduino IDE编程并下载程序到开发板的过程,实际上是编译器将程序翻译为机器语 言(即二进制语言)的过程。计算机将二进制的指令传送到单片机程序闪存中,单片机识别指令后 进行工作。图 2-21是从编写好的程序到 Arduino开发板运行程序的流程。 Arduino 开发从零开始学 ·22· 图 2-21 从代码到开发板 Arduino编译器的作用除了是一位必不可少的翻译官外,还是一位一丝不苟的检察官。写好的 程序在编译器翻译成机器语言之前,需要检查程序是否存在语法错误,如果不符合程序框架,或者 有些函数没有定义或者使用错误,还有变量类型不正确,编译器都会尽职尽责地检查出来,并明确 错误位置。没有编译器,程序编写好后将无法进行解释和分析,也就无法转化成相应的机器语言。 2.4 Arduino 语法——变量和常量 加载第一个程序后,要想写出一个完整的程序,需要了解和掌握 Arduino 语言,本节将对 Arduino语言做一个初步讲解,首先介绍变量和常量。 2.4.1 变量 变量来源于数学,是计算机语言中能储存计算结果或者能表示某些值的一种抽象概念。通俗 来说可以认为是给一个值命名。当定义一个变量时,必须指定变量的类型。如果要变量全是整数, 这种变量称为整型(int),那么如果要定义一个名为 LED的变量值为 11,变量应该这样声明: int led 11; 一般变量的声明方法为类型名+变量名+变量初始化值。变量名的写法约定为首字母小写,如 果是单词组合则中间每个单词的首字母都应该大写,例如 ledPin、ledCount等,一般把这种拼写方 式称为小鹿拼写法(pumpy case)或者骆驼拼写法(camel case)。 变量的作用范围又称为作用域,变量的作用范围与该变量在哪儿声明有关,大致分为如下两 种。 (1)全局变量:若在程序开头的声明区或是在没有大括号限制的声明区,所声明的变量作用 域为整个程序。即整个程序都可以使用这个变量代表的值或范围,不局限于某个括号范围内。 (2)局部变量:若在大括号内的声明区所声明的变量,其作用域将局限于大括号内。若在主 程序与各函数中都声明了相同名称的变量,当离开主程序或函数时,该局部变量将自动消失。 使用变量还有一个好处,就是可以避免使用魔数。在一些程序代码中,代码中出现但没有解 释的数字常量或字符串称为魔数(magic number)或魔字符串(magic string)。魔数的出现使得程 开始 Arduino 之旅 第 2 章 ·23· 序的可阅读性降低了很多,而且难以进行维护。如果在某个程序中使用了魔数,那么在几个月(或 几年)后将很可能不知道它的含义是什么。 为了避免魔数的出现,通常会使用多个单词组成的变量来解释该变量代表的值,而不是随意 给变量取名。同时,理论上一个常数的出现应该对其做必要地注释,以方便阅读和维护。在修改程 序时,只需修改变量的值,而不是在程序中反复查找令人头痛的“魔数”。 【示例 1】 带变量的闪灯程序 在接下来的程序 2-4里会用到 ledPin这个变量,通过它来做一个带变量的闪灯程序。 程序 2-4:带变量的闪灯程序 int ledPin = 13; int delayTime = 1000; void setup() { pinMode(ledPin,OUTPUT); } void loop() { digitalWrite(ledPin,HIGH); delay(delayTime); //延时 1s digitalWrite(ledPin,LOW); delay(delayTime); //延时 1s } 这里还使用了一个名为延时的 delayTime变量,在延时(delay)函数中使用的参数单位为毫秒, 用到 delay函数中,即延时 1000毫秒。 【示例 2】 改变闪烁频率的闪灯程序 如果希望小灯闪烁快些,将延时函数值改小就可以了,读者可以尝试将 delayTime改成 500, 可以看到小灯闪烁的频率变大了。如果在程序的后面再加上 1行代码“delayTime=delayTime+100;” 可以发现小灯闪烁的频率越来越小,即小灯闪烁的越来越慢了。当按下“重置”按钮后,小灯闪烁 又重新变快了,如下面程序 2-5所示。 程序 2-5:改变闪烁频率的闪灯程序 int ledPin = 13; int delayTime = 1000; void setup() { pinMode(ledPin,OUTPUT); } void loop() Arduino 开发从零开始学 ·24· { digitalWrite(ledPin,HIGH); delay(delayTime); //延时 digitalWrite(ledPin,LOW); delay(delayTime); delayTime=delayTime+100; //每次增加延时时间 0.1s } 2.4.2 常量 常量是指值不可以改变的量,例如定义常量 const float pi = 3.14,当 pi = 5时就会报错,因为 常量是不可以被赋值的。编程时,常量可以是自定义的,也可以是 Arduino核心代码中自带的。下 面就介绍一下 Arduino核心代码中自带的一些常用的常量,以及自定义常量时应该注意的问题。 1.逻辑常量(布尔常量):false 和 true false的值为零,true通常情况下被定义为 1,但 true具有更广泛的定义。在布尔含义(Boolean Sense)里任何非零整数为 true。所以在布尔含义中-1、2和-200都定义为 true。 2.数字引脚常量:INPUT 和 OUTPUT 首先要记住这两个常量必须是大写的。当引脚被配置成 INPUT时,此引脚就从引脚读取数据; 当引脚被配置成 OUTPUT 时,此引脚向外部电路输出数据。在前面程序中经常出现的 pinMode(ledPin,OUTPUT),表示从 ledPin 代表的引脚向外部电路输出数据,使得小灯能够变亮或 者熄灭。 3.引脚电压常量:HIGH 和 LOW 这两个常量也是必须大写的。HIGH表示的是高电位,LOW表示的是低电位。例如:digitalWrite (pin,HIGH);就是将 pin这个引脚设置成高电位的。还要注意,当一个引脚通过 pinMode被设 置为 INPUT,并通过 digitalRead读取(read)时。如果当前引脚的电压大于等于 3V,微控制器将 会返回为 HIGH,引脚的电压小于等于 2V,微控制器将返回为 LOW。 当一个引脚通过 pinMode 配置为 OUTPUT,并通过 digitalWrite 设置为 LOW 时,引脚为 0V,当 digitalWrite 设置为 HIGH 时,引脚的电压应在 5V。 4.自定义常量 在 Arduino中自定义常量包括宏定义#define和使用关键字 const来定义,它们之间有细微的区 别。在定义数组时只能使用 const。一般 const相对的#define是首选的定义常量语法。 2.5 Arduino 语法——数据类型 Arduino与 C语言类似,有多种数据类型。数据类型在数据结构中的定义是一个值的集合,以 及定义在这个值集上的一组操作,各种数据类型需要在特定的地方使用。一般来说,变量的数据类 型决定了如何将代表这些值的位存储到计算机的内存中。在声明变量时需要指定它的数据类型,所 开始 Arduino 之旅 第 2 章 ·25· 有变量都具有数据类型,以便决定存储不同类型的数据。 2.5.1 常用的数据类型 常用的数据类型有布尔类型、字符型、字节型、整型、无符号整型、长整型、无符号长整型、 浮点型、双精度浮点型等,本小节会依次介绍这些数据类型。 1.布尔类型 布尔值(bollean)是一种逻辑值,其结果只能为真(true)或者假(false)。布尔值可以用来 进行计算,最常用的布尔运算符是与运算(&&)、或运算(||)和非运算(!)。表 2-2是与、或 和非运算的真值表。 表 2-2 真值表 与 与运算 A假 A 真 B 假 假 假 B 真 假 真 或 或运算 A假 A 真 B 假 假 真 B 真 真 真 非 非运算 A假 A 真 真 假 如表 2-2 所示的真值表中,对于与运算,仅当 A和 B均为真时,运算结果为真,否则,运算 结果为假;对于或运算,仅当 A 和 B均为假时,运算结果为假,否则,运算结果为真。对于非运 算,当 A为真时,运算结果为假;当 A为假时,运算结果为真。 2.字符型 字符型(char)变量可以用来存放字符,其数值范围是-128~+128。例如: char A=58; 3.字节型 字节(byte)只能用一个字节(8位)的存储空间,它可以用来存储 0~255之间的数字。例如: byte B=8; 4.整型 整型(int)用两个字节表示一个存储空间,它可以用来存储-32768~+32767 之间的数字。在 Arduino中,整型是最常用的变量类型。例如: Arduino 开发从零开始学 ·26· int C=13; 5.无符号整型 同整型一样,无符号整型(unsigned int)也用两个字节表示一个存储空间,它可以用来存储 0~65536之间的数字,通过范围可以看出,无符号整型不能存储负数。例如: unsigned int D=65535; 6.长整型 长整型(long)可以用 4个字节表示一个存储空间,其大小是 int型的 2倍。它可以用来存储 -2147483648~2147483648 之间的数字。例如: long E=2147483647; 7.无符号长整型 无符号长整型(unsigned long)同长整型一样,用 4个字节表示一个存储空间,它可以用来存 储 0~4294967296之间的数字。例如: unsigned long F=4294967295; 8.浮点型 浮点数(float)可以用来表示含有小数点的数,例如:1.24。当需要用变量表示小数时,浮点 数便是所需要的数据类型。浮点数占有 4个字节的内存,其存储空间很大,能够存储带小数的数字。 例如: a = b / 3; 当 b = 9时,显然 a = 3,为整型。 当 b = 10时,正确结果应为 3.3333,可是由于 a是整型,计算出来的结果将会变为 3,这与实 际结果不符。 但是,如果方程为:float a = b / 3.0。 当 b = 9时,a = 3.0。 当 b = 10时,a = 3.3333,结果正确。 如果在常数后面加上“.0”,编译器会把该常数当做浮点数而不是整数来处理。 9.双精度浮点型 双精度浮点型(double)同 float 类似,它通常占有 8 个字节的内存,但是,双精度浮点型数 据比浮点型数据的精度高,而且范围广。但是,双精度浮点型数据和浮点型数据在 Arduino中是一 样的。 2.5.2 数据类型转换 在编写程序过程中需要用到一些有关数据类型转换的函数,这里介绍几个常见的数据类型转 换函数。 开始 Arduino 之旅 第 2 章 ·27· (1)char() 功能:将一个变量的类型变为 char。 语法:char(x) 参数:x:任何类型的值 返回值:char型值 (2)byte() 功能:将一个值转换为字节型数值。 语法:byte(x) 参数:x:任何类型的值 返回值:字节 (3)int() 功能:将一个值转换为整型数值。 语法:int(x) 参数:x:任何类型的值 返回值:整型的值 (4)long() 功能:将一个值转换为长整型数值。 语法:long(x) 参数:x:任何类型的值 返回值:长整型的值 (5)float() 功能:将一个值转换换浮点型数值。 语法:float(x) 参数:x:任何类型的值 返回值:浮点型的值 (6)word() 功能:把一个值转换为 word数据类型的值,或由两个字节创建一个字符。 语法:word(x)或 word(H,L) 参数:x:任何类型的值,H:高阶字节(左边),L:低阶字节(右边) 返回值:字符 2.5.3 自定义数据类型 在 Arduino中可以根据自己的需要定义结构类型的数据,其方法和 C语言是一致的。 struct 名称 { Arduino 开发从零开始学 ·28· 成员列表; }; 例如: struct Student { char[20] name; int number; char[2] sex; int score; }; 2.6 Arduino 语法——数组 数组是一种可访问的变量的集合。Arduino的数组是基于 C语言的,实现起来虽然有些复杂, 但使用却很简单。 2.6.1 创建或声明一个数组 数组的声明和创建与变量一致,下面是一些创建数组的例子。 arrayInts [6]; arrayNums [] = {2,4,6,8,11}; arrayVals [6] = {2,4,-8,3,5}; char arrayString[7] = "Arduino"; 由例子中可以看出,Arduino数组的创建可以指定初始值,如果没有指定,那么编译器默认为 0,同时,数组的大小可以不指定,编译器在监察时会计算元素的个数来指定数组的大小。在 arrayString中,字符个数正好等于数组大小。 在声明时元素的个数不能够超过数组的大小,即小于或等于数组的大小。 2.6.2 指定或访问数组 在创建完数组之后,可以指定数组的某个元素的值。 int intArray[3]; intArray[2]=2; 数组是从零开始索引的,也就说,数组初始化之后,数组第一个元素的索引为 0,如上例所示, arrayString[0]为“A”即数组的第一个元素是 0号索引,并以此类推。这也意味着,在包含 10个元 素的数组中,索引 9是最后一个元素。因此,在下个例子中: int intArray[10] = {1,2,3,4,5,6,7,8,9,10}; 开始 Arduino 之旅 第 2 章 ·29· //intArray[9]的数值为 10 // intArray[10],该索引是无效的,它将会是任意的随机信息(内存地址) 出于这个原因,在访问数组时应该注意。如果访问的数据超出数组的末尾—如访问 intArray[10],则将从其他内存中读取数据。从这些地方读取的数据,除了产生无效的数据外,没 有任何作用。向随机存储器中写入数据绝对是一个坏主意,通常会导致一些意外的结果,如导致系 统崩溃或程序故障。顺便说一句,不同于 Basic或 Java,C语言编译器不会检查访问的数组是否大 于声明的数组。 【示例 3】 串口打印数组 数组创建之后在使用时,往往在 for循环中进行操作,循环计数器可用于访问数组中的每个元 素。例如,将数组中的元素通过串口打印,程序可以这样写。 程序 2-6:串口打印数组 void setup() { // put your setup code here, to run once: int intArray[10] = {1,2,3,4,5,6,7,8,9,10}; //定义长度为 10的数组 int i; for (i = 0; i < 10; i = i + 1) //循环遍历数组 { Serial.println(intArray[i]); //打印数组元素 } } void loop() { // put your main code here, to run repeatedly: } 2.7 Arduino 语法——运算符 本节介绍最常用的一些 Arduino运算符,包括赋值运算符、算数运算符、关系运算符、逻辑运 算符和递增/减运算符。 2.7.1 赋值运算符 =(等于)为指定某个变量的值,例如:A=x,将 x变量的值放入 A变量。 +=(加等于)为加入某个变量的值,例如:B+=x,将 B变量的值与 x变量的值相加,其和放 入 B变量,这与 B=B+x表达式相同。 -=(减等于)为减去某个变量的值,例如:C-=x,将 C变量的值减去 x变量的值,其差放入 C 变量,与 C=C-x表达式相同。 *=(乘等于)为乘入某个变量的值,例如:D*=x,将 D变量的值与 x变量的值相乘,其积放 入 D变量,与 D=D*x表达式相同。 /=(除等于)为和某个变量的值做商,例如:E/=x,将 E变量的值除以 x变量的值,其商放入 Arduino 开发从零开始学 ·30· E变量,与 E=E/x表达式相同。 %=(取余等于)对某个变量的值进行取余数,例如:F%=x,将 F变量的值除以 x变量的值, 其余数放入 F变量,与 F=F%x表达式相同。 &=(与等于)对某个变量的值按位进行与运算,例如:G&=x,将 G 变量的值与 x 变量的值 做 AND运算,其结果放入 G变量,与 G=G&x表达式相同。 |=(或等于)对某个变量的值按位进行或运算,例如:H|=x,将 H 变量的值与 x 变量的值相 OR运算,其结果放入变量 H,与 H=H|x相同。 ^=(异或等于)对某个变量的值按位进行异或运算,例如:I^=x,将 I变量的值与 x变量的值 做 XOR运算,其结果放入变量 I,与 I=I^x相同。 <<=(左移等于)将某个变量的值按位进行左移,例如:J<<=n,将 J 变量的值左移 n 位,与 J=J<>=(右移等于)将某个变量的值按位进行右移,例如:K>>=n,将 K变量的值右移 n位,与 K=K>>n相同。 2.7.2 算数运算符 +(加)对两个值进行求和,例如:A=x+y,将 x与 y变量的值相加,其和放入 A变量。 -(减)对两个值进行做差,例如:B=x-y,将 x变量的值减去 y变量的值,其差放入 B变量。 *(乘)对两个值进行乘法运算,例如:C=x*y,将 x与 y变量的值相乘,其积放入 C变量。 /(除)对两个值进行除法运算,例如:D=x/y,将 x 变量的值除以 y 变量的值,其商放入 D 变量。 %(取余)对两个值进行取余运算,例如:E=x%y,将 x变量的值除以 y变量的值,其余数放 入 E变量。 2.7.3 关系运算符 ==(相等)判断两个值是否相等,例如:x==y,比较 x 与 y变量的值是否相等,相等则其结 果为 1,不相等则为 0。 !=(不等)判断两个值是否不等,例如:x!=y,比较 x与 y变量的值是否相等,不相等则其结 果为 1,相等则为 0。 <(小于)判断运算符左边的值是否小于右边的值,例如:x(大于)判断运算符左边的值是否大于右边的值,例如:x>y,若 x 变量的值大于 y 变量的 值,其结果为 1,否则为 0。 <=(小等于)判断运算符左边的值是否小于等于右边的值,例如:x<=y,若 x 变量的值小等 于 y变量的值,其结果为 1,否则为 0。 >=(大等于)判断运算符左边的值是否大于等于右边的值,例如:x>=y,若 x 变量的值大等 于 y变量的值,其结果为 1,否则为 0。 开始 Arduino 之旅 第 2 章 ·31· 2.7.4 逻辑运算符 &&(与运算)对两个表达式的布尔值进行按位与运算,例如:(x>y)&&(y>z),若 x 变 量的值大于 y变量的值,且 y变量的值大于 z变量的值,则其结果为 1,否则为 0。 ||(或运算)对两个表达式的布尔值进行按位或运算,例如:(x>y)||(y>z),若 x 变量的值 大于 y变量的值,或 y变量的值大于 z变量的值,则其结果为 1,否则为 0。 !(非运算)对某个布尔值进行非运算,例如:!(x>y),若 x变量的值大于 y变量的值,则 其结果为 0,否则为 1。 2.7.5 递增/减运算符 ++(加 1)将运算符左边的值自增 1,例如:x++,将 x 变量的值加 1,表示在使用 x 之后, 再使 x值加 1。 --(减 1)将运算符左边的值自减 1,例如:x--,将 x 变量的值减 1,表示在使用 x 之后,再 使 x值减 1。 2.8 Arduino 语法——条件判断语句 Arduino语言基于 C和 C++,有过开发经验的都知道,C语言中有一些内建指令,这些内建指 令中有很重要的几个语句经常用到,这里介绍常用的条件判断语句 if和 else。 if 语句 在考虑问题和解决问题的过程中,很多事情不是一帆风顺的,需要进行判断再做出不同的行 为。这里就需要用到了条件语句,有些语句并不是一直执行的,需要一定的条件去触发。同时,针 对同一个变量,不同的值进行不同的判断,也需要用到条件语句。同样,程序如果需要运行一部分, 也可以进行条件判断。 if的语法如下: if(delayTime<100) { delayTime=1000; } 如果 if后面的条件满足,就执行{ }内的语句。 if中表示判断的语句使用到的关系运算符如表 2-3所示。 表 2-3 关系运算符 运算符 含义 例子 结果 < 小于 1<2 真 2<1 假 > 大于 2>1 真 Arduino 开发从零开始学 ·32· 1>1 假 <= 小于等于 2<=2 真 3<=2 假 (续表) 运算符 含义 例子 结果 >= 大于等于 3>=3 真 2>=3 假 == 等于 2==2 真 1==2 假 != 不等于 1!=2 真 2!=2 假 【示例 4】 使用 if 制作改变闪烁频率的闪灯程序 在介绍变量时,用了一个闪灯的例子进行举例说明,最后加了一行代码来使小灯闪烁的频率 越来越小,即小灯越闪越慢。可是如果希望小灯越闪越快,并且到一定的程度重新恢复初始的闪灯 频率,应该怎么办呢?看下面的程序。 程序 2-7:改变闪烁频率的闪灯程序 int ledPin = 13; int delayTime = 1000; void setup() { pinMode(ledPin,OUTPUT); } void loop() { digitalWrite(ledPin,HIGH); //点亮小灯 delay(delayTime); //延时 digitalWrite(ledPin,LOW); //熄灭小灯 delay(delayTime); delayTime=delayTime-100; //每次将延时时间减少 0.1s if(delayTime<100) { delayTime=1000; //当延时时间小于 0.1s时,重新校准延时为 1s } } 在这个程序中用到了 if 条件判断语句,程序每次运行到 if 语句时都会进行检查,在 delayTime>=100 时,大括号里面的 delayTime=1000 是不执行的。程序进入下一次循环。当 delayTime<100,delayTime=1000被执行,delayTime的值改变成为 1000,并进入到下一次循环中。 开始 Arduino 之旅 第 2 章 ·33· 【示例 5】 使用 if…else 制作改变闪烁频率的闪灯程序 if语句另一种形式也很常用,即 if…else语句。这种语句语义为:在条件成立时执行 if语句下 括号的内容,不成立时执行 else语句下的内容。 对闪灯的程序进行修改,使用 else语句,如程序 2-8所示。 程序 2-8:使用 else语句的闪灯程序 int ledPin = 13; int delayTime = 1000; void setup() { pinMode(ledPin,OUTPUT); } void loop() { digitalWrite(ledPin,HIGH); delay(delayTime); digitalWrite(ledPin,LOW); delay(delayTime); if(delayTime<100) { delayTime=1000; //当延时小于 0.1s时校准延时时间为 1s } else { delayTime=delayTime-100; //大于或等于 0.1s时将延时时间缩短 } } if-else语句还可以多次连用来进行多次选择判断。使用时应判断准确逻辑关系,以避免产生错 误。 2.9 Arduino 语法——循环语句 循环语句用来重复执行某一些语句,为了避免死循环,必须在循环语句中加入条件,满足条 件时执行循环,不满足条件时退出循环。本节介绍 for循环和 while循环。 2.9.1 for 循环 在 loop()函数中,程序执行完一次之后会返回 loop 中重新执行,在内建指令中同样有一种循 环语句可以进行更准确的循环控制——for语句,for循环语句可以控制循环的次数。 for循环包括 3个部分: for(初始化,条件检测,循环状态){程序语句} Arduino 开发从零开始学 ·34· 初始化语句是对变量进行条件初始化,条件检测是对变量的值进行条件判断,如果为真则运 行 for循环语句大括号中的内容,若为假则跳出循环。循环状态则是在大括号语句执行完之后,执 行循环状态语句,之后重新执行条件判断语句。 【示例 6】 使用计数器和 if 语句的闪灯程序 同样以闪灯程序为例,这次是让小灯闪烁 20次之后停顿 3秒。在没有学习 for循环语句之前, 用 if语句是完全可以实现的。由于 loop()函数本身就可以进行循环,因此,设置一个计数器再用 if 语句进行判断便可以实现,如程序 2-9所示。 程序 2-9:使用计数器和 if语句的闪灯程序 int ledPin = 13; int delayTime = 1000; //定义延时变量 delayTime为 1s int delayTime2 = 3000; //定义延时变量 delayTime2为 2s int count=0; //定义计数器变量并初始化为 0 void setup() { pinMode(ledPin,OUTPUT); } void loop() { digitalWrite(ledPin,HIGH); delay(delayTime); digitalWrite(ledPin,LOW); delay(delayTime); if(count==20) { delay(delayTime2); //当计数器数值为 20时,延时 3s } } 【示例 7】 使用 for 语句的闪灯程序 如果使用 for语句,就可以在一次 loop循环中实现。下面是一个具体的示例。 程序 2-10:使用 for语句的闪灯程序 int ledPin = 13; int delayTime = 1000; //定义延时变量 delayTime为 1s int delayTime2 = 3000; //定义延时变量 delayTime2为 2s void setup() { pinMode(ledPin,OUTPUT); } void loop() 开始 Arduino 之旅 第 2 章 ·35· { digitalWrite(ledPin,HIGH); delay(delayTime); digitalWrite(ledPin,LOW); delay(delayTime); for(int count=0;count<20;count ++) //执行 20次延时 3s { delay(delayTime2); } } 这段代码虽然可以在一次 loop 语句中完成闪烁 20 次后延时 3 秒,但是 loop 语句会执行时间 过长,Sketch中的 loop()函数经常可以用来检查是否有中断或者其他信号,如果处理器被一个循环 占用大多数时间,难免会增加程序的响应时间。因此比较而言,用 if语句和 count计数器更方便。 2.9.2 while 循环 相比 for,while语句更简单一些,但是实现的功能和 for是一致的。while语句语法为“while(条 件语句){程序语句}”。条件语句结果为真时则执行循环中的程序语句,如果条件语句为假时则跳 出 while循环语句。相比 for语句,while语句循环状态可以写到程序语句中,更方便易读。 while的语法如下: while(count<20) //满足( )内的条件时,执行循环中的内容 { …… } 【示例 8】 使用 while 语句的闪灯程序 同样以小灯闪烁 20次延时 3秒为例,用 while语句也可以实现。 程序 2-11:使用 while语句的闪灯程序 int ledPin = 13; int delayTime = 1000; //定义延时变量 delayTime为 1s int delayTime2 = 3000; //定义延时变量 delayTime2为 2s int count=0; //定义计数器变量并初始化为 0 void setup() { pinMode(ledPin,OUTPUT); } void loop() { while(count<20) //当计数器数值小于 20时,执行循环中的内容 { Arduino 开发从零开始学 ·36· digitalWrite(ledPin,HIGH); delay(delayTime); digitalWrite(ledPin,LOW); delay(delayTime); count++; //计数器数值自增 1 } } 2.10 Arduino 语法—函数 在编写程序的过程中,有时一个功能需要多次使用,反复写同一段代码既不方便又难以维护。 开发语言提供的函数无法满足特定的需求,同时,一些功能写起来并不容易,为了方便开发和阅读 维护,函数的重要性便不言而喻,使用函数可以使程序变得简单。 函数就像一个程序中的小程序,一个函数实现的功能可以是一个或多个功能,但是函数并不 是实现的功能越多越强大。优秀的函数往往是功能单一的,调用起来非常方便。一个复杂的功能很 多情况下是由多个函数共同完成的。 【示例 9】 使用闪灯函数的闪灯程序 继续以闪灯为例,LED灯要闪烁 20次,闪灯这个功能可以封装到一个函数里面,当多次需要 闪灯的时候便可以直接调用这个闪灯函数了。 程序 2-12:使用闪灯函数的闪灯程序 int ledPin = 13; int delayTime = 1000; //定义延时变量 delayTime为 1s int delayTime2 = 3000; //定义延时变量 delayTime2为 2s void setup() { pinMode(ledPin,OUTPUT); } void loop() { for(int count=0;count<20;count ++) //调用 20次闪烁函数 { flash(); } delay(delayTime2); //延时 3s } void flash() //定义无参数的闪灯函数 { digitalWrite(ledPin,HIGH); delay(delayTime); 开始 Arduino 之旅 第 2 章 ·37· digitalWrite(ledPin,LOW); delay(delayTime); } 在该程序里,调用的 flash()函数实际上就是 LED 闪烁的代码,相当于程序运行到那里便跳入 该 4行闪灯代码中,其函数非常简单。在这个例子中,flash()函数是一个空类型的函数,即没有任 何返回值。flash()函数也没有任何参数,有些函数需要接受参数才能执行特定的功能。 【示例 10】 改进使用闪灯函数的闪灯程序 所谓的函数参数,就是函数中需要传递值的变量、常量、表达式、函数等。接下来的例子会 将闪灯函数改造一下,使其闪烁时间可以变化。 程序 2-13:改进使用闪灯函数的闪灯程序 int ledPin = 13; int delayTime = 1000; //定义延时变量 delayTime为 1s int delayTime2 = 3000; //定义延时变量 delayTime2为 2s void setup() { pinMode(ledPin,OUTPUT); } void loop() { for(int count=0;count<20;count ++) { flash(delayTime); //调用 20次闪烁灯光的函数,延时为 3s } delay(delayTime2); //延时 3s } void flash(int delayTime3) //定义具有参数的闪灯函数 { digitalWrite(ledPin,HIGH); delay(delayTime3); digitalWrite(ledPin,LOW); delay(delayTime3); } 在改进的闪灯例子中,flash()函数接受一个整型的参数 delayTime3,称为形参,全名为形式参 数。形参是在定义函数名和函数体时使用的参数,目的是用来接收调用该函数时传递的参数,值一 般不确定。形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。 因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。 而 loop()函数中 flash接受的参数 delayTime,称为实参,全名为实际参数。实参是传递给形参 的值,具有确定的值。实参和形参在数量上,类型上、顺序上应严格一致,否则将会发生类型不匹 Arduino 开发从零开始学 ·38· 配的错误。 如果是非空类型的函数,在构造函数时应注意函数的返回值应和函数的类型保持一致,在调 用该函数时函数返回值应和变量的类型保持一致。程序 2-14 中是一个比较两个整数大小的函数 max,程序中给出了这个具有返回值的函数的定义和调用。 程序 2-14:具有返回值的函数Max() int Max(int a,int b) { //定义具有参数和返回值的求两个数最大值的函数{ if(a>=b) { return a; //a>=b时返回 a } else{ return b; //a
本文档为【arduino基础入门教程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
豆浆
暂无简介~
格式:pdf
大小:6MB
软件:PDF阅读器
页数:0
分类:工学
上传时间:2019-05-17
浏览量:12