<jupyter_start><jupyter_text>虚谷号和物联网应用范例  范例说明 1.功能描述：利用虚谷号和常见传感器模块，制作一个简单的物联网作品原型，实现数据采集和远程控制，并且可以和手机交互；2.涉及材料：    1）硬件：虚谷号、Arduino扩展板、光线传感器    2）软件：siot服务器，siot库（Python），xugu库（Python）3.文档写作：谢作如、元银萍4.参考网站：https://github.com/vvlink/SIoT5.其他说明：本作品范例可以移植到其他平台。  准备工作因为虚谷号已经默认安装了siot库，也预装了siot服务器，使用虚谷号的用户可以省略这一步。  安装siot库安装方法：pip install siot如果pip不能安装，可以试试pip3。 安装siot服务器根据系统的版本下载相应的siot软件，直接运行即可。下载地址：https://github.com/vvlink/SIoT  编写范例  1.采集传感器数据 第一步：导入库<jupyter_code>import siot
import time<jupyter_output><empty_output><jupyter_text>siot库是对mqtt库对二次封装，让代码更加简洁。<jupyter_code>from xugu import Pin<jupyter_output><empty_output><jupyter_text>xugu库是转为虚谷号开发的通用GPIO库，通过串口控制虚谷号板载的Arduino。第一次引入这个库，虚谷号将会给板载Arduino写入标准的固件。 第二步：配置SIOT服务器<jupyter_code>SERVER = "127.0.0.1"        #MQTT服务器IP
CLIENT_ID = ""              #在SIoT上，CLIENT_ID可以留空
IOT_pubTopic  = 'xzr/001'   #“topic”为“项目名称/设备名称”
IOT_UserName ='scope'        #用户名
IOT_PassWord ='<PASSWORD>'     #密码<jupyter_output><empty_output><jupyter_text>说明：虚谷号可以用127.0.0.1表示本机，用户名和密码统一使用“scope”，topicid自己定义，这里用的是“xzr/001”，表示项目名称为“xzr”，设备名称为“001”。<jupyter_code>第三步：连接SIOT服务器<jupyter_output><empty_output><jupyter_text>siot.init(CLIENT_ID, SERVER, user=IOT_UserName, password=IOT_PassWord)siot.connect()<jupyter_code>第四步：初始化模拟传感器<jupyter_output><empty_output><jupyter_text>p1 = Pin("A0", Pin.ANALOG)  初始化 A0 引脚,设置为输入模式<jupyter_code>请将光线传感器通过arduino扩展板（通用），接到虚谷号板载Arduino的A0口。<jupyter_output><empty_output><jupyter_text>第五步：获取模拟传感器数据，并发送MQTT消息<jupyter_code>while True:
  value = p1.read_analog()
  print(value)
  siot.publish(IOT_pubTopic,"%d"%value)
  time.sleep(1)<jupyter_output><empty_output><jupyter_text>访问虚谷号的siot服务，输入用户名密码（分别为scope），在主题“xzr/001”中，可看到虚谷号发送的光线数据，如图所示。![image.png](attachment:image.png)注：使用“停止”按钮，可以停止程序运行。  2.远程控制虚谷号LED 前三步和第一个案例是一样的，这里直接从第四步开始。同时，为了和上一个范例的数据隔离，这里使用了一个新的topicid（主题），名称为“xzr/002”。LED的引脚使用13，即Arduino自带的led。<jupyter_code>IOT_pubTopic  = 'xzr/002'   # “topic”为“项目名称/设备名称”
p = Pin(13, Pin.OUT)<jupyter_output><empty_output><jupyter_text>第四步：定义全局变量<jupyter_code>利用第五步的回调函数，当接收到信息的时候，就给全局变量ret赋值。<jupyter_output><empty_output><jupyter_text>ret = 0<jupyter_code>第五步：构建订阅信息的回调函数<jupyter_output><empty_output><jupyter_text>def sub_cb(client, userdata, msg):  global ret  print("\nTopic:" + str(msg.topic) + " Message:" + str(msg.payload))  if msg.payload==b'1':    ret = 1  if msg.payload==b'0':    ret = 0<jupyter_code>第六步：开始订阅信息<jupyter_output><empty_output><jupyter_text>siot.subscribe(IOT_pubTopic, sub_cb)siot.loop()<jupyter_code>第七步：循环监视变量，并控制LED<jupyter_output><empty_output><jupyter_text>while True:  if ret == 1:    p.write_digital(1)  if ret == 0:    p.write_digital(0)<jupyter_code>##注：如果打开笔记的时候，程序已经开始，需先断开服务器（点击上方的黑色正方形），再分布执行进行下面的代码。<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14108640174990886, 'fraction_numerical': 0.02150929639081298, 'mean_word_length': 11.25, 'pattern_counts': {'":': 0, '<': 54, '<?xml version=': 0, '>': 54, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 2, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '13', 'dir': 'jupyter-structured-clean-dedup', 'id': '275396', 'license': 'MIT', 'n_tokens_mistral': 1683, 'n_tokens_neox': 1865, 'n_words': 82, 'path': '课程汇集/其他课程/虚谷号和物联网应用范例.ipynb', 'repo_name': 'xiezuoru/vvBoard-docs', 'size': '2738'}