当前位置: 首页 > news >正文

【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)

电路是数据手册的参考电路,天线使用弹簧天线

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YYm9ZLzX-1676130327907)(picture/1.png)]

433发射

使用XL4456(淘宝)(单价0.47)

电路是数据手册的参考电路,天线使用弹簧天线

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F40M8GrJ-1676130327908)(picture/2.png)]

esp32

使用ESP32C3(单价10)(也可以使用esp8266模块,但手头无货,故使用这个芯片)

烧录时同时按下两个按键,先松开EN按键 2s以上后在松开Io9按键

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z0vMwBYL-1676130327910)(picture/3.png)]

stm32

最小系统设计

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1lQqcCy7-1676130327912)(picture/4.png)]

电源

使用5v电源适配器

只需要在这里转3,3v即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iWvjBAGo-1676130327912)(picture/5.png)]

其余接口

包括控制舵机的接口和红外接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePYwmzg1-1676130327913)(picture/6.png)]

软件设计

协议

功能esp32串口输出代码物联网平台代码stm32动作
主屋开0xac0000H_ON操作舵机开灯
主屋关0xac00ffH_OFF操作舵机关灯
北屋开0xac1100N_ON将串口代码通过RF433发射
北屋关0xac11ffN_OFF将串口代码通过RF433发射
南屋开0xac2200S_ON将串口代码通过RF433发射
南屋关0xac22ffS_OFF将串口代码通过RF433发射
西屋开0xac3300W_ON将串口代码通过RF433发射
西屋关0xac33ffW_OFF将串口代码通过RF433发射
全开0xacff00ALL_ON分别发送各屋开灯代码
全关0xacffffALL_OFF分别发送各屋关灯代码

esp32

环境

这里使用Arduino框架

请自行查询arduino的环境搭建

这里使用了一个第三方库(PubSubClient)来建立MQTT连接

这里提供zip文件(成品的github连接中),自行导入即可

如下图选择添加zip库,添加即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1oUTd77Z-1676130327914)(picture/7.png)]

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是巴法云控制台中的这个红圈里的私钥

主题则是自己建立的主题名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BxBbVn7e-1676130327915)(picture/8.png)]

程序

连接函数

巴法云的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为周期,最大计数无需改变,开启溢出中断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LkSXEQuo-1676130327915)(picture/9.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rM7t2myC-1676130327916)(picture/10.png)]

定时器2

用作舵机控制的PWM生成

每隔20us触发一次中断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6fP0vkC-1676130327916)(picture/11.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U7e4YdhY-1676130327917)(picture/12.png)]

定时器3

用作RF433信号发射时的计时

分频1us,计数值默认最大即可,开中断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NK734OrN-1676130327917)(picture/13.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WaVZdcEq-1676130327918)(picture/14.png)]

GPIO

LED:用作指示灯,推挽输出即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wu93asXP-1676130327918)(picture/15.png)]

GPIO

RF433输出

需要配置为推挽输出(开漏不行)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vxdzvUSG-1676130327919)(picture/16.png)]

GPIO

舵机控制信号

配置为开漏浮空(外部接上拉电阻到5V),配置为最高等级(避免复位时让电机出现误动作)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tne6j7oG-1676130327919)(picture/17.png)]

GPIO

RF433输入

配置为边沿中断模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uTchpMON-1676130327920)(picture/18.png)]

GPIO

红外输入

配置为下降沿中断模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l63PeSdI-1676130327921)(picture/19.png)]

注意开两个外部中断的中断设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uu169nDs-1676130327921)(picture/20.png)]

串口

开启中断,后面使用空闲中断来接收数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FTWQvzDw-1676130327921)(picture/21.png)]

硬件看门狗

32分频,溢出值4000

每(32/40k*4000=3.2s)触发一次

本程序目的是让程序每3.2s重启一次,因此只在需要操作舵机时喂狗,主循环无喂狗

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LljvVjOh-1676130327922)(picture/22.png)]

程序

分为

  1. 红外和RF433的解码共用了一个定时器,需要做时序控制,让红外有输入时屏蔽RF433,避免出现问题(RF会有幻听,会阶段性输入高低电平)
  2. 接收来自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 使用构造器来对单个对象进行初始化操作&#xff0c;使用构造器先完成对整个 Java 对象的状态初始化&#xff0c;然后将 Java 对象返回给程序&#xff0c;从而让该 Java 对象的信息更加完整。…...

超详细讲解长度受限制的字符串函数(保姆级教程!!!)

超详细讲解长度受限制的字符串函数&#xff08;保姆级教程&#xff01;&#xff01;&#xff01;&#xff09;长度受限制的字符串函数strncpy函数strncpy函数的使用strncpy函数的模拟实现strncat函数strncat函数的使用strncat函数的模拟实现strncmp函数strncmp函数的使用strncm…...

【c#】c#常用小技巧方法整理(4)——cmd命令提示符,c#调用cmd

CMD命令是一种命令提示符&#xff0c;CMD是command的缩写&#xff0c;位于系统System32的目录下&#xff0c;是大多数Windows操作系统中可用的命令行解释器应用程序。用于执行输入的命令。其中大多数命令通过脚本和批处理文件自动执行任务&#xff0c;执行高级管理功能&#xf…...

在项目中遇到的关于form表单的问题

前言 以下内容都是基于element Plus 和 vue3 一个form-item校验两个下拉框 有时候不可避免会遇到需要一个form-item校验两个下拉框的情况&#xff0c;比如&#xff1a; 这种情况下传统的校验已经无法实现&#xff0c;需要通过form表单提供的自定义校验来实现。以上面的必填…...

德国奔驰、博世和保时捷的员工年薪有多少?

