需要用到的东西:
小熊派的ec100y开发板,或者ec600S开发板;
i2c的温湿度传感器(我这里用的sht31,其他的也可以,自行修改代码);
阿里云账号;
接线:用到3.3v,GND,i2c的SCL和SDA
阿里云显示展示:
app展示:
代码:
# 包引用部分
import log
from aLiYun import aLiYun
import ujson
import utime
from machine import I2C
import pm
# 用户变量区域
# 上传间隔(单位分钟)
interval=5
# 设置日志输出级别
log.basicConfig(level=log.INFO)
aliYun_log = log.getLogger("ALiYun")
productKey = "a1UMWyl1ee3" # 产品标识
productSecret = None # 产品密钥(使用一机一密认证时此参数传入None)
DeviceName = "hO43OC0BX6r3YdQrVhE5" # 设备名称
DeviceSecret = "73b65a9b59eb95d14b462a257815764a" # 设备密钥(使用一型一密认证此参数传入None,免预注册暂不支持,需先在云端创建设备)
topic = "/sys/a1UMWyl1ee3/hO43OC0BX6r3YdQrVhE5/thing/event/property/post" # 云端自定义或自拥有的Topic
clientID = "temp001" # 自定义字符(不超过64)
pm.autosleep(1)
# 创建aliyun连接对象
ali = aLiYun(productKey, productSecret, DeviceName, DeviceSecret)
ali.setMqtt(clientID, clean_session=False, keepAlive=300)
# 回调函数
def sub_cb(topic, msg):
aliYun_log.info("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode()))
# 设置回调函数
ali.setCallback(sub_cb)
# 运行
ali.start()
i2c_obj = I2C(I2C.I2C0, I2C.STANDARD_MODE) # 返回i2c对象
def readSht30():
I2C_SLAVE_ADDR = 0x44 # i2c 设备地址
WHO_AM_I = bytearray({0x2C, 0}) # i2c 寄存器地址,以buff的方式传入,取第一个值,计算一个值的长度
data = bytearray({0x06, 0}) # 输入对应指令
i2c_obj.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2) # 写入data
r_data = bytearray(6) # 创建长度为2的字节数组接收
i2c_obj.read(I2C_SLAVE_ADDR, WHO_AM_I, 1, r_data, 6, 0) # read
temperature_raw = r_data[0] << 8 | r_data[1]
temperatur = (175.0 * float(temperature_raw)/65535.0)-45
humidity_raw = r_data[3] << 8 | r_data[4]
humidity = (100.0 * float(humidity_raw) / 65535.0)
return temperatur,humidity
while 1:
# 接受一条消息后退出
temperature,humidity=readSht30()
send_data={'method':'thing.event.property.post','params':{'temperature':temperature,'humidity':humidity}}
s = ujson.dumps(send_data)
ali.publish(topic,s)
aliYun_log.info("SEND")
utime.sleep_ms(1000*60*interval) # 休眠(单位min)
目前没做异常检测,都是理想状态,后面等官方更新再完善代码。
目前掉线不能重连,等官方更新后,放出完整教程。