【项目介绍】
1.项目来源
物联网(IoT)起源于传媒领域,是信息科技产业的第三次革命。物联网是指通过信息传感设备,按约定的协议,将任何物体与网络相连接,物体通过信息传播媒介进行信息交换和通信,以实现智能化识别、定位、跟踪、监管等功能。
我是甘肃省金昌市的一名信息科技教师,在我们甘肃省教育出版社的七年级信息科技课本中,物联网相关知识被设置到《第三单元 走进物联网世界》这一章节中。物联网作为一个新兴的工程,它实践性很强,涉及的学科和专业知识较复杂,要想更好的开展物联网教学,必须依托新技术和新产品。而蘑菇云公司最近推出了一款,基于物联网解决方案的实用产品——行空板K10,这个产品性价比非常的好,它集成了物联、语音、视频等功能于一体。我有幸入围加入此次活动,通过近几天的学习和摸索,决定配合行空板K10进行物联网可视化大屏的案例制作。

2.项目知识点
贴合新课标中七年级的内容要求,“物联网实践与探索”中开发出一款互联智能设计,设计一款“未来智能场景畅想”项目,核心知识点如下:
(1)物联网的设置。
(2)可视化大屏的设置与实现,
(3)语音功能的实现。
(4)显示功能的实现。
(5)LED灯带、光线传感器、温湿度传感器、舵机、风扇、光敏传感器、空气质量传感器的值测试与显示。
3.项目介绍
第七次人口普查公报结果显示,全国人口中 65 岁及以上人口,占总人口数的13.50%,其中 65岁以上的独居老人人口,占65岁以上老人总数的10.43%。65岁以上老年人的前4大死亡原因分别是呼吸系统疾病、循环系统疾病、肿瘤和意外伤害,而独居老人在面对上述各种疾病或意外伤害时具有更高的死亡率,这说明独居老人具有更大的健康风险。
同时由于老年人生理机能变化,活动量减少,行动不便,缺乏照顾,他们发生意外伤害的可能性随年龄的增长而不断上升,研究表明意外跌倒是我国老年人意外死亡的第一因素,当独居老人发生意外跌倒时,若无法及时得到救助,可能危及生命,导致悲剧的发生。
随着第四次科技革命推动的物联网、信息技术、大数据和云计算等技术的发展,养老服务水平也被极大地提升,部分智能家居技术也被用于养老服务中。基于养老的智能家居服务用于满足老年人安全、独立、健康和援助等需求,在照顾老年人方面发挥着重要作用。
调研市场发现,目前面向老人的监护产品还存在着功能单一、不成系统。从关心独居老人的健康状况出发,本设计为面向独居老人的智能居家监护系统。可以通过语音识别,实现对老人的需求进行自动控制;还能通过物联,进行远程报警和救助。
4. 设计特色
以物联网技术为核心的智能监控系统,通过综合的传感器和智能设备的协作,实现了对室内与室外环境的全面监控和管理,从而为老人提供更加舒适、安全和高效的环境支持。
(1)我们使用语音识别的方式解决独居老人的生活需求,通过行空板K10中的语音识别功能来完成。
(2)通过搭建的物联网平台,进行远程报警与求助功能。
(3)可以行空板K10来了解室内环境,行空板M10了解室外环境情况,并且通过物联网和可视化大屏,进行远程监控与管理功能。
【制作过程】
1.硬件准备
(1)行空板K10

行空板K10是一款专为快速体验和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等人工智能项目。
(2)行空板M10
行空板M10是一款专为Python学习和使用设计的新一代国产开源硬件,采用单板计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。同时,其自带Linux操作系统和Python环境,还预装了常用的Python库。

2. 硬件清单




3.物联设计过程
(1)可视化大屏模拟环境监测大屏。
(2)SIOT2.0物联网平台,存储和物联通信,转发消息。
(3)行空板K10、行空板m10和可视化大屏,两个主控设备与一个监控大屏的共同连接,远程互通信息。

