返回首页
IoT SmartHome

基于腾讯云物联网开发平台的光照传感器

构建光照传感器

硬件

  • NodeMCU ESP8266
  • 光照度传感器
  • 面包板
  • 杜邦线
  • USB数据线

NodeMCU 的管脚图

电路图

光照传感器

物联网开发平台

平台使用流程

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

③ 创建产品

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

④ 定义数据模板

  1. 选择数据模板,通过导入自定义数据模板。
{
  "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": []
}

  1. 导入成功

⑥ 交互开发

⑦ 设备调试

  1. 新建设备

  2. 创建成功

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

  4. 在线调试

软件实现

参考数据模板协议开发用于上报设备的状态和控制设备的指令。可由腾讯云物联网平台提供的生成小工具自动生成,想了解更多的详情,请查看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 :

远程控制

在微信中打开腾讯连连小程序,添加-扫一扫。

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

添加成功

查看设备状态

参考资料