“物联网开发实战”学习笔记-(三)根据光线调节亮度

让智能电灯可以基于环境的明暗来自动地打开和关闭。可以分为两个阶段,第一阶段是打造传感器设备来感知光照的强弱,判断出环境的明暗状态,第二阶段是创建一个场景联动,根据传感器的数值来控制智能电灯的状态。

1.通信技术-选择 BLE 低功耗蓝牙技术

因为光照传感器设备的部署位置比较灵活,不太可能像智能电灯一样连接房间里的电源线,所以我们要用一种比 Wi-Fi 功耗更低的通信技术。
不过在正式开发之前,还得补充说明一些 BLE 的相关知识。
BLE 设备可以在 4 种模式下工作:
1.广播模式),这里特指单纯的广播模式。这种模式下设备不可以被连接,只能够以一定的时间间隔把数据广播出来,供其他设备使用,比如手机扫描处理。蓝牙 Beacon 设备就是工作在这种模式。
2.从机模式,这种模式下设备仍然可以广播数据,同时也可以被连接。建立连接后,双方可以进行双向通信。比如你用手机连接一个具有蓝牙功能的体温计,这时体温计就是从机(Peripheral)。
3.主机模式,这种模式下设备不进行广播,但是可以扫描周围的蓝牙广播包,发现其他设备,然后主动对这些设备发起连接。还是刚才那个例子,主动连接蓝牙体温计的手机就是主机(Central)角色。
4.观察者模式,这种模式下设备像主机模式一样,也不进行广播,而是扫描周围的蓝牙广播包,但是不同的地方是,它不会与从机设备建立连接。一般收集蓝牙设备广播包的网关就是在这种模式下工作的,它会将收集的广播数据通过网线、Wi-Fi 或者 4G 等蜂窝网络上传到云平台。

这里我们用的蓝牙可以定义设备在广播模式下工作。

2.选择开发板- ESP32 芯片的 NodeMCU 开发板

因为 NodeMCU 是基于 ESP8266 芯片的,这款芯片并不支持低功耗蓝牙。在市场上还有一款基于 ESP32 芯片的 NodeMCU 开发板。MicroPython 也支持 ESP32 芯片,这样我们就可以继续使用 Python 语言来开发了。
最重要的是也不贵,某多上买一块也就是二十来块

准备 MicroPython 环境

接下来就要在 NodeMCU(ESP32)上安装 MicroPython 固件,准备 Python 程序的运行环境。
MicroPython 官网已经为我们准备了编译好的固件文件,这省掉了我们在电脑上进行交叉编译的工作。你可以从这个链接 链接: link.
中选择“Firmware with ESP-IDF v3.x”下面的“GENERIC”类别,直接下载最新版本的固件文件到电脑中。

然后使用一根 USB 数据线,将 NodeMCU 开发板和电脑连接起来。我们使用 esptool 工具把这个固件烧录到 NodeMCU 开发板上。先在电脑终端上输入下面的命令,清空一下 NodeMCU 的 Flash 存储芯片。

esptool.py --chip esp32 --port /dev/cu.usbserial-0001 erase_flash

可以从命令里看到,和之前智能电灯用的命令相比,这里增加了芯片信息“esp32”。另外,“–port”后面的串口设备名称,需要你替换为自己电脑上对应的名称。
成功擦除 Flash 之后,就执行下面的命令,将固件写入 Flash 芯片。

esptool.py --chip esp32 --port /dev/cu.usbserial-0001 --baud 460800 write_flash -z 0x1000 esp32-idf3-20200902-v1.13.bin

这时,我们使用电脑上的终端模拟器软件,比如 SecureCRT,通过串口协议连接上开发板,注意波特率(Baud rate)设置为 115200。
然后你应该就能看到下图所示的内容,并且可以进行交互。

4.搭建光照传感器硬件电路

现在,我们开始基于 NodeMCU 搭建光照传感器的硬件电路。
首先,我们要准备好实验的硬件:
NodeMCU(ESP32)开发板一个(二十多)
光照传感器模块一个(几块钱)
杜邦线 / 跳线若干个(几块钱一大把)
面包板一个(7块钱,物联网必备工具)
然后,你可以按照我画的连线图来搭建出自己的电路。