4.程序展示
(1)行空板K10
/*!
* MindPlus
* esp32s3bit
*
*/
#include "asr.h"
#include <DFRobot_Iot.h>
#include "unihiker_k10.h"
#include <Microbit_Motor.h>
#include <DFRobot_NeoPixel.h>
// 静态常量
const String topics[5] = {"siot/温度值","siot/湿度值","siot/光线值","",""};
// 创建对象
Microbit_Motor motorbit;
UNIHIKER_K10 k10;
uint8_t screen_dir=2;
DFRobot_NeoPixel neoPixel_P0;
ASR asr;
DFRobot_Iot myIot;
AHT20 aht20;
// 主程序开始
void setup() {
k10.begin();
pinMode(P1, OUTPUT);
k10.initScreen(screen_dir);
k10.creatCanvas();
asr.setAsrSpeed(2);
asr.asrInit(CONTINUOUS, CN_MODE, 6000);
while(asr._asrState == 0){delay(100);}
motorbit.servo(S2, 0);
k10.setScreenBackground(0x99FF99);
k10.canvas->updateCanvas();
neoPixel_P0.begin(P0, 19);
neoPixel_P0.setBrightness(255);
neoPixel_P0.clear();
asr.addASRCommand(0+1, "kai deng");
asr.addASRCommand(1+1, "guan deng");
asr.addASRCommand(2+1, "kai men");
asr.addASRCommand(3+1, "guan men");
asr.addASRCommand(4+1, "feng shan da kai");
asr.addASRCommand(5+1, "feng shan guan bi");
asr.addASRCommand(6+1, "jiu ming");
Serial.begin(9600);
myIot.wifiConnect("vivo S17 Pro", "123456789");
while (!myIot.wifiStatus()) {}
Serial.println("WIFI连接成功");
myIot.init("192.168.105.248","siot","933184197236687","dfrobot", topics, 1883);
myIot.connect();
while (!myIot.connected()) {}
Serial.println("MQTTT连接成功");
}
void loop() {
if (asr.isDetectCmdID(0+1)) {
neoPixel_P0.setRangeColor(0, 18, 0xFFCC33);
asr.speak("灯已经打开");
}
if (asr.isDetectCmdID(1+1)) {
neoPixel_P0.setRangeColor(0, 18, 0x000000);
asr.speak("灯已经关闭");
}
if (asr.isDetectCmdID(2+1)) {
motorbit.servo(S2, 90);
asr.speak("大门已经打开");
}
if (asr.isDetectCmdID(3+1)) {
motorbit.servo(S2, 0);
asr.speak("大门已经关闭");
}
k10.canvas->canvasText("唤醒词:", 2, 0x000000);
k10.canvas->canvasText(" “你好小新”", 4, 0xFF0000);
k10.canvas->canvasText(" 屋内体感值", 6, 0x000000);
k10.canvas->canvasText((String("温度值:") + String(aht20.getData(AHT20::eAHT20TempC))), 8, 0x0000FF);
k10.canvas->canvasText((String("湿度值:") + String(aht20.getData(AHT20::eAHT20HumiRH))), 10, 0x0000FF);
k10.canvas->canvasText((String("光线值:") + String(k10.readALS())), 12, 0x0000FF);
k10.canvas->updateCanvas();
myIot.publish(topic_0, aht20.getData(AHT20::eAHT20TempC), 1);
myIot.publish(topic_1, aht20.getData(AHT20::eAHT20HumiRH), 1);
myIot.publish(topic_2, k10.readALS(), 1);
if (asr.isDetectCmdID(4+1)) {
digitalWrite(P1, HIGH);
}
if (asr.isDetectCmdID(5+1)) {
digitalWrite(P1, LOW);
}
if (asr.isDetectCmdID(6+1)) {
asr.speak("我摔倒了,快来帮帮我");
}
delay(1000);
}
(2)行空板M10
# -*- coding: UTF-8 -*-
# MindPlus
# Python
import cv2
import siot
import time
from unihiker import GUI
from pinpong.board import Board
from pinpong.board import DHT11
from pinpong.board import NeoPixel
from pinpong.board import Board,Pin
from pinpong.extension.unihiker import *
from pinpong.libs.dfrobot_ens160 import Ens160
import base64
from io import BytesIO
from PIL import Image
# 事件回调函数
def on_message_callback(client, userdata, msg):
if (msg.payload.decode() == "on"):
siot.publish_save(topic="siot/求救信息值", data="")
def button_click1():
buzzer.play(buzzer.DADADADUM,buzzer.Once)
siot.publish_save(topic="siot/求救信息值", data="我需要帮助")
Board().begin()
u_gui=GUI()
siot.init(client_id="41269719478398015",server="192.168.105.248",port=1883,user="siot",password="dfrobot")
siot.connect()
siot.loop()
p_p21_analog=Pin(Pin.P21, Pin.ANALOG)
siot.set_callback(on_message_callback)
def frame2base64(frame):
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = Image.fromarray(frame) #将每一帧转为Image
output_buffer = BytesIO() #创建一个BytesIO
img.save(output_buffer, format='JPEG') #写入output_buffer
byte_data = output_buffer.getvalue() #在内存中读取
base64_data = base64.b64encode(byte_data) #转为BASE64
return base64_data #转码成功 返回base64编码
def base642base64(frame):
data=str('data:image/png;base64,')
base64data = str(frame2base64(frame))
framedata = base64data[2:(len(base64data)-1)]
base642base64_data = data + str(framedata)
return base642base64_data
vd = cv2.VideoCapture()
vd.open(-1)
p_ens160 = Ens160(0x52)
p_ens160.set_pwr_mode(p_ens160.ENS160_STANDARD_MODE)
dht1 = DHT11(Pin((Pin.P23)))
np1 = NeoPixel(Pin((Pin.P24)),8)
np1.brightness(128)
np1.brightness(255)
np1.clear()
u_gui.draw_text(text="面向独居老人",x=50,y=0,font_size=20, color="#000000")
u_gui.draw_text(text="智能居家监护系统",x=10,y=30,font_size=20, color="#000000")
u_gui.draw_text(text="室外监控数据:",x=10,y=80,font_size=15, color="#993399")
u_gui.draw_text(text="温 度 值:",x=10,y=110,font_size=15, color="#0000FF")
u_gui.draw_text(text="湿 度 值:",x=10,y=140,font_size=15, color="#0000FF")
u_gui.draw_text(text="光 线 值:",x=10,y=170,font_size=15, color="#0000FF")
u_gui.draw_text(text="CO2浓度:",x=10,y=200,font_size=15, color="#0000FF")
u_gui.draw_text(text="空气质量:",x=10,y=230,font_size=15, color="#0000FF")
u_gui.draw_text(text="TVOC浓度:",x=10,y=260,font_size=15, color="#0000FF")
u_gui.draw_text(text="远程求助",x=10,y=290,font_size=15, color="#0000FF")
siot.getsubscribe(topic="siot/温度")
siot.getsubscribe(topic="siot/湿度")
siot.getsubscribe(topic="siot/光线")
siot.getsubscribe(topic="siot/co2")
siot.getsubscribe(topic="siot/tvoc")
siot.getsubscribe(topic="siot/空气质量")
siot.getsubscribe(topic="siot/求救信息值")
siot.getsubscribe(topic="siot/按钮")
siot.getsubscribe(topic="siot/摄像头")
while True:
wendu=u_gui.draw_text(text="",x=120,y=110,font_size=15, color="#0000FF")
wendu.config(text=dht1.temp_c())
shidu=u_gui.draw_text(text="",x=120,y=140,font_size=15, color="#0000FF")
shidu.config(text=dht1.humidity())
guangxian=u_gui.draw_text(text="",x=120,y=170,font_size=15, color="#0000FF")
guangxian.config(text=p_p21_analog.read_analog())
co2=u_gui.draw_text(text="",x=120,y=200,font_size=15, color="#0000FF")
co2.config(text=p_ens160.get_eco2())
kongqi=u_gui.draw_text(text="",x=120,y=230,font_size=15, color="#0000FF")
kongqi.config(text=p_ens160.get_aqi())
tvoc=u_gui.draw_text(text="",x=120,y=260,font_size=15, color="#0000FF")
tvoc.config(text=p_ens160.get_tvoc())
u_gui.draw_line(x0=0,y0=290,x1=240,y1=290,width=3,color="#FFCC33")
u_gui.add_button(text="我需要帮助!",x=120,y=290,w=100,h=40,onclick=button_click1)
time.sleep(3)
wendu.remove()
shidu.remove()
guangxian.remove()
co2.remove()
kongqi.remove()
tvoc.remove()
if (p_p21_analog.read_analog() < 1000):
np1.range_color(0,7,0x00FF00)
time.sleep(1)
siot.publish_save(topic="siot/温度", data=dht1.humidity())
siot.publish_save(topic="siot/湿度", data=dht1.humidity())
siot.publish_save(topic="siot/光线", data=p_p21_analog.read_analog())
siot.publish_save(topic="siot/co2", data=p_ens160.get_eco2())
siot.publish_save(topic="siot/空气质量", data=p_ens160.get_aqi())
siot.publish_save(topic="siot/tvoc", data=p_ens160.get_tvoc())
if vd.grab():
ret, grab = vd.read()
siot.publish(topic="siot/摄像头", data=base642base64(grab))
time.sleep(1)
5.总结与反思
这套基于物联网技术设计的面向独居老人的智能居家监护系统充分利用了传感器和嵌入式设备,通过物联网实现环境的智能监控与管理。该系统支持对室内外进行,环境温湿度、光线强弱、空气质量的实时检测和数据采集,确保我们对所处环境有所了解。并且通过语音控制可以实现自动控制灯光的开关、自动控制风扇的开关和大门的开关,方便老人的生活。
评论