JavaScript轻应用硬件模块介绍

简介: 为了便于开发者使用底层硬件的功能,轻应用里以JSAPI的形式对底层硬件接口做了封装。主要包含uart、gpio、adc、dac、pwm、i2c、spi、timer、rtc、watch dog等。
来源 | HaaS技术社区

1、前言

关于JavaScript轻应用的文档请参考:轻应用总览

为了便于开发者使用底层硬件的功能,轻应用里以JSAPI的形式对底层硬件接口做了封装。主要包含uart、gpio、adc、dac、pwm、i2c、spi、timer、rtc、watch dog等。

2、UART - 串口

示例代码

板级配置

板级详细配置说明见:app.json - 全局配置文件说明

  1. {
  2. "io": {
  3. "serial1":{
  4. "type": "UART",
  5. "port": 2,
  6. "dataWidth": 8,
  7. "baudRate": 115200,
  8. "stopBits": 0,
  9. "flowControl": "disable",
  10. "parity": "none"
  11. }
  12. },
  13. "debugLevel": "DEBUG"
  14. }

业务脚本

  1. var uart = require( 'uart');
  2. var msgbuf = 'this is amp uart test'
  3. // uart open
  4. var serial = uart.open({
  5. id: 'serial1'
  6. });
  7. // uart write
  8. serial.write(msgbuf);
  9. // uart read
  10. var value = serial.read();
  11. console.log( 'sensor value is ' + value);
  12. // uart data event
  13. serial.on( 'data', function(data) {
  14. console.log( 'uart receive data is ' + data);
  15. });
  16. // uart close
  17. serial.close();

open(Object options)

打开串口,创建 UART 实例。

入参

Object类型,属性如下:

属性

类型

必填

描述

id

String

在app.json中定义的UART id名称

返回

  • UART 串口实例,为空代表创建失败。

UART 实例

事件:'data'

当串口接收到新数据时,会触发

'data'
事件,
'data'
事件回调函数参数:

参数

类型

必填

描述

data

ArrayBuffer

串口接收到的数据

UART.write(String|ArrayBuffer data)

发送串口数据,该函数为阻塞函数,串口发送完成后才会返回。

入参

参数

类型

必填

描述

data

String或ArrayBuffer

需要发送到串口的数据

UART.read(Number bytes)

主动读取指定bytes的串口数据。

入参

参数

类型

必填

描述

bytes

Number

需要读取的字节个数

返回值

  • 读取到的串口数据,ArrayBuffer类型,如果没有数据,则返回空数组。

UART.close()

关闭串口实例。

UART.on(String event, Function cb)

监听串口事件。

3、GPIO

示例代码

板级配置

板级详细配置说明见:app.json - 全局配置文件说明

  1. {
  2. "io": {
  3. "led": {
  4. "type": "GPIO",
  5. "port": 23,
  6. "dir": "output",
  7. "pull": "pullup"
  8. },
  9. "key": {
  10. "type": "GPIO",
  11. "port": 25,
  12. "dir": "input",
  13. "pull": "pullup",
  14. "intMode": "rising"
  15. }
  16. },
  17. "debugLevel": "DEBUG"
  18. }

业务脚本

  1. var gpio = require('gpio');
  2. // led
  3. var led = gpio.open({
  4. id: 'led'
  5. });
  6. // set led gpio level
  7. led.writeValue(1);
  8. led.readValue();
  9. led.writeValue(0);
  10. led.readValue();
  11. // led toggle
  12. led.toggle();
  13. // key
  14. var key = gpio.open({
  15. id: 'key'
  16. });
  17. //key trigger callback
  18. key.onIRQ({
  19. trigger: 'rising',
  20. cb: function() {
  21. console.log('key pressed\n');
  22. }
  23. });
  24. // release led&key
  25. led.close();
  26. key.close();

open(Object options)

打开GPIO接口,创建 GPIO 实例。

入参

Object类型,属性如下:

属性

类型

必填

描述