这里说明一下,在我的电路图中,光照传感器模块从左到右,管脚分别是光强度模拟信号输出管脚、电源地 GND 和电源正 VCC 管脚。你需要根据自己的传感器模块调整具体的连线。
课程选择的是基于 PT550 环保型光敏二极管的光照传感器元器件,它的灵敏度更高,测量范围是 0Lux~6000Lux。
Lux(勒克斯)是光照强度的单位,它和另一个概念 Lumens(流明)是不同的。Lumens 是指一个光源(比如电灯、投影仪)发出的光能力的总量,而 Lux 是指空间内一个位置接收到的光照的强度。
这个元器件通过信号管脚输出模拟量,我们读取 NodeMCU ESP32 的 ADC 模数转换器(ADC0,对应 GPIO36)的数值,就可以得到光照强度。这个数值越大,表示光照强度越大。
因为 ADC 支持的最大位数是 12bit,所以这个数值范围是 0~4095 之间。这里我们粗略地按照线性关系做一个转换。具体计算过程,你可以参考下面的代码:

from machine import ADC
from machine import Pinclass LightSensor():def __init__(self, pin):self.light = ADC(Pin(pin))def value(self):value = self.light.read()print("Light ADC value:",value)return int(value/4095*6000)

5.编写蓝牙程序

NodeMCU ESP32 的固件已经集成了 BLE 的功能,我们可以直接在这个基础上进行软件的开发。这里我们需要给广播包数据定义一定的格式,让其他设备可以顺利地解析使用扫描到的数据。
我们可以使用小米制定的MiBeacon蓝牙协议。

MiBeacon 蓝牙协议的广播包格式是基于 BLE 的 GAP制定的。GAP 控制了蓝牙的广播和连接,也就是控制了设备如何被发现,以及如何交互。
具体来说,GAP 定义了两种方式来让设备广播数据:
一个是广播数据,这个是必须的,数据长度是 31 个字节;
另一个是扫描回复数据,它基于蓝牙主机设备(比如手机)发出的扫描请求来回复一些额外的信息。数据长度和广播数据一样。

所以,只要含有以下指定信息的广播报文,就可以认为是符合 MiBeacon 蓝牙协议的。
Advertising Data 中 Service Data (0x16) 含有 Mi Service UUID 的广播包,UUID 是 0xFE95。
Scan Response 中 Manufacturer Specific Data (0xFF) 含有小米公司识别码的广播包,识别码 ID 是 0x038F。
其中,无论是在 Advertising Data 中,还是 Scan Response 中,均采用统一格式定义。
具体的广播报文格式定义,你可以参考下面的表格。

因为我们要为光照传感器增加广播光照强度数据的能力,所以主要关注Object 的定义。Object 分为属性和事件两种,具体定义了设备数据的含义,比如体温计的温度、土壤的湿度等,数据格式如下表所示:

按照 MiBeacon 的定义,光照传感器的 Object ID 是 0x1007,数据长度 3 个字节,数值范围是 0~120000 之间。
这是课程代码提供参考。

