1.背景介绍:
根据2022版义务教育信息科技新课标要求,信息科技课程教学,以培养学生数字素养与技能为目标,以学生已有的知识、技能和经验为起点,遵循学生学习规律,系统设计学习活动,突出用信息科技解决学习、生活中的问题,为学生创设自主、合作、探究的学习情境和知、情、意、行融合发展的成长环境。根据逻辑主线之一人工智能,结合原江苏省义务教育信息技术课程初中阶段跨学科主题之一:"未来智能场景畅想”,所以设计物联网“智能家居”——让学生进行"物联网实践与探索"的体验学习与原理探究。
通过本项目让学生学会使用行空板,配合SIOT物联网平台,模拟电脑远程实时控制家庭中照明、风扇、门窗。通过本项目的体验与学习,进一步加强学生对于科技的认知,增强互联智能设计能力。
2.遇到的问题:
智能家居监控系统,既需要有质量过硬、侦测数据准确的传感器,又需要有物联网平台的支撑进行实时数据采集和处理。采购整体的监控系统硬件,价格昂贵,不能满足让学生进行互联智能设计的需要,一般物联网平台需要付费才能使用,且依赖互联网网络的支持,而采用slot本地服务器或行空板(自带siot服务)比较适合家庭、学校使用。
(1).MIND+在python模式下,使用行空板获取SCI采集模块中获取的温湿度传感器的数据时,出现错误,经群里咨询老师,需要在扩展库中分别加载pinpong库中pinpong初始化、用户库中的SCI采集模块。
(2).最初在主程序中原本打算将硬件初始化这块做成自定义函数,实际操作后发现调试错误种种,主要原因自定义函数中使用了不好变量,而在主程序使用时,出现变量未定义,最好放弃即解决。
3.硬件连接图及部分关键程序截图:
3.反思与总结
智能家居控制系统,通过编程实现行空板的板载光线传感器、音量传感器、SCI采集模块、SHT31数字温湿度传感器获取到的数据通过行空板的屏幕实时呈现,利用行空板屏幕中按钮及SIOT平台、mind实时模式下实现了对家居里的灯光、风扇、门窗的远程控制与监控。预期的基本功能均已实现。但是不足之处主要是由于缺乏激光切割硬件及技术,所以作品的成套模型无法呈现,后期将争取机会学习激光切割技术,然后通过开源硬件与激光切割制作的模型结合,进一步完美地呈现智能家居模型。
步骤1 确定项目需求:制作一个智能家居控制系统,能实时控制室内照明、照明状态数据的实时显示以及风扇控制与状态实时显示。
步骤2 硬件准备:行空板、SCI采集模块、Micro:bit掌控IO扩展板、数字食人鱼红色LED发光模块、SHT31数字温湿度传感器、SG90舵机、130直流电机风扇
步骤3 完成程序编写和调试
# -*- coding: UTF-8 -*-
# MindPlus
# Python
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from dfrobot_rp2040_sci import *
from pinpong.board import Servo
from pinpong.board import Board
from unihiker import Audio
from unihiker import GUI
import siot
import time
# 事件回调函数
def on_message_callback(client, userdata, msg):
global fanctl1
global ledctl1
global doorctl
if (msg.topic == "siot/照明"):
if ((int(float(msg.payload.decode()))) == 0):
print("0")
p_p9_pwm.write_analog(0)
ledctl1 = 0
if ((int(float(msg.payload.decode()))) == 1):
p_p9_pwm.write_analog(1023)
print("1")
ledctl1 = 1
if (msg.topic == "siot/风扇"):
if (msg.payload.decode() == "on"):
print("on")
p_p8_pwm.write_analog(1023)
fanctl1 = 1
if (msg.payload.decode() == "off"):
p_p8_pwm.write_analog(0)
print("off")
fanctl1 = 0
if (msg.topic == "siot/门窗"):
if (msg.payload.decode() == "on"):
servo1.write_angle(135)
doorctl = 1
if (msg.payload.decode() == "off"):
servo1.write_angle(45)
doorctl = 0
def button_click1():
global ledctl1
ledctl1 = (1 - ledctl1)
if (ledctl1 == 1):
siot.publish_save(topic="siot/照明", data="1")
else:
siot.publish_save(topic="siot/照明", data="0")
def button_click2():
global fanctl1
fanctl1 = (1 - fanctl1)
if (fanctl1 == 1):
siot.publish_save(topic="siot/风扇", data="on")
else:
siot.publish_save(topic="siot/风扇", data="off")
def button_click3():
global doorctl
doorctl = (1 - doorctl)
if (doorctl == 1):
siot.publish_save(topic="siot/门窗", data="on")
else:
siot.publish_save(topic="siot/门窗", data="off")
Board().begin()
u_gui=GUI()
siot.init(client_id="28661157379204716",server="192.168.10.100",port=1883,user="siot",password="dfrobot")
u_audio = Audio()
siot.connect()
siot.loop()
siot.set_callback(on_message_callback)
p_p9_pwm=Pin(Pin.P9, Pin.PWM)
p_p8_pwm=Pin(Pin.P8, Pin.PWM)
print("pinpong ok")
SCI1 = DFRobot_RP2040_SCI_IIC(addr=0x21)
while SCI1.begin() != 0:
print("Initialization Sensor Universal Adapter Board failed.")
time.sleep(1)
print("Initialization Sensor Universal Adapter Board done.")
print("sci ok")
print(SCI1.get_version_description(SCI1.get_version()))
TEMP=u_gui.draw_text(text="温度:",x=18,y=36,font_size=15, color="#000000")
HUMI=u_gui.draw_text(text="湿度:",x=18,y=66,font_size=15, color="#000000")
LOUNDNESS=u_gui.draw_text(text="响度:",x=18,y=96,font_size=15, color="#000000")
biaoti=u_gui.draw_text(text="智慧教室控制系统",x=120,y=15,font_size=15, color="#000000")
zs1=u_gui.draw_round_rect(x=15,y=35,w=210,h=160,r=5,width=3,color="#0000FF")
zs2=u_gui.draw_round_rect(x=15,y=200,w=210,h=115,r=5,width=3,color="#0000FF")
BRIGHTNESS=u_gui.draw_text(text="亮度:",x=18,y=126,font_size=15, color="#000000")
TEMP_value=u_gui.draw_text(text="0",x=68,y=36,font_size=15, color="#FF0000")
HUM_value=u_gui.draw_text(text="0",x=68,y=66,font_size=15, color="#FF0000")
Lound_value=u_gui.draw_text(text="0",x=68,y=96,font_size=15, color="#FF0000")
bright_value=u_gui.draw_text(text="0",x=68,y=126,font_size=15, color="#FF0000")
ledctl=u_gui.add_button(text="照明控制",x=35,y=205,w=80,h=35,onclick=button_click1)
fanctl=u_gui.add_button(text="风扇控制",x=125,y=205,w=80,h=35,onclick=button_click2)
led_value=u_gui.draw_text(text="关",x=65,y=245,font_size=15, color="#0000FF")
fan_value=u_gui.draw_text(text="关",x=155,y=245,font_size=15, color="#0000FF")
door=u_gui.add_button(text="门窗控制",x=75,y=275,w=80,h=35,onclick=button_click3)
door_value=u_gui.draw_text(text="关",x=50,y=275,font_size=15, color="#0000FF")
biaoti.config(origin="center")
servo1 = Servo(Pin((Pin.P0)))
print("舵机 初始化 ok")
print("MQTT ok")
print("MQTT connect ok")
siot.getsubscribe(topic="siot/照明")
siot.getsubscribe(topic="siot/风扇")
siot.getsubscribe(topic="siot/门窗")
angle = 0
servo1.write_angle(0)
time.sleep(3)
ledctl1 = 0
fanctl1 = 0
doorctl = 0
while True:
hum1 = SCI1.get_value1(SCI1.eALL,"Humi_Air")
temp1 = SCI1.get_value1(SCI1.eALL,"Temp_Air")
brightness1 = light.read()
loundness1 = u_audio.sound_level()
TEMP_value.config(text=(str(temp1) + str(SCI1.get_unit0("Temp_Air"))))
HUM_value.config(text=(str(hum1) + str(SCI1.get_unit0("Humi_Air"))))
bright_value.config(text=(str(brightness1) + str("lx")))
Lound_value.config(text=(str(loundness1) + str("分贝")))
if (ledctl1 == 1):
led_value.config(text="开")
else:
led_value.config(text="关")
if (fanctl1 == 1):
fan_value.config(text="开")
else:
fan_value.config(text="关")
if (doorctl == 1):
door_value.config(text="开")
else:
door_value.config(text="关")
time.sleep(0.3)
附件
hacker_2023.08.22
666