id

String

在app.json中定义的GPIO id名称

返回

GPIO 实例

GPIO.writeValue(Number level)

设置GPIO电平值,GPIO引脚为输出模式时可用。

入参

属性

类型

必填

描述

level

Number

电平值,1(高电平) 或者 0(低电平)

GPIO.toggle()

切换GPIO的电平,当前GPIO电平为低电平时设置为高电平,当前GPIO电平为高电平时设置为低电平。

GPIO.onIRQ(Function cb)

开启引脚中断触发,引脚为输入模式时可用。

入参

属性

类型

必填

描述

cb

Function

引脚中断触发回调函数

GPIO.readValue()

读取GPIO电平值,输入模式和输出模式时均可用。

返回值

  • Number类型,电平值,1(高电平) 或者 0(低电平)。

GPIO.close()

关闭GPIO实例。

4、ADC

示例代码

板级配置

板级详细配置说明见:app.json - 全局配置文件说明

  1. {
  2. "io": {
  3. "battery": {
  4. "type": "ADC",
  5. "port": 1,
  6. "sampling": 12000000
  7. }
  8. },
  9. "debugLevel": "DEBUG"
  10. }

业务脚本

  1. var adc = require('adc');
  2. // voltage
  3. var vol = adc.open({
  4. id: 'battery'
  5. });
  6. // read voltage
  7. var value = vol.readValue();
  8. console.log('voltage value is ' + value);
  9. vol.close();

open(Object options)

打开ADC,创建 ADC 实例。

入参

属性

类型

必填

描述

id

String

在app.json中定义的ADC id名称。

返回

  • ADC 实例。

ADC 实例

ADC.readValue()

读取ADC数据。

返回值

  • Number类型,读取到的ADC数据。

ADC.close()

关闭ADC实例。

5、DAC

示例代码

板级配置

板级详细配置说明见:app.json - 全局配置文件说明

  1. {
  2. "io": {
  3. "voltage": {
  4. "type": "DAC",
  5. "port": 1
  6. }
  7. },
  8. "debugLevel": "DEBUG"
  9. }

业务脚本

  1. var dac = require('dac');
  2. // led
  3. var voltage = dac.open({
  4. id: 'voltage'
  5. });
  6. voltage.writeValue(65536 / 2);
  7. var value = voltage.readValue();
  8. console.log('voltage value is ' + value);
  9. voltage.close();

open(Object options)

打开DAC,创建 DAC 实例,默认启动DAC电压输出。

入参

Object类型,属性如下:

属性

类型

必填

描述

id

String

在app.json中定义的DAC id名称。

返回

  • DAC 实例。

DAC 实例

DAC.readValue()

读取DAC输出值。

返回值

  • Number类型,DAC输出值。

DAC.writeValue(Number value)

设置DAC输出值。

入参

属性

类型

必填

描述

value

Number

需要设置的DAC值

DAC.close()

关闭DAC实例。关闭DAC实例后,也会停止DAC电压输出。

6、PWM

示例代码

板级配置

板级详细配置说明见:app.json - 全局配置文件说明

  1. {
  2. "io": {
  3. "motor":{
  4. "type":"PWM",
  5. "port":4
  6. }
  7. },
  8. "debugLevel": "DEBUG"
  9. }

业务脚本

  1. var pwm = require('pwm');
  2. // motor start
  3. var motor = pwm.open({
  4. id: 'motor'
  5. });
  6. // get motor option
  7. var freq = motor.get().freq;
  8. var duty = motor.get().duty;
  9. console.log('pwm config freq is ' + freq + ' duty is ' + duty);
  10. // set motor option
  11. motor.set(0.5, 500000);
  12. // motor stop
  13. motor.close();

open(Object options)

打开PWM,创建 PWM 实例。

入参

属性

类型

必填

描述

id

String

在app.json中定义的PWM id名称。

返回

  • PWM 实例。

PWM 实例

PWM.set(Number duty, Number freq)

