likes
comments
collection
share

JavaScript 只能写 Web?JavaScript in IoT 应用入门

作者站长头像
站长
· 阅读数 30

​ 物联网(IoT,Internet of things)即“万物相连的互联网”,最早由美国麻省理工学院 Auto-ID 中心主任 Kevin Ashton 于 1999 年进行 RFID (Radio Frequency Identification,射频识别)研究时提出。

​ 物联网将一般物品(例如:超商以及它所贩售的所有商品)、传感器,甚至人类和动物,都标上唯一识别码(Unique Identifier, 如条形码、IP 地址、身份证号码等),彼此之间通过约定好的通信协议,利用互联网相连、分享数据。

​ 随着宽带网络基础建设的普及、各式云服务推陈出新,加上传感器、通信芯片和单片机技术的提升与价格下降,使得“物联网”从概念融入真实的日常中。例如,手机可以记录你的运动习惯,导航系统可以告诉你交通状况,外卖平台可以实时更新商品位置和预计送达时间。机器和机器及云服务器相互连接、协同合作,极大的提高生活生产效率和品质。。

1 JavaScript 与物联网

​ 许多嵌入式系统采用的是运算性能、存储器容量相对较低的 8 位或 16 位单片机,它们也通常采用专属的库和开发工具,并且多采用 C/C++ 语言开发。就像电视机、空调等家电,逐渐脱离“单独”运作的时代,为了抢食物联网市场大饼,原本软硬件较为封闭的嵌入式控制器,也开始拥抱开放的互联网和 Web 标准。

1.1 硬件项目剖析

​ 我们以构建一个小项目举例,温度超过限定温度时,LED 警示灯亮起。这种微型的、独立的温度监测设备会持续地监测周边环境的温度。虽然这个项目及其简单,但它的基本组成和构建更复杂的项目是一样的。

1.1.1 输入设备和输出设备

​ 输入设备为系统提供输入数据,传感器就是一种提供物理环境数据的输入设备。在项目中可以使用各种传感器,如光、热、噪声、振动、蒸汽、湿度、气味、移动、火焰等传感器。在本例中,输入设备就是温度传感器。

​ 项目的输出代表这个项目提供给使用者的实际功能,如闪烁的灯光、刺耳的响声、LCD 屏幕上的状态读数、移动的机械臂等。本例的 LED 就是一个输出设备。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

1.1.2 微控制器

​ 要实现根据实时温度开启或关闭 LED,需要个能注意到温度传感器读数和控制 LED 的“大脑”。这里所需要的“大脑”实际上是一台“小型计算机”,包含一个处理器、一些存储器以及处理输入和控制输出的能力。当处理器、存储器和输入输出(I/O)功能都被集成在一个小型的物理封装中时,把这样的集成芯片称为微控制器(MCU,Microcontroller Unit)。

​ 微控制器不像笔记本电脑中的通用处理器那么强大,大多数都无法运行一个完整的操作系统。但是它们价格便宜、功能可靠、体积小、功耗极低的有点,使其在硬件项目中应用广泛。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

1.1.3 电源、电路和系统

​ 现在有了输入设备、输出设备和微控制器,我们需要使用导线连接元件并接上电源,构建成一个电子电路系统。将导线直接连接到微控制器的微小引脚需要焊接和稳定的手法,为了方便硬件开发者的使用,微控制器通常安装在物理开发板上。

​ 开发板可以轻松地将 I/O 设备连接到微控制器,还为微控制器编程烧录提供了方便的接口(通常是USB)。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

1.1.4 逻辑和固件

​ 微控制器如何知道它该做什么,这里就涉及逻辑。如下是监听温度传感器,做出决策,发送指令来开启或关闭 LED 的伪代码。

// 温度触发 LED 逻辑伪代码

initialize input
initialize output
initialize threshold 30

loop main
  read input value into currentTemperature
  if currentTemperature is greater than threshold
    turn output on
  else currentTemperature is less than or equal threshold
    turn output off