#File:ble_lightsensor.py
import bluetooth
import struct
import time
from ble_advertising import advertising_payloadfrom micropython import const_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_INDICATE_DONE = const(20)_FLAG_READ = const(0x0002)
_FLAG_NOTIFY = const(0x0010)_ADV_SERVICE_DATA_UUID = 0xFE95
_SERVICE_UUID_ENV_SENSE = 0x181A
_CHAR_UUID_AMBIENT_LIGHT = ‘FEC66B35-937E-4938-9F8D-6E44BBD533EE’# Service environmental sensing
_ENV_SENSE_UUID = bluetooth.UUID(_SERVICE_UUID_ENV_SENSE)
# Characteristic ambient light density
_AMBIENT_LIGHT_CHAR = (bluetooth.UUID(_CHAR_UUID_AMBIENT_LIGHT),_FLAG_READ | _FLAG_NOTIFY ,
)
_ENV_SENSE_SERVICE = (_ENV_SENSE_UUID,(_AMBIENT_LIGHT_CHAR,),
)# https://specificationrefs.bluetooth.com/assigned-values/Appearance%20Values.pdf
_ADV_APPEARANCE_GENERIC_AMBIENT_LIGHT = const(1344)class BLELightSensor:def __init__(self, ble, name=‘Nodemcu’):self._ble = bleself._ble.active(True)self._ble.irq(self._irq)((self._handle,),) = self._ble.gatts_register_services((_ENV_SENSE_SERVICE,))self._connections = set()time.sleep_ms(500)self._payload = advertising_payload(name=name, services=[_ENV_SENSE_UUID], appearance=_ADV_APPEARANCE_GENERIC_AMBIENT_LIGHT)self._sd_adv = Noneself._advertise()def _irq(self, event, data):# Track connections so we can send notifications.if event == _IRQ_CENTRAL_CONNECT:conn_handle, _, _ = dataself._connections.add(conn_handle)elif event == _IRQ_CENTRAL_DISCONNECT:conn_handle, _, _ = dataself._connections.remove(conn_handle)# Start advertising again to allow a new connection.self._advertise()elif event == _IRQ_GATTS_INDICATE_DONE:conn_handle, value_handle, status = datadef set_light(self, light_den, notify=False):self._ble.gatts_write(self._handle, struct.pack(“!h”, int(light_den)))self._sd_adv = self.build_mi_sdadv(light_den)self._advertise()if notify:for conn_handle in self._connections:if notify:# Notify connected centrals.self._ble.gatts_notify(conn_handle, self._handle)def build_mi_sdadv(self, density):uuid = 0xFE95fc = 0x0010pid = 0x0002fcnt = 0x01mac = self._ble.config(‘mac’)objid = 0x1007objlen = 0x03objval = densityservice_data = struct.pack(“<3HB”,uuid,fc,pid,fcnt)+mac+struct.pack(“<H2BH”,objid,objlen,0,objval)print(“Service Data:”,service_data)return advertising_payload(service_data=service_data)def _advertise(self, interval_us=500000):self._ble.gap_advertise(interval_us, adv_data=self._payload)time.sleep_ms(100)print(“sd_adv”,self._sd_adv)if self._sd_adv is not None:print(“sdddd_adv”,self._sd_adv)self._ble.gap_advertise(interval_us, adv_data=self._sd_adv)

验证光照传感器

我们可以通过手机上的蓝牙调试软件来扫描周围蓝牙设备,查看设备有没有蓝牙广播包输出,能不能跟手机正常交互。常用的软件有 LightBlue、nRFConnect 和 BLEScanner,选择其中一个就行了。
比如课程选择的是 nRF Connect,打开之后,它会自动扫描周围的蓝牙广播包,将发现的设备以列表的形式展示。
如果周围蓝牙设备很多的话,为了方便发现自己的开发板,你可以点击列表上方的“No Filter”,选择将“Max.RSSI”打开。拖动其中的滑竿到合适的值,比如 -50dBm,就可以过滤掉蓝牙信号强度比较弱(一般也是比较远)的设备。

下面是手机扫描到的基于 NodeMCU 开发板的蓝牙设备。

其中名称 Nodemcu 下面的就是广播包的具体数据。
到这里,我们就完成了光照传感器设备的开发工作。

根据光照强度数据来联动控制智能电灯

对于蓝牙设备,我们需要借助网关来实现联网的目的。需要用到树莓派打造蓝牙网关,最终实现光照传感器和智能电灯的场景联动。

网关系统架构

网关的主要功能是协议转换,一方面它需要接收低功耗蓝牙技术的光照传感器的广播数据,另一方面,它需要把解析的数据上传到云平台。
具体的架构图如下所示。

南向蓝牙通信

在树莓派上进行蓝牙开发,可以使用bluepy软件包。它提供了一个 Python 语言版本的低功耗蓝牙 API 接口,而且对树莓派的适配非常好。

通过终端登录树莓派

在学习第 15 讲的时候,应该已经在树莓派上部署好了包含 Gladys Assistant 系统的 Raspbian 操作系统,现在你可以直接使用这个系统。安装软件包之前,我们在电脑终端上输入下面的命令,通过 SSH 协议登录到树莓派系统中。

$ ssh pi@gladys.local