设置PWM参数,同时会启动PWM输出。

入参

属性

类型

描述

duty

Number

设置PWM占空比,范围在0~100,单位是百分比

freq

Number

设置PWM的频率,单位是HZ

PWM.get()

获取PWM参数。

返回值

Object类型,详细的属性为:

属性

类型

描述

duty

Number

PWM占空比。

freq

Number

PWM的频率。

PWM.close()

关闭PWM实例,同时也会停止PWM输出。

7、I2C

示例代码

板级配置

板级详细配置说明见:app.json - 全局配置文件说明

  1. {
  2. "io": {
  3. "i2c1":{
  4. "type":"I2C",
  5. "port":0,
  6. "mode":"slave",
  7. "addrWidth":7,
  8. "devAddr":27,
  9. "freq":400000
  10. }
  11. },
  12. "debugLevel": "DEBUG"
  13. }

业务脚本

  1. var i2c = require('i2c');
  2. var memaddr = 0x18;
  3. var msgbuf = [0x10, 0xee];
  4. // sensor
  5. var sensor = i2c.open({
  6. id: 'i2c1'
  7. });
  8. // sensor write
  9. sensor.write(msgbuf);
  10. var value = sensor.read(2);
  11. console.log('sensor value is ' + value);
  12. // sensor write to memory address
  13. sensor.writeMem(memaddr, msgbuf);
  14. // sensor read from memory address
  15. var vol = sensor.readMem(memaddr, 2);
  16. console.log('sensor read mem vol is ' + vol);
  17. sensor.close();

open(Object options)

打开I2C,创建 I2C 实例。

入参

属性

类型

必填

描述

id

String

指定要打开的I2C端口。

返回

  • I2C 实例。

I2C 实例

I2C.write(String|ArrayBuffer data)

发送数据,该函数为阻塞函数,I2C发送完成后才会返回。

入参

属性

类型

必填

描述

data

String或ArrayBuffer

要发送的数据

I2C.writeMem(ArrayBuffer memaddr, String|ArrayBuffer data)

向寄存器地址

memaddr
发送数据,该函数为阻塞函数,I2C发送完成后才会返回。

入参

属性

类型

必填

描述

memaddr

Number

寄存器地址memaddr

data

String或ArrayBuffer

要发送的数据

I2C.read(Number bytes)

主动读取指定

bytes
的I2C数据。该函数为阻塞函数,会一直等待读取指定
bytes
的数据。

入参

属性

类型

必填

描述

bytes

Number

需要读取的字节个数

返回值

  • ArrayBuffer类型,读取到的I2C数据。

I2C.readMem(String|ArrayBuffer memaddr, Number bytes)

主动向寄存器地址

memaddr
读取指定
bytes
的I2C数据。该函数为阻塞函数,会一直等待读取指定
bytes
的数据。

入参

属性

类型

必填

描述

memaddr

Number

寄存器地址memaddr

bytes

Number

需要读取的字节个数

返回值

  • 读取到的I2C数据,ArrayBuffer类型。

I2C.close()

关闭I2C实例。

8、SPI

示例代码

板级配置

板级详细配置说明见:app.json - 全局配置文件说明

  1. {
  2. "io": {
  3. "sensor1":{
  4. "type":"SPI",
  5. "port":1,
  6. "mode":"slave",
  7. "freq":3250000
  8. }
  9. },
  10. "debugLevel": "DEBUG"
  11. }

业务脚本

  1. var spi = require('spi');
  2. var msgbuf = [0x10, 0xee];
  3. // spi sensor
  4. var sensor = spi.open({
  5. id: 'sensor1'
  6. });
  7. sensor.write(msgbuf);
  8. var value = sensor.read(2);
  9. console.log('sensor value is ' + value);
  10. sensor.close();

open(Object options)

打开SPI,创建 SPI 实例。

入参

属性

类型

必填

描述

id

String

指定要打开的SPI端口

返回

  • SPI 实例。

SPI 实例