​ C 语言(或者类似 C 语言的衍生语言)是为微控制器编程所使用的主要语言。代码被编译成与体系结构相关的汇编代码。代码通过物理上传或者烧录到微控制器的程序存储器中。这种程序存储器通常是非易失存储器————ROM,它可以让微控制器在断电的情况下依然能“保存”程序(而 RAM 仅在供电时才会保存其内容,断点丢失)。一旦将程序烧录到微控制器,它就像微控制器的固件一样————供电时,微控制器持续运行程序。

程序的可用空间有限,通常在几万字节左右,这也意味着在微控制器上运行的程序需要很好地优化。

1.1.5 嵌入式系统

​ 如本例所展示的,通过导线将输入设备、输出设备、微控制器和电源连接在一起,创建为一个独立的系统。之所以被称为“嵌入式”,是因为这个系统通常被嵌入到其他设备或系统中(如一个外壳或家电、通信设备等),而不是作为独立的个体使用。

1.2 JavaScript 与硬件的协同操作

​ 在JavaScript 和嵌入式系统相结合时,仍然以与其他类型硬件项目相同的方式构建电子电路。仍然有输入设备、输出设备、微控制器、电源和导线。但不使用汇编语言或 C 语言,而是使用 JavaScript 来定义项目的微控制器或处理器的功能。

​ 使用 JavaScript 为硬件项目提供逻辑有几种不同的方法。这些方法按照 JavaScript 逻辑本身执行的载体位置分类:

  • 在嵌入式系统的微控制器上。

  • 在与嵌入式系统分离的主机上。

1.2.1 嵌入式 JavaScript

​ 使用嵌入式 JavaScript 时,控制项目的 JavaScript 逻辑可以直接在硬件的微控制器上运行。

​ 许多微控制器都是以 8 位或者 16 位架构构建,其处理器的性能不高(时钟频率在 200MHz 以内),而且存储容量不大(以 KB 为单位)。在这些微控制器中,大多数都不能运行操作系统,也没有直接提供 JavaScript 运行时的能力。随着技术的进步,廉价的微控制器也越来越先进。直接在某些嵌入式处理器上运行 JavaScript 或 JavaScript 的优化变体,已经成为可能。Espruino 是一个基于 JavaScript 的嵌入式平台,其将优化的 JavaScript 核心与具有硬件相关功能的 API 相结合,配套了一个类库,用于编写兼容的 JavaScript 代码和 CLI(命令行接口)并提供了代码上传到微控制器的方法。

​ 这些可以嵌入式运行 JavaScript 的硬件, 一般来说功耗较低并且相对独立,但也有一些缺点:

  • 目前可选的硬件较少且价格相对较高。
  • 每个硬件平台有自己的平台相关技术(软件、工具和方法),学习成本较高。

1.2.1 宿主机-客户端方法

​ 为了规避一些微处理器的限制,宿主机——客户端方法可以在更强大的宿主机上执行 JavaScript 逻辑。宿主机能够运行完整的操作系统,能够运行 Node.js, 并且可以利用整个 JavaScript 生态系统。

​ 使用此方法首先需要将特定的固件上传(烧录)到微控制器的程序存储器中来准备嵌入式硬件。 宿主机(如笔记本电脑)与客户端(如微控制器)通过物理有线连接(通常是 USB)或无线(WiFi 或蓝牙)连接。运行代码时,宿主机与嵌入式硬件使用可以相互理解的“语言”(一种通用 API)来互相交换指令和数据,这种嵌入式硬件就像是一个客户端,监听来自宿主机的指令。

​ 宿主机——客户端方式不必编写底层的固件协议 API 软件,同时规避了便宜的微控制器带来的性能和内存限制,得到众多平台的支持。缺点是客户端硬件只在宿主机运行软件时才能正常工作,在没有宿主机的情况下无能为力。

2、关于 ESP8266

