【STM32】【HAL库】遥控关灯1主机
相关连接
【STM32】【HAL库】遥控关灯0 概述
【STM32】【HAL库】遥控关灯1主机
【STM32】【HAL库】遥控关灯2 分机
【STM32】【HAL库】遥控关灯3 遥控器
需求
主机需要以下功能:
- 接收来自物联网平台的命令
- 发送RF433信号给从机
- 接收RF433信号和红外信号
- 驱动舵机动作
方案设计
使用双MCU方案,ESP32C3负责物联网相关通信,STM32负责发送信号给从机和接收RF433的信号,还有舵机控制
本单使用ESP32即可,但手头的RF433的遥控器的协议不是常见的,没找到相关的解码库
而ESP32本人不算熟悉,经过测试没法成功解码,因此使用双MCU方案,后续可能会改进
ESP32与STM32直接使用串口通信
使用巴法云平台作为物联网平台,使用MQTT协议连接
硬件设计
433接收
使用XL700芯片(淘宝)(单价0.52)
电路是数据手册的参考电路,天线使用弹簧天线
433发射
使用XL4456(淘宝)(单价0.47)
电路是数据手册的参考电路,天线使用弹簧天线
esp32
使用ESP32C3(单价10)(也可以使用esp8266模块,但手头无货,故使用这个芯片)
烧录时同时按下两个按键,先松开EN按键 2s以上后在松开Io9按键
stm32
最小系统设计
电源
使用5v电源适配器
只需要在这里转3,3v即可
其余接口
包括控制舵机的接口和红外接口
软件设计
协议
功能 | esp32串口输出代码 | 物联网平台代码 | stm32动作 |
---|---|---|---|
主屋开 | 0xac0000 | H_ON | 操作舵机开灯 |
主屋关 | 0xac00ff | H_OFF | 操作舵机关灯 |
北屋开 | 0xac1100 | N_ON | 将串口代码通过RF433发射 |
北屋关 | 0xac11ff | N_OFF | 将串口代码通过RF433发射 |
南屋开 | 0xac2200 | S_ON | 将串口代码通过RF433发射 |
南屋关 | 0xac22ff | S_OFF | 将串口代码通过RF433发射 |
西屋开 | 0xac3300 | W_ON | 将串口代码通过RF433发射 |
西屋关 | 0xac33ff | W_OFF | 将串口代码通过RF433发射 |
全开 | 0xacff00 | ALL_ON | 分别发送各屋开灯代码 |
全关 | 0xacffff | ALL_OFF | 分别发送各屋关灯代码 |
esp32
环境
这里使用Arduino框架
请自行查询arduino的环境搭建
这里使用了一个第三方库(PubSubClient)来建立MQTT连接
这里提供zip文件(成品的github连接中),自行导入即可
如下图选择添加zip库,添加即可
wifi连接
将esp32设置为sta模式,接入其他wifi
根据wifi的ssid和password接入
如下所示
const char *ssid = "";
const char *password = "";
void setupWifi() {WiFi.mode(WIFI_STA);esp_wifi_set_mac(WIFI_IF_STA, newMACAddress);Serial.println(WiFi.macAddress());Serial.print("Connecting to ");Serial.println(ssid);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi connected.");Serial.println("IP address: ");Serial.println(WiFi.localIP());
}
MQTT
云平台设置
使用的是巴法云的mqtt服务
巴法云设置,传送门
一般的MQTT有这么几个要素
设备id(mqtt_devid),产品id(mqtt_pubid),密钥信息(mqtt_password),主题名(mqtt_topic)
在巴法云中只用了设备ID和主题名(产品ID和密钥为空即可)
#define mqtt_devid "********" //设备ID
#define mqtt_pubid " " //产品ID
#define mqtt_password " " //鉴权信息
const char *mqtt_topic = "ESP32HomeRFLight2";
设备ID是巴法云控制台中的这个红圈里的私钥
主题则是自己建立的主题名
程序
连接函数
巴法云的MQTT连接地址是(bemfa.com),端口号是 9501
MQTT连接,传入链接地址端口,在传入设备信息,主题信息即可
注意设置回调函数(接收到信息时触发)(client.setCallback(callback)😉
void clientReconnect() {while (!client.connected()) //再重连客户端{delay(3000);client.setServer(mqtt_server, 9501); //设置客户端连接的服务器client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息client.subscribe(mqtt_topic);client.setCallback(callback); //设置好客户端收到信息是的回调Serial.println("reconnect MQTT...");if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password)) {Serial.println("connected");} else {Serial.println("failed");Serial.println(client.state());}}
}
//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
void callback(char *topic, byte *payload, unsigned int length)
{}
在回调函数中需要对信息处理
首先把主题信息和数据信息提取出来,转化成string格式(可以用内置函数比较)
String topic_zj = "";String data_zj = "";for (size_t i = 0; i < strlen(topic); i++) {topic_zj += (char)topic[i];}for (size_t i = 0; i < length; i++) {data_zj += (char)payload[i];}
之后根据协议做比较即可
if (!topic_zj.compareTo(mqtt_topic)) {Serial.write(0xac);if (!data_zj.compareTo("H_ON")) {Serial.write(0x00);Serial.write(0x00);} else if (!data_zj.compareTo("H_OFF")) {Serial.write(0x00);Serial.write(0xFF);} else if (!data_zj.compareTo("N_ON")) {Serial.write(0x11);Serial.write(0x00);} else if (!data_zj.compareTo("N_OFF")) {Serial.write(0x11);Serial.write(0xFF);} else if (!data_zj.compareTo("S_ON")) {Serial.write(0x22);Serial.write(0x00);} else if (!data_zj.compareTo("S_OFF")) {Serial.write(0x22);Serial.write(0xFF);} else if (!data_zj.compareTo("W_ON")) {Serial.write(0x33);Serial.write(0x00);} else if (!data_zj.compareTo("W_OFF")) {Serial.write(0x33);Serial.write(0xFF);} else if (!data_zj.compareTo("ALL_ON")) {Serial.write(0xFF);Serial.write(0x00);} else if (!data_zj.compareTo("ALL_OFF")) {Serial.write(0xFF);Serial.write(0xFF);}}
esp32总程序
#include <PubSubClient.h>
#include <WiFi.h>
#include <esp_wifi.h>uint8_t newMACAddress[] = { 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf };
const char *ssid = "K2FeO4";
const char *password = "lxz123ac";
const char *mqtt_server = "bemfa.com"; //onenet 的 IP地址#define mqtt_devid "858e79b6f49d47fb90f2bd9f9ca2d331" //设备ID
#define mqtt_pubid " " //产品ID
#define mqtt_password " " //鉴权信息
const char *mqtt_topic = "ESP32HomeRFLight2";
WiFiClient espClient; //创建一个WIFI连接客户端
PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端char msg_buf[200]; //发送信息缓冲区void setupWifi() {WiFi.mode(WIFI_STA);esp_wifi_set_mac(WIFI_IF_STA, newMACAddress);Serial.println(WiFi.macAddress());Serial.print("Connecting to ");Serial.println(ssid);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi connected.");Serial.println("IP address: ");Serial.println(WiFi.localIP());
}//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
void callback(char *topic, byte *payload, unsigned int length) {String topic_zj = "";String data_zj = "";for (size_t i = 0; i < strlen(topic); i++) {topic_zj += (char)topic[i];}for (size_t i = 0; i < length; i++) {data_zj += (char)payload[i];}if (!topic_zj.compareTo(mqtt_topic)) {Serial.write(0xac);if (!data_zj.compareTo("H_ON")) {Serial.write(0x00);Serial.write(0x00);} else if (!data_zj.compareTo("H_OFF")) {Serial.write(0x00);Serial.write(0xFF);} else if (!data_zj.compareTo("N_ON")) {Serial.write(0x11);Serial.write(0x00);} else if (!data_zj.compareTo("N_OFF")) {Serial.write(0x11);Serial.write(0xFF);} else if (!data_zj.compareTo("S_ON")) {Serial.write(0x22);Serial.write(0x00);} else if (!data_zj.compareTo("S_OFF")) {Serial.write(0x22);Serial.write(0xFF);} else if (!data_zj.compareTo("W_ON")) {Serial.write(0x33);Serial.write(0x00);} else if (!data_zj.compareTo("W_OFF")) {Serial.write(0x33);Serial.write(0xFF);} else if (!data_zj.compareTo("ALL_ON")) {Serial.write(0xFF);Serial.write(0x00);} else if (!data_zj.compareTo("ALL_OFF")) {Serial.write(0xFF);Serial.write(0xFF);}}
}void sendTempAndHumi() {if (client.connected()) {Serial.print("public message:");client.publish("$dp", (uint8_t *)msg_buf, 3); //发送数据到主题$dp}
}//重连函数, 如果客户端断线,可以通过此函数重连
void clientReconnect() {while (!client.connected()) //再重连客户端{delay(3000);client.setServer(mqtt_server, 9501); //设置客户端连接的服务器client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息client.subscribe(mqtt_topic);client.setCallback(callback); //设置好客户端收到信息是的回调Serial.println("reconnect MQTT...");if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password)) {Serial.println("connected");} else {Serial.println("failed");Serial.println(client.state());}}
}void setup() {// put your setup code here, to run once:// rtc_wdt_protect_off();// rtc_wdt_enable();// rtc_wdt_feed();// rtc_wdt_set_time(RTC_WDT_STAGE0, 8000);Serial.begin(115200);setupWifi(); //调用函数连接WIFIdelay(2000);clientReconnect();
}void loop() {// put your main code here, to run repeatedly:if (!WiFi.isConnected()) //先看WIFI是否还在连接{setupWifi();}if (!client.connected()) //如果客户端没连接ONENET, 重新连接{clientReconnect();}client.loop(); //客户端循环检测
}
stm32
相关链接
用到了之前写的几个库
舵机驱动
NEC
RF433
舵机关灯思路
设计思路
需要:
接收RF433信号/红外,根据解码的信号控制舵机
接收来自串口信号,根据信号发送RF433或控制舵机
需要用到的外设及功能
定时器(3个)(红外433解码,合用一个,舵机控制一个,RF433发送的时序控制一个)
串口1个(与esp32通信)
GPIO(5个,后续详细说)
硬件看门狗
HAL初始化
定时器1
用作 红外和RF433解码的计时
需要分频后1us为周期,最大计数无需改变,开启溢出中断
定时器2
用作舵机控制的PWM生成
每隔20us触发一次中断
定时器3
用作RF433信号发射时的计时
分频1us,计数值默认最大即可,开中断
GPIO
LED:用作指示灯,推挽输出即可
GPIO
RF433输出
需要配置为推挽输出(开漏不行)
GPIO
舵机控制信号
配置为开漏浮空(外部接上拉电阻到5V),配置为最高等级(避免复位时让电机出现误动作)
GPIO
RF433输入
配置为边沿中断模式
GPIO
红外输入
配置为下降沿中断模式
注意开两个外部中断的中断设置
串口
开启中断,后面使用空闲中断来接收数据
硬件看门狗
32分频,溢出值4000
每(32/40k*4000=3.2s)触发一次
本程序目的是让程序每3.2s重启一次,因此只在需要操作舵机时喂狗,主循环无喂狗
程序
分为
- 红外和RF433的解码共用了一个定时器,需要做时序控制,让红外有输入时屏蔽RF433,避免出现问题(RF会有幻听,会阶段性输入高低电平)
- 接收来自RF433,串口,红外的数据,在主循环里根据不同的指令做发射信号/控制舵机的动作
中断回调函数(舵机/红外/RF433的驱动)
保存串口数据
调用之前的库文件
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim == &htim1){}else if (htim == &htim2){if (M_EN == 1)Steering_Engine_Action();elseHAL_GPIO_WritePin(Steering_Engine_GPIOx, Steering_Engine_GPIO_Pin, GPIO_PIN_SET);}else if (htim == &htim3){}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin == GPIO_PIN_2) // 433{if (Input_EN == 1)if (IR_NEC_Read_ins == 0)if (RF_READ_OK == 0)RF_Read_Decode();}else if (GPIO_Pin == GPIO_PIN_3) // IR{if (Input_EN == 1)if (IR_NEC_Read_OK == 0)IR_NEC_Read_Decode(air);}
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if (huart == &huart1){Uart1_OK = 1;HAL_UART_Transmit(&huart2, Uart1_Buf, Size, 0xfff);}
}
开关灯控制
详情原理见,传送门
void OPEN()
{M_EN = 1;HAL_IWDG_Refresh(&hiwdg);Steering_Engine_360(0, 30);HAL_Delay(500);HAL_IWDG_Refresh(&hiwdg);Steering_Engine_360(1, 40);HAL_Delay(80);HAL_IWDG_Refresh(&hiwdg);Steering_Engine_Stop();M_EN = 0;
}
void CLOSE()
{M_EN = 1;HAL_IWDG_Refresh(&hiwdg);Steering_Engine_360(1, 30);HAL_Delay(500);HAL_IWDG_Refresh(&hiwdg);Steering_Engine_360(0, 30);HAL_Delay(80);HAL_IWDG_Refresh(&hiwdg);Steering_Engine_Stop();M_EN = 0;
}
主循环内容,根据传入的信息判断
if (RF_READ_OK == 1){HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);Input_EN = 0;if (RF_READ_data[0] == 0xac && RF_READ_data[1] == 0x01 && RF_READ_data[2] == 0x00)OPEN();else if (RF_READ_data[0] == 0xac && RF_READ_data[1] == 0x01 && RF_READ_data[2] == 0xff)CLOSE();HAL_IWDG_Refresh(&hiwdg);RF_READ_data[0] = 0;RF_READ_data[1] = 0;RF_READ_data[2] = 0;RF_READ_OK = 0;Input_EN = 1;HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);}if (IR_NEC_Read_OK == 1){HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);Input_EN = 0;// printf("%02X%02X%02X\r\n", RF_READ_data[0], RF_READ_data[1], RF_READ_data[2]);if (IR_NEC_Read_Dat[0] == 0x4D && IR_NEC_Read_Dat[1] == 0xb2 && IR_NEC_Read_Dat[2] == 0xa3 && IR_NEC_Read_Dat[3] == 0x5C)OPEN();else if (IR_NEC_Read_Dat[0] == 0x4D && IR_NEC_Read_Dat[1] == 0xb2 && IR_NEC_Read_Dat[2] == 0x59 && IR_NEC_Read_Dat[3] == 0xa6)CLOSE();if (IR_NEC_Read_Dat[0] == 0x84 && IR_NEC_Read_Dat[1] == 0xff && IR_NEC_Read_Dat[2] == 0x81 && IR_NEC_Read_Dat[3] == 0x7e)OPEN();else if (IR_NEC_Read_Dat[0] == 0x84 && IR_NEC_Read_Dat[1] == 0xff && IR_NEC_Read_Dat[2] == 0x01 && IR_NEC_Read_Dat[3] == 0xfe)CLOSE();HAL_IWDG_Refresh(&hiwdg);IR_NEC_Read_Dat[0] = 0;IR_NEC_Read_Dat[1] = 0;IR_NEC_Read_Dat[2] = 0;IR_NEC_Read_Dat[3] = 0;IR_NEC_Read_OK = 0;Input_EN = 1;HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);}if (Uart1_OK == 1){Input_EN = 0;HAL_IWDG_Refresh(&hiwdg);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);if (Uart1_Buf[0] == 0xac && Uart1_Buf[1] != 0x00 && Uart1_Buf[1] != 0xFF){for (int i = 0; i < 3; i++)RF433_Buf[i] = Uart1_Buf[i];RF_Write_Send(RF433_Buf);}else if (Uart1_Buf[0] == 0xac && Uart1_Buf[1] == 0x00){if (Uart1_Buf[2] == 0x00)OPEN();else if (Uart1_Buf[2] == 0xff)CLOSE();}if (Uart1_Buf[0] == 0xac && Uart1_Buf[1] == 0xff){// HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);if (Uart1_Buf[2] == 0x00){RF_Write_Send(Data_N_Open);HAL_IWDG_Refresh(&hiwdg);HAL_Delay(300);HAL_IWDG_Refresh(&hiwdg);RF_Write_Send(Data_S_Open);OPEN();}else if (Uart1_Buf[2] == 0xff){RF_Write_Send(Data_N_Close);HAL_IWDG_Refresh(&hiwdg);HAL_Delay(300);HAL_IWDG_Refresh(&hiwdg);RF_Write_Send(Data_S_Close);HAL_IWDG_Refresh(&hiwdg);CLOSE();}}HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);Input_EN = 1;Uart1_OK = 0;HAL_UARTEx_ReceiveToIdle_IT(&huart1, Uart1_Buf, 20);}
注意,串口使用了空闲中断模式,鉴别不同数据帧
成品
另外app开发很简单,百度凑凑就行了,源码同样在GitHub上,请自行查看即可
GitHub
相关文章:
【STM32】【HAL库】遥控关灯1主机
相关连接 【STM32】【HAL库】遥控关灯0 概述 【STM32】【HAL库】遥控关灯1主机 【STM32】【HAL库】遥控关灯2 分机 【STM32】【HAL库】遥控关灯3 遥控器 需求 主机需要以下功能: 接收来自物联网平台的命令发送RF433信号给从机接收RF433信号和红外信号驱动舵机动作 方案设计…...
Java 初始化块
文章目录1、初识初始化块2、实例初始化块和构造器3、类初始化块1、初识初始化块 Java 使用构造器来对单个对象进行初始化操作,使用构造器先完成对整个 Java 对象的状态初始化,然后将 Java 对象返回给程序,从而让该 Java 对象的信息更加完整。…...
超详细讲解长度受限制的字符串函数(保姆级教程!!!)
超详细讲解长度受限制的字符串函数(保姆级教程!!!)长度受限制的字符串函数strncpy函数strncpy函数的使用strncpy函数的模拟实现strncat函数strncat函数的使用strncat函数的模拟实现strncmp函数strncmp函数的使用strncm…...
【c#】c#常用小技巧方法整理(4)——cmd命令提示符,c#调用cmd
CMD命令是一种命令提示符,CMD是command的缩写,位于系统System32的目录下,是大多数Windows操作系统中可用的命令行解释器应用程序。用于执行输入的命令。其中大多数命令通过脚本和批处理文件自动执行任务,执行高级管理功能…...
在项目中遇到的关于form表单的问题
前言 以下内容都是基于element Plus 和 vue3 一个form-item校验两个下拉框 有时候不可避免会遇到需要一个form-item校验两个下拉框的情况,比如: 这种情况下传统的校验已经无法实现,需要通过form表单提供的自定义校验来实现。以上面的必填…...
德国奔驰、博世和保时捷的员工年薪有多少?
点击 欧盟IT那些事 关注我们公告:因企鹅审核规定,本公众号从《德国IT那些事》更名为《欧盟IT那些事》。从职场新人到总裁,一个个盘。位于德国斯图加特的梅赛德斯-奔驰集团及其子公司梅赛德斯-奔驰是世界最知名的汽车制造商之一。奔驰车代表着…...
Mybatis与微服务注册
目录 一,Springboot整合MybatisPlus 创建商品微服务子模块 二,SpringBoot整合Freeamarker 三、SpringBoot整合微服务 &gateway&nginx 整合微服务之商品服务zmall-product 创建并配置网关gateway服务 安装配置SwitchHosts 安装配置Windo…...
JAVA练习47-合并两个有序数组
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、题目-合并两个有序数组 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示:这里可以添加本文要记录的大概内容: 2月11日练习…...
右键菜单管理 - Win系统
右键菜单管理 - Win系统前言软件工具管理右键菜单360右键管理右键管家前言 Windows系统可以借助软件工具对右键菜单进行管理,可对指定的右键菜单进行删除和恢复。下面以Win10系统为例介绍管理方法。 注意:使用本文提及的工具将某软件的右键菜单删除后&…...
背包问题求方案数、具体方案
背包问题求方案数、具体方案01背包问题求体积恰好等于V的方案数完全背包问题求体积恰好等于V的方案数01背包问题求最优选法的方案数完全背包问题求最优选法的方案数01背包问题求具体方案01背包问题求体积恰好等于V的方案数 原题链接AcWing278. 数字组合 考虑状态表示&#x…...
电商导购CPS,淘宝联盟如何跟单实现用户和订单绑定
前言 大家好,我是小悟 做过自媒体的小伙伴都知道,不管是发图文还是发短视频,直播也好,可以带货。在你的内容里面挂上商品,你自己都不需要囤货,如果用户通过这个商品下单成交了,自媒体平台就会…...
【Shell1】shell语法,ssh/build/scp/upgrade,环境变量,自动升级bmc,bmc_wtd,
文章目录1.shell语法:Shell是用C语言编写的程序,它是用户使用Linux的桥梁,硬件>内核(os)>shell>文件系统1.1 变量:readonly定义只读变量,unset删除变量1.2 函数:shell脚本传递的参数中包含空格&am…...
刷题记录:牛客NC208250牛牛的最美味和最不美味的零食
传送门:牛客 题目描述: 牛牛为了减(吃)肥(好),希望对他的零食序列有更深刻的了解,所以他把他的零食排成一列,然后对每一 个零食的美味程度都打了分,现在他有可能执行两种操作&…...
微搭低代码从入门到精通08-轮播容器
我们上一篇讲解了基础布局组件,讲解了普通容器和文本组件的用法,本篇我们继续介绍布局组件。 小程序中经常会有个功能是轮播图展示的功能,多张图片可以顺序进行切换。我们学习使用轮播容器的时候,先考虑切换的图片从哪来…...
分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测
分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测 目录分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测分类效果基本介绍模型描述程序设计参考文献分类效果 基本介绍 1.Matlab实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测&…...
华为10年经验测试工程师,整理出来的python自动化测试实战
前言 全书共分11章,第一章是基础,了selenium家谱,各种组件之间的关系以及一些必备知识。第二章告诉如何开始用python IDLE写程序以及自动化测试环境的搭建。第三章是webdriver API,我花了相当多时间对原先的文档,冗余…...
OpenCV杂谈 - 如何导出图像到内存中其他结构
前言 最近在net环境使用OpenCV,记录些疑难杂点. 一、OpenCV主要结构 Mat 二、Cols,Rows 和 Width,Hight 三、导入\导出到内存中其他结构 四、按矩形 在Mat之间复制 总结 一、OpenCV主要结构 Mat Mat是OpenCV中的主要结构. 主要有两个用途. 1 存储图片信息,2 存…...
Session与Cookie的区别(四)
咖啡寄杯的烦恼 虽然店里生意还可以,但小明无时无刻不想着怎么样发大财赚大钱,让店里的生意变得更好。 他观察到最近好多便利商店开始卖起了咖啡,而且时不时就买一送一或是第二件半价,并且贴心地提供了寄杯的服务。 寄杯就是指说你…...
Linux 文件锁 - fcntl
什么是文件锁? 即锁住文件,不让其他程序对文件做修改! 为什么要锁住文件? 案例,有两个程序,都对一个文件做写入操作。 #include <unistd.h> #include <stdio.h> #include <stdlib.h> …...
CellularAutomata元胞向量机-2-初等元胞自动机MATLAB代码分享
%% 二维元胞自动机%imagesc(a)的色度矩阵a中0->256由蓝变黄% 规则,先把中间点置为1,每一时间每一点如果%周围八个点和为偶数,则变为0,为奇数则变为 1% 颜色控制clc, clearMap [1 1 1; 0 0 0];% [0 0 0] is black, [1 1 1] is …...
OpenStack云平台搭建(6) | 部署Neutron
目录 1.在控制节点登录数据库配置 2.要创建服务证书,完成这些步骤 3.创建网络服务API端点: 4.安装网络组件 5.配置neutron组件 6.配置 Modular Layer 2 (ML2) 插件 7.配置Linuxbridge代理 8.配置DHCP代理 9.配置元数据代理 10.编辑/etc/nova/no…...
Lesson 05.Configuring the Oracle Network Environment
Lesson 05. Configuring the Oracle Network Environment 文章目录Lesson 05. Configuring the Oracle Network Environment1. 监听程序的配置文件有哪些,如何命名,保存在什么位置?2. Oracle 网络的服务名称文件是如何命名的,需要…...
理论五:接口vs抽象类的区别,如何用普通的类模拟抽象类和接口
在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础。比如,我们可以使用接口来实现面向对象的抽象特性、多态特性和基于接口而非实现的设计原则,使用抽象类来实现面向对象的继承特性和模板设计模…...
【Hello Linux】 Linux的权限以及Shell原理
作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍Linux的基础命令 Linux的权限以及Shell原理Shell的运行原理权限Linux中权限的概念如何切换用户如何提升当前操作的权限如何添加信任…...
【STM32】【HAL库】遥控关灯2 分机
相关连接 【STM32】【HAL库】遥控关灯0 概述 【STM32】【HAL库】遥控关灯1主机 【STM32】【HAL库】遥控关灯2 分机 【STM32】【HAL库】遥控关灯3 遥控器 需求 接收RF433和红外信号,根据信号内容控制舵机 硬件设计 主控采用stm32F103c6 STM32 433接收 其他接口 软件设计 接…...
代码随想录算法训练营第27天|● 93.复原IP地址 ● 78.子集 ● 90.子集II
93.复原IP地址 看完题后的思路 典型分割问题略lue略剪枝条件 sub: 1) 不是一位首字母为0 2)大于三位 3)介于0-255之间 4) 当已分割得到3个时,第四个直接从startIndex到末尾就行 代码 ArrayList<String> slist…...
Unity UI合批的问题
今天看到一个问题,主要说的是Unity中的UI资源合批的问题之前一直以为主要和UI资源在Hierarchy中的排列顺序有关,但其实这并不是最主要的,因为Unity会对同一个Canvas下的UI进行排序(注:不同Canvas下的资源是不能够合批的…...
MWORKS--系统建模与仿真
MWORKS--系统建模与仿真1 系统定义特征2 系统研究2.1 特点与原则2.2 方法百度百科归纳同元杠归纳3 系统建模与仿真3.1 系统、模型、仿真的关系3.2 系统建模4 建模方法4.1 方法4.2 一般流程4.3 目的5 仿真方法5.1 方法5.2 流程参考1 系统定义 系统是由相互作用相互依赖的若干组…...
PC端开发GUI
PC端开发GUI 一、搭建PC端环境:常规方式1、Python2、Pycharm二、搭建PC端环境:创建虚拟环境1、创建文件夹存放虚拟环境相关2、配置环境变量3、创建.ui文件4、.ui文件转成.py文件5、打包.py文件来发布.exe一、搭建PC端环境:常规方式 1、Python 注意Python版本不能超过3.9,…...
解读手机拍照的各个参数(拍照时,上面会有6个符号)
1第一个符号是闪光灯符号,如下图所示。有四种模式, 手机的闪光灯分别为关闭、自动、开启和常亮四种状态。 关闭:就是在任何情况下都不会闪光 自动:由手机来判断此时的光线强弱,若手机测光认为光线太弱,则…...
python开发做网站/视频专用客户端app
(Python编写的“情人节”表白软件)情人节到了,首先祝天下有情人终成眷属,Happy Valentines Day! 下面用Python制作一款非常简单的“情人节”表白软件,大体分为以下三个步骤:准备工作:除了Python自带的tkinter库之外&am…...
广州一起做网站/中国科技新闻网
这是一种可以创建多线程消息的函数 使用方法:1,首先创建一个Handler对象 Handler handlernew Handler(); 2,然后创建一个Runnable对象 Runnable runnablenew Runnable(){ Override public void run() { // TODO Auto-generated met…...
农村基本制度建设网站/整站优化 快速排名
一.获取原生DOM的方式 给标签或者属性添加ref属性 1 //1.添加属性 2 <div refshy><div> 3 <Home refhome></Home> 4 //2.获取原始DOM 5 this.$refs.shy 6 //3.组件实例化对象 7 this.$refs.home 使用实例 1 <body>2 <div id"app"&g…...
用php做视频网站的步骤/搜索引擎调词平台价格
会员卡管理系统技术解析(十八)Timer定时监听 在web应用中,有时候客户须要一些定时程序。不须要客户自己去操作。而是由应用程序自行触发(代理)运行某些操作。这个时候监听与定时器的配合使用就基本能够实现这个需求了。网上非常多代码并不完整,水平未到,…...
2014个人网站备案/百度下载app下载安装
万拓单控存储DS1200是万拓推出的新一代基于Intel高性能服务器平台推出的12盘位存储产品,凭借面向云架构的存储操作系统、强大的新一代硬件平台和丰富的智能管理软件,采用WEB GUI管理界面,应用大容量写入缓存、掉电零数据丢失的缓存保护技术和优化的高可靠…...
推荐完善政府网站建设/重庆网站seo服务
1. 内省(Introspection)函数Introspection(内省)程序在运行时检查对象的类型或属性的能力,他允许对象类由程序员操纵。你将会发现introspection 相当有用当你不知道哪一个类后或者方法在设计时需要被执行.Introspection 在 PHP 提供非常有用的能力去检查类(classes)…...