SPI.write(String|ArrayBuffer data)

通过SPI发送数据,该函数为阻塞函数,SPI发送完成后才会返回。

入参

属性

类型

必填

描述

data

String | ArrayBuffer

需要发送的数据

SPI.read(Number bytes)

读取指定bytes的SPI数据,该函数为阻塞函数,读取到指定bytes的数据后才会返回。

入参

属性

类型

必填

描述

bytes

Number

指定需要读取的字节个数

返回值

  • ArrayBuffer类型,读取到的SPI数据。

SPI.close()

关闭SPI实例。

9、timer

示例代码

板级配置

板级详细配置说明见:app.json - 全局配置文件说明

  1. {
  2. "io": {
  3. "timer1": {
  4. "type": "TIMER",
  5. "port": 1
  6. }
  7. },
  8. "debugLevel": "DEBUG"
  9. }

业务脚本

  1. var timer = require('timer');
  2. var timer1 = timer.open({
  3. id: 'timer1'
  4. });
  5. // set timer1 timeout
  6. timer1.setTimeout(function() {
  7. console.log('timer1 timeout');
  8. }, 1000);
  9. // timer1.clearTimeout();
  10. // set timer1 interval
  11. timer1.setInterval(function() {
  12. console.log('timer1 interval');
  13. }, 1000);
  14. // timer1.clearInterval();
  15. timer1.close();

open(Object options)

打开硬件TIMER,创建 TIMER 实例。

入参

Object类型,属性如下:

属性

类型

必填

描述

id

String

在app.json中定义的TIMER id名称

返回

TIMER 实例

硬件TIMER可以设置成超时(setTimeout())和周期(setInterval())2种状态,但是同一时刻只能有一个状态。

TIMER.setTimeout(Function cb, Number timeout)

在指定的毫秒数后调用回调函数。

入参

属性

类型

必填

描述

cb

Function

定时器超时回调函数

timeout

Number

设置timer的定时时间

TIMER.clearTimeout()

停止执行

setTimeout()

TIMER.setInterval(Function cb, Number time)

按照指定的周期(以毫秒计)来调用回调函数。

入参

参数option为Object类型,详细的属性为:

属性

类型

必填

描述

cb

Function

定时器周期回调函数

time

Number

设置timer的周期时间

TIMER.clearInterval()

停止执行

setInterval()

TIMER.close()

关闭TIMER实例。

10、RTC

示例代码

  1. var rtc = require('rtc');
  2. // start rtc
  3. rtc.start();
  4. // set rtc time
  5. rtc.setTime(new Date());
  6. // get rtc time
  7. var current_time = rtc.getTime();
  8. console.log('current time is ' + current_time);
  9. rtc.close();

方法

rtc.start()

启动RTC。

rtc.setTime(Date time)

设置RTC时间。

入参

  • 需要设置的时间,Date 类型。

rtc.getTime()

获取RTC当前时间。

返回值

  • 返回当前的RTC时间,Date 类型。

rtc.close()

关闭RTC。

11、watchdog

示例代码

业务脚本

  1. var wdg = require('wdg');
  2. //start wdg
  3. wdg.start(2000);
  4. // feed wdg
  5. wdg.feed();
  6. // stop wdg
  7. wdg.stop();

方法

wdg.feed()

喂狗。

wdg.stop()

停止WDG定时器。

wdg.start(Number timeout)

启动WDG定时器。如果timeout之后没有进行喂狗操作,会导致系统重启。

入参

参数

类型

是否必须

说明

timeout

Number

WDG超时时间,单位毫秒

如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号

更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/

