【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】
天气时钟:天气模块开发、主函数编写
- I2C协议和SPI协议
- I2C(Inter-Integrated Circuit)
- SPI(Serial Peripheral Interface)
- 天气模块
- 心知天气预报使用
- HTTPClient类介绍
- 主要功能
- 常用函数
- 注意事项
- JSON介绍
- deserializeJson函数介绍
- 函数原型
- 参数
- 返回值
- 常见错误
- 注意事项
- 头文件
- cpp文件
- 主函数
上一篇文章,我们已经完成了WiFi模块、OLED模块、NTP模块的编写,本文将先对I2C协议进行相关补充,并且对天气时钟进行收尾。
I2C协议和SPI协议
I2C(Inter-Integrated Circuit)和SPI(Serial Peripheral Interface)是两种常用的串行通信协议,主要用于微控制器与各种外设(如传感器、显示器、存储器等)之间的数据传输。
I2C(Inter-Integrated Circuit)
特点:
- 双线制:I2C使用两根线进行通信:数据线(SDA)和时钟线(SCL)。通过这两根线就可以实现多个设备之间的通信。
- 多主机和多从机:I2C支持多个主设备和多个从设备,主设备可以主动发起通信。
- 地址识别:每个I2C设备都有一个唯一的地址,主设备通过地址来选择要与之通信的从设备。
- 速度:常见的I2C速度为100 kHz(标准模式)和400 kHz(快速模式),某些设备支持更高的速度(如高速模式,最高可达3.4 MHz)。
- 应用场景:适合传感器、EEPROM等低速设备的连接,尤其是在引脚资源有限的情况下使用。
优点:
- 线缆少,连接简单(只需两根线)。
- 支持多个从设备,节省引脚资源。
- 适用于短距离通信。
缺点:
- 速度相对较慢,适合对速度要求不高的应用。
- 由于使用了共享总线,可能会存在总线冲突的问题。
SPI(Serial Peripheral Interface)
特点:
- 多线制:SPI通常使用四根线进行通信:主设备输出(MOSI)、主设备输入(MISO)、时钟线(SCK)和从设备选择(SS)。每个从设备通常需要一个独立的SS线。
- 全双工通信:SPI支持全双工通信,主设备和从设备可以同时发送和接收数据。
- 速度:SPI的速度通常比I2C快,可以达到几MHz到几十MHz,具体取决于设备和连接方式。
- 应用场景:适合需要高速数据传输的设备,如SD卡、显示屏、ADC/DAC等。
优点:
- 速度快,适合对速度要求较高的应用。
- 简单的协议,易于实现。
- 全双工通信,提高了数据传输效率。
缺点:
- 需要更多的引脚,特别是在有多个从设备的情况下。
- 不支持多主机,通常由一个主设备控制多个从设备。
天气模块
心知天气预报使用
使用心知天气预报可以通过自行创建项目的方式,获取私人API和城市等的专属ID,以获取准确的信息,以下是操作流程:
- 点击控制台
- 点击申请添加免费产品
- 产品创建完成后,复制API私钥(私人API)
- 查看产品文档,此处我们功能较简单,使用v3版本即可,找到查看天气预报的网址
可以看到在预报网址上,我们只需要将变量key替换为自己的API_KEY、将变量location修改为对应的城市ID即可;同时我们只查询当天一天的天气,因此变量start应修改为0,变量days应修改为1;由于我们的数据从网站返回,并且返回结果是JSON格式的,因此我们需要对HTTPClient和JSON相关信息进行介绍
HTTPClient类介绍
HTTPClient
是一个用于在嵌入式系统(如Arduino、ESP8266、ESP32等)中进行HTTP通信的库。它提供了简单的接口来发送HTTP请求和接收响应,支持常见的HTTP方法,如GET、POST、PUT、DELETE等。以下是对 HTTPClient
的详细介绍:
主要功能
-
HTTP请求:
- 支持发送GET、POST、PUT、DELETE等HTTP请求。
- 可以与HTTP和HTTPS(SSL/TLS)服务器通信。
-
请求头和参数:
- 可以设置自定义HTTP请求头。
- 支持发送带有参数的请求。
-
响应处理:
- 能够接收和处理HTTP响应,包括响应码和响应体。
- 提供方法来获取响应的内容长度、类型等信息。
-
连接管理:
- 支持持久连接(Keep-Alive)以提高效率。
- 提供方法来管理连接的生命周期。
常用函数
-
begin()
:- 初始化HTTP请求,指定目标URL和WiFiClient。
- 可以重载以支持HTTPS和自定义端口。
-
addHeader()
:- 添加自定义HTTP请求头。
-
GET()
:- 发送HTTP GET请求,返回HTTP响应码。
-
POST()
:- 发送HTTP POST请求,带有可选的请求体。
-
PUT()
:- 发送HTTP PUT请求,带有可选的请求体。
-
DELETE()
:- 发送HTTP DELETE请求。
-
getString()
:- 获取HTTP响应体的内容作为字符串。
-
getStream()
:- 获取HTTP响应体的内容作为流,适合处理大数据。
-
end()
:- 结束HTTP请求,释放资源。
注意事项
- 在使用
HTTPClient
时,确保设备已连接到网络。 - 对于HTTPS请求,可能需要处理SSL证书验证。
HTTPClient
适合在资源受限的嵌入式环境中使用,但在处理大量数据时要注意内存管理。
JSON介绍
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。以下是JSON的主要特点和用途:
-
简单易读:
- JSON使用键值对的形式来表示数据,结构清晰。这使得JSON非常直观,易于理解和使用。
-
轻量级:
- JSON格式简洁,数据量小,适合在网络上传输,尤其是在带宽有限的环境中。
-
广泛支持:
- 几乎所有现代编程语言(如Python、Java、C++、Ruby等)都提供了对JSON的解析和生成支持。
-
数据结构:
- JSON支持多种数据类型,包括字符串、数字、布尔值、数组、对象和null。通过这些基本类型,可以构建复杂的数据结构。
-
互操作性:
- JSON是语言无关的,这意味着不同的系统和应用程序可以使用JSON进行数据交换,而不必担心语言或平台的差异。
-
常见用途:
- JSON常用于Web应用程序中,作为客户端和服务器之间的数据交换格式。它也被广泛用于配置文件、数据存储和API通信中。
以下是一个简单的JSON示例:
{"name": "张三","age": 30,"isStudent": false,"courses": ["数学", "物理"],"address": {"city": "北京","postalCode": "100000"}
}
在这个示例中,JSON对象包含了一个人的基本信息,包括姓名、年龄、是否为学生、所选课程和地址。JSON的结构使得它非常适合表示层次化的数据。
deserializeJson函数介绍
deserializeJson
是 ArduinoJson 库中的一个函数,用于将 JSON 格式的字符串解析为 JSON 文档对象
。该函数是处理 JSON 数据的核心工具,广泛用于嵌入式系统中,以便从网络、文件或其他数据源中读取和解析 JSON 数据。
函数原型
DeserializationError deserializeJson(JsonDocument& doc, const char* input);
DeserializationError deserializeJson(JsonDocument& doc, const String& input);
DeserializationError deserializeJson(JsonDocument& doc, Stream& input);
DeserializationError deserializeJson(JsonDocument& doc, char* input, size_t inputSize);
参数
-
JsonDocument& doc
: 引用一个JsonDocument
对象,用于存储解析后的 JSON 数据
。JsonDocument
可以是StaticJsonDocument
或DynamicJsonDocument
,根据内存管理需求选择。 -
const char* input
: 指向要解析的 JSON 字符串。 -
const String& input
: ArduinoString
对象,包含要解析的 JSON 数据。 -
Stream& input
: ArduinoStream
对象,支持从流中读取 JSON 数据(如串口、网络流等)。 -
char* input, size_t inputSize
: 指向 JSON 数据的字符数组及其大小。
返回值
DeserializationError
: 返回一个DeserializationError
对象,用于指示解析结果。可以通过error.c_str()
获取错误信息。
常见错误
Ok
: 解析成功。InvalidInput
: 输入数据无效或格式不正确。NoMemory
:JsonDocument
的容量不足以存储解析后的数据。
注意事项
- 确保
JsonDocument
的大小足够大,以容纳解析后的数据。 StaticJsonDocument
使用静态内存分配,适合内存受限的环境;DynamicJsonDocument
使用动态内存分配,适合需要处理大数据的场合。- 在解析复杂或嵌套的 JSON 数据时,合理设置
JsonDocument
的容量非常重要,以避免NoMemory
错误。
头文件
#ifndef WEATHER_H
#define WEATHER_H#include <Arduino.h>
#include <ESP8266HTTPClient.h> // 导入HTTPClient头文件
#include <ArduinoJson.h> // 导入Json相关头文件#define WEATHER_API_KEY "SmH8mwzAZeMp0KFmr" // 私人API-KEY
#define WEATHER_CITY "WS0E9D8WN298" // 广州的城市ID// 路径中把API-KEY和城市ID挖空替换为%s
#define WEATHER_URL "http://api.seniverse.com/v3/weather/daily.json?key=%s&location=%s&language=zh-Hans&unit=c&start=0&days=1"
// 创建天气信息结构体,用于存储后续获取到的JSON相关数据
struct WeatherInfo{String city; // 城市String weather; // 天气String temp; // 温度String humidity; // 湿度
};void weatherInit(); // 初始化
bool weatherUpdate(); // 更新天气
WeatherInfo weatherGetInfo(); // 获取天气信息
#endif
cpp文件
#include "weather.h"
#include "serial.h"WeatherInfo currentWeather; // 创建天气结构体对象// 初始化天气信息
void weatherInit() {serialPrint("初始化天气模块...");currentWeather.city = "未知";currentWeather.weather = "未知";currentWeather.temp = "0";currentWeather.humidity = "0";serialPrint("初始化天气模块完成");
}//
bool weatherUpdate() {serialPrint("正在更新天气信息...");// 构建API请求URLchar url[200];// 拼接路径 要注意理解本函数sprintf(url,WEATHER_URL, WEATHER_API_KEY, WEATHER_CITY);serialPrint("请求URL:" + String(url));// 进行HTTP请求WiFiClient client; // 初始化HTTPClient的时候需要用到HTTPClient http;if(http.begin(client, url)) {serialPrint("开始HTTP请求...");int httpCode = http.GET();serialPrint("HTTP返回码:" + String(httpCode));// 如果接收成功if(httpCode == HTTP_CODE_OK) {// 获取数据包参数并转成字符串String payload = http.getString();// 定义参数,用于存储处理成文档对象后的JSON字符串DynamicJsonDocument doc(1024);// 解析JSON包DeserializationError error = deserializeJson(doc, payload);// 若没有错误,则解析成功if(!error){JsonObject results_0 = doc["results"][0]; // 将最外层Json对象拆出,得到包含location和daily的对象JsonObject location = results_0["location"]; // 找出地址JsonArray daily = results_0["daily"]; // 找出日期JsonObject today = daily[0]; // 第一个元素就是今天的所有信息// 只要获取到的今天不为空if(!today.isNull()){// 把非String类型的全部转换成String类型// 找出城市名,阴晴状况,最高温和湿度currentWeather.city = location["name"].as<String>();currentWeather.weather = today["text_day"].as<String>();currentWeather.temp = today["high"].as<String>();currentWeather.humidity = today["humidity"].as<String>();// 在串口监视器输出,方便调试serialPrint("城市:" + currentWeather.city);serialPrint("天气:" + currentWeather.weather);serialPrint("温度:" + currentWeather.temp);serialPrint("湿度:" + currentWeather.humidity);// 释放HTTP资源http.end();return true;} else { // 如果今天的数据为空serialPrint("JSON解析失败,找不到今日天气数据");}} else { // 如果JSON包解析错误,在串口监视器打印错误信息serialPrint("JSON解析错误:" + String(error.c_str()));}}// 释放HTTP资源http.end();}serialPrint("天气更新失败");return false;
}// 获取当前天气数据
WeatherInfo weatherGetInfo() {return currentWeather;
}
处理JSON字符串的时候用到了很多个JsonObject和JsonArray变量,这是由我们获取到的JSON文档对象和我们想要获取到的数据所决定的,为了方便理解,以下展示接收到的数据:
用JSON转换工具看得更加清晰,代码最终获取到了name(城市名),text_day(阴晴状况),high(最高温),humidity(湿度)的数据
测试结果
主函数
所有的功能都已经实现完毕,在主函数中只要调用这些函数即可。对于天气情况的获取,我设置了每10分钟更新一次、对于屏幕显示,设置为每秒更新一次。
#include <Arduino.h>
#include <Wire.h>
#include "serial.h"
#include "wifi.h"
#include "oled.h"
#include "ntp.h"
#include "weather.h"// 显示所有信息(时间日期和天气)
// 在OLED屏幕上显示三行信息:
// 1. 日期和时间
// 2. 温度和湿度
// 3. 天气和城市
void showAllInfo() {u8g2.clearBuffer();// 第一行:日期和时间u8g2.setCursor(0, 16);u8g2.print(ntpGetDate() + " " + ntpGetTime());// 第二行:温度和湿度u8g2.setCursor(0, 35);u8g2.print("温度 " + weatherGetInfo().temp + "°C");u8g2.setCursor(70, 35);u8g2.print("湿度 " + weatherGetInfo().humidity + "%");// 第三行:天气和城市u8g2.setCursor(0, 55);u8g2.print(weatherGetInfo().weather);u8g2.setCursor(70, 55);u8g2.print(weatherGetInfo().city);u8g2.sendBuffer();
}// 同步网络服务(WiFi、NTP、天气)
// return: 同步是否全部成功
bool syncNetworkServices() {if (wifiConnect()) {oledClear();oledShow(0, 16, "WiFi连接成功");oledShow(0, 32, "SSID: " + String(WiFi_SSID));oledShow(0, 48, "IP: " + WiFi.localIP().toString());delay(1000);} else {oledClear();oledShow(0, 16, "WiFi连接失败");oledShow(0, 32, "SSID: " + String(WiFi_SSID));return false;}// 初始化并同步NTP时间oledClear();oledShow(0, 16, "正在同步网络时间...");if (!ntpSync()) {serialPrint("NTP同步失败,请检查网络连接");}delay(1000);// 初始化天气模块oledClear();oledShow(0, 16, "正在获取天气信息...");if (!weatherUpdate()) {serialPrint("天气信息获取失败");}delay(1000);return true;
}// Arduino启动初始化
void setup() {// 初始化各个模块serialInit(115200);serialPrint("系统启动");oledInit();oledShow(0, 16, "系统启动中...");oledShow(0, 32, "正在初始化WiFi...");wifiInit();ntpInit(); // NTP初始化weatherInit(); // 天气模块初始化oledShow(0, 48, "正在连接WiFi...");oledShow(0, 64, "SSID: " + String(WiFi_SSID));syncNetworkServices();
}// Arduino主循环
void loop() {// 检查WiFi连接状态if (WiFi.status() != WL_CONNECTED) {serialPrint("WiFi连接断开,尝试重连");oledClear();oledShow(0, 16, "WiFi已断开,重连中...");oledShow(0, 32, "SSID: " + String(WiFi_SSID));syncNetworkServices(); // 重新同步网络服务}if (WiFi.status() == WL_CONNECTED) {static uint32_t lastWeatherUpdate = 0; // 最后一次更新天气的时间static uint32_t lastDisplayUpdate = 0; // 最后一次更新显示的时间uint32_t currentMillis = millis(); // 获取当前时间戳// 每10分钟更新一次天气if (currentMillis - lastWeatherUpdate >= 600000) {if (weatherUpdate()) {showAllInfo();}lastWeatherUpdate = currentMillis;}// 每秒更新一次显示if (currentMillis - lastDisplayUpdate >= 1000) {showAllInfo();lastDisplayUpdate = currentMillis;}}}
运行结果
至此天气时钟的制作已全部完成。回顾整个流程,我们连接了硬件、开发了串口模块、WiFi模块,对于调试和网络部分有了更深入的了解;学习了能够同步时间的NTP库、显示信息的四针OLED屏幕、进行HTTP请求和响应、以及JSON对象的相关处理,通过实践,在这些方面都有了更深刻的认识。
相关文章:
【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】
天气时钟:天气模块开发、主函数编写 I2C协议和SPI协议I2C(Inter-Integrated Circuit)SPI(Serial Peripheral Interface) 天气模块心知天气预报使用HTTPClient类介绍主要功能常用函数注意事项 JSON介绍deserializeJson函…...
简单的SQL语句的快速复习
语法的执行顺序 select 4 字段列表 from 1 表名列表 where 2 条件列表 group by 3 分组前过滤 having 分组后过滤 order by 5 排序字段列表 limit 6 分页参数 聚合函数 count 统计数量 max 最大值 min 最小值 avg 平均 sum 总和 分组查询使…...
跟李沐学AI:视频生成类论文精读(Movie Gen、HunyuanVideo)
Movie Gen:A Cast of Media Foundation Models 简介 Movie Gen是Meta公司提出的一系列内容生成模型,包含了 3.2.1 预训练数据 Movie Gen采用大约 100M 的视频-文本对和 1B 的图片-文本对进行预训练。 图片-文本对的预训练流程与Meta提出的 Emu: Enh…...
Rust 所有权特性详解
Rust 所有权特性详解 Rust 的所有权系统是其内存安全的核心机制之一。通过所有权规则,Rust 在编译时避免了常见的内存错误(如空指针、数据竞争等)。本文将从堆内存与栈内存、所有权规则、变量作用域、String 类型、内存分配、所有权移动、Cl…...
基于人脸识别的课堂考勤系统
该项目是一个基于人脸识别的课堂考勤系统,使用Python开发,结合了多种技术实现考勤功能。要开发类似的基于人脸识别的考勤系统,可参考以下步骤: 环境搭建:利用Anaconda创建虚拟环境,指定Python版本为3.8&am…...
Deepseek R1 本地化部署指南:跨平台实战
引言 Deepseek R1 作为一款强大的本地化人工智能工具,支持在多种操作系统上部署,满足开发者和企业私有化运行的需求。本文将手把手教你如何在 Windows、Linux 和 macOS 系统上完成 Deepseek R1 的本地化部署,并附赠常见问题解决技巧! © ivwdcwso (ID: u012172506) 1…...
Nginx 运维开发高频面试题详解
一、基础核心问题 原文链接:https://blog.csdn.net/weixin_51146329/article/details/142963853 1、什么是Nginx? Nginx 是一个高性能的 HTTP 和反向代理服务器,它以轻量级和高并发处理能力而闻名。Nginx 的反向代理功能允许它作为前端服务…...
JVM运行时数据区域-附面试题
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是 依赖用户线程的启动和结束而建立和销毁。 1. 程序计…...
DeepSeek本地部署详细指南
DeepSeek本地部署详细指南 随着人工智能技术的飞速发展,本地部署大模型的需求也日益增加。DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私。以下是…...
Debian 10 中 Linux 4.19 内核在 x86_64 架构上对中断嵌套的支持情况
一、中断嵌套的定义与原理 中断嵌套是指在一个中断处理程序(ISR)正在执行的过程中,另一个更高优先级的中断请求到来,系统暂停当前中断处理程序,转而处理新的高优先级中断。处理完高优先级中断后,系统返回到原来的中断处理程序继续执行。这种机制允许系统更高效地响应紧急…...
C语言:深入了解指针1
内存和地址 1. 酒店房间类比内存和地址 场景描述 把计算机的内存想象成一家酒店,每个房间就是一个内存单元,每个房间都有一个唯一的房间号,这个房间号就相当于内存地址。房间里可以存放客人的行李等物品,这些物品就好比存储在内…...
【AI】探索自然语言处理(NLP):从基础到前沿技术及代码实践
Hi ! 云边有个稻草人-CSDN博客 必须有为成功付出代价的决心,然后想办法付出这个代价。 目录 引言 1. 什么是自然语言处理(NLP)? 2. NLP的基础技术 2.1 词袋模型(Bag-of-Words,BoWÿ…...
游戏引擎 Unity - Unity 下载与安装
Unity Unity 首次发布于 2005 年,属于 Unity Technologies Unity 使用的开发技术有:C# Unity 的适用平台:PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域:开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…...
文本复制兼容方案最佳实现落地。
文章目录 一、navigator.clipboard.writeText二、方案落地总结 一、navigator.clipboard.writeText navigator.clipboard.writeText 是一个Web API,它允许网页脚本将文本数据写入用户的系统剪贴板。这个API是异步的,并且设计用于提高安全性和用户体验&a…...
LabVIEW如何高频采集温度数据?
在LabVIEW中进行高频温度数据采集时,选择合适的传感器(如热电偶或热电阻)和采集硬件是关键。下面是一些建议,帮助实现高效的温度数据采集: 1. 传感器选择: 热电偶(Thermocouple)&am…...
AI智慧社区--人脸识别
前端 人脸的采集按钮: 首先对于选中未认证的居民记录,进行人脸采集 前端的按钮 <el-form-item><el-button v-has"sys:person:info" type"info" icon"el-icon-camera" :disabled"ids.length < 0" …...
C++11—右值引用
目录 简介 左值和右值 左值 右值 右值引用 生命周期 引用折叠 实际应用 移动语义 移动构造函数 移动赋值运算符 完美转发 简介 之前我们曾学习过引用叫左值引用,但那是C98的,在C11中新增了一种引用叫右值引用。右值引用主要用于支持移动语…...
Workbench 中的热源仿真
探索使用自定义工具对移动热源进行建模及其在不同行业中的应用。 了解热源动力学 对移动热源进行建模为各种工业过程和应用提供了有价值的见解。激光加热和材料加工使用许多激光束来加热、焊接或切割材料。尽管在某些情况下,热源 (q) 不是通…...
Windows11 不依赖docker搭建 deepseek-R1 1.5B版本(附 Open WebUi搭建方式)
零、前言 过年这几天发现 DeepSeek 非常火,试用了一下发现确实不错。与豆包、kimi、perplexity 这些相比完全不是一个次元的存在,特别是用ta写文章的时候体验非常好。所以试着自己搭一个环境。 一、安装 Ollama和DeepSeek-R1 我的安装方式很简单…...
Error: Expected a mutable image
你的函数用了不支持的图片格式比如我的人脸检测,本来要RGB565我却用JPEG所以报错...
【4Day创客实践入门教程】Day2 探秘微控制器——单片机与MicroPython初步
Day2 探秘微控制器——单片机与MicroPython初步 目录 Day2 探秘微控制器——单片机与MicroPython初步MicroPython语言基础开始基础语法注释与输出变量模块与函数 单片机基础后记 Day0 创想启程——课程与项目预览Day1 工具箱构建——开发环境的构建Day2 探秘微控制器——单片机…...
代码随想录算法训练营Day51 | 101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿
文章目录 101.孤岛的总面积思路与重点 102.沉没孤岛思路与重点 103.水流问题思路与重点 104.建造最大岛屿思路与重点 101.孤岛的总面积 题目链接:101.孤岛的总面积讲解链接:代码随想录状态:直接看题解了。 思路与重点 nextx或者nexty越界了…...
网络基础
协议 协议就是约定 网络协议是协议中的一种 协议分层 协议本身也是软件,在设计上为了更好的模块化,解耦合,也是设计成为层状结构的 两个视角: 小白:同层协议,直接通信 工程师:同层协议&…...
利用Spring Batch简化企业级批处理应用开发
1. 引言 1.1 批处理的重要性 在现代企业系统中,批处理任务用于处理大量数据,如报表生成、数据迁移、日终结算等。这些任务通常不需要实时响应,但需要高效、可靠地完成。批处理可以显著提高系统性能,减少实时系统的负载,并确保数据的完整性和一致性。 1.2 Spring Batch简…...
Python - pyautogui库 模拟鼠标和键盘执行GUI任务
安装库: pip install pyautogui 导入库:import pyautogui 获取屏幕尺寸: s_width, s_height pyautogui.size() 获取鼠标当前位置: x, y pyautogui.position() 移动鼠标到指定位置(可以先使用用上一个函数调试获取当…...
UE求职Demo开发日志#19 给物品找图标,实现装备增加属性,背包栏UI显示装备
1 将用到的图标找好,放一起 DataTable里对应好图标 测试一下能正确获取: 2 装备增强属性思路 给FMyItemInfo添加一个枚举变量记录类型(物品,道具,装备,饰品,武器)--> 扩展DataT…...
【PyQt】lambda函数,实现动态传递参数
为什么需要 lambda? 在 PyQt5 中,clicked 信号默认会传递一个布尔值(表示按钮是否被选中)。如果我们希望将按钮的文本内容传递给槽函数,需要通过 lambda 函数显式传递参数。 这样可以实现将按钮内容传递给槽函数&…...
Unity 2D实战小游戏开发跳跳鸟 - 跳跳鸟碰撞障碍物逻辑
在有了之前创建的可移动障碍物之后,就可以开始进行跳跳鸟碰撞到障碍物后死亡的逻辑,死亡后会产生一个对应的效果。 跳跳鸟碰撞逻辑 创建Obstacle Tag 首先跳跳鸟在碰撞到障碍物时,我们需要判定碰撞到的是障碍物,可以给障碍物的Prefab预制体添加一个Tag为Obstacle,添加步…...
LeetCode:121.买卖股票的最佳时机1
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:121.买卖股票的最佳时机1 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票…...
DeepSeek-R1 论文. Reinforcement Learning 通过强化学习激励大型语言模型的推理能力
论文链接: [2501.12948] DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 实在太长,自行扔到 Model 里,去翻译去提问吧。 工作原理: 主要技术,就是训练出一些专有用途小模型&…...
SQL索引优化_提高系统响应速度的秘诀
1. 引言 1.1 索引的重要性 在数据库管理系统中,索引是提升查询性能的关键工具。合理的索引设计可以显著减少查询时间,提高系统的响应速度,从而改善用户体验。然而,不恰当的索引使用可能会适得其反,增加写操作的开销并导致性能下降。 1.2 文章目标与结构 本文旨在介绍如…...
MoonBit 编译器(留档学习)
MoonBit 编译器 MoonBit 是一个用户友好,构建快,产出质量高的编程语言。 MoonBit | Documentation | Tour | Core This is the source code repository for MoonBit, a programming language that is user-friendly, builds fast, and produces high q…...
基于微信小程序的酒店管理系统设计与实现(源码+数据库+文档)
酒店管理小程序目录 目录 基于微信小程序的酒店管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员模块的实现 (1) 用户信息管理 (2) 酒店管理员管理 (3) 房间信息管理 2、小程序序会员模块的实现 (1)系统首页 ÿ…...
重生之我在异世界学编程之C语言:深入指针篇(上)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文(1)内置数…...
Unity Shader Graph 2D - 跳动的火焰
在游戏中,火焰是一种常见的特效。通常来讲火焰特效通过粒子系统的方式实现的相对较多,本文将通过Shader Graph的方式来实现一种不同的火焰效果。 那么怎么实现呢 首先创建一个名为Fire的Shader Graph文件,然后创建一个名为M_Fire的材质球。 …...
CoRAG 来自微软与人大的创新RAG框架技术
微软与人大合作开发的CoRAG(Chain-of-Retrieval Augmented Generation)是一种创新的检索增强生成(RAG)框架,旨在通过模拟人类思考方式来提升大语言模型(LLM)在复杂问题上的推理和回答能力。以下是对CoRAG的深度介绍: 1. CoRAG的核心理念 CoRAG的核心思想是通过动态调…...
MySQL的GROUP BY与COUNT()函数的使用问题
在MySQL中,GROUP BY和 COUNT()函数是数据聚合查询中非常重要的工具。正确使用它们可以有效地统计和分析数据。然而,不当的使用可能会导致查询结果不准确或性能低下。本文将详细讨论 GROUP BY和 COUNT()函数的使用方法及常见问题,并提供相应的…...
DS常识问答:人民币升值贬值是什么回事
好的!我用一个简单的比喻来解释,就像用苹果换橘子一样: 1. **汇率是什么?** 假设你有人民币,别人有美元。汇率就是你们交换的“价格”。比如今天1美元能换7块人民币,明天可能变成7.5块或者6.5块&…...
docker直接运行arm下的docker
运行环境是树莓派A 处理器是 arm32v6 安装了docker,运行lamp 编译安装php的时候发现要按天来算,于是用电脑vm下的Ubuntu系统运行arm的docker 然后打包到a直接导入运行就可以了 第一种方法 sudo apt install qemu-user-static 导入直接运行就可以了…...
机器学习--概览
一、机器学习基础概念 1. 定义 机器学习(Machine Learning, ML):通过算法让计算机从数据中自动学习规律,并利用学习到的模型进行预测或决策,而无需显式编程。 2. 与编程的区别 传统编程机器学习输入:规…...
人机交互系统实验三 多通道用户界面
实验目的和要求 1)了解常见的多通道用户界面 2)查找资料,熟悉一种多通道用户界面并写出综述 实验环境 Windows10 实验内容与过程 (一) 实验内容: 要求上网查找资料,熟悉一种多通道用户界面并写出综述,可以是眼动跟踪、手势识别、 三维…...
Python(Pandas)数据分析学习
1.Pandas基本构成 引入Pandas import pandas as pd 1.Series 行 对应Excel中的一行数据,一维数据 定义Series # 第一个参数是具体数据 # 第二个参数的对应的索引下标 # 第三个参数的行名称 data pd.Series([1,2,3,4,5], index[a,b,c,d,e], namedata) print(d…...
JavaScript系列(53)--内存管理与垃圾回收机制详解
JavaScript内存管理与垃圾回收机制详解 🧹 今天,让我们深入探讨JavaScript的内存管理与垃圾回收机制。理解这些机制对于编写高性能、无内存泄漏的JavaScript应用至关重要。 内存管理基础概念 🌟 💡 小知识:JavaScrip…...
每日一题——用两个栈实现队列
用两个栈实现队列 题目描述数据范围示例 代码实现1. 代码思路push 操作:pop 操作: 2. 代码实现3. 代码解析4. 时间复杂度与空间复杂度 总结 题目描述 用两个栈来实现一个队列,使用 n 个元素来完成 n 次在队列尾部插入整数(push)和 n 次在队列…...
DeepSeek与OpenAI:谁是AI领域的更优选择?
在人工智能领域,DeepSeek和OpenAI是两个备受瞩目的玩家。尽管OpenAI凭借其强大的GPT系列模型在全球范围内获得了广泛的认可,但DeepSeek凭借其独特的技术优势和创新理念,正在逐渐成为许多企业和开发者的新选择。本文将对DeepSeek和OpenAI进行详…...
【爬虫】JS逆向解决某药的商品价格加密
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据开发、数据分析等。 🐴欢迎小伙伴们点赞👍🏻、收藏⭐️、…...
deepseek v3 搭建个人知识库
目录 deepseek-r1本地部署,这个比较好,推荐 Chatbox连接ollama服务 知乎教程,需要注册: deepseek-r1本地部署,这个比较好,推荐 公司数据不泄露,DeepSeek R1本地化部署web端访问个人知识库搭建…...
ETCD集群证书生成
安装cfssl工具配置CA证书请求文件创建CA证书创建CA证书策略配置etcd证书请求文件生成etcd证书 继续上一篇文章《负载均衡器高可用部署》下面介绍一下etcd证书生成配置。其中涉及到的ip地址和证书基本信息请替换成你自己的信息。 安装cfssl工具 下载cfssl安装包 https://github…...
【软件测试项目实战】淘宝网订单管理功能
一、测试功能模块分析 选择淘宝网订单管理功能进行测试,核心子功能包含: 订单创建(商品结算、地址选择)订单状态变更(待付款、已付款、已发货、已收货、退款中)订单修改(地址修改、商品数量修…...
扩散模型(一)
在生成领域,迄今为止有几个主流的模型,分别是 GAN, VAE,Flow 以及 Diffusion 模型。 GAN:GAN 的学习机制是对抗性学习,通过生成器和判别器的对抗博弈来进行学习,这种竞争机制促使生成器不断提升生成能力&a…...