其中,pi 就是默认的登录用户名,gladys.local 是树莓派开发板的本地域名。
当提示输入密码时,我们输入默认密码 raspberry,然后回车,就登录到了树莓派系统中。

通过图形化窗口软件登录树莓派

当然,你也可以使用提供图形化窗口的软件来登录树莓派,比如 SecureCRT,它除了支持串口协议,同时也支持 SSH 协议。你只需要新建一个连接会话,按照下图所示的内容填写就行了:

第一次登录时,SecureCRT 会弹窗提示我们查看“Host Key”,这时点击“Accept Once”即可。

然后我们输入密码“raspberry”,同时勾选“Save password”,省去以后重复输入密码的麻烦。点击“OK”后,就进入树莓派系统了。

在树莓派开发蓝牙程序

我们在树莓派的终端上输入下面命令,就可以完成 bluepy 的安装:

$ sudo apt-get install python3-pip libglib2.0-dev
$ sudo pip3 install bluepy

另外,我们还需要安装 interruptingcow 软件包。它主要是便于编写定时任务。它的安装命令是:

$ sudo pip3 install interruptingcow

具体代码如下,供参考:

#File: blescan.py
import time
from threading import Thread
from interruptingcow import timeoutfrom bluepy.btle import DefaultDelegate, Peripheral, Scanner, UUID, capitaliseName, BTLEInternalError
from bluepy.btle import BTLEDisconnectError, BTLEManagementError, BTLEGattErrorclass LightScanner():SCAN_TIMEOUT = 5def __init__(self, name):self._name = namedef status_update(self):results = self._get_data()# messages = [#     MqttMessage(#         topic=self.format_topic(“property/light”),#         payload=results.lightlevel,#     )# ]return resultsdef _get_data(self):scan_processor = ScanProcessor(self._name)scanner = Scanner().withDelegate(scan_processor)scanner.scan(self.SCAN_TIMEOUT, passive=True)with timeout(self.SCAN_TIMEOUT,exception=Exception(“Retrieving data from {} device {} timed out after {} seconds”.format(repr(self), self._name, self.SCAN_TIMEOUT)),):while not scan_processor.ready:time.sleep(1)return scan_processor.resultsreturn scan_processor.resultsclass ScanProcessor:ADV_TYPE_SERVICE_DATA = 0x16def __init__(self, name):self._ready = Falseself._name = nameself._results = MiBeaconData()def handleDiscovery(self, dev, isNewDev, _):is_nodemcu = Falseif isNewDev:for (adtype, desc, value) in dev.getScanData():#Service Data UUID == 0xFE95 according to MiBeaconif adtype == self.ADV_TYPE_SERVICE_DATA and value.startswith(“95fe”):print(“FOUND service Data:”,adtype, desc, value)#Object ID == 0x1007 according to MiBeaconif len(value) == 38 and value[26:30] == ‘0710’:light_den = int((value[-2:] + value[-4:-2]), 16)mac = value[14:26]self._results.lightlevel = light_denself._results.mac = macself.ready = True@propertydef mac(self):return self._mac@propertydef ready(self):return self._ready@ready.setterdef ready(self, var):self._ready = var@propertydef results(self):return self._resultsclass MiBeaconData:def __init__(self):self._lightlevel = Noneself._mac = None@propertydef lightlevel(self):return self._lightlevel@lightlevel.setterdef lightlevel(self, var):self._lightlevel = var@propertydef mac(self):return self._mac@mac.setterdef mac(self, var):self._mac = var

北向 MQTT 对接云平台

接下来我们要实现网关和云平台的对接。

1.MQTT 开发环境准备-安装软件包

蓝牙网关与云平台交互的通信协议也是使用 MQTT 协议,所以我们需要安装 MQTT 的软件包。这里我们选择支持 Python 语言开发的Eclipse Paho软件包。我们在树莓派的终端上输入下面的命令来安装。

$ sudo pip3 install paho-mqtt

安装成功后,我们可以写一个 demo 程序测试一下。下面是我测试的代码,这段代码仍然会连接到 test.mosquitto.org,并且订阅“/geektime/iot”的主题消息。