相关文章
|
8天前
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
|
11天前
|
JavaScript 前端开发
js变量的作用域、作用域链、数据类型和转换应用案例
【4月更文挑战第27天】JavaScript 中变量有全局和局部作用域,全局变量在所有地方可访问,局部变量只限其定义的代码块。作用域链允许变量在当前块未定义时向上搜索父级作用域。语言支持多种数据类型,如字符串、数字、布尔值,可通过 `typeof` 检查类型。转换数据类型用 `parseInt` 或 `parseFloat`,将字符串转为数值。
17 1
|
2天前
|
数据采集 JavaScript 数据可视化
Node.js爬虫在租房信息监测与分析中的应用
Node.js爬虫在租房信息监测与分析中的应用
|
8天前
|
开发框架 JavaScript 前端开发
【JavaScript 与 TypeScript 技术专栏】TypeScript 在 Web 开发中的前沿应用
【4月更文挑战第30天】TypeScript在Web开发中日益重要,以其强大的类型系统提升代码质量,支持组件化开发,与React、Vue、Angular等框架良好集成。在大型项目管理中,TypeScript助于代码组织和优化,提高团队协作效率。此外,它提升开发体验,提供智能提示和错误检测。众多成功案例证明其前沿应用,未来将在Web开发领域持续发挥关键作用。
|
8天前
|
前端开发 JavaScript 网络协议
【JavaScript技术专栏】WebSockets在JavaScript中的应用
【4月更文挑战第30天】WebSocket是为解决HTTP协议在实时通信上的局限而诞生的技术,提供全双工、持久连接的通信方式,适合在线聊天、实时游戏等场景。JavaScript中的WebSocket API使浏览器与服务器能建立持久连接,通过事件处理连接、发送/接收数据及错误。相较于AJAX轮询和长轮询,WebSockets更高效、实时,是现代Web实时通信的优选。
|
8天前
|
移动开发 JavaScript 前端开发
【JavaScript技术专栏】Web Worker在JavaScript中的应用
【4月更文挑战第30天】HTML5的Web Worker API解决了JavaScript单线程性能瓶颈问题,允许在后台线程运行JS代码。本文介绍了Web Worker的基本概念、类型、用法和应用场景,如复杂计算、图像处理和数据同步。通过实例展示了搜索建议、游戏开发和实时数据分析等应用,并提醒注意其无法直接访问DOM、需消息传递通信以及移动端资源管理。Web Worker为前端开发提供了多线程能力,提升了Web应用性能和用户体验。
|
8天前
|
消息中间件 监控 JavaScript
Node.js中的进程管理:child_process模块与进程管理
【4月更文挑战第30天】Node.js的`child_process`模块用于创建子进程,支持执行系统命令、运行脚本和进程间通信。主要方法包括:`exec`(执行命令,适合简单任务)、`execFile`(安全执行文件)、`spawn`(实时通信,处理大量数据)和`fork`(创建Node.js子进程,支持IPC)。有效的进程管理策略涉及限制并发进程、处理错误和退出事件、使用流通信、谨慎使用IPC以及监控和日志记录,以确保应用的稳定性和性能。
|
8天前
|
JSON 前端开发 JavaScript
使用JavaScript制作一个简单的天气应用
使用JavaScript制作一个简单的天气应用
|
9天前
|
缓存 JavaScript 前端开发
Node.js的模块系统:CommonJS模块系统的使用
【4月更文挑战第29天】Node.js采用CommonJS作为模块系统,每个文件视为独立模块,通过`module.exports`导出和`require`引入实现依赖。模块有独立作用域,保证封装性,防止命名冲突。引入的模块会被缓存,提高加载效率并确保一致性。利用CommonJS,开发者能编写更模块化、可维护的代码。
|
11天前
|
JavaScript 前端开发
js的let、const、var的区别以及应用案例
【4月更文挑战第27天】ES6 中,`let` 和 `const` 是新增的变量声明关键字,与 `var` 存在显著差异。`let` 允许重新赋值,而 `const` 不可,且两者都具有块级作用域。`var` 拥有函数级作用域,并可在函数内任意位置访问。`let` 和 `const` 声明时必须初始化,而 `var` 不需。根据需求选择使用:局部作用域用 `let`/`const`,全局或函数范围用 `var`,不可变值用 `const`。
20 2