点击 欧盟IT那些事 关注我们公告&#xff1a;因企鹅审核规定&#xff0c;本公众号从《德国IT那些事》更名为《欧盟IT那些事》。从职场新人到总裁&#xff0c;一个个盘。位于德国斯图加特的梅赛德斯-奔驰集团及其子公司梅赛德斯-奔驰是世界最知名的汽车制造商之一。奔驰车代表着…...

Mybatis与微服务注册

目录 一&#xff0c;Springboot整合MybatisPlus 创建商品微服务子模块 二&#xff0c;SpringBoot整合Freeamarker 三、SpringBoot整合微服务 &gateway&nginx 整合微服务之商品服务zmall-product 创建并配置网关gateway服务 安装配置SwitchHosts 安装配置Windo…...

JAVA练习47-合并两个有序数组

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、题目-合并两个有序数组 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 2月11日练习…...

右键菜单管理 - Win系统

右键菜单管理 - Win系统前言软件工具管理右键菜单360右键管理右键管家前言 Windows系统可以借助软件工具对右键菜单进行管理&#xff0c;可对指定的右键菜单进行删除和恢复。下面以Win10系统为例介绍管理方法。 注意&#xff1a;使用本文提及的工具将某软件的右键菜单删除后&…...

背包问题求方案数、具体方案

背包问题求方案数、具体方案01背包问题求体积恰好等于V的方案数完全背包问题求体积恰好等于V的方案数01背包问题求最优选法的方案数完全背包问题求最优选法的方案数01背包问题求具体方案01背包问题求体积恰好等于V的方案数 原题链接AcWing278. 数字组合 考虑状态表示&#x…...

电商导购CPS,淘宝联盟如何跟单实现用户和订单绑定

前言 大家好&#xff0c;我是小悟 做过自媒体的小伙伴都知道&#xff0c;不管是发图文还是发短视频&#xff0c;直播也好&#xff0c;可以带货。在你的内容里面挂上商品&#xff0c;你自己都不需要囤货&#xff0c;如果用户通过这个商品下单成交了&#xff0c;自媒体平台就会…...

【Shell1】shell语法,ssh/build/scp/upgrade,环境变量,自动升级bmc,bmc_wtd,

文章目录1.shell语法&#xff1a;Shell是用C语言编写的程序&#xff0c;它是用户使用Linux的桥梁&#xff0c;硬件>内核(os)>shell>文件系统1.1 变量&#xff1a;readonly定义只读变量&#xff0c;unset删除变量1.2 函数&#xff1a;shell脚本传递的参数中包含空格&am…...

刷题记录:牛客NC208250牛牛的最美味和最不美味的零食

传送门:牛客 题目描述: 牛牛为了减&#xff08;吃&#xff09;肥&#xff08;好&#xff09;&#xff0c;希望对他的零食序列有更深刻的了解&#xff0c;所以他把他的零食排成一列&#xff0c;然后对每一 个零食的美味程度都打了分&#xff0c;现在他有可能执行两种操作&…...

微搭低代码从入门到精通08-轮播容器

我们上一篇讲解了基础布局组件&#xff0c;讲解了普通容器和文本组件的用法&#xff0c;本篇我们继续介绍布局组件。 小程序中经常会有个功能是轮播图展示的功能&#xff0c;多张图片可以顺序进行切换。我们学习使用轮播容器的时候&#xff0c;先考虑切换的图片从哪来&#xf…...

分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测

分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测 目录分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测分类效果基本介绍模型描述程序设计参考文献分类效果 基本介绍 1.Matlab实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测&…...

华为10年经验测试工程师,整理出来的python自动化测试实战

前言 全书共分11章&#xff0c;第一章是基础&#xff0c;了selenium家谱&#xff0c;各种组件之间的关系以及一些必备知识。第二章告诉如何开始用python IDLE写程序以及自动化测试环境的搭建。第三章是webdriver API&#xff0c;我花了相当多时间对原先的文档&#xff0c;冗余…...

OpenCV杂谈 - 如何导出图像到内存中其他结构

前言 最近在net环境使用OpenCV,记录些疑难杂点. ​​​ 一、OpenCV主要结构 Mat 二、Cols,Rows 和 Width,Hight 三、导入\导出到内存中其他结构 四、按矩形 在Mat之间复制 总结 一、OpenCV主要结构 Mat Mat是OpenCV中的主要结构. 主要有两个用途. 1 存储图片信息,2 存…...

Session与Cookie的区别(四)

咖啡寄杯的烦恼 虽然店里生意还可以&#xff0c;但小明无时无刻不想着怎么样发大财赚大钱&#xff0c;让店里的生意变得更好。 他观察到最近好多便利商店开始卖起了咖啡&#xff0c;而且时不时就买一送一或是第二件半价&#xff0c;并且贴心地提供了寄杯的服务。 寄杯就是指说你…...

Linux 文件锁 - fcntl

什么是文件锁&#xff1f; 即锁住文件&#xff0c;不让其他程序对文件做修改&#xff01; 为什么要锁住文件&#xff1f; 案例&#xff0c;有两个程序&#xff0c;都对一个文件做写入操作。 #include <unistd.h> #include <stdio.h> #include <stdlib.h> …...

CellularAutomata元胞向量机-2-初等元胞自动机MATLAB代码分享

%% 二维元胞自动机%imagesc(a)的色度矩阵a中0->256由蓝变黄% 规则&#xff0c;先把中间点置为1&#xff0c;每一时间每一点如果%周围八个点和为偶数&#xff0c;则变为0&#xff0c;为奇数则变为 1% 颜色控制clc, clearMap [1 1 1; 0 0 0];% [0 0 0] is black, [1 1 1] is …...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...