项目来源:
六年级跨学科主题学习,结合信息科技新课标中的小型系统模拟中的小型安全系统。设计了“智能绿色节能教室”。
项目简介:
在“智能绿色节能教室”项目中,学生将使用K10行空板自带的温度传感器在SIOT物联网平台上监控环境温度,并且显示在k10行空板上;同时也将环境光传感器采集的数据以及LED状态在siot平台以及屏幕上进行显示。根据环境光对灯补光进行控制,同时对教室中的灯光进行远程监控,减少电能损耗。结合行空板中自带的语音识别人工智能技术,对安全教育方面的知识,采用图像与文字结合以及语音合成的方式进行科普。
项目知识点:
结合新课标内容,通过项目学习,知识点如下:
1. 通过体验项目,了解过程控制中的输入、计算、和输出三个环节。
2. 理解智能绿色节能教室这个大系统中的三个小系统:环境光控制灯;语音控制显示屏内容输出以及语音合成输出;采用物联网方式远程发送指令控制灯的开关。
3. 通过对该项目的体验分析,了解反馈是过程与控制中的重要手段,初步了解反馈对系统优化的作用。
4. 通过对环境光以及温度数据的采集,了解系统的输入与输出可以是连续量,同时了解连续量可以经由阈值判断形成开关量;通过物联网信息发送,了解系统的输入与输出可以是开关量。
5. 通过项目学习,了解计算机可以用于实现过程与控制,能够在实验系统中通过编程可以验证过程与控制系统的设计。
项目原理:
六年级的过程与控制抽象包含为:输入、计算和输出。
智能光照反馈系统如下:
环境光控制灯
人工智能语音输入知识科普
基于siot物联网平台控灯
硬件连接如下:
智能绿色节能教室控制流程图如下:
环境光控制灯
Siot控灯
程序编写如下:
程序MQTT初始化,初始化语音识别
显示屏对温度和光照以及LED数据显示状态初始化
语音唤醒设置
定义地震避险
定义火灾逃生
定义补光灯亮灯
定义siot控灯
/*!
* MindPlus
* esp32s3bit
*
*/
#include "asr.h"
#include <DFRobot_Iot.h>
#include "unihiker_k10.h"
#include "arduino_image_cache.h"
// 动态变量
String mind_s_kaiguan;
volatile float mind_n_ShiJian;
// 函数声明
void obloqMqttEventTeqc3l(String& message);
void DF_HuoZaiTaoSheng();
void DF_DiZhenBiXian();
void DF_ZiDongLiangDeng();
// 静态常量
const MsgHandleCb msgHandles[5] = {NULL,obloqMqttEventTeqc3l,NULL,NULL,NULL};
const String topics[5] = {"siot/风扇","siot/LED","siot/光照","siot/温度",""};
// 创建对象
DFRobot_Iot myIot;
UNIHIKER_K10 k10;
uint8_t screen_dir=2;
ASR asr;
AHT20 aht20;
// 主程序开始
void setup() {
myIot.setMqttCallback(msgHandles);
k10.begin();
pinMode(P1, OUTPUT);
k10.initScreen(screen_dir);
k10.creatCanvas();
asr.asrInit(CONTINUOUS, CN_MODE, 6000);
while(asr._asrState == 0){delay(100);}
asr.setAsrSpeed(2);
mind_s_kaiguan = "off";
myIot.wifiConnect("ChangyanTCH", "iFlytek1234");
myIot.init("192.168.1.200","siot","025468387381277324","dfrobot", topics, 1883);
myIot.connect();
k10.canvas->canvasText("WiFi连接成功", 1, 0x0000FF);
k10.canvas->updateCanvas();
asr.addASRCommand(0+1, "huo zai tao sheng");
asr.addASRCommand(1+1, "di zhen bi xian");
mind_n_ShiJian = 0;
}
void loop() {
if (((millis() - mind_n_ShiJian)>1000)) {
mind_n_ShiJian = millis();
myIot.publish(topic_3, aht20.getData(AHT20::eAHT20TempC), 1);
myIot.publish(topic_2, k10.readALS(), 1);
k10.canvas->canvasText((String("当前灯光状态是:") + String(mind_s_kaiguan)), 0, 0, 0x00FF00, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->canvasText((String("当前环境温度是") + String(aht20.getData(AHT20::eAHT20TempC))), 0, 30, 0x0000FF, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->canvasText((String("当前环境光强度是") + String(k10.readALS())), 0, 60, 0x0000FF, k10.canvas->eCNAndENFont24, 50, true);
k10.canvas->updateCanvas();
}
if (asr.isWakeUp()) {
k10.canvas->canvasText("你可以问我安全相关知识,比如说:", 0, 120, 0xFF6666, k10.canvas->eCNAndENFont16, 50, true);
k10.canvas->canvasText("火灾逃生、地震避险", 0, 140, 0xFF6666, k10.canvas->eCNAndENFont16, 50, true);
k10.canvas->updateCanvas();
}
else {
k10.canvas->canvasText("请唤醒我:“你好,小行”", 0, 120, 0xFF6666, k10.canvas->eCNAndENFont16, 50, true);
k10.canvas->updateCanvas();
}
DF_HuoZaiTaoSheng();
DF_DiZhenBiXian();
DF_ZiDongLiangDeng();
}
// 自定义函数
void DF_HuoZaiTaoSheng() {
if (asr.isDetectCmdID(0+1)) {
k10.canvas->canvasClear();
k10.canvas->canvasDrawBitmap(0,0,240,320,image_data1);
k10.canvas->canvasText("教室和楼道都出现烟雾怎么办 :", 0, 60, 0xFF6666, k10.canvas->eCNAndENFont16, 50, false);
k10.canvas->canvasText("1用湿毛巾或湿纸巾捂住口鼻。", 0, 80, 0xFF6666, k10.canvas->eCNAndENFont16, 50, false);
k10.canvas->canvasText("2弯腰并小步移动向前。", 0, 100, 0xFF6666, k10.canvas->eCNAndENFont16, 50, false);
k10.canvas->canvasText("3向空旷和安全的地方转移。 ", 0, 120, 0xFF6666, k10.canvas->eCNAndENFont16, 50, false);
k10.canvas->canvasText("4烟雾沉积时匍匐撤离。", 0, 140, 0xFF6666, k10.canvas->eCNAndENFont16, 50, false);
asr.speak("教室和楼道都出现烟雾怎么办 ?1 用湿毛巾或湿纸巾捂住口鼻。2 弯腰并小步移动向前。3 向空旷和安全的地方转移。4 烟雾沉积时匍匐撤离。");
k10.canvas->updateCanvas();
delay(12000);
}
}
void DF_DiZhenBiXian() {
if (asr.isDetectCmdID(1+1)) {
k10.canvas->canvasClear();
k10.canvas->canvasDrawBitmap(0,0,240,320,image_data2);
k10.canvas->canvasText("地震发生时在教室怎么办 :", 0, 60, 0xFF0000, k10.canvas->eCNAndENFont16, 50, false);
k10.canvas->canvasText("在老师的指挥下迅速抱头、闭眼,", 0, 80, 0xFF0000, k10.canvas->eCNAndENFont16, 50, false);
k10.canvas->canvasText("躲在各自的课桌下,绝不能乱跑或者跳楼;", 0, 100, 0xFF0000, k10.canvas->eCNAndENFont16, 50, false);
k10.canvas->canvasText("地震后,有组织地撤离教室", 0, 120, 0xFF0000, k10.canvas->eCNAndENFont16, 50, false);
k10.canvas->canvasText("到就近的开阔地带避震。", 0, 140, 0xFF0000, k10.canvas->eCNAndENFont16, 50, false);
asr.speak("在老师的指挥下迅速抱头、闭眼,躲在各自的课桌下,绝不能乱跑或者跳楼;地震后,有组织地撤离教室,到就近的开阔地带避震。");
k10.canvas->updateCanvas();
delay(12000);
}
}
void DF_ZiDongLiangDeng() {
if ((k10.readALS()<90)) {
digitalWrite(P1, HIGH);
}
else {
digitalWrite(P1, LOW);
}
}
// 事件回调函数
void obloqMqttEventTeqc3l(String& message) {
mind_s_kaiguan = message;
if ((mind_s_kaiguan==String("on"))) {
k10.rgb->write(-1, 0x00FFFF);
}
if ((mind_s_kaiguan==String("off"))) {
k10.rgb->write(-1, 0x000000);
}
}
附件
评论