这是一个基于行空版M10的工作室物联网红外控制系统。
设计初衷是因为在日常我在工作室中待的时间比较长,每天都需要开灯关灯,开空调关空调,以开关照明桌面照明,比较麻烦,休息下还要需要起身关灯,遥控空调什么的。
另外是想把这个系统做成不同的新课标初中八年级物联网知识点,顺便能给学生做一个演示。
所以将所有的东西都基于图形化来进行设计。
近两年虽说白嫖了DF不少好东西,比如M10扩展板啊,k10,这次的电池板确实解决了我设计的系统一大痛点——没有移动端。虽说有语音识别,但是语音控制在桌面,躺在沙发上就要靠吼。
系统为了降成本,使用了esp8266和自己画的扩展板作为门锁和桌面端的设备,但是这不是DF的8266,是那种13块一块的稀罕货,还好自己爱折腾,做了个df8266和esp8266针脚的对应图,普通数字输出加个传感器啥的也还好用,但这次我想把空调遥控也集成进来,虽说有现成的HA以及类似米家、苹果、点灯一系列更好用的系统,但是我的初衷是做一套图形化的学生能参与设计改造的开放系统,于是再次重操就业玩起了MIND+的用户自定义模块,但是这次有点难度的是过去加传感器,就是一句头文件一句设置或者调用函数。这次需要对8266添加用户自定义模块实现空调系统使用的38Khz的红外发射和接收功能。需要使用到一IR remove这个库。除了库文件以外,还要使用它自定好的一些函数,Mind+添加自定义用户模块,main.ts里,添加全局变量,需要在include中添加。
运行SIOT服务器,也有彩蛋,服务器掉线问题悬而未决。
系统分为
1. SIoT服务器中枢
核心设备: M10主机
功能:WIFI热点和SIOT服务器
通信协议: MQTT/HTTP
2. 移动控制终端
设备: M10 + 电池扩展板
功能: 移动遥控器 状态监控 紧急控制
3. 红外控制系统
ESP8266主控 红外发射电路板
控制对象:
空调
安装位置: 桌面
4. 智能门禁系统
门锁部分: ESP8266电子锁体
识别部分: K10人脸识别模组
联动功能: 门禁自动亮灯
5. 照明系统
桌面照明:
ESP8266 调光模块
室内照明:
ESP8266 86底盒安装
6. 网络拓扑
通信架构: 星型网络
MQTT协议













所有设备都连接到这个M10热点,并且连接它这SIOT服务器,在服务器中建了有四个主题,分别是门禁的,灯的,空调的。移动端可以使用按键的方式进行开门、关门、开灯、关灯这些操作。桌面可以使用语音方式进行开灯、关灯以及一些简单的命令还在不断的完善中。







门锁的板子上出现一个问题,就是在演示的过程中使用小舵机是没有问题的,但是一旦换了打舵机,可能是电流的问题导致系统会重启。所以。又重新改了电路,将这个基于这个IP5306的这个电池管理芯片直接输出到舵机,做了一个充电充电和电池自放电的这样一个电源切换。