​ ESP8266 是由中国台湾乐鑫公司开发的一个 WiFi 转串口通信的模块,也是具备 WiFi 联网功能的 32 位微控制板。于 2014 年问世。因价格低廉,受到开发者的热捧。

2.1 ESP8266 模块

​ 市场上的 ESP8266 模块有不同的包装形式,名称用“ESP”开头加上数字编号。这些模块都采用相同的微控制器,主要差异在于尺寸、I/O 脚位数量、天线类型和闪存容量。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

​ ESP8266 模块部分硬件规格如下:

  • 工作电压与电流:3-3.6V,通常采3.3V;WiFi 联网时最大约消耗 215mA 电流。
  • 处理器核心:32 位 Tensilica Xtensa LX106,时钟频率 80~160MHz(通常都是80MHz)。
  • WiFi无线网络:AP(无线接入点)、STA(无线终端)和 AP-STA(接入点以及终端)三种工作模式。
  • 内存:
    • 96KB 数据内存(DRAM)。
    • 64KB 命令内存(IRAM, Instruction RAM),用于开机启动程序(bootloader)。
    • 没有内置Flash(闪存),通过 SPI 接口连接外部Flash,最大可支持16MB。

​ 依照 ESP8266 模块的固件而定,它大致可分成两大应用类型:

  • 充当微控制板(如:Arduino 或 Espruino)的串口转 WiFi 网络的桥接器;
  • 充当独立微控制板,可以使用 C 或 C++ 语言(包含 Arduino 的语法版本)、JavaScript、Lua、MicroPython、BASCI 语言来操控它。

2.2 NodeMCU 微控制板

​ 像 2.1 中这些不具备电源电路和 USB 转串口芯片的 ESP8266 模块,通常称为通用型 ESP8266 模块(Generic ESP8266 Module)。有些厂商为通用型模块加上电源和 USB 串口芯片,并引出通用模块的引脚,甚至预先烧入定制的固件,变成更适合开发实验的控制板。

NodeMCU 是中国台湾乐鑫公司开发的一款基于 ESP8266 模块的开发板,出货时已预先烧录定制的开源固件,让开发者通过 Lua 语言开发 IoT 应用。由于 NodeMCU 控制板包含 USB 转 TTL 串口、3.3V 电压转换电路和两个按键,而且引脚宽度和面包板兼容、价格低廉,很适合当作 ESP8266 的实验板。我们可自行烧写其他固件,不一定要运行 Lua 程序。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

3 使用 Arduino 开发 NodeMCU

​ Arduino 是一家公司,一个项目,一种硬件,也是一个用户社区。通常,我们在 Arduino 的跨平台 IDE(集成开发环境)上编写代码(Arduino 中通常称为“草图”),然后将编译的代码上传(烧录)到开发板的微控制器中。代码是用 Arduino 语言编写的,该语言与 C 或 C++ 相似,但另外引入了硬件控制特性。

以前 Arduino IDE 只支持自家的 Arduino UNO 开发板,但从 1.6.4 版开始,Arduino IDE 添加“Boards Manager(板子管理员)”,相当于IDE 的插件,让原本不属于 Arduino 家族的微控制板(如:ESP8266),也能通过 Arduino 语言和开发工具来编写、编译和上传代码。程序开发的基本概念、流程和语法,都跟 Arduino UNO 一样。

​ 一群 ESP8266 爱好者编写了 ESP8266 版的管理器和库,源代码和相关说明见github.com/esp8266/Ard… 中使用)。

3.1 Arduino IDE 准备

​ Arduino IDE 支持 Windows、Linux、MacOS 系统的多个版本,按需下载自己所需版本。下文均以 MacOS 版界面介绍。

​ 下载地址:www.arduino.cc/en/software

JavaScript 只能写 Web?JavaScript in IoT 应用入门

​ Arduino IDE 可免费使用,可点击“JUST DOWNLOAD”下载安装。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

