构建光照传感器
硬件
- NodeMCU ESP8266
- 光照度传感器
- 面包板
- 杜邦线
- USB数据线
NodeMCU 的管脚图

电路图

光照传感器

物联网开发平台
平台使用流程

① 登录腾讯云物联网开发平台控制台,进入公共实例

③ 创建产品
选择智能家居,新建产品:光照传感器。

④ 定义数据模板
- 选择数据模板,通过导入自定义数据模板。
{
"version": "1.0",
"profile": {
"ProductId": "您的产品ID",
"CategoryId": "112"
},
"properties": [
{
"id": "Illuminance",
"name": "光照度",
"desc": "光照度检测",
"mode": "r",
"define": {
"type": "float",
"unit": "Lux",
"min": "0",
"max": "6000",
"start": "0",
"step": "1"
}
}
],
"events": [],
"actions": []
}

- 导入成功

⑥ 交互开发

⑦ 设备调试
新建设备

创建成功

新建设备的二维码,可以使用腾讯连连扫描快速增加。

在线调试

软件实现
参考数据模板协议开发用于上报设备的状态和控制设备的指令。可由腾讯云物联网平台提供的生成小工具自动生成,想了解更多的详情,请查看MQTT.fx 快速接入指引。
MQTT用户名和密码生成工具

配置您自己的信息
WiFi(用于联网)
- ESSID
- PASSWORD
IOT平台定义的设备信息
- DEVICE_NAME(设备名称)
- PRODUCT_ID(产品ID)
- DEVICE_KEY(设备密钥)
MQTT
- MQTT_USERNAME
- MQTT_PASSWORD
代码
- wifi.py
import network
ESSID = ""
PASSWORD = ""
def connect(essid=ESSID, password=PASSWORD):
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect(essid, password)
while not wlan.isconnected():
pass
print('network config:', wlan.ifconfig())
- light.py
from machine import ADC
from machine import Pin
class Light():
"""
基于 PT550 环保型光敏二极管的光照传感器元器件,它的灵敏度更高,测量范围是 0Lux~6000Lux。
Lux(勒克斯)是光照强度的单位,它和另一个概念 Lumens(流明)是不同的。Lumens 是指一个光源(比如电灯、投影仪)发出的光能力的总量,而 Lux 是指空间内一个位置接收到的光照的强度。
因为 ADC 支持的最大位数是 12bit,所以这个数值范围是 0~4095 之间。这里按照线性关系做一个转换。
"""
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)
- tencent_mqtt.py
import time
import ujson
from umqtt.simple import MQTTClient
from light import Light
"""
QCloud Device Info
"""
DEVICE_NAME = ""
PRODUCT_ID = ""
DEVICE_KEY = ""
"""
MQTT topic
"""
MQTT_DEVICE_CONTROL_TOPIC = "$thing/down/property/"+PRODUCT_ID+"/"+DEVICE_NAME
MQTT_DEVICE_STATUS_TOPIC = "$$thing/up/property/"+PRODUCT_ID+"/"+DEVICE_NAME
MQTT_SERVER = PRODUCT_ID + ".iotcloud.tencentdevices.com"
MQTT_PORT = 1883
MQTT_CLIENT_ID = PRODUCT_ID+DEVICE_NAME
MQTT_USERNAME = ""
MQTT_PASSWORD = ""
class LightSensor():
def __init__(self):
self.light = Light(36)
class TencentMQTT():
light_sensor = LightSensor()
def __init__(self):
self.mqtt_client = None
def connect(self):
self.mqtt_client = MQTTClient(MQTT_CLIENT_ID, MQTT_SERVER, MQTT_PORT, MQTT_USERNAME, MQTT_PASSWORD, 60)
self.mqtt_client.set_callback(TencentMQTT.control)
self.mqtt_client.connect()
"""
接收订阅的消息(用于远程控制)
"""
@staticmethod
def control(topic, msg):
pass
"""
发送设备的状态消息
"""
def report(self):
msg = {
"method": "report",
"clientToken": "clientToken-0123456789",
"params": {
"Illuminance": self.light_sensor.value()
}
}
self.mqtt_client.publish(MQTT_DEVICE_STATUS_TOPIC.encode(), ujson.dumps(msg).encode())
"""
消息循环
"""
def loop(self):
self.mqtt_client.subscribe(MQTT_DEVICE_CONTROL_TOPIC.encode())
up_time = 5000
time_sleep = 50
time_count = 0
while True:
self.mqtt_client.check_msg()
time_count += time_sleep
if (time_count >= up_time):
self.report()
time_count = 0
time.sleep_ms(time_sleep)
- main.py
import wifi
from tencent_mqtt import TencentMQTT
if __name__ == '__main__':
wifi.connect()
mqtt = TencentMQTT()
mqtt.connect()
mqtt.loop()
程序写入开发板
$ ./pyboard.py --device /dev/cu.usbserial-0001 -f cp light.py wifi.py main.py tencent_mqtt.py :
远程控制
在微信中打开腾讯连连小程序,添加-扫一扫。

扫描下面光照传感器的二维码。

添加成功

查看设备状态

参考资料
- 腾讯云物联网开发平台入门
- MQTT.fx-目前主流的MQTT桌面客户端
- MQTT X
- MQTT Version 3.1.1 协议标准
- MQTT协议
- umqtt.simple
- MicroPython – Getting Started with MQTT on ESP32/ESP8266
- uasyncio — asynchronous I/O scheduler
- The Breathing Lamp
- micropython-async
- MicroPython Random number generation?
- General information about the ESP8266 port
- MicroPython libraries
- MicroPython 相关库
- Enable two-way SSL/TLS for EMQ X
- Online UUID Generator
- 乐鑫信息科技