程序部分过于简单,直接看图吧。
M10 和电池板还有扩展板组装后自己画了个外壳,只保留了几个重要按键开关接口,更多的扩展口嫌麻烦没开口。
最后吐槽造物记这个地方编辑文章不方便,要改。
enum XINGHAO {
//% block="GREE"
HIGH,
//% block="MEIDI"
LOW
}
enum COMMAND {
//% block="ON"
HIGH,
//% block="OFF"
LOW
}
//% color="#33CCFF" iconWidth=80 iconHeight=30
namespace Irsend {
//% block="初始化D4引脚的红外发射" blockType="command"
export function CHUSHIHUA(parameter: any, block: any) {
Generator.addInclude('IncludeArduino', '#include <Arduino.h>');
Generator.addInclude('IncludeIRremoteESP8266', '#include <IRremoteESP8266>');
Generator.addInclude('IncludeIRsend', '#include <IRsend.h>');
Generator.addInclude(`KIrLed`, `const uint16_t kIrLed = D4;// ESP8266 GPIO pin to use. Recommended: 15 (D8)(df8266-D4).`);
Generator.addInclude(`ButtonState`, `int buttonState = 0;`);
Generator.addSetup(`pinMode`, ` pinMode(D4, OUTPUT);`);
Generator.addInclude(`IRsend`, `IRsend irsend(kIrLed);`);
Generator.addInclude(`greeOn`, `const uint16_t greeOn[279] = {9054, 4422, 716, 1592, 714, 492, 688, 518, 714, 1592, 716, 1590, 716, 1592, 716, 1592, 716, 490, 714, 492, 688, 516, 716, 490, 714, 490, 690, 518, 714, 492, 714, 490, 714, 492, 714, 490, 714, 492, 714, 490, 714, 492, 714, 1592, 714, 490, 714, 490, 716, 488, 716, 490, 714, 490, 714, 492, 714, 492, 714, 1592, 714, 492, 714, 1592, 714, 492, 714, 490, 714, 1594, 714, 492, 712, 19924, 716, 1592, 714, 490, 716, 490, 714, 490, 714, 1592, 714, 490, 714, 492, 714, 492, 714, 490, 714, 492, 714, 492, 714, 490, 714, 492, 714, 492, 712, 492, 716, 490, 716, 492, 712, 492, 714, 492, 714, 492, 714, 490, 716, 490, 714, 492, 712, 490, 716, 490, 714, 492, 714, 490, 716, 492, 714, 490, 714, 490, 716, 1592, 714, 492, 714, 39934, 9052, 4422, 716, 1590, 714, 490, 714, 492, 714, 1590, 716, 1594, 714, 1590, 716, 1592, 716, 490, 714, 492, 714, 490, 714, 492, 688, 518, 714, 492, 716, 488, 714, 492, 714, 492, 714, 492, 714, 490, 714, 490, 714, 490, 714, 1592, 714, 492, 716, 488, 714, 492, 714, 490, 714, 490, 688, 520, 714, 490, 714, 1594, 686, 1618, 688, 1620, 714, 490, 716, 492, 710, 1596, 714, 492, 688, 19952, 712, 490, 714, 490, 714, 492, 712, 492, 714, 490, 716, 490, 714, 492, 716, 490, 714, 492, 712, 492, 712, 494, 714, 492, 686, 516, 712, 496, 664, 540, 686, 518, 688, 518, 688, 518, 662, 542, 664, 542, 664, 1644, 664, 1644, 664, 542, 664, 542, 662, 542, 664, 540, 664, 542, 664, 540, 664, 542, 664, 1644, 710, 1596, 664, 540, 664};`);
Generator.addInclude(`greeOff`, `const uint16_t greeOff[139] = {8948, 4502, 650, 552, 648, 552, 650, 1644, 650, 552, 648, 1648, 648, 1648, 650, 1646, 650, 552, 648, 552, 648, 1646, 650, 552, 648, 1646, 648, 552, 646, 552, 648, 552, 648, 552, 648, 552, 648, 552, 648, 552, 648, 552, 648, 552, 648, 1646, 650, 552, 648, 554, 646, 554, 646, 552, 650, 552, 646, 552, 648, 1648, 648, 550, 650, 1648, 648, 552, 648, 552, 648, 1648, 648, 552, 648, 20010, 652, 1646, 648, 554, 646, 552, 648, 552, 646, 1650, 648, 552, 650, 552, 648, 554, 648, 554, 646, 552, 648, 552, 648, 552, 646, 554, 646, 1650, 650, 550, 648, 554, 650, 552, 648, 552, 648, 552, 648, 552, 648, 552, 648, 552, 648, 552, 648, 554, 648, 554, 646, 552, 648, 552, 648, 1648, 648, 1648, 648, 1648, 648, 554, 648, 1650, 648};`);
Generator.addInclude(`greehotOn`, `const uint16_t greehotOn[279] = {9056, 4420, 716, 490, 716, 490, 716, 1592, 716, 1592, 716, 1592, 714, 1592, 716, 1592, 716, 488, 716, 1592, 716, 490, 714, 490, 716, 1592, 716, 490, 716, 490, 716, 488, 716, 490, 716, 488, 716, 490, 716, 490, 716, 488, 718, 490, 714, 490, 714, 490, 716, 490, 716, 488, 716, 492, 716, 488, 716, 490, 716, 1592, 716, 488, 716, 1592, 714, 490, 716, 490, 716, 1590, 714, 492, 716, 19922, 716, 1592, 716, 488, 716, 490, 714, 490, 716, 1590, 714, 490, 716, 490, 714, 490, 716, 488, 716, 490, 716, 490, 714, 490, 714, 490, 716, 492, 716, 488, 716, 490, 716, 490, 714, 490, 714, 492, 716, 488, 716, 490, 716, 490, 716, 490, 714, 490, 716, 490, 716, 490, 716, 490, 716, 490, 716, 490, 716, 490, 716, 490, 714, 490, 716, 39932, 9058, 4422, 716, 490, 716, 490, 714, 1592, 714, 1592, 716, 1592, 714, 1592, 714, 1592, 716, 490, 714, 1590, 716, 490, 716, 488, 716, 1592, 714, 490, 716, 490, 716, 490, 716, 490, 716, 488, 716, 490, 716, 490, 716, 492, 716, 490, 714, 490, 716, 490, 716, 490, 714, 492, 716, 488, 716, 490, 716, 488, 716, 1592, 716, 1590, 714, 1590, 716, 490, 716, 490, 714, 1592, 716, 490, 714, 19924, 716, 490, 716, 490, 714, 488, 716, 490, 716, 490, 714, 490, 716, 490, 716, 488, 716, 490, 716, 490, 716, 490, 714, 490, 716, 490, 716, 490, 714, 490, 716, 492, 714, 490, 714, 492, 714, 490, 716, 490, 714, 1592, 714, 1592, 714, 492, 714, 490, 714, 492, 714, 490, 714, 490, 714, 492, 716, 490, 714, 1594, 714, 490, 714, 492, 714};`);
Generator.addInclude(`greehotOff`, `const uint16_t greehotOff[279] = {9028, 4446, 688, 518, 716, 490, 714, 1592, 718, 490, 688, 1618, 716, 1590, 716, 1592, 688, 518, 688, 1618, 716, 490, 718, 488, 716, 1592, 716, 490, 716, 490, 716, 490, 688, 518, 714, 490, 716, 490, 714, 490, 716, 490, 688, 518, 688, 516, 716, 490, 688, 516, 716, 490, 716, 490, 716, 490, 714, 490, 716, 1592, 716, 490, 716, 1592, 714, 490, 716, 490, 716, 1590, 716, 490, 716, 19922, 714, 1590, 716, 492, 714, 488, 716, 490, 716, 1592, 716, 490, 716, 488, 716, 490, 716, 490, 716, 490, 714, 490, 716, 490, 716, 490, 716, 490, 716, 490, 714, 490, 716, 490, 716, 490, 716, 490, 714, 490, 716, 492, 714, 488, 716, 490, 716, 490, 716, 490, 716, 490, 716, 490, 714, 490, 716, 490, 716, 490, 716, 488, 716, 1592, 716, 39932, 9052, 4422, 718, 488, 716, 490, 716, 1592, 714, 490, 716, 1592, 714, 1592, 716, 1592, 716, 490, 716, 1590, 718, 490, 716, 488, 716, 1590, 716, 490, 716, 488, 716, 490, 716, 490, 716, 490, 716, 490, 716, 490, 716, 490, 716, 488, 716, 490, 716, 490, 716, 490, 716, 490, 714, 490, 716, 490, 716, 488, 716, 1592, 714, 1592, 718, 1590, 716, 490, 716, 490, 716, 1592, 716, 488, 714, 19924, 714, 488, 716, 490, 716, 490, 716, 490, 716, 490, 716, 490, 716, 488, 718, 488, 714, 490, 714, 490, 716, 490, 716, 490, 714, 490, 714, 490, 716, 490, 714, 490, 716, 490, 716, 490, 714, 490, 716, 490, 716, 1592, 716, 1592, 714, 490, 716, 490, 716, 490, 716, 492, 714, 490, 714, 488, 716, 490, 714, 1592, 714, 492, 714, 1592, 714};`);
Generator.addInclude(`mideahotOn`, `const uint16_t mideahotOn[299] = {4460, 4362, 560, 1600, 560, 520, 560, 1598, 560, 1600, 560, 520, 560, 518, 560, 1600, 558, 520, 560, 520, 560, 1600, 560, 518, 560, 520, 558, 1600, 560, 1600, 560, 518, 560, 1598, 560, 1600, 560, 520, 560, 1600, 558, 1600, 560, 1598, 560, 1600, 560, 1598, 560, 1600, 560, 520, 560, 1598, 560, 518, 560, 520, 560, 520, 560, 520, 558, 520, 560, 518, 560, 520, 560, 1600, 560, 1600, 560, 1598, 562, 1600, 558, 1600, 558, 520, 560, 520, 560, 1600, 560, 520, 560, 520, 560, 520, 506, 574, 506, 574, 506, 1654, 506, 1654, 528, 5240, 4380, 4418, 528, 1630, 530, 550, 528, 1630, 528, 1632, 528, 550, 528, 550, 530, 1630, 578, 502, 578, 504, 574, 1608, 552, 502, 576, 502, 578, 1606, 554, 1582, 578, 500, 580, 1604, 556, 1604, 558, 498, 582, 1580, 580, 1600, 560, 1598, 560, 1598, 562, 1600, 560, 1598, 562, 518, 560, 1598, 562, 520, 560, 520, 560, 518, 560, 518, 562, 518, 560, 520, 560, 520, 560, 1598, 560, 1600, 560, 1600, 560, 1598, 562, 1598, 560, 520, 560, 518, 562, 1600, 560, 518, 560, 518, 560, 520, 560, 520, 560, 518, 560, 1600, 560, 1600, 560, 5210, 4432, 4364, 560, 1602, 558, 1600, 558, 520, 532, 1628, 508, 572, 554, 1604, 554, 524, 556, 1604, 508, 572, 530, 1628, 508, 1652, 508, 572, 554, 524, 508, 1652, 508, 1652, 554, 524, 508, 570, 508, 572, 508, 572, 508, 570, 508, 570, 508, 572, 508, 572, 530, 548, 532, 548, 532, 548, 530, 548, 530, 550, 530, 550, 530, 550, 530, 550, 528, 550, 530, 550, 528, 550, 528, 552, 528, 550, 530, 552, 526, 550, 530, 552, 528, 550, 528, 552, 526, 576, 504, 1632, 528, 1654, 506, 1654, 506, 574, 506, 1632, 528, 1634, 526};`);
Generator.addInclude(`mideahotOff`, `const uint16_t mideahotOff[199] = {4460, 4366, 560, 1600, 560, 520, 560, 1598, 562, 1598, 560, 518, 560, 520, 560, 1600, 560, 518, 560, 520, 560, 1600, 560, 520, 560, 518, 560, 1600, 558, 1598, 562, 518, 562, 1598, 560, 520, 560, 1598, 560, 1598, 562, 1598, 560, 1600, 560, 518, 560, 1600, 560, 1598, 560, 1600, 560, 520, 560, 518, 560, 518, 560, 520, 560, 1600, 560, 518, 560, 520, 560, 1600, 560, 1598, 560, 1600, 560, 520, 560, 518, 560, 520, 560, 520, 560, 518, 560, 518, 560, 520, 560, 518, 560, 1600, 506, 1652, 506, 1654, 506, 1654, 528, 1630, 530, 5240, 4404, 4396, 528, 1630, 528, 552, 528, 1632, 528, 1630, 528, 552, 576, 504, 528, 1630, 576, 504, 576, 504, 576, 1584, 578, 502, 576, 504, 576, 1582, 576, 1582, 580, 500, 580, 1580, 580, 500, 578, 1602, 558, 1602, 558, 1600, 560, 1598, 560, 520, 560, 1600, 560, 1600, 560, 1600, 560, 518, 560, 520, 560, 520, 560, 520, 560, 1600, 560, 518, 560, 518, 560, 1600, 560, 1598, 560, 1600, 560, 520, 560, 518, 560, 518, 560, 520, 560, 520, 560, 520, 560, 520, 560, 518, 560, 1600, 560, 1600, 560, 1602, 558, 1600, 558, 1600, 560};`);
Generator.addCode(`irsend.begin();`);
Generator.addCode(`#if ESP8266`);
Generator.addCode(`Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);`);
Generator.addCode(`#else // ESP8266`);
Generator.addCode(`Serial.begin(115200, SERIAL_8N1);`);
Generator.addCode(`#endif // ESP8266`);
Generator.addCode(`pinMode(14, INPUT);`);
}
//% block="发射[XINGHAO]空调遥控信号[COMMAND]" blockType="command"
//% XINGHAO.shadow="dropdown" XINGHAO.options="XINGHAO"
//% COMMAND.shadow="dropdown" COMMAND.options="COMMAND"
export function FASHE(parameter: any, block: any) {
let XINGHAO = parameter.XINGHAO.code;
let COMMAND = parameter.COMMAND.code;
Generator.addCode(`if (((XINGHAO==String("GREE")) && (COMMAND==String("ON")))) {`);
Generator.addCode(`irsend.sendRaw(greeOn, 279, 38); // Send a raw data capture at 38kHz.`);
Generator.addCode(`Serial.println("midea hot on");`);
Generator.addCode(`delay(500);}`);
Generator.addCode(`if (((XINGHAO==String("GREE")) && (COMMAND==String("OFF")))) {`);
Generator.addCode(`irsend.sendRaw(greeOff, 139, 38); // Send a raw data capture at 38kHz.`);
Generator.addCode(`Serial.println("midea hot off");`);
Generator.addCode(`delay(500);}`);
Generator.addCode(`if (((XINGHAO==String("MEIDI")) && (COMMAND==String("ON")))) {`);
Generator.addCode(`irsend.sendRaw(mideahotOn, 299, 38); // Send a raw data capture at 38kHz.`);
Generator.addCode(`Serial.println("midea hot on");`);
Generator.addCode(`delay(500);}`);
Generator.addCode(`if (((XINGHAO==String("MEIDI")) && (COMMAND==String("OFF")))) {`);
Generator.addCode(`irsend.sendRaw(mideahotOff, 199, 38); // Send a raw data capture at 38kHz.`);
Generator.addCode(`Serial.println("midea hot off");`);
Generator.addCode(`delay(500);}`);
}
}
评论