3.2 配置 ESP8266 环境

  1. 选择“Arduino IDE→首选项”,在“其他开发板管理器地址”栏(编辑器语言选择中文简体)中输入 ESP8266 开发板管理器地址:

arduino.esp8266.com/stable/pack…

JavaScript 只能写 Web?JavaScript in IoT 应用入门
  1. 单击“确定”按钮之后,选择“工具→开发板→开发板管理器”,打开“开发板管理器面板”并搜索"esp8266",安装。

    JavaScript 只能写 Web?JavaScript in IoT 应用入门

    安装完毕后,“工具→开发板”命令下面将出现新 的 ESP8266 相关选项。

3.3 为 NodeMCU 烧录 Arduino 程序

​ 在软件传统中,学习新语言或新系统时,Hello World 程序是常见的第一个练习。通常这些程序做的事情很简单,比如在屏幕上输出“Hello, World"。基本的 LED 技巧就是硬件编程里的 Hello World。让 LED 灯点亮和闪烁是进入电子领域的初次尝试。

​ NodeMCU 控制板有两个 LED,一个是 ESP8266 模块内置的 LED,与 GPIO2 脚相连;另一个是 NodeMCU 板外置的 LED,与GPIO16 相连。本例将控制 GPIO2 脚的 LED。

​ 将 NodeMCU 与电脑通过 USB 相连。在“工具→开发板”,选择合适的 ESP8266 开发板,此处选择“Generic ESP8266 Module”。在“工具→端口”,选择“/dev/tty.xxxxx”。其余选项采用默认即可。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

端口显示:

  • Windows,端口显示为“COMx”。
  • MAC,端口显示为“/dev/tty.xxxxx”。
  • Linux,端口显示为“/dev/ttyUSBx”。

如果仅显示蓝牙接口或无法显示上述合适接口,请确认所使用 USB 线是否支持数据传输。

​ 接着选择“文件→示例→01.Basics→Blink”,将生成的 LED 闪烁示例代码。

​ Arduino 代码主要分为两部分:

  • 设置(setup):该代码在程序执行开始时执行一次。
  • 循环(loop):在设置完成后,循环中的代码会一遍遍的被执行,直到开发板断电或重置。
// LED_BUILTIN 默认为 2

void setup() {
  pinMode(LED_BUILTIN, OUTPUT); // 将引脚 2 配置为输出引脚
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // 将引脚 2 设置为 HIGH (高电平)以点亮 LED
  delay(1000);                      // 等待 1000ms
  digitalWrite(LED_BUILTIN, LOW);   // 将引脚 2 设置为 LOW (低电平)以熄灭 LED
  delay(1000);                      // 等待 1000ms
}

​ 点击“➡️”,将代码编译并上传到开发板。上传成功后,开发板 ESP8266 模块内置 LED 将开每 1000ms 闪烁一次。

JavaScript 只能写 Web?JavaScript in IoT 应用入门 JavaScript 只能写 Web?JavaScript in IoT 应用入门

4 使用 JavaScript 控制 NodeMCU

​ 使用 JavaScript 和宿主机-客户端配置与 NodeMCU 一起工作的流程与默认的 NodeMCU 工作流程不同。在一开始,就需要上传一段代码作为开发板的固件,而不是使用 Arduino IDE 创作和重复上传代码。之后,不必再使用 Arduino IDE, 只需要编写 JavaScript 代码,并在终端通过 node 执行它。

4.1 配置 NodeMCU 客户端

​ 在 1.2.1 节提到,宿主机——客户端方法使用宿主机和客户端之间的通用 API 通信。接下来的章节,我们将使用 Firmata 协议进行 NodeMCU 客户端 与 Node 宿主机的通信。

​ Firmata 是一种通信协议,允许允许宿主机(计算机)和客户端(微控制器)以基于 MIDI 消息传递的格式来回交换消息。通常,嵌入式设备上需要运行 Firmata 程序,该程序没有特定用途,可以使嵌入式设备成为可编程的输入输出设备,将计算机的指令转化为硬件控制操作。

