Arduino 编程从零开始使用 C 和 C++
发布时间:2024-04-03 17:04:14浏览次数:51
作者简介 Simon Monk,模拟控制与计算机科学学士,软件工程博士。从少年时代起,他就是一名活跃的电子玩家,并担任业余电路杂志的兼职作者。Monk 博士撰写了 20 余本有关创客和电子题材的著作,尤其是 Arduino 和树莓派。你可以在网站http://simonmonk.org 上找到他的更多作品,也可以关注他的推特@simonmonk2。
致 谢 我想感谢 Linda 给了我时间、场地并支持我完成这本书,她还忍受我因为制作电子项目在家里造成的脏乱。 非常感谢 Robert“BobKat”Logan 和许多其他慧眼如炬、报告本书第 1 版勘误表的热心人士,我已经尽我所能修正了你们发现的错误。 最后,我想感谢 Michael McCabe、Srishti Malasi 和每一个参与本书出版工作的人,与如此优秀的团队合作是我的荣幸。
前 言 Arduino 接口的开发板提供了一种低成本、便于使用的技术来创作基于微控制器的项目。只需要掌握很少的电子学基础知识,就可以让 Arduino 实现从控制艺术装置的灯光到管理太阳能系统的电力在内的方方面面。 有很多基于项目的书会向你展示如何把设备连接到你的Arduino 上,包括本书作者的 30 Arduino Projects for the Evil Genius一书。但是,本书重点关注如何编写 Arduino 程序。 本书将会向你讲解如何让 Arduino 编程变得简单有趣,避免使用那些往往会让项目受阻的、棘手的代码。在本书指导下,你会从Arduino 使用的最基础的 C 语言开始,一步步彻底了解 Arduino 编程过程。 0.1 什么是 Arduino Arduino 是一款小型微控制器开发板,使用 USB (Universal Serial Bus,通用串口总线)接口连接到计算机,并且拥有大量可以用来连接像电机、继电器、光传感器、激光二极管、扩音器、麦克风等外部电子元件的接口。这些外部设备可以通过计算机的 USB 连接、9V电池或外部电源供电。它们可以通过计算机直接控制或在编程后独立运行。 Arduino 开发板的设计是开源的,这意味着任何人都可以制作Arduino 兼容的开发板。这种竞争带来了低成本的开发板和在“标准”
Arduino 编程从零开始 使用 C 和 C++(第 2 版) X 开发板基础上加以改型的各类板型。 Arduino 主控板可以通过在顶部插入扩展板的方式进行功能扩充。 用于 Arduino 编程的软件简单易用,并且可以轻松地为Windows、Mac 和 Linux 系统免费获得。 0.2 需要准备什么? 这是一本面向初学者的书,但也可以为那些已经用过一段时间Arduino,并且想了解关于 Arduino 编程更多知识,或者想更深入了解其中原理的人带来帮助。依照这个定位,本书把注意力放在Arduino Uno 开发板的使用上;当然,几乎所有的代码都可以不经修改地直接在 Arduino 的其他型号和变种上使用。 不需要拥有任何编程经验或技术背景,本书的全部练习也不需要焊接。你所需要的全部就是对创造的渴望。 如果想充分利用本书并尝试其中的一些实验,那么手头有以下物品是很有帮助的: · 几根实心导线 · 一台便宜的数字万用表 只需要花几块钱就可以很容易地从电子元器件商店或网络经销商(如 Adafruit 或 Sparkfun)那里买到它们。当然,你还需要一块Arduino Uno 开发板。 如果想要更进一步了解并且尝试一些使用显示器和网络连接的实验,需要从网上购买一些扩展板,详见第 9 章和第 10 章。 0.3 如何使用本书 本书在内容安排上循序渐进,可以让你用一种简单的方式上手。但是当你找到合适的定位并开始阅读本书时,你可能会发现自己可以跳过或只需要粗略阅读前面的章节。 本书按如下顺序组织章节内容:
前 言 XI 第 1 章:Arduino 介绍。这是关于 Arduino 硬件的引言,该章介绍 Arduino 的功能和大量可获得的不同型号的 Arduino 开发板。 第 2 章:启程。你将使用 Arduino 开发板开始自己的首个实验:安装软件,上电,下载你的第一个项目。 第 3 章:C 语言基础。该章涵盖 C 语言的基础语法;对于编程初学者,该章也可以作为一本大体的编程教材。 第 4 章:函数。该章讲解在 Arduino 项目中使用和编写函数的关键概念。这些项目都包含用来示范的可运行的示例代码。 第 5 章:数组和字符串。该章将介绍如何使用比整型变量更高级的数据结构。通过逐步开发一个摩尔斯电码例程来解释这些概念。 第 6 章:输入和输出。该章介绍如何在程序中使用 Arduino 开发板上的数字和模拟输入/ 输出接口。通过万用表有助于了解Arduino 输入/输出接口上所发生的情况。 第 7 章:Arduino 标准类库。该章讲解如何利用 Arduino 标准类库中的函数。 第 8 章:数据存储。在该章中可以学习如何编写可以在 EEPROM (Electrically Erasable Programmable Read Only Memory,电可擦可编程只读存储器)中存储数据并利用 Arduino 内置闪存(Flash Memory)的项目。 第 9 章:显示器。在该章中,你会学到如何将 Arduino 和显示器连接起来并制作 USB 留言板。 第 10 章:Arduino 物联网程序设计。该章讲解如何让 Arduino像网络服务器那样运行并像 dweet 和 IFTTT 那样与互联网应用服务通信。 第 11 章:C++和库。你已经攻克了 C 语言,尝试一下面向对象编程,然后编写自己的 Arduino 类库。
Arduino 编程从零开始 使用 C 和 C++(第 2 版) XII 0.4 资源 本书由以下网站提供技术支持:www.arduinobook.com。 可以从这个网站以及诸如勘误表之类的其他来源找到本书使用的所有源代码。也可以通过扫描封底的二维码来得到这些资源。
目 录 第 1 章 Arduino 介绍 ··································································1 1.1 微控制器 ··············································································· 1 1.2 Arduino 开发板的探索之旅 ·················································· 3 1.2.1 电源接口··················································································· 4 1.2.2 供电接口··················································································· 4 1.2.3 模拟输入接口 ··········································································· 4 1.2.4 数字接口··················································································· 5 1.2.5 微控制器··················································································· 5 1.2.6 其他元件··················································································· 6 1.3 Arduino 的起源 ····································································· 7 1.4 Arduino 家族 ········································································· 8 1.4.1 Uno 和 Leonardo······································································· 9 1.4.2 Mega 和 Due ············································································· 9 1.4.3 微型和小型 Arduino 开发板··················································· 10 1.4.4 Yun·························································································· 11 1.4.5 Lilypad ···················································································· 12 1.4.6 其他“官方”开发板 ····························································· 12 1.5 Arduino 复制品和变型························································ 13 1.6 本章小结 ············································································· 13 第 2 章 启程 ·············································································15 2.1 上电 ····················································································· 15
Arduino 编程从零开始 使用 C 和 C++(第 2 版) XIV 2.2 安装软件 ·············································································· 16 2.3 上传你的第一个项目 ··························································· 16 2.4 Arduino 应用程序································································· 21 2.5 本章小结 ·············································································· 23 第 3 章 C语言基础···································································25 3.1 编程 ····················································································· 25 3.2 什么是编程语言?······························································ 27 3.3 Blink——再来一次! ························································· 31 3.4 变量 ····················································································· 33 3.5 C 语言实验·········································································· 35 3.6 数值变量和算术运算符 ······················································ 36 3.7 控制语句 ············································································· 39 3.7.1 if 语句 ····················································································· 39 3.7.2 for 语句··················································································· 41 3.7.3 while 语句···············································································44 3.8 常量 ····················································································· 45 3.9 本章小结 ············································································· 45 第 4 章 函数 ·············································································47 4.1 什么是函数?······································································ 47 4.2 参数 ····················································································· 48 4.3 全局变量、局部变量和静态变量······································· 50 4.4 返回值 ················································································· 53 4.5 其他变量类型······································································ 54 4.5.1 float(浮点型)··········································································· 54 4.5.2 boolean(布尔型)······································································ 55 4.5.3 其他数据类型 ········································································· 56 4.6 代码风格 ············································································· 58 4.6.1 缩进 ························································································ 58
目 录 XV 4.6.2 花括号·····················································································59 4.6.3 空白 ························································································ 60 4.6.4 注释 ························································································ 60 4.7 本章小结 ············································································· 62 第 5 章 数组和字符串 ·······························································63 5.1 数组 ····················································································· 63 5.2 字符串 ················································································· 67 5.2.1 字符串常量············································································· 68 5.2.2 字符串变量············································································· 69 5.3 摩尔斯电码转换器······························································ 70 5.3.1 数据 ························································································ 71 5.3.2 全局变量和 setup 函数 ··························································· 72 5.3.3 loop 函数·················································································72 5.3.4 flashSequence 函数 ································································· 75 5.3.5 flashDotOrDash 函数 ······························································ 76 5.3.6 整合 ························································································ 77 5.4 本章小结 ············································································· 79 第 6 章 输入和输出···································································81 6.1 数字输出 ············································································· 81 6.2 数字输入 ············································································· 85 6.2.1 上拉电阻·················································································85 6.2.2 内部上拉电阻 ········································································· 88 6.2.3 防抖动····················································································· 89 6.3 模拟输出 ············································································· 94 6.4 模拟输入 ············································································· 96 6.5 本章小结 ············································································· 98
Arduino 编程从零开始 使用 C 和 C++(第 2 版) XVI 第 7 章 Arduino 标准类库 ·························································99 7.1 随机数 ················································································· 99 7.2 数学函数 ··········································································· 102 7.3 位操作 ··············································································· 103 7.4 高级 I/O ············································································· 105 7.4.1 生成音调···············································································105 7.4.2 移位寄存器···········································································107 7.4.3 中断 ······················································································107 7.5 本章小结 ··········································································· 109 第 8 章 数据存储 ···································································· 111 8.1 常量 ··················································································· 111 8.2 将数据存储在闪存中························································ 112 8.3 EEPROM ··········································································· 114 8.3.1 在 EEPROM 中存储整数 ·····················································116 8.3.2 使用 AVR EEPROM 库 ························································ 117 8.3.3 在 EEPROM 中存储浮点数·················································· 118 8.3.4 在 EEPROM 中存储字符串·················································· 118 8.3.5 清除 EEPROM 的内容 ·························································120 8.4 压缩 ··················································································· 121 8.5 本章小结 ··········································································· 122 第 9 章 显示器········································································123 9.1 字母数字 LCD 显示器 ······················································ 124 9.2 USB 留言板······································································· 125 9.3 使用显示器········································································ 127 9.4 其他 LCD 库函数······························································ 128 9.5 OLED 图形显示器 ···························································· 128 9.6 连接 OLED 显示器 ··························································· 129 9.7 软件 ··················································································· 130
Arduino 编程从零开始使用 C 和 C++ (第 2 版) [美] 西蒙 • 蒙克 (Simon Monk) 著 张 懿 译 北 京
目 录 XVII 9.8 本章小结 ··········································································· 132 第 10 章 Arduino 物联网程序设计···········································133 10.1 与 Web 服务器通信························································· 134 10.1.1 HTTP ················································································134 10.1.2 HTML···············································································134 10.2 将 Arduino Uno 作为 Web 服务器 ·································· 136 10.3 网络控制的 Arduino························································ 139 10.4 Node MCU Web 服务器 ·················································· 145 10.5 网络控制的 Node MCU ·················································· 150 10.6 呼叫 Web 服务器····························································· 153 10.7 Arduino Uno 和 IFTTT···················································· 156 10.8 Node MCU ESP8266 开发板和 IFTTT ··························· 158 10.9 其他物联网选择······························································ 160 10.9.1 Arduino Yun······································································160 10.9.2 Particle Photon ··································································161 10.10 本章小结········································································ 161 第 11 章 C++和库···································································163 11.1 面向对象·········································································· 163 11.2 内置库示例······································································ 164 11.3 编写自己的库·································································· 165 11.3.1 头文件 ··············································································165 11.3.2 实现文件 ··········································································166 11.3.3 完成你的库·······································································167 11.3.4 关键字 ··············································································168 11.3.5 示例·················································································168 11.4 本章小结·········································································· 171
第 1 章 Arduino 介绍 Arduino 是一款能极大激发电子爱好者想象力的微控制器平台,易于使用和开源特性使它成为电子项目开发者不错的选择。 基本上,把电子元件连接到 Arduino 的接口上,Arduino 就可以控制这些元件——比如开关灯和电机,或者检测光照和温度。这就是为什么 Arduino 有时会提供物理运算描述的原因。因为 Arduino 开发板可以通过 USB 线连接到计算机,所以可以将 Arduino 用作接口板来控制计算机中相同的电子元件。 本章对 Arduino 作简单介绍,包括 Arduino 的历史、背景和硬件概况。 1.1 微控制器 Arduino的心脏是微控制器。从给开发板供电到允许开发板和桌面计算机进行通信在内的几乎所有东西都与它息息相关。 微控制器本质上是一台片上微型计算机,拥有组成一台计算机的所有结构并且已经超越了第一代家用计算机。微控制器内拥有一台处理器,1KB 或 2KB 容量用来存储数据的随机存取存储器(Random Access Memory,RAM),几 KB 容量用来存储程序的可擦除可编程只
Arduino 编程从零开始 使用 C 和 C++(第 2 版) 2 读存储器(Erasable Programmable Read Only Memory,EPROM)或闪存,以及输入/输出(I/O)引脚。这些输入/输出引脚将其他电子元件连接到微控制器上。 输入引脚可以读取数字量(导通还是关闭?)和模拟量(引脚上的电压是多少?)。这让你有机会可以将许多不同种类的传感器(如用于光照、温度、声音等的传感器)连接到你的微控制器上。 输出引脚也可以接受模拟量和数字量。因此,可以设置一个引脚是导通还是关闭(0V 还是 5V),从而可以直接控制一个 LED 开关:也可以使用输出引脚来控制一些需要更多供电的设备,比如电机。输出引脚也可以提供模拟量输出。这代表可以控制输出引脚的输出能量大小,让你控制电机的转速或灯的亮度,而不是简单地控制其开关。 Arduino Uno 开发板上的微控制器是安装在开发板底座中央的 28引脚的芯片。这个单独的芯片包含内存、处理器和输入/输出引脚的所有电子元件。它由专业微控制器制造厂商之一的 Atmel 公司制造。每一家微控制器生产厂商都生产着几十种不同系列、不同型号的微控制器。微控制器不仅仅是为了帮助像我们这样的电子爱好者而被创造出来。我们只是这个巨大市场中的一小部分。这些设备将被嵌入消费级产品,包括汽车、洗衣机、DVD 播放器、儿童玩具甚至空气净化器。 Arduino 最伟大的地方就是用微控制器来代替这些令人眼花缭乱的选择并坚持到底(尽管在之后的内容中,这种陈述并不完全正确,但已足够接近)。 这意味着当开始一个新的项目时,不需要首先衡量所有利弊和各种微控制器的缺点。 开发板 我们已经确定微控制器只是一个芯片。一片微控制器在没有支持电路提供规范而准确的供电(微控制器对供电敏感),以及一种用来给微控制器编程的与计算机通信的手段的情况下是不会独立工作的。
第 1 章 Arduino 介绍 3 这就是开发板的由来。一块 Arduino Uno 开发板本质上是一个独立且开源设计的微控制器扩展板。这代表着所有印制电路板(Printed Circuit Board,PCB)的设计文档和原理图都是公开的,任何人都可以免费使用这些设计,制作和销售自己的 Arduino 开发板。 所有的微控制器生产厂商,包括把 ATmega328 微控制器应用于Arduino 开发板的 Atmel,都同样提供他们自己的开发板和编程软件。尽管这些开发板相当廉价,但是它们更倾向于面向专业的电子工程师而不是爱好者。这表明这些开发板和软件可以说是难以使用,并且在你能够从中得到有用的东西之前需要大量学习投入。 1.2 Arduino 开发板的探索之旅 图 1-1 展示了一块 Arduino Uno 开发板。让我们快速浏览一遍开发板上的各个组件。 图 1-1 一块 Arduino Uno 开发板
Arduino 编程从零开始 使用 C 和 C++(第 2 版) 4 1.2.1 电源接口 参考图 1-1,USB 接口的正下方是 5V 稳压芯片。这个元件可以将直流电源接口接入的 7V~12V 直流电源稳压至 5V。 与其他芯片相比,5V 稳压芯片的体积可以称得上“巨大”。这是为了确保芯片在通过电流较大的情况下,有足够的面积发散在调节电压时产生的热量。当需要用 Arduino 驱动外部电路时,你会发现这个设计相当有用。 虽然通过直流电源接口连接电池或者通过直流电源为 Arduino 供电非常有用,但是也可以通过用来烧录程序的 USB 接口供电。 1.2.2 供电接口 接下来让我们一起研究图 1-1 所示开发板底部的接口。可以看一下这些接口旁边的名字,有没有注意到最左边的 RESET 接口?也许你会联想到复位按钮,是的没错,这个接口可以实现和 Arduino 开发板上复位按钮相同的功能。和重启计算机略有不同,使用 RESET 接口重启微控制器,可以让它从头开始程序。只需要让 RESET 接口处于低电平一小段时间(接到 0V),就可以让微控制器完成复位操作。 这块区域剩下的引脚只具有提供它们所标记的电平值(3.3V、5V、GND 和 Vin)的功能。GND 接口,也叫接地端,提供 0V 电压。这个数值是相对的,因为在开发板上它是其他所有电压的参考电压。 1.2.3 模拟输入接口 以 A0 到 A5 标记的 6 个模拟输入引脚可以用来测量输入它们的电压值,这样就可以在 Sketch(Arduino 项目名称)中使用这些数据。 必须注意,这些引脚测量的是电压值而非电流值。由于模拟输入
第 1 章 Arduino 介绍 5 引脚的内阻非常大,只有很小的电流会经过它们,然后从接地端流出。换个说法,就是模拟输入引脚的内阻较大,只允许很小的电流通过。 虽然这些输入引脚被标记为模拟接口并且默认为模拟输入,但是依然可以把它们用作数字输入/输出接口。 1.2.4 数字接口 现在,我们开始介绍图 1-1 所示开发板顶部的接口。在这块区域内,可以看到一排被标记为数字 0~13 的接口。这 14 个接口都支持输入/输出两种模式。当被用作输出接口时,它们的工作方式与之前介绍的供电接口相似,除了电源接口会始终保持 5V 电压输出,而数字接口可以用 Sketch 控制其是否工作以外。所以,如果在 Sketch 中打开了数字接口,它们就会输出 5V 电压;如果关闭它们,电压就会变为 0V。和电源接口一样,必须注意输出电流大小以确保不会超过最大驱动电流。最右边的两个接口(0 和 1)又被标记为 RX 和 TX,它们可以用来收发数据。这两个接口是为与计算机通过 USB 连接进行直接数据传输而预留的。 数字接口可以在 5V 电压下提供最大 40mA 的驱动电流。这样的电流大小足够点亮一个标准的 LED 灯,但并不足以直接驱动直流电机。 1.2.5 微控制器 继续我们的 Arduino 开发板探索之旅,开发板上含有 28 个引脚的黑色矩形元件就是微控制器芯片。得益于双列直插式封装设计,它可以很方便地进行更换。Arduino Uno 采用一块 ATmega328 作为主控芯片。图 1-2 提供的框图展示了这台设备的主要构成。
Arduino 编程从零开始 使用 C 和 C++(第 2 版) 6 图 1-2 ATmega328 框图 中央处理器(Central Processing Unit,CPU)是整台设备的心脏,也许比作大脑更恰当一些。它控制着设备内部进行的一切活动。中央处理器取出存储在闪存中的程序指令,然后执行。这些指令也许是从RAM 中读取数据,对其进行修改,然后放回。当然,这也可能意味着将其中一个数字引脚的输出从 0V 改为 5V。 EEPROM 和闪存有一些相似之处,二者都具有非易失性。通俗来讲,可以安心地重启设备而其中的内容不会丢失。但闪存通常被用来存储程序指令(从项目文件中获得),而 EEPROM 被用来存储那些在复位或断电情况下不想丢失的数据。 1.2.6 其他元件 在微控制器的上方有一个小巧的银色矩形元件。这是石英晶体振荡器(晶振)。它一秒钟振动 1600 万次,在每一个机器周期①内,微控 ① 译者注:微控制器执行一条指令需要一个机器周期,一般来讲,一个机器周期由 12个振荡周期(时钟周期)组成,即执行一次操作需要 12 个振荡周期。同时,受限于硬件功能,不同的数学运算需要的指令周期也不尽相同,这里不多作赘述。
第 1 章 Arduino 介绍 7 制器可以执行一次操作——相加、相减或其他数学运算。 在开发板左上方的是复位开关。按下复位开关将会向微控制器的复位引脚发送一个逻辑脉冲,使微控制器从头开始程序并清空内存。请注意所有存储在设备上的程序依然会被保留,因为它们都被存储在闪存中——这就是说,存储介质依然保存着这些数据,即便设备掉电。 在开发板右侧的是串行编程接口。它提供了一种不使用 USB 接口的 Arduino 程序烧录方法。因为 USB 连接器和软件更易于使用,所以在本书中我们不会利用这个特性。 USB 接口芯片在开发板左上角靠近 USB 接口的位置。这个芯片将遵循 USB 通信协议的信号电平转换为可供 Arduino 板直接使用的信号电平。 1.3 Arduino 的起源 最初,Arduino 是作为学生教学的辅助工具开发的。随后在 2005年,Massimo Banzi 和 David Cuartielles 对其进行了商业化开发。从那时起,Arduino 凭借简单易用和经久不衰的特点在创客、学生和艺术家群体中取得了巨大的成功。 Arduino 取得成功的另一个关键因素,就是在 Creative Commons(CC)授权下,任何基于 Arduino 的硬件设计都可以免费获得。在该协议下,任何人都可以制作低成本的原设计的复制品。唯一被保留的只有Arduino 这个名字,因此许多复制品会在自己的产品名字中加入 duino以示尊重或表明自己是 Arduino 的衍生产物,例如 Boarduino 、Seeeduino 和 Freeduino。在 2014 年,Arduino 的创始团队和主要生产厂商之间出现了严重分歧。这次分裂的结果之一就是现在除美国本土以外的区域,Arduino UNO 都被改称为 Genuino UNO。许多大的零售商只销售官方出品的开发板,因为它们通常包装更精美,质量更好。
Arduino 编程从零开始 使用 C 和 C++(第 2 版) 8 对于 Arduino 而言,所有微控制器都是通用的,这也是其成功要素之一。市面上有大量兼容 Arduino 的扩展板,它们可以直接插在Arduino开发板上使用。由于这些扩展板几乎涵盖所有的应用方向,因此常常可以通过堆叠扩展板的方式来代替电烙铁。下面是一部分最常见的扩展板: ● Ethernet:以太网扩展板,它为 Arduino 提供互联网扩展服务。 ● Motor:电机扩展板,它可以驱动电动马达。 ● USB Host:USB 主机扩展板,它可以使 Arduino 与一台 USB设备通信。 ● Relays:继电器扩展板,它是一台外接的开关继电器。 图 1-3 展示了电机扩展板(左)和继电器扩展板(右)。 图 1-3 电机扩展板和继电器扩展板 1.4 Arduino 家族 稍微了解一下各种各样的 Arduino 开发板的背景是有帮助的。我们会使用 Arduino Uno 作为标准设备,更准确一些,是 Arduino Uno R3(第三次修改版)。事实上,这是到目前为止应用最多的 Arduino 开发板,但是所有的开发板都用相同的语言编程并且大部分采用相同的外部接口,所以可以很方便地使用不同的开发板。
第 1 章 Arduino 介绍 9 1.4.1 Uno 和 Leonardo Arduino Uno 只是众多 Arduino 开发板中的典型,这个系列包括Diecimila(意大利语的 10000)和 Duemilanove(意大利语的 2009)。图 1-4展示了一块 Arduino Leonardo 开发板,现在你可能会猜测 Arduino 是一项意大利发明。 Arduino Leonardo(参见图 1-4)是另一款受欢迎的 Arduino 开发板,在绝大多数情况下都可以用来代替 Arduino Uno。它比 Uno 稍微便宜一点,并且和 Uno 拥有相同的接口。它的处理器焊接在开发板上,所以不可以移除(Uno 的处理器可以移除)。Leonardo 的低价部分是因为使用了一台自带 USB 接口的处理器,而不需要使用 Uno 那样的分离式芯片。 图 1-4 Arduino Leonardo 1.4.2 Mega 和 Due Arduino Mega 是 Arduino 开发板中的重量级代表,拥有大量的输
Simon Monk Programming Arduino: Getting Started with Sketches, Second Edition EISBN:978-1-25-964163-3 Copyright © 2017 by McGraw-Hill Education. All Rights reserved. No part of this publication may be reproduced or transmitted in any form or by any means, electronic or mechanical, including without limitation photocopying, recording, taping, or any database, information or retrieval system, without the prior written permission of the publisher. This authorized Chinese translation edition is jointly published by McGraw-Hill Education and Tsinghua University Press Limited. This edition is authorized for sale in the People’s Republic of China only, excluding Hong Kong, Macao SAR and Taiwan. Translation copyright © 2018 by McGraw-Hill Education and Tsinghua University Press Limited. 版权所有。未经出版人事先书面许可,对本出版物的任何部分不得以任何方式或途径复制或传播,包括但不限于复印、录制、录音,或通过任何数据库、信息或可检索的系统。 本授权中文简体字翻译版由麦格劳-希尔(亚洲)教育出版公司和清华大学出版社有限公司合作出版。此版本经授权仅限在中国大陆地区销售,不能销往中国香港、澳门特别行政区和中国台湾地区。 版权©2018 由麦格劳-希尔(亚洲)教育出版公司与清华大学出版社有限公司所有。 北京市版权局著作权合同登记号 图字:01-2018-0335 本书封面贴有 McGraw-Hill Education 公司防伪标签,无标签者不得销售。 版权所有,侵权必究。侵权举报电话:010-62782989 13701121933 图书在版编目(CIP)数据 Arduino编程从零开始:使用C和C++:第2版/(美)西蒙• 蒙克(Simon Monk) 著;张懿 译. —北京:清华大学出版社,2018 书名原文:Programming Arduino: Getting Started with Sketches, Second Edition ISBN 978-7-302-50056-8 Ⅰ. ①A… Ⅱ. ①西… ②张… Ⅲ. ①单片微型计算机-C 语言-程序设计 Ⅳ. ①TP368.1②TP312.8 中国版本图书馆 CIP 数据核字(2018)第 088825 号 责任编辑:王 军 李维杰 装帧设计:牛艳敏 责任校对:孔祥峰 责任印制:李红英 出版发行:清华大学出版社 网 址:http://www.tup.com.cn,http://www.wqbook.com 地 址:北京清华大学学研大厦 A 座 邮 编:100084 社 总 机:010-62770175 邮 购:010-62786544 投稿与读者服务:010-62776969,c-service@tup.tsinghua.edu.cn 质 量 反 馈:010-62772015,zhiliang@tup.tsinghua.edu.cn 印 装 者:北京嘉实印刷有限公司 经 销:全国新华书店 开 本:148mm×210mm 印 张:6 字 数:167 千字 版 次:2018 年 7 月第 1 版 印 次:2018 年 7 月第 1 次印刷 定 价:49.80 元 ———————————————————————————————————————— 产品编号:078167-01
Arduino 编程从零开始 使用 C 和 C++(第 2 版) 10 入/输出接口,但 Mega 很机智地将这些接口布置在开发板的尾部,允许继续对 Arduino Uno、Leonardo和所有 Arduino 扩展板保持引脚兼容。 Mega 使用一款永久固定在开发板上,且带有更多输入/输出引脚的贴片式处理器——ATmega1280。所以,不像 Uno 以及类似的开发板,如果不慎将处理器损坏,将无法更换。 多出的接口被安排在开发板的尾部。Mega 提供的额外功能如下: ● 54 个输入/输出引脚 ● 128KB 容量的用来存储程序和数据的闪存(Uno 只有 32KB 容量) ● 8KB 的 RAM 空间和 4KB 的 EEPROM 空间 Arduino Due(参见图 1-5)和 Mega 拥有相同的尺寸和接口,但使用一块 32 位 84MHz 频率的 ARM 处理器。Due 工作在 3.3V 而不是Arduino 开发板最常用的 5V,因此一些扩展板会无法正常工作。 图 1-5 一块 Arduino Due 开发板 1.4.3 微型和小型 Arduino 开发板 Uno 的体积在某些场合下实在是太大了,这里有一系列更小的Arduino 和 Arduino 兼容开发板。图 1-6 展示了一些被选出来的开发板。
第 1 章 Arduino 介绍 11 图 1-6 Arduino Micro(左)、Freetronics LeoStick(中)和 Adafruit Trinket(右) Arduino Micro 使用和 Leonardo 相同的微控制器,但被缩减到一块更紧凑的开发板上。像 LeoStick 和 Adafruit Trinket 这样的第三方开发板,提供了 Micro 的替代方案。 像 Micro 这样的小型开发板的不足之处就是:它们比 Uno 小太多,它们不能使用 Uno 尺寸的扩展板。 1.4.4 Yun Arduino Yun(参见图 1-7)基本上是一块 Arduino Leonardo 和运行Linux 的微型 WiFi 模块的结合体。这种设备是为需要网络连接的 图 1-7 Arduino Yun
Arduino 编程从零开始 使用 C 和 C++(第 2 版) 12 Arduino 应用而准备的。Yun 上面的 Arduino 和 Linux 两部分通过被称为桥接的软件相连接。Yu n 像普通 Arduino 开发板一样通过 Arduino IDE 编程,但在接入本地网络后也可以通过 Arduino IDE 进行无线编程。 1.4.5 Lilypad Lilypad(参见图 1-8)是一款可以为可穿戴计算应用而被缝进衣服的小且薄的 Arduino 开发板。 图 1-8 Arduino Lilypad Lilypad 没有 USB 接口,必须使用单独的适配器来为它编程,它有着异常完美的设计。 Adafruit 也出售与 Lilypad 在概念上相似,被称为 Flora 的开发板。 1.4.6 其他“官方”开发板 之前介绍的 Arduino 开发板都是使用最广泛、最受欢迎的型号。但是 Arduino 开发板的种类在不停变化,所以可以浏览 Arduino 官方
第 1 章 Arduino 介绍 13 网站 www.arduino.cc/en/Main/Hardware 以了解完整的 Arduino 家族和它们最新的图片。 1.5 Arduino 复制品和变型 非官方的开发板分两大类。一类只是采用标准的 Arduino 开源硬件设计,然后制作成廉价产品。下面是一些可以搜索到的这类开发板的名称: ● Sparkfun RedBoard ● Adafruit Metro ● Olimexino 更有趣的是,一些 Arduino 兼容的设计打算在某些方面扩展或改善 Arduino。每时每刻都有新的变体出现,它们太多了以至于难以全部提及。不过,下面是一些更有趣、更受欢迎的变体: ● Node MCU 开发板,围绕 ESP8266 芯片上的 WiFi 系统设计。这在项目需要使用 WiFi 连接 Arduino 时提供了一种非常廉价的解决方案。更多信息参考第 10 章。 ● Adafruit Trinket,一致非常小的 Arduino 开发板。 ● Freetronics EtherTen,一致内置以太网的 Arduino 板。 ● Particle Photon,一致廉价的 WiFi 开发板。可以使用 Arduino C语言进行网络编程,但是采用了基于网页的 IDE 而不是Arduino IDE。 1.6 本章小结 现在已经探索了 Arduino 硬件世界的一部分,是时候搭建自己的软件开发环境了。
本书赞誉 多年来,我一直是一个电子爱好者,但主要涉足模拟领域,对数字方面的兴趣不大。在接触和使用 Arduino 之前,我一直在编程,但从不使用微处理器。现在,我上瘾了。但让人遗憾的是,普通 Arduino 图书提供的“帮助”与示例和解释非常零碎,从来没有十分系统的讲述。这本书真是太棒了!我刚一拿到手,就迫不及待地阅读了,我用笔把其中的内容标记起来,提醒自己几个月前我想知道的重要内容。我以前用 FORTRAN 语言和 BASIC语言编程,但从未学习过 C 语言。谢天谢地,这本书不需要 C 语言基础,并手把手带你经历这个过程。该书很好地解释了编程的每一部分,解释了开发板的硬件,以及开发板如何与计算机进行通信。最后,书中不只是复制和粘贴别人的程序,而是希望读者可以对其进行修改以实现自己的功能,读者可以理解为什么某些事情产生的效果远大于初衷。
Arduino 编程从零开始 使用 C 和 C++(第 2 版) II 这本书太适合编程新手了,书中的信息十分切合主题,并且紧跟技术潮流,因此,我强烈推荐给任何想要涉足或深入 Arduino 编程的人。本书的一大特色,就是可以使用 Arduino 随时跟进示例。如果正在寻找哪些书能帮你涉足 Arduino,那么本书再适合不过了。 本书涵盖 Arduino IDE的绝大部分功能,包括库、类、标准 Arduino库的用法,以及足够的硬件理论来帮助你理解优秀的 Arduino 示例程序。网上的大多数 Arduino 示例程序都是依葫芦画瓢; 本书可以帮助你理解为什么要这么做,并且准确解释了其中专有词汇的含义。
译 者 序 Arduino 是一款便捷灵活、易于上手的开源电子开发平台,自 2005 年推出以来,在全球范围内激起了经久不衰的创客风潮。它是一款强大的开发工具,可以适应各个层次、不同场合的应用需求。从可穿戴智能设备,到大型工业机器人,从深海自主探测器,到 NASA 发射的创客卫星,甚至在欧洲原子能机构的大型强子对撞机上都能见到 Arduino 的身影。革命性技术的诞生都伴随着传统行业门槛的大幅降低。例如,冷兵器时代,骑士们花费一生时间学习剑术、马术和各种格斗技术。但火枪诞生后,只要扣动扳机就行了。Arduino 最大的贡献就是,给极为复杂难懂的电子制作“装上了扳机”——它把极客们最头疼的电子电路和底层驱动库都打包集成为黑箱,进而省略了大部分与电路和硬件驱动相关的操作,最终只剩下简单的控制逻辑。这让程序员无须学习复杂的电子基础,也能轻松制作出精良而可靠的电子创意产品。 对于初学者来说,一本好的入门书籍可以让你获益良多,但目前市面上 Arduino 相关的书籍种类之多,涉及的领域之广,往往令人眼花缭乱,难以选择。《Arduino 编程从零开始 使用 C 和C++(第 2 版)》是众多 Arduino 学习资源中的经典,在创客圈中影响颇深。本书的作者是 Arduino 爱好者、电子大师 Simon Monk。从少年时代起 Simon Monk 就是一名活跃的电子玩家,并担任业余电路杂志的兼职作者。Monk 博士撰写了 20 余本有关创客和电
Arduino 编程从零开始 使用 C 和 C++(第 2 版) IV 子题材的著作,本书作为 Simon Monk 的经典之作,帮助大量电子爱好者入门 Arduino 编程,对 Arduino 的推广功不可没。 本书在前一版的基础上,新增加了一章:Arduino 物联网程序设计。其中介绍了如何让 Arduino 像网络服务器那样运行并像dweet 和 IFTTT 那样与互联网应用服务交换数据。第 10 章“ 物 联网程序设计”在丰富内容的同时,牢牢抓住电子开发的热点话题,使得本书紧跟物联网开发浪潮。此外,本书也随着硬件设备不断推陈出新对章节内容进行了调整,使用最新的开发板、软件开发环境以及外围硬件设备,全方位地升级了全书内容。 正所谓“耳闻之不如目见之,目见之不如足践之”,学习的最好方法就是亲自动手实践。考虑到编程过程的烦琐和枯燥,本书作者已将全部项目代码上传至支持网站,并在每一章中都给出了可供参考的资源链接以方便读者参考和使用。你可以使用作者提供的代码快速上手,实现项目要求,领略程序之美,但照搬代码终归不是编程之道,知者明其形而深谙其意,所以译者建议各位读者在使用作者的源码熟练掌握语法、深入理解程序逻辑后,用自己的风格重新编写例程,如此方能成为理论和行动上的“巨人”。 在这里要感谢清华大学出版社的编辑,他们为本书的翻译投入了巨大的热情并付出了很多心血。没有你们的帮助和鼓励,本书不可能顺利付梓。 本书全部章节由张懿翻译。对于这本经典之作,译者本着“诚惶诚恐”的态度,在翻译过程中力求“信、达、雅”,但是鉴于译者水平有限,错误和失误在所难免,如有任何意见和建议,请不吝指正,感激不尽! 最后,希望读者通过阅读本书能早日掌握 Arduino 编程,体验创客乐趣!
序 言 本书的第 1 版于 2011 年 11 月出版,在亚马逊网站的 Arduino同类书籍销售排行榜中位居第一。 在本书刚刚完成时,最新的 Arduino 型号是 Arduino 2009,软件版本是 Beta018。几乎就在本书上架的同时,Arduino Uno 和1.0 版本的 Arduino 软件发布。很快,本书第 1 版在重印时进行了一次对新开发板和软件的次要更新,但并没有正式成为第 2 版。本书的第 2 版基于 Arduino1.6 全方位地升级了全书内容。 Arduino Uno R3 依然被公认为一款优秀的 Arduino 开发板。但也有许多其他的开发板出现,包括官方出品的(如 Leonardo、Zero、101、Due 和 Yun) 和其他基于 Ardunio 编程语言的设备,如Photon 和 Intel Edison。 本书的第 2 版还介绍了 Arduino 在物联网项目和包括 OLED及 LCD 在内的多种显示设备上的应用。 Simon Monk