案例介绍
基于HaaS EDU K1开发,通过I2C采集温湿度的数据,并且通过IoT组件上云的JavaScript轻应用案例。
简介
本案例主要分为三个部分:
- 环境准备
- 温湿度数据采集
- 数据上云
环境准备
1.烧写支持轻应用的HaaS Edu K1开发板
2.下载VScode软件,并且安装HaaS Studio插件
固件烧写
案例是基于JavaScript轻应用,需要能运行javascript代码的硬件环境,需要保证HaaS Edu K1烧写了支持JavaScript轻应用固件,操作步骤如下。
创建项目
?等待下载
创建成功,跳转到新项目。
?
编译烧写
以HaaS EDU K1为例
?
编译
编译成功
?
烧写
选择串口
烧写中
? 烧写成功?
温湿度采集
说明:案例开发基于HaaS Edu K1单板自带温湿度模块Si7006,具体参考硬件资源
代码编写
// app.js
import * as i2c from 'i2c';
// 初始化对应的I2C
let sensor = i2c.open({
?id: 'sensor',
?success: function () {
? ?// 初始化成功
? ?console.log('open i2c success')
?},
?fail: function () {
? ?// 初始化失败
? ?console.log('open i2c failed')
?}
});
setInterval(function () {
?// 切换成温度模式
?sensor.write([0xF3]);
?sleepMs(30)
?// 代码功能:原始数据格式为[142,124]转成0x8e7c,再解析成数值36476
?var tempData = Number('0x' + sensor.read(2).map((i) => ((i < 10 ? ?'0': '') + i.toString(16))).toString().replace(/,/g, ''));
?// 温度公式,可参考Si7006的datasheet
?var temp = ((175.72 * tempData) / 65536 - 46.85).toFixed(2);
?console.log('temp data is ' + temp);
?sleepMs(30);
?// 切换成湿度模式
?sensor.write([0xF5]);
?sleepMs(30);
?// 代码功能:原始数据格式为[142,124]转成0x8e7c,再解析成数值36476
?var humiData = Number('0x' + sensor.read(2).map((i) => ((i < 10 ? ?'0': '') + i.toString(16))).toString().replace(/,/g, ''));
?// 湿度公式,可参考Si7006的datasheet
?var humi = ((125 * humiData) / 65536 - 6).toFixed(2);
?console.log('humi data is ' + humi);
}, 1000);
// app.json
{
? ?"version": "1.0.0",
? ?"io": {
? ? ? ?"sensor": {
? ? ? ? ? ?"type": "I2C",
? ? ? ? ? ?"port": 1,
? ? ? ? ? ?"addrWidth": 7,
? ? ? ? ? ?"freq": 400000,
? ? ? ? ? ?"mode": "master",
? ? ? ? ? ?"devAddr": 64
? ? ? ?}
? ?},
? ?"debugLevel": "DEBUG"
}
数据上云
上云分两部分展开,一部分是云端配置,一部分是代码编写。
说明:使用netmgr组件连接网络,再通过iot将采集到的数据上传云端。
云端配置
?
2.创建产品
?
3.创建产品配置
?
4.查看产品详情
?
5.定义物模型
(1)创建湿度模型
?
(2)创建温度模型
?
6.创建设备
?
7.获取登录信息
说明:获取productKey, deviceName, deviceSecret填入代码中
?
代码编写
// app.js
import * as i2c from 'i2c';
import * as netmgr from 'netmgr';
import * as iot from 'iot';
let sensor = i2c.open({
?id: 'sensor',
?success: function () {
? ?console.log('open i2c success')
?},
?fail: function () {
? ?console.log('open i2c failed')
?}
});
function uploadData(iotdev) {
?// 获取云端下发的消息
?iotdev.onService(function(service) {
? ?console.log('received cloud service id ' + service.service_id);
? ?console.log('received cloud service param ?' + service.params);
? ?console.log('received cloud service param len ?' + service.params_len);
?});
?// 云端收到上报下发的消息
?iotdev.onProps(function(properity) {
? ?console.log('received cloud properity param ' + properity.params);
? ?console.log('received cloud properity param len ' + properity.params_len);
?});
?// 每一秒钟上报温湿度数据
?setInterval(function () {
? ?sensor.write([0xF3]);
? ?sleepMs(30)
? ?// 代码功能:原始数据格式为[142,124]转成0x8e7c,再解析成数值36476
? ?var tempData = Number('0x' + sensor.read(2).map((i) => ((i < 16 ? ?'0': '') + i.toString(16))).toString().replace(/,/g, ''));
? ?console.log('tempData:', tempData);
? ?var temp = ((175.72 * tempData) / 65536 - 46.85);
? ?console.log('temp data is ' + temp);
? ?sleepMs(30);
? ?sensor.write([0xF5]);
? ?sleepMs(30);
? ?// 代码功能:原始数据格式为[142,124]转成0x8e7c,再解析成数值36476
? ?var humiData = Number('0x' + sensor.read(2).map((i) => ((i < 16 ? ?'0': '') + i.toString(16))).toString().replace(/,/g, ''));
? ?var humi = ((125 * humiData) / 65536 - 6);;
? ?console.log('humi data is ' + humi);
? ?// 上报数据到云端
? ?iotdev.postProps(
? ? ? ?JSON.stringify({
? ? ? ? ? ?Humidity: humi,
? ? ? ? ? ?Temperature: temp,
? ? ? ?})
? ?);
?}, 1000);
}
function iotDeviceCreate() {
?const productkey = 'xxxxxx'; ? ? //请输入您的pk
?const devicename = 'xxxxxx'; ? ?//请输入您的dn
?const devicesecret = 'xxxxxx'; ? //请输入您的ds
?// 初始化IoT连接
?iotdev = iot.device({
? ? ?productKey: productkey,
? ? ?deviceName: devicename,
? ? ?deviceSecret: devicesecret
?});
?// IoT连接成功
?iotdev.on('connect', function () {
? ? ?console.log('success connect to aliyun iot server');
? ? ?// 上报数据
? ? ?uploadData(iotdev);
?});
?// IoT重新连接
?iotdev.on('reconnect', function () {
? ? ?console.log('success reconnect to aliyun iot server');
?});
?// IoT断开连接
?iotdev.on('disconnect', function () {
? ? ?console.log('aliyun iot server disconnected');
?});
}
// 初始化网络,基于wifi的连接
var network = netmgr.openNetMgrClient({
?name: '/dev/wifi0'
});
// 连接网络
network.connect({
?ssid: 'xxxxx', ? ? ? ? ? ? //请替换为自己的热点ssid
?password: 'xxxxx' ? ? ?//请替换为自己热点的密码
});
// 连接失败的监听
network.on('error', function () {
?console.log('error ...');
});
// 连接成功的监听
network.on('connect', function () {
?console.log('net connect success');
?// 连接成功后建立IoT连接
?iotDeviceCreate();
});
// app.json
{
? ?"version": "1.0.0",
? ?"io": {
? ? ? ?"sensor": {
? ? ? ? ? ?"type": "I2C",
? ? ? ? ? ?"port": 1,
? ? ? ? ? ?"addrWidth": 7,
? ? ? ? ? ?"freq": 400000,
? ? ? ? ? ?"mode": "master",
? ? ? ? ? ?"devAddr": 64
? ? ? ?}
? ?},
? ?"debugLevel": "DEBUG"
}
|