​ 在 Arduino IDE 中,访问“文件→示例→Firmata”子菜单,从列表中选择 “StandardFirmataWIFI”。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

为什么这么多Firmata?

Arduino IDE 中的示例中提供了丰富的 Firmata 代码选项。不同的 Firmata 代码实现了不同种类的特性,为不同的硬件或用例量身定制。例如,StandardFirmataEthernet 添加了对以太网屏蔽的支持,AnalogFirmata 尝试最大化一次通信中可以模拟输入的数量。StandardFirmataWIFI 则平衡了所有最流行的功能,并支持 WIFI 接入,这是我们要使用的.

​ 由于我们所使用的开发板具有 ESP8266 WIFI 模块功能,我们没有选择“StandardFirmataPlus”(宿主机与客户端间使用 USB 线进行数据通信),而是选择了更方便的“StandardFirmataWIFI”(宿主机与客户端间使用无线网络进行数据通信)。

​ 为此,我们需要修改示例代码,配置 ESP8266 所需连接的 WiFi 网络。在“StandardFirmataWIFI.ino”文件内,搜索“SERIAL_DEBUG”,取消注释以允许在 Arduino IDE 串行监视器中查看调试输出。在另一个文件选项卡的“wifiConfig.h”文件内,搜索“ssid[]”,将“your_network_name”修改为你的 WiFi 网络名称。搜索“wpa_passphrase”,将“your_wpa_passphrase”修改为你的 Wifi 网络密码。

​ 修改完毕,点击“➡️”,将代码编译并上传到开发板。上传完毕,点击输出栏中的“串口监视器”,可查看 ESP8266 WIFI 连接情况及 IP 地址与端口号。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

4.2 配置 Node.js 宿主机

Johnny-Five 是一个开源的、基于 Firmata 协议的物联网和机器人编程 Node.js 模块,由 Bocoup 公司开发,用于宿主机和客户端间的控制。Johnny-Five 诞生的时间比大多数用于硬件的 JavaScript 模块都要早,它提供的 API 清晰明了,成熟度高,适用微控制板广(如 Arduino、NodeMCU、Raspberry Pi 等)。