#File: mqttdemo.py
import paho.mqtt.client as mqttdef on_connect(client, userdata, flags, rc):print(“Connected with result code “+str(rc))client.subscribe(“/geektime/iot”)def on_message(client, userdata, msg):print(msg.topic+” “+str(msg.payload))client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message#Still connect to mqtt.eclipse.org
client.connect(“test.mosquitto.org”, 1883, 60)client.loop_forever()

2.部署文件到树莓派

现在,我们把测试文件 mqttdemo.py 上传到树莓派上。
你可以在电脑终端上,运行下面的命令。(注意,你需要先在树莓派上创建 pi-gateway 这个目录。

$ scp mqttdemo.py pi@gladys.local:/home/pi/pi-gateway/

其中这个 scp 命令是基于 SSH 协议实现的安全文档传输功能。
当然,你也可能更习惯图形化的软件,所以我再介绍一个能实现 scp 功能的软件 FileZilla。它支持 MacOS、Windows 和 Linux 操作系统,操作界面也非常直观。
打开“站点管理器”,创建“新站点”。你可以按照下图设置具体配置参数,然后点击“连接”,登录到树莓派系统。为了方便之后的使用,你可以勾选“保存密码”选项。


在软件界面的左半部分是你的电脑上的文件目录,右半部分是树莓派上的目录。你只需要双击左边的某个文件,就可以将文件传输到树莓派上。当然你也可以双击右边树莓派上的文件,将它传输到你的电脑。

把文件传输到树莓派之后,我们就可以在树莓派的终端上输入下面的命令,运行上面的 demo 程序。

$ sudo python3 mqttdemo.py

云平台创建光照传感器设备

现在,我们已经做好了对接云平台的准备工作。在树莓派上开发与云平台的通信代码之前,我们还需要在腾讯云平台上创建对应的光照传感器设备。
在“新建产品”中,产品类别选择“智慧生活”—>“安防报警”—>“光照度传感器”。数据协议仍然选择“数据模板”,其他的保持默认值即可。

创建成功后,我们点击进入数据模板的设置界面。为了尽量简单,课程只定义了一个属性“光照度”,而且是只读类型。你可以直接导入下面的 JSON 文件完成数据模板的设置。

{“version”: “1.0”,“profile”: {“ProductId”: “你的ProductID”,“CategoryId”: “112”},“properties”: [{“id”: “Illuminance”,“name”: “光照度”,“desc”: “光照度检测”,“mode”: “r”,“define”: {“type”: “float”,“min”: “0”,“max”: “6000”,“start”: “0”,“step”: “1”,“unit”: “Lux”}}],“events”: [],“actions”: []
}


在“交互开发”标签页中,和智能电灯一样,我们仍然保持“使用官方小程序控制产品”选项是打开状态。另外,还有一个配置项需要关注,那就是“智能联动配置”,因为后面我们要为光照传感器设置联动场景。

我们点击“配置”,在设置页面中,就可以看到“光照度”这个属性,因为它是只读属性,所以只能作为联动的触发条件。我们勾选“作为条件”的选项,完成配置。


下一步,在“设备调试”界面中,我们创建一个测试设备。点击“新建设备”,输入设备名称“Lightsensor_1”。

创建成功后,在测试设备列表中,点击“Lightsensor_1”,进入设备的详情页面,我们可以看到设备三元组的信息。你需要将这些信息记录下来,因为后面的开发中需要使用。
在测试设备列表中,我们点击“二维码”操作,获取测试设备的二维码,以便在小程序“腾讯连连”中添加这个设备。
到这里,腾讯云平台上的产品创建工作就完成了。

产品联网开发

在腾讯云平台准备好产品的配置工作之后,我们继续在树莓派上完成北向的通信交互的开发工作。
之前在第二部分已经了解了 MQTT 通信的主题 Topic ,以及 Broker 服务器地址、端口号、设备 ID、用户名和密码等连接参数的知识。
我们还是可以使用 sign.html 这个网页工具生产用户名和密码,然后就能得到所有的参数。这时,把这些参数替换到下面这段代码的对应位置就可以了。

#File: gateway.py
from blescan import LightScanner, MiBeaconDataimport time
import asyncio
import json
import uuid
import paho.mqtt.client as MQTTClient“””
QCloud Device Info
“””
DEVICE_NAME = “Lightsensor_1”
PRODUCT_ID = “MAO3SVUCFO”
DEVICE_KEY = “TYjuKNc2GpDykXUv4MWBOA==““””
MQTT topic
“””
MQTT_CONTROL_TOPIC = “$thing/down/property/“+PRODUCT_ID+”/“+DEVICE_NAME
MQTT_CONTROL_REPLY_TOPIC = “$thing/up/property/“+PRODUCT_ID+”/“+DEVICE_NAMEdef mqtt_callback(client, userdata, msg):# Callbackprint(f”Received `{msg.payload.decode()}` from `{msg.topic}` topic”)async def mqtt_connect():#connect callbackdef on_connect(client, userdata, flags, rc):if rc == 0:print(“Connected to MQTT Broker!”)else:print(“Failed to connect, return code %d\n”, rc)mqtt_client = NoneMQTT_SERVER = PRODUCT_ID + “.iotcloud.tencentdevices.com”MQTT_PORT = 1883MQTT_CLIENT_ID = PRODUCT_ID+DEVICE_NAMEMQTT_USER_NAME = “MAO3SVUCFOLightsensor_1;12010126;2OYA5;1609057368”MQTTT_PASSWORD = “8f79b7f1b0bef9cde7fd9652383b6ff8bfeb8003cc994c64f3c8e069c11fd4c7;hmacsha256”mqtt_client = MQTTClient.Client(MQTT_CLIENT_ID)mqtt_client.username_pw_set(MQTT_USER_NAME, MQTTT_PASSWORD)mqtt_client.on_connect = on_connectmqtt_client.connect(MQTT_SERVER, MQTT_PORT, 60)return mqtt_clientdef mqtt_report(client, light_level):client_token = “clientToken-“ + str(uuid.uuid4())msg = {“method”: “report”,“clientToken”: client_token,“params”: {“Illuminance”: light_level}}client.publish(MQTT_CONTROL_REPLY_TOPIC, json.dumps(msg))async def light_loop(mclient):bles = LightScanner(‘Nodemcu’)mclient.subscribe(MQTT_CONTROL_TOPIC)mclient.on_message = mqtt_callbackmclient.loop_start()while True:try:data = bles.status_update()except Exception as e:print(“BLE SCAN error:”, e)continueprint(“Light Level:”, data.lightlevel)mqtt_report(mclient, data.lightlevel)time.sleep(0.1)async def main():mqtt_client = None# MQTT connectiontry:mqtt_client = await asyncio.wait_for(mqtt_connect(), 20)except asyncio.TimeoutError:print(“mqtt connected timeout!”)if mqtt_client is not None:await asyncio.gather(light_loop(mqtt_client))asyncio.run(main())

在树莓派上部署软件

接下来,我们把代码文件 gateway.py 和 blescan.py 两个文件也上传到树莓派的 /home/pi/pi-gateway 目录中。
同时,为了让程序作为后台服务运行,并且能够开机自启动,我们来做一个 Pi Gateway Service。
首先,你需要新建一个 service.sh 脚本文件,内容如下:

#!/bin/sh
set -e
SCRIPT_DIR=$( cd “$( dirname “$0” )” >/dev/null 2>&1 && pwd )cd “$SCRIPT_DIR”
sudo python3 ./gateway.py “$@“然后,创建我们 service 的配置文件,内容如下:[Unit]
Description=Pi Gateway
Documentation=https://time.geekbang.org/column/intro/100063601
After=network.target[Service]
Type=simple
WorkingDirectory=/home/pi/pi-gateway
ExecStart=/home/pi/pi-gateway/service.sh
Restart=always[Install]
WantedBy=multi-user.target

接着,把这两个文件上传到树莓派系统的 /home/pi/pi-gateway 目录中,并且运行下面命令,修改文件的属性。

$ sudo chmod a+x service.sh
$ sudo chmod a+x pi-gateway.service最后,执行下面的几条命令,为树莓派系统增添上 Pi Gateway 这个服务。```javascript
$ sudo cp /home/pi/pi-gateway/pi-gateway.service /etc/systemd/system/
$ sudo systemctl daemon-reload
$ sudo systemctl start pi-gateway
$ sudo systemctl status pi-gateway
$ sudo systemctl enable pi-gateway

到这里,网关程序已经在树莓派上运行起来。我们在腾讯云物联网平台上可以看到,光照传感器变为“在线”状态。

设置场景联动

现在可以为它们设置场景联动了。

场景联动任务分解

我们希望实现的联动场景是,基于环境的光照强度自动控制电灯的开和关。具体来说,这个目标可以拆解为 3 个自动触发任务:
当光照强度大于 1024Lux 时,关闭电灯。
当光照强度小于 1024Lux 时,打开电灯。
至于光照强度等于 1024Lux 时,也打开电灯。
注意,这里的 1024Lux 是我自己选择的一个值,你可以根据房屋情况自己调整。

联动设备准备

如果你还没有在小程序中添加光照传感器设备,这时可以打开微信中的腾讯连连小程序,扫描上面云平台“设备调试”中保存的那个二维码,添加光照传感器测试设备“Lightsensor_1”。
现在你的小程序里面已经有了两个设备,如下图所示。

刚才我们已经在腾讯云物联网平台上,为光照传感器设置了“智能联动配置”。现在,我们来为智能电灯配置智能联动能力。
我们进入智能电灯的“交互开发”页面,打开下面的“智能联动配置”页面,然后,像下图显示的那样,把“电灯开关”的“作为任务”条件勾选上。

联动任务创建

然后,我们进入腾讯连连小程序,点击下面的“+”,选择“添加智能”,开始配置工作。

我们从弹框里选择“自动智能”,可以看到下图的配置界面:

首先,我们添加条件,选择光照传感器设备,然后就会看到光照度属性。我们先设置大于 1024Lux 的条件。

然后,我们添加任务,选择智能电灯设备后,可以看到电灯开关的属性,选择“关”,点击保存。

这时,我们可以看到这个智能联动的条件和任务已经配置完成。腾讯连连小程序还支持配置“生效时间段”,可以限定智能联动在选定的时间段内运行。

接下来,我们还可以设置一个主题图片和名称,这个根据喜好来就行了。

按照相同的方法,我们可以设置其他两个条件,如下图所示:

最终的智能联动,包括了刚才提到的 3 个不同的触发条件。

现在,可以通过控制光照传感器的光照明暗(比如用手遮挡光敏元器件然后再把手拿开),来观察智能电灯的打开和关闭,检验功能是否正常。

学习笔记总结自‘物联网开发实战’–郭朝斌
–笔记只用于学习交流,请不要用于商业用途。

“物联网开发实战”学习笔记-(三)通过感知光线开关电灯相关推荐

  1. “物联网开发实战”学习笔记-(二)手机控制智能电灯

    "物联网开发实战"学习笔记-(二)手机控制智能电灯 如果搭建好硬件平台后,这一次我们的任务主要是调试好智能电灯,并且连接到腾讯云的物联网平台. 腾讯云物联网平台 腾讯物联网平台的优 ...

  2. “物联网开发实战”学习笔记-(四)智能音箱制作和语音控制

    "物联网开发实战"学习笔记-(四)智能音箱制作和语音控制 这次来造一个属于自己的智能音箱,这里详细介绍了智能音箱的语音控制的实现. 智能音箱的技术架构 智能音箱主要涉及拾音.前端信 ...

  3. “物联网开发实战”学习笔记-(五)根据土壤湿度、环境温湿度和光照强度自动浇花

    "物联网开发实战"学习笔记-(五)根据土壤湿度.环境温湿度和光照强度自动浇花 研究场景需求 自动浇花这个场景,很明显是为了自动控制水泵,及时给植物补充水分.同时用户的目的并不只是浇 ...

  4. 阿里云HaaS100物联网开发板学习笔记(三)轻应用初步--用js让小灯闪烁起来

    摘要:能让JavaScript应用运行在haas100开发板上,这实在是太酷了,这种方式被阿里云称之为"轻应用".本文带各位从零开始,先了解啥是轻应用,然后搭建环境,再一步步将一个 ...

  5. 阿里云HaaS100物联网开发板学习笔记(六)做个智能灯---一个完整的开发例子

    摘要:本篇文章将前期几个专题综合起来,基于阿里云HaaS100的新固件设计制作一个智能灯.这个智能灯由云平台.手机APP端和设备端组成,基本上涵盖了一个物联网小项目所需的主要步骤. 目录 1.在阿里云 ...

  6. 阿里云HaaS100物联网开发板学习笔记(四)轻应用初步--用javascript连接阿里云物联网平台

    摘要:本篇文章讲解如何使用JavaScript"轻应用"连接阿里云物联网平台并上报一个数据.仍然延续前几篇文章的结构,从安装软件环境开始讲,以使零基础的同学看了本篇文章之后,也能够 ...

  7. HaaS600物联网开发板学习笔记(二)---轻应用方式让LED闪烁起来

    摘要:轻应用开发非常方便快捷,gitee上的例程也都是基于HaaS600的,所以,拿HaaS600来逐个测试例程,学习轻应用开发和物联网应用是最合适的.本文介绍一下HaaS600如何使用轻应用来开发. ...

  8. 阿里云HaaS100物联网开发板学习笔记(二)硬件控制初步--让小灯闪烁起来

    摘要:无论是哪种开发板,要想开发特定的功能,必先从GPIO开始,HaaS100开发也是一样.如果仅仅利用HaaS100的联网功能,那简直是太浪费了.HaaS100拥有其他开发板所具备的所有的功能,比如 ...

  9. 唐金州的Vue开发实战学习笔记(基础篇)

    Vue开发实战学习笔记 简易的Vue程序 组件 事件 插槽 单文件组件 双向绑定 虚拟DOM与key属性 组件更新 状态data与属性props vue的响应式更新 计算属性和侦听器 计算属性 com ...

  10. 唐金州的Vue开发实战学习笔记(生态篇)

    Vue开发实战学习笔记 Vuex Why Vuex How Vuex Vuex的核心概念和底层原理 Vuex的最佳实践 Vue Router Why Vue Router 路由类型及底层原理 Nuxt ...

最新文章

  1. 【机器视觉案例】(9) AI视觉,手势控制电脑键盘,附python完整代码
  2. Android中设置TextView的颜色setTextColor
  3. zabbix trapper方式监控
  4. 如何列出JavaScript对象的属性?
  5. 统计学习方法笔记(三)-朴素贝叶斯原理及python实现
  6. Java中基本数据类型和Object之间的关系
  7. Qualcomm式创新融入中国 有何深层逻辑?
  8. .NET中颜色的转换方法总结
  9. BugkuCTF-MISC题怀疑人生
  10. 很多IP摄像头厂商都在用的固件中存在多个严重漏洞
  11. 5月全国程序员工资最新统计,网友:惊呆了!
  12. 服务器稳定时间,NTP时钟服务器网络时间服务器哪个更好呀?
  13. python3吧_基于python3 抓取贴吧图片与评论 图片下载保存
  14. 洛谷P4325 [COCI2006-2007#1] Modulo
  15. element表格样式优化
  16. MATLAB实现k-means算法(k-均值)对无标签数据进行聚类,并通过肘部法则确定聚类类别
  17. 什么是显示器支架,显示器支架有啥优势
  18. 航模遥控继电器单通道控制2路继电器开关实现原理解析
  19. 找出一个二维数组中的鞍点
  20. 手机qq2012(android)1.0,手机qq2012安卓1.0 几个版本改进后的正式版本

热门文章

  1. matlab中的三次样条曲线拟合,三次样条拟合典型实例.doc
  2. 再见2021,你好2022
  3. Ubuntu系统中清理DNS缓存
  4. 磁盘压缩卷只能压缩一半
  5. 计算机思维培训心得,计算机教师培训心得体会
  6. 华为移动应用引擎安装第三方apk教程
  7. 【问题解决】电脑微信聊天记录备份时显示不在同一网络(电脑LAN,手机WIFI)
  8. php gtk不更新了,[新人求助] gtk控件动态更新
  9. 电信手机手机最快服务器是哪个,移动、电信、联通4G上网速度,哪家速度最快?...
  10. 如何将class文件转换成java文件