Johnny-Five 是 1986 年上映的科幻电影 Short Circuit (直译为"短路”,译作“霹雳五号”)中的机器人主角的名字(强尼五号)。电影中的机器人原本是人工智能军武,由于雷击造成短路,让它有了自我意识而开始—连串的故事。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

​ Johnny-Five程序至少包含三大要素:

  • 引用 johnny-five 库文件
  • 创建 board 对象,通过它与控制板串口相连
  • 创建连接回调函数

​ 基本程序架构如下:

const five = require('johnny-five')

const board = new five.board()

board.on('ready', () => {
  // 指挥控制板的代码
})

​ Johnny-Five 会自动查找连接在 USB 串口的微控制板,也可以通过代码明确指定串口或使用 etherport-client 库提供以太网端口连接微控制板。

4.3 用 Johnny-Five 控制 NodeMCU

​ 前面介绍了使用 Arduino 编程语言闪烁 LED 的方法,现在通过编写 JavaScript 来实现此功能。

const five = require('johnny-five') // 加载 johnny-five 模块

// 初始化一个新的 Board 对象来表示微控制器
const board = new five.board({
  port: new EtherPortClient({
    // 4.1 中获得的 ESP8266 局域网地址和端口
    host: '192.168.0.105',
    port: 3030
  }),
  repl: false // 不启用交互式命令行界面
})

// 等待微控制器触发 ready 事件
board.on('ready', () => {
  const led = new five.Led(2) // 在引脚 2 上实例化一个 LED 对象
  led.blink(1000) // 让 LED 每 1000ms 闪烁一次
})

​ 运行此段代码,在终端中看到如下所示的输出,开发板 ESP8266 模块内置 LED 将开每 1000ms 闪烁一次。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

5、案例

5.1 控制 LED 矩阵显示图像

5.1.1 案例说明

​ 使用 Johnny-five 控制 LED 矩阵模块显示自定义的图像。

5.1.2 案例材料

  • NodeMCU 开发板,一个
  • MAX7219 LED 矩阵(8×8),1 个

5.1.3 案例电路

​ MAX7219 是一种集成 LED 显示控制器的芯片,主要用于控制 LED 矩阵模块,特别是 8×8 LED 点阵。它通过 SPI 接口进行通信,支持级联连接多个芯片来控制更大规模的 LED 显示。MAX7219 具有简单的控制方式、亮度可调、低功耗等特点,广泛应用于各种嵌入式系统、DIY项目、时钟、温度计、文字和图形显示等领域。

​ LED 矩阵的外观和引脚图如下图所示。

JavaScript 只能写 Web?JavaScript in IoT 应用入门
  • VCC:Voltage at Common Collector,供电正极引脚,连接电源,提供芯片所需的电源供应。
  • GND:Ground,地引脚,连接到电源地,用于提供电路的地线。
  • DIN:数据输入引脚,通过 SPI 接口将数据输入到 MAX7219 芯片,通过该引脚发送控制命令和显示数据。
  • CS:片选引脚,通过 SPI 接口选择要操作的 MAX7219 芯片,当使用多个 MAX7219 芯片级联连接时,可以通过该引脚选择要控制的目标芯片。
  • CLK:时钟引脚,通过 SPI 接口提供时钟信号,用于同步数据的传输。

​ 请依下图组装LED 矩阵模块, 5V 电源可接在Arduino 板的5V 脚上。

​ DIN、CS、CLK 可接 NodeMCU 的任何模拟输入引脚,本例 DIN 接在 D5、CS 接在 D6、CLK 接在 D7 引脚上。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

5.1.4 案例代码

​ Johnny-Five 内置控制 LED 矩阵(Led.Matrix) 的类。Matrix 类的提供部分方法如下:

  • on() 开启 LED 矩阵。
  • off() 关闭 LED 矩阵。
  • clear() 清除矩阵画面(全部变暗)。
  • brightness(O100) 设置0100%亮度。
  • draw(字符或自定义图像) 在 LED 矩阵上显示数字、英文大/小写字母或特殊符号等字符,或者显示自定义图像。

​ 自定义图像使用数组定义,里面的数据通常用二进制字符串,或者十六进制数字。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

​ 在 LED 矩阵模块上显示自定义图像的示例程序如下。

const five = require('johnny-five')
const { EtherPortClient } = require('etherport-client')

const board = new five.Board({
  port: new EtherPortClient({
    host: '192.168.0.105',
    port: 3030,
  }),
  repl: false
})

board.on('ready', () => {
  const pict = [
    '00000000',
    '00100000',
    '00101000',
    '10100101',
    '10100001',
    '00100010',
    '00111110',
    '00000000'
  ]
  const matrix = new five.Led.Matrix({
    pins: {
      data: 14, // 数据脚
      cs: 12, // 芯片选择脚
      clock: 13, // 时钟脚
    }
  })
  
  matrix.on(); // 开启LED 矩阵模块
  matrix.draw(pict); // 显示自定义图像
})

5.1.5 案例结果

​ 在终端中运行程序,LED 矩阵模块将呈现自定义图像。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

5.2 检测环境温度

5.2.1 案例说明

​ 使用 Johnny-five 和温度传感器实时监测环境温度。

5.2.2 案例材料

  • NodeMCU 开发板,一个
  • 温度传感器 LM35, 一个。

5.2.3 案例电路

​ LM35 是一种模拟输出温度传感器,可以直接测量环境温度并将其转换为与摄氏温度成线性关系的电压信号。LM35 具有高精度和稳定性,温度测量范围通常为 -55°C - +150°C,工作电压为 3-5V。常见的型号和封装形式有 LM350、LM35DZ 和 LM35CZ,常用的封装是 T0-92,类似小功率晶体管,具有三个引脚。LM35 适用于各种温度测量和控制应用,例如室内温度监测、恒温控制和电子设备散热监测等。

​ 本例所使用 LM35 温度传感器已做板载,并引出全部引脚。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

​ LM35 可接 NodeMCU 的任何模拟输入引脚,本例接在 D5 引脚上。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

5.1.4 案例代码

​ Johnny-Five 内置支持温度传感器(Led.Thermometer) 的类,只需要告诉它传感器类型(支持 LM35、TMP36、DS18B20 等多种温度传感器)以及微控制器的引脚,即可接收温度值。

​ 使用温度传感器检测环境温度的示例程序如下。

const five = require('johnny-five')
const { EtherPortClient } = require('etherport-client')

const board = new five.Board({
  port: new EtherPortClient({
    host: '192.168.0.105',
    port: 3030,
  }),
  repl: false
})

board.on('ready', () => {
  const thermometer = new five.Thermometer({
    controller: 'LM35',
    pin: 14
  })

  thermometer.on('change', () => {
    console.log(thermometer.celsius)
  })
})

5.1.5 案例结果

​ 在终端中运行程序,观察温度数值变化。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

5.3 控制舵机

5.3.1 案例说明

​ 使用 Johnny-five 控制舵机

5.3.2 案例材料

  • NodeMCU 开发板,一个
  • SG90 舵机, 一个。

5.3.3 案例电路

​ 舵机是一种闭环控制设备,用于精确控制旋转角度或位置。它由电机、减速器、编码器和控制电路组成。舵机具有高精度的位置控制能力,通常可旋转180度。通过输入脉宽调制(PWM)信号控制,配备反馈系统实现闭环控制。广泛应用于机器人、遥控模型、摄像头云台等,适用于需要精确控制位置或角度的项目。本例所用 SG90 舵机是一种小型、廉价且常见的塑料舵机,功耗低,工作电压 3-7.2V,可实现约 180 度的旋转范围,具备较高的精度和扭矩(通常在1.5kg/cm到2.5kg/cm之间)。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

​ SG90 舵机红线为电源输入,棕线为电源输出,黄线为信号线。信号线可接 NodeMCU 的任何模拟输入引脚,本例接在 D5 引脚上。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

5.3.4 案例代码

​ Johnny-Five 内置支持舵机(Led.Servo) 的类,Servo 类的提供部分属性和方法如下:

  • startAt:设置初始角度

  • range:以数组数据形式设置电机的旋转角度范围,[最小值,最大值]。

  • step(角度值):设置转动角度。

  • to(角度值):转动到指定的角度。

  • min():转到最小角度。

  • max():转到最大角度。

  • center():转到中间角度。

  • sweep():角度范围内往复扫动

    控制舵机运动的示例程序如下。

const five = require('johnny-five')
const { EtherPortClient } = require('etherport-client')

const board = new five.Board({
  port: new EtherPortClient({
    host: '192.168.0.105',
    port: 3030,
  }),
  repl: false
})

board.on('ready', () => {
  const servo = new five.Servo(14)

  servo.sweep()
})

5.3.5 案例结果

​ 在终端中运行程序,观察舵机运动。

JavaScript 只能写 Web?JavaScript in IoT 应用入门

6、总结

​ 随着物联网技术的不断发展,从家庭自动化到智能工农业,JavaScript 与各类微控制器的结合为创造智能化的物联网应用提供了更多可能性。这种技术的应用潜力是无限的,只需要发挥创意和想象力,就能创造出各种智能化的物联网解决方案。

​ 不可否认,目前使用 JavaScript 开发物联网应用相较于原生语言仍有很大差距。JavaScript 语言的解释执行和 I/O 插件层的指令映射必然会造成一定的性能损失,这就使得目前 JavaScript 很难应对一些对软件系统实时性要求较高的场合,例如飞行器控制或是实时图像传输等场景,但对于实验室中以原型设计为目的的开发,JavaScript 是完全可以胜任的。