esp8266_TFTST7735语音识别UI界面虚拟小助手
文章目录
- 一 实现思路
- 1 项目简介
- 1.1 项目效果
- 1.2 实现方式
- 2 项目构成
- 2.1 软硬件环境
- 2.2 完整流程总结(重点整合)
- (1) 功能逻辑图
- (2) 接线
- (3) 使用esp8266控制TFT屏
- (4)TFT_espI库配置方法
- (5) TFT_esp库常用代码详解
- (6)TFT屏显示图片
- (7) TFT屏显示汉字
- (8) wif联网与HTTP获取时间
- 3 代码实现
- 3.1 不同UI界面
- 3.2 UI切换方法
- 3.3 LooP函数中的内容与优先级
- 3.4 随时间滚动的计划事项
- 3.5 天问代码
- 二 展示
- 1 图片
- 2 视频
- 3 下载
- 3.1 项目下载
- 3.2 arduino esp8266开发板离线包
- 3.3 processin下载
- 3.4 天问BLOCK下载
一 实现思路
摘要:esp8266wifi,HTTP通信,TFT_espI库使用,语音交互系统,从0开始自定义UI界面,防低帧不爆刷
1 项目简介
功能与实现思路
1.1 项目效果
集成了ESP8266开发板,语音识别模块,TFT显示屏和小喇叭,实现了一个语音交互系统,拥有图标菜单和4个交互界面。完全使用语音口令操作,效率很高。有以下基础功能:
(1) 计划管理
这是最主要的功能,可以在TFT屏幕上查看每天、每周和每月
的计划安排,随时随地的查看下一步要做的事情
,不再需要翻阅复杂的计划表。其中存入了周,月,日的具体计划,esp8266会联网获取时间,到时间了自动更新下一步计划内容,且仅在发生变化时更新屏幕,不会爆刷形成低帧率。.看一眼便知道当前时间段应该做什么事
(2) 提醒功能
目前设置了五个固定时间点提醒喝水,通过蜂鸣器的振动提示。任何固定时间
需要提醒的事件,都可以加在里面,形成一个提醒清单。
(3) 打卡功能
这一功能是为了帮助自己,每天高效做一件事,每天坚持一个最重要的习惯
,可以设置打卡内容。
(4) 特殊功能
这里暂时显示一些重要的事件
,比如生日纪念日或节气,或从网络获取一些信息,预留后续开发
本项目最大的特点是,设计了一个UI框架
,把一个TFT屏幕划分为4个界面去利用。不论是直接使用它的计划功能,还是用于修改,都很方便。之所以不用手机app,是因为容易分散注意力,嵌入式产品的一大有点就是功能性强,不掺杂娱乐事项。
1.2 实现方式
(1) esp8266中:
编写主程序即界面框架和功能实现,4个UI界面内容划分在不同的模块
中编写,主函数中仅设计界面交互方
与初始化
必备信息,并且把wifi与HTTP功能也单独划分,主函数逻辑清晰,所有修改接在各自模块中进行。并连接蜂鸣器,提醒事件时会触发蜂鸣器发声。
(2) 天问block中:
在这里,我们主要使用其控制引脚电平的功能,听到说某个 UI界面的名称,通过喇叭说出回复语并控制对应引脚电平发生变化。
这是一个集成好的模块,使用简便,并且官方软件是图形化积木编程(可以随时查看c代码),不过积木封装的不太行,容易遇到各种稀奇古怪的bug。该语音模块主要使用方式为:
听到固定语音指令后
,使用预设好的声音,说出预设好的回复词
。或是听到指令,控制引脚电平发生改变
。该模块本身也可以接入其它简单模块,诸如oled,tft,温湿度,数码管超声波等等,但bug仍比较多,debug还得翻看积木的c代码,只建议简单使用。最大优点仍然在其快捷的语音交互上
(3) 交互原理
天问asr_pro模块检测
到说出了指令
——>asr_pro引脚电平变化(GPIO output)——>连接esp82266与asr_pro引脚——>esp8266检测
到引脚电平
变化(GPIO Iutput)——>切换UI界面/执行其它功能
本质是通过引脚电平信号变化
,串联二者
功能,但对电平稳定要求较高,否则容易波动。(之所以只做4个UI界面,是因为esp8266引脚不不够了,连接TFT就占据了5个个。也可以考虑使用RXTX进行通讯)
2 项目构成
软硬件环境,代码逻辑结构,与事项项目中,会遇到的所有问题与解决方案
2.1 软硬件环境
(1) 软件环境
上传程序:arduino,天问block,
图片转c数组:lcd-image-converter(底部项目文件链接含此软件)
字体编辑:processing
(2) 所需硬件
esp8266(cp2102)+电机扩展板
天问语音识别模块:ASR_PRO
TFTst7735_RGB128*160——8引脚
小喇叭,蜂鸣器
2.2 完整流程总结(重点整合)
从0开始搭建项目中,遇到的所有问题
(1) 功能逻辑图
(2) 接线
TFT | esp8266 |
---|---|
SCL | d5 |
SDA | d7 |
RST | d4 |
DC | d3 |
CS | d8 |
BLK | 背光,可不接 |
V | 3.3v即可 |
G | G |
esp8266 | 天问语音模块 |
---|---|
D0 | A5 |
D6 | A6 |
D1 | A2 |
D2 | A3 |
Tx | 蜂鸣器IO |
天问语音模块 | 接线 |
---|---|
5v5 | 5v (3.3v容易带不动,因为有喇叭) |
G | G |
(3) 使用esp8266控制TFT屏
一般我们从淘宝买的屏幕模块,会自带stm32的测试程序
,或是arduino UNO板
的测试样例和库,但这二者,前者空间较小存不了几个图,后者没有wifi功能,一般也不会送esp8266或者32的库和案例。
所以如何使用esp8266控制tft
就是个问题,解决这个问题我们可以使用一个arduino中可以直接下载的库:TFT_espI
,只需要预先修改User_Setup.h中的一些参数,根据自己屏幕的 驱动如st7735,型号,分辨率等等参数,取消掉一些注释
即可使用。
(4)TFT_espI库配置方法
设置好参数和引脚
,才可以驱动tft屏,打开库文件中的User_Setup.h
,需要修改以下内容:
必要设置
-
step1:44-65行,找到自己tft的
驱动型号
,取消那一行的注释
如我的: #define ST7735_DRIVER -
step2:76-77行,根据自己的屏幕型号,选择
RGB
或 BGR,取消其中一行的注释 -
step3: 85-89行,根据屏幕的
宽和高
型号,取消注释对应代码
如128*160:#define TFT_WIDTH 128 #define TFT_HEIGHT 160 -
step4:在112行以下,找到自己开发板的型号与引脚分布,设置
SPI
与引脚的连接,
( esp8266 :167行以下,esp32: 209行以下)
白屏问题:如TFTST7735,128*160,仍需要在102-111行间,找到对应分辨率的一行取消注释(因为不是同一批制造的)
其余型号,如有问题需自己查找驱动部分代码注释查看解决
如碰到屏幕反色,将116或117其中一行取消注释
其余设置
- 310-321 为库自带字体(一般不需改动)
- 359-372 为SPI频率和触摸屏相关参数
有问题,多看英文注释翻译解释
注意esp8266在arduino中的引脚,以GPIO数字编号为,不是DX
(5) TFT_esp库常用代码详解
1 基本功能
TFT_eSPI tft = TFT_eSPI(); //初始化tft对象
tft.init();
tft.setRotation(0); //屏幕旋转0123: 0 90 180 270
tft.fillScreen(TFT_BLACK);//清屏
tft.setSwapBytes(true);//不加容易颜色异常
tft.pushImage(0,0,128,160,test2);//背景图
tft.loadFont(HGY316); //加载自定义中文字体,设置字体大小对加载的字体无效
2 字体设置
tft.setCursor(0,0); //改字体显示位置
tft.setCursor(0,0,a); //第三参数选择自带字体样式:a=124678
tft.setTextSize(1); //设置文本显示的大小,,对中文字体无效
tft.setTextFont(1); //选择库自带字体:1,2, 4, 6, 7, 8
tft.setTextColor(TFT_GREEN, TFT_BLACK);//字体颜色,字体背景色
tft.println("周一"); //输出中文或字符串,draw没有自动换行tft.drawChar('#', 100, 64, 2); //输出字符(字符,x,y,大小)字符或ascii码都可以
tft.drawNumber(num, 0, 100, 4); //输出数字
tft.drawString("zifucahun", 0, 80, 2);//上传字符串(坐标,大小)
3 常见字体颜色代码:
#define TFT_BLACK 0x0000 /* 0, 0, 0 */
#define TFT_NAVY 0x000F /* 0, 0, 128 */
#define TFT_DARKGREEN 0x03E0 /* 0, 128, 0 */
#define TFT_DARKCYAN 0x03EF /* 0, 128, 128 */
#define TFT_MAROON 0x7800 /* 128, 0, 0 */
#define TFT_PURPLE 0x780F /* 128, 0, 128 */
#define TFT_OLIVE 0x7BE0 /* 128, 128, 0 */
#define TFT_LIGHTGREY 0xD69A /* 211, 211, 211 */
#define TFT_DARKGREY 0x7BEF /* 128, 128, 128 */
#define TFT_BLUE 0x001F /* 0, 0, 255 */
#define TFT_GREEN 0x07E0 /* 0, 255, 0 */
#define TFT_CYAN 0x07FF /* 0, 255, 255 */
#define TFT_RED 0xF800 /* 255, 0, 0 */
#define TFT_MAGENTA 0xF81F /* 255, 0, 255 */
#define TFT_YELLOW 0xFFE0 /* 255, 255, 0 */
#define TFT_WHITE 0xFFFF /* 255, 255, 255 */
#define TFT_ORANGE 0xFDA0 /* 255, 180, 0 */
#define TFT_GREENYELLOW 0xB7E0 /* 180, 255, 0 */
#define TFT_PINK 0xFE19 /* 255, 192, 203 */
#define TFT_BROWN 0x9A60 /* 150, 75, 0 */
#define TFT_GOLD 0xFEA0 /* 255, 215, 0 */
#define TFT_SILVER 0xC618 /* 192, 192, 192 */
#define TFT_SKYBLUE 0x867D /* 135, 206, 235 */
#define TFT_VIOLET 0x915C /* 180, 46, 226 */
(6)TFT屏显示图片
1 想要显示图片,需要将图片转化为c数组
,然后存入头文件中调用显示
显示图片函数为:
tft.pushImage(0,0,128,160,test2);//x1,y1-->x2,y2
2 值得一提,tft屏幕的坐标系与旋转问题:
3 把图片转化为数组步骤(使用lcd-image-converter):
1 准备好分辨率图,可以使用window画图软件
2 导入图片
3 设置参数
4 保存数组
头文件格式:
#pragma once
#include<pgmspace.h>const uint8_t name[] PROGMEM ={ //name可自己设置//放生成的代码
}
4 本项目中计划内容的坐标分配:
(7) TFT屏显示汉字
-
1 c/user/windows/fonts/想用的
字体.ttf
(或网上下)
移动到TFT_espI库/tools/Creat_Smooth_Font/Creat_Font/data目录下 -
2 下载processing软件,打开TFT_eSPI\Tools\Create_Smooth_Font\的
Create_font.pde
进行编辑:
-130行改为自己的ttf字体文件名
-132行选中后缀ttf解注释
-140行设置字体大小(使用中文库:在arduino中不可修改,只有在里可修改) -
3 准备好项目中使用的所有汉字,使用网页在线转换:汉字转Unicode编码
然后可以在记事本中,把所有的\u
替换为,\0x
,删除开头的逗号 -
4 在Create_font.pde
-330行下,把上一步的汉字Unicode编码,粘贴到specificUnicodes
数组中去 -
5 点击precessing 运行按钮,弹窗会显示所有生成的汉字和其余字符
-
6 成功后,回到TFT_eSPI\Tools\Create_Smooth_Font\Create_font\FontFiles目录,
把生成对的字体名.h 头文件
,粘贴到项目文件夹中,然后引用头文件就可以显示中文。
tft.print("内容") 函数输出即可
该步可直接搜b站教程:
如何使用TFT_espI库在tft屏上显示汉字
注:只有生成好的汉字,才能够在TFT屏上显示,否则乱码
(8) wif联网与HTTP获取时间
事先注意:上传代码前,一定查看清楚自己的模块到底是什么型号
若是CP2102,则对应NodeMCU板载ESP-12E
( 4MB Flash) WIFI模组
在arduino中一旦选择错误,wif功能基本报废
,且波特率也对不上
cp2102:应设115200,若设为9600烧录代码会很慢
1 给出cp2102的arduino工具参数图:
2 wifi连接基本操作
led灯显示是否连接成功,闪烁表示正在连接,长亮表示连接成功
#include <ESP8266WiFi.h>
const char *ssid = "....";
const char *pass = "....";int led=14; //wifi连接指示灯D5连接led
void setup() {Serial.begin(115200);WiFi.mode(WIFI_STA); //使用STA模式用8266去连接wifiWiFi.begin(ssid, pass);//等待wifi连接结果while (WiFi.status()!=WL_CONNECTED) {bool is=digitalRead(led);//巧妙反转指示灯digitalWrite(led, !is);Serial.println("....");delay(500);}digitalWrite(led, 1);//成功常亮Serial.println("WiFi 已连接");Serial.println("IP地址为:");Serial.println(WiFi.localIP());}
3 HTTP获取网络时间
使用网址为:http://quan.suning.com/getSysTime.do
显示格式为:{"sysTime2":"2024-12-20 07:59:14","sysTime1":"20241220075914"}
#include <ESP8266HTTPClient.h>
HTTPClient http;
String GetURL="http://quan.suning.com/getSysTime.do"; //获取链接
String res;//回应
void setup() {//需提前连接wifiSerial.begin(115200)//http连接http.setTimeout(5000);//预启动连接,不加也行http.begin(GetURL);//网址
}
void loop() {//连接int httpCode = http.GET();//一个数值,表示连接情况if(httpCode>0){Serial.printf("[HTTP] GET... code: %d\n", httpCode);if (httpCode == HTTP_CODE_OK){ //是否是一个成功的请求//读取响应内容res = http.getString();//得到固定内容Serial.println(res);//可使用substring(a,b)--:显示s[a]~s[b-1]的字符串内容,截取时间delay(300);}}else{Serial.println("HTTP Get ERROR");} http.end();//关闭连接
}
4 因为没有周几的情况,故本项目使用zeller公式,根据年月日计算出周几
注意:
实测定时器内置定时器
Tricker库
法:
-若开机只获取一次时间,然后采用tricker定时器库,每几秒联网更新一次时间
这样容易反复重启
,可能tricker要求调用函数精简,而网络获取不稳定,需要1-2s
或是其它的冲突问题,开发板容易无限重启,最后仍采用在loop中重复获网络时间的方案
3 代码实现
代码模块功能介绍与注意事项
3.1 不同UI界面
项目共有5个界面,可想而知人如果全把代码写在主程序,修改非常不遍,故根据功能将不同的界面写入不同的.c和.h文件,由主函数统一调用,主函数只负责调用写的方法,每个UI的美化与内容设计,都在各自模块中中进行,见下头文件方法:
(1) 计划内容
与wifi_HTTP
头文件:
/*
1 计划界面设计:月,日,周 计划设计函数
2 功能接口函数,便于修改
3 wifi+http获取网络时间
*/
//日期结构体
typedef struct {int year;int mon;//月int day;//日int wk;//周int h;//小时 0-24int m;//分 0-60int s;//秒0-60
}DateTypedef;//tft屏上显示月,日,周 计划信息
void Get_monthPlan(DateTypedef x);//显示月初事项
void Get_weekPlan(DateTypedef x);//显示周信息
void Get_dayPlan(DateTypedef x);//显示日计划
void Get_bottomtime();//显示底部时间数据//网络功能
void WiFiHTTP_init();
void Update_http();//并更新时间数值
(2) 提醒 与 UI界面
头文件:
/*
1 功能:U1-4界面设计
2 提醒事件设计,如:喝水,日期提醒
*///弹出提醒函数,可扩展类似功能
void Remind_water(DateTypedef x);//每日定时喝水,弹出几s//仅查看UI界面函数
void Remind_menu();//UI1
void Remind_warn();//UI2
void Remind_habit(DateTypedef x); //UI3
void Remind_special(DateTypedef x);//UI4
3.2 UI切换方法
功能逻辑为,天问语音模块检测到口令后给对应引脚一个高电平(正常为低),所以在loop中检测对应引脚变化即可。使用UI表示每个界面的编号,0-4,0为计划界面在swith的default分支,1234分别对应:菜单,提醒,打卡,特殊。
值得注意的是:Loop中不要放刷新屏幕数,否则会爆刷
,屏幕帧率会极端低,效果很差。而这里采用了标记法
,记录上一次屏幕UI编号
和本次编号
,只有两次编号不同的时候,说明进行了界面切换,此时才刷新屏幕,然后及时更新两个标记就可以吗,大大减少刷新次数,增加稳定性。
void loop() {Get_freshUI();//更新UI编号,显示不同界面switch (UI){case 1: //U1菜单Remind_menu();UI=0;break;case 2: //U2提醒Remind_warn();UI=0;break;case 3: //U3打卡Remind_habit(wifi_date);UI=0;break;case 4: //U4特殊Remind_special(wifi_date);UI=0;break;default: //计划界面Get_dayPlan(wifi_date);Get_weekPlan(wifi_date); Get_monthPlan(wifi_date);Get_bottomtime();//多久更新一次UI=0;//默认为计划界面}
}
//获取当前口令下的UI编号
int tem=0;//标记上一次UI界面的编号牌
void Get_freshUI(){//不同的口令,在语音模块设置对应引脚电平为高//esp8266读取到高电平信号,更新界面UI值,显示不同界面if(digitalRead(u1_pin)==HIGH)UI=1;if(digitalRead(u2_pin)==HIGH)UI=2;if(digitalRead(u3_pin)==HIGH)UI=3;if(digitalRead(u4_pin)==HIGH)UI=4;if(tem!=UI){tft.fillScreen(TFT_BLACK);//清屏tem=UI; //仅在切换不同界面时更新一次,防低帧爆闪}
}
3.3 LooP函数中的内容与优先级
(1) 网络更新需要放在这里,获取网络时间应立即对本地结构体时间尽心修改
(2) 像闹钟,纪念日,喝水,这种固定时间的时间,需要弹出立刻提醒的,应放在界面切换之上,时间到立刻弹出一段时间,然后自动退出即可。
(3) 更新界面编号的函数,应随时检测引脚电平变化确定口令的有效性
void loop() {Update_http();//从网上获取与更新本地时间Get_freshUI();//更新UI编号,显示不同界面digitalWrite(u5_pin,HIGH);//我的蜂鸣器低电平触发Remind_water(wifi_date);//提醒喝水,所有弹出提醒事件,都是高优先级,不在swith中switch (UI){case 1: //U1菜单Remind_menu();UI=0;break;case 2: //U2提醒Remind_warn();UI=0;break;case 3: //U3打卡Remind_habit(wifi_date);UI=0;break;case 4: //U4特殊Remind_special(wifi_date);UI=0;break;default: //计划界面Get_dayPlan(wifi_date);Get_weekPlan(wifi_date); Get_monthPlan(wifi_date);Get_bottomtime();//多久更新一次UI=0;//默认为计划界面}//测试:快速模拟 时分秒,查看计划// wifi_date.m++;// if(wifi_date.s==60){ wifi_date.s=0; wifi_date.m++;}// if(wifi_date.m==60){ wifi_date.m=0; wifi_date.h++;}// if(wifi_date.h==24){ wifi_date.h=0; wifi_date.wk++; wifi_date.day++;}// if(wifi_date.wk==8) { wifi_date.wk=1; }
}
3.4 随时间滚动的计划事项
(1) 首先我们的时间结构体,存取的是整数值
而非简单的截取显示一段字符串,所以对于网络获取的数据,应对字符串进行准换,保留为整型数据
,
String s;
s[i]-'0' 可得到数字字符代表的整数值
然后通过十进制计算出具体值保留即可(乘以若干10)
(2)涉及时间区间,需要判断一个时间是否在某个区间内,用反向判断更简单:
typedef struct {int year;int mon;//月int day;//日int wk;//周int h;//小时 0-24int m;//分 0-60int s;//秒0-60
}DateTypedef;
//判断当前时间是否在[m1:n1]~[m2:n2]之间,含区间端点
int Set_section(DateTypedef x,int m1,int n1,int m2,int n2){if(x.h<m1||x.h>m2) return 0; //小时超界 else if(x.h==m1&&x.m<n1) return 0; //不到区间左端点 else if(x.h==m2&&x.m>n2) return 0; //超过区间右端点else{return 1; }
}
(3)最后一个问题
每一步计划的更新,应该是在某一秒到达计划时间后,更新一次,而不是反复的刷新屏幕,那样会降低帧率,效果极差,同上,我们依旧使用标记法,这次是对所有的计划事件编号,两个标记,本次时间与上次事件(万能的flag)
如不刷新屏幕,会有字体重叠显现出现
/*
周计划显示
*/
int int wk_s=1,wk_n=0; //st上一次计划编号,now本次计划编号
void Get_weekPlan(DateTypedef x){tft.setTextColor(TFT_GREEN);switch (x.wk){case 1:wk_n=1;locadt(0,60,"周一"); //封装的显示函数,坐标与内容一起设置,简化代码locadt(0,80,"今日内务");locadt(0,100,"耳鼻,清灰,耳机");break;case 2:wk_n=2;locadt(0,60,"周二");locadt(0,80,"今日内务");locadt(0,100,"洗澡,大扫除");break;case 3:default:locadt(0,100,"ERROR!");}if(wk_s!=wk_n){ //同理,防爆刷tft.fillRect(0, 60, 128, 120, TFT_BLACK);//部分刷新屏幕wk_s=wk_n;}
}
3.5 天问代码
仅需要注意:语音标识ID不会自懂更新
重点内容便是上述部分,还有数不清对的小功能,便不再详细描述,项目文件链接中包含全部的程序,开源供大家学习交流。
项目难度不大,代码和结构半小时就编好了,但各种模块的坑,真的是一个接一个,在此综合的整合一下所有问题,希望对需要的人有所帮助,节省时间。硬件学习并不是件很难的事,只不过麻烦而已,请不要丧失你的信心,加油各位
二 展示
1 图片
2 视频
✨太一·庚辰✨赛博少女助手,esp8266+TFT+语音识别
3 下载
3.1 项目下载
项目完整文件
3.2 arduino esp8266开发板离线包
esp8266+32开发板包
3.3 processin下载
processing官网
3.4 天问BLOCK下载
天问官网
相关文章:
esp8266_TFTST7735语音识别UI界面虚拟小助手
文章目录 一 实现思路1 项目简介1.1 项目效果1.2 实现方式 2 项目构成2.1 软硬件环境2.2 完整流程总结(重点整合)(1) 功能逻辑图(2) 接线(3) 使用esp8266控制TFT屏(4)TFT_espI库配置方法(5) TFT_esp库常用代码详解(6)TFT屏显示图片(7) TFT屏显示汉字(8) …...
RTOS 基础知识
**实时操作系统(RTOS, Real-Time Operating System)**是一种专为实时性要求设计的操作系统,具有确定性和高效性。RTOS 的系统架构围绕任务调度、时间管理和资源管理展开,以确保系统能够在规定时间内响应外部事件。以下是RTOS的系统…...
【 thefuck 安装与使用】Linux 终端自动纠错工具:一头GitHub上的“草泥马“ - thefuck,妈妈再也不用担心我打错命令行了!
目录 快速安装使用 . 1.简介 2.安装 3.配置 4.补充 官方盗料参考 快速安装使用 快速安装使用,四步即可: #Ubuntu/Debian系统 sudo apt update sudo apt install python3-dev python3-pip sudo pip3 install thefuck #编辑bashrc配置文件 vim ~/.bashrc…...
在Nginx部署Web应用,如何保障后端API的安全
1. 使用HTTPS和http2.0 参考:Nginx配置HTTP2.0_nginx 支持 2.0-CSDN博客 2. 设置严格的CORS策略 通过add_header指令设置CORS头。 只允许来自https://frontend.yourdomain.com的请求访问API location /api/ {if ($http_origin ~* (https://frontend\.yourdomai…...
vue关闭eslint校验及开启debugger
文章目录 在Vue项目中关闭ESLint检查,可以通过以下几种方式实现:修改package.json文件中的eslintScript,将其设置为空字符串或者直接删除。在项目根目录下创建.eslintrc.js文件,并设置rules为关闭所有规则。如果使用Vue CLI创建的…...
docker mysql5.7安装
一.更改 /etc/docker/daemon.json sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io","https:/…...
json字符串或者json文件转换成相应的bean,报错“Unrecognized field xxx , not marked as ignorable”
1. 异常描述 将一个json字符串或者json文件转换成相应的bean的时候,报如下错误: 2. 异常分析 bean中某个字段的get和set方法可能不是工具自动生成的,而是自己写的,譬如字段是“sInfo”,本来get方法是应该写成getsI…...
Windows下C++使用SQLite
1、安装 进入SQLite Download Page页面,下载sqlite-dll-win-x86-*.zip、sqlite-amalgamation-*.zip、sqlite-tools-win-x64-*.zip三个包,这三个包里分别包含dll文件和def文件、头文件、exe工具。 使用vs命令行工具生成.lib文件:进入dll和def文…...
依图科技简介
依图科技(YITU Technology)是中国一家全球领先的人工智能(AI)公司,成立于2012年,总部位于上海。公司专注于计算机视觉、语音识别和自然语言处理等核心AI技术,致力于推动AI技术在医疗、安防、金融…...
BiLSTM模型详解及代码复现(源码)
(需要源码请私信或留言) LSTM基础 LSTM (Long Short-Term Memory) 是一种特殊类型的循环神经网络(RNN),旨在解决传统RNN在处理长序列时面临的梯度消失和梯度爆炸问题。其核心创新在于引入了 门控机制 ,包括遗忘门、输入门和输出门,有效控制信息的流动和存储。这种独特的…...
HTMLCSS:超炫丝滑的卡片水波纹效果
这段代码创建了一个卡片,卡片上有三个波动效果,这些波动效果通过 CSS 的keyframes 动画实现,创建了一个旋转的动画效果。这种效果适用于创建动态的视觉效果,例如音乐播放器的封面、动态背景或其他需要动态效果的界面元素。 演示效…...
8086汇编(16位汇编)学习笔记05.asm基础语法和串操作
8086汇编(16位汇编)学习笔记05.asm基础语法和串操作-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net asm基础语法 1. 环境配置 xp环境配置 1.拷贝masm615到指定目录 2.将masm615目录添加进环境变量 3.在cmd中输入ml,可以识别即配置成功 dosbox…...
【漏洞复现】BIG-IP Next Central Manager OData 注入漏洞(CVE-2024-21793)
免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作…...
Go语言及MongoDB数据库安装配置详解!
Go语言安装 首先讲一下go语言的安装,这部分可直接从官网下载,基本上一键配置的: 官网地址:All releases - The Go Programming Language 选择自己对应系统的安装包,这里官网提供了5种不同的包可自行下载 之后便是默认…...
数据库管理-第275期 Oracle 23ai:画了两张架构图(20241225)
数据库管理275期 2024-12-25 数据库管理-第275期 Oracle 23ai:画了两张架构图(20241225)1 系统管理分片2 用户定义分片总结 数据库管理-第275期 Oracle 23ai:画了两张架构图(20241225) 作者:胖…...
HTML速查
HTML 基本文档 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>文档标题</title></head><body>可见文本...</body> </html>基本标签(Basic Tags) <h1>最大的…...
系统分析师第二版口诀
【绪 数 计 网 库】、【信 工 项 安 规 】、【需 架 设 测 运】、【We 嵌 移 大 微 物 论】(第1章 绪论、第2章 数学与工程基础、第3章 计算机系统、第4章 计算机网络与分布式系统、第5章 数据库系统、第6章 企业信息化、第7章 软件工程、第8章 项目管理、第9章 信息…...
E-commerce .net+React(一)——项目初始化
文章目录 项目地址一、创建.Net环境1.1环境配置1.1.1 使用vscode创建webapi1.1.2 Clean architecture结构创建1.1.3 将创建好结构的项目添加到git里1.1.4 EF Core配置1. 在infrastructure里安装EF所需环境2. 创建Product数据模型3. 创建EF Core的DbContext 数据库上下文4. 创建…...
15 break和continue
while True: content input("请输入你要喷的内容") print("发送给下路",content) #上述的程序如果没有外力干扰:程序会一直进行输入下去 #break:就能让当前这个循环立即进行停止 while True: content input("请输入…...
SwiftUI 入门趣谈:在文本框(TextField)内限制数字的输入
概述 虽然 SwiftUI 本身提供了海量内置的原生视图供我们使用,但对于某些情况我们还需要根据实际需求“量体裁衣、专属定制”。 在日常的撸码场景中,我们有时需要限制文本框(TextField)中数字内容的输入,如何又简单又快…...
JOGL 从入门到精通:开启 Java 3D 图形编程之旅
一、引言 Java 作为一门广泛应用的编程语言,在图形编程领域也有着强大的工具和库。JOGL(Java OpenGL)便是其中之一,它为 Java 开发者提供了访问 OpenGL(Open Graphics Library)功能的接口,使得…...
scrollIntoView() 滚动到元素顶部和底部
scrollIntoView() 是一个 DOM 方法,通常用于将某个元素滚动到视口内(可视区域)。这个方法能够使目标元素在页面上可见,尤其是在有滚动条的容器中。当你调用 scrollIntoView() 时,浏览器会自动滚动页面,直到…...
数据预处理
数据预处理科普指南 一、数据预处理:开启数据价值之门的钥匙 在当今数字化浪潮中,数据被视作蕴含无尽宝藏的富矿。然而,原始数据就如同刚从矿山采出的原石,虽内藏珍贵信息,却混杂着诸多瑕疵,如噪声、缺失…...
关于分布式数据库需要了解的相关知识!!!
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于关于分布式数据库方面的相关内容&a…...
IP代理测试要测试哪些方面?
在数据采集的征途上,IP代理是我们的得力助手,它不仅帮助我们高效地收集信息,还能在保护数据安全方面发挥重要作用。但面对众多的IP代理服务,如何知道哪一个才是最适合我们的呢?这就需要我们进行一系列的测试。 速度与…...
【前沿 热点 顶会】AAAI 2025中与目标检测有关的论文
CP-DETR: Concept Prompt Guide DETR Toward Stronger Universal Object Detection(AAAI 2025) 最近关于通用物体检测的研究旨在将语言引入最先进的闭集检测器,然后通过构建大规模(文本区域)数据集进行训练࿰…...
【Unity3D】Jobs、Burst并行计算裁剪Texture3D物体
版本:Unity2019.4.0f1 PackageManager下载Burst插件(1.2.3版本) 利用如下代码,生成一个Texture3D资源,它只能脚本生成,是一个32*32*32的立方体,导出路径记得改下,不然报错。 using UnityEditor; using Uni…...
HTML与数据抓取:GET与POST请求处理流程
请求数据最重要的三个要点 1. 请求URL 请求URL是客户端向服务器发出请求的目标地址。它指定了要访问的资源位置,并且可以包含路径和查询参数。URL不仅决定了请求的目标,还可以传递必要的信息给服务器; 格式:http(s)://域名/路径…...
TCP客户端模拟链接websocket服务端发送消息(二)
兄弟们,我来填坑了,o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o,前几天写了个tcp模拟websocket客户端的以为完成,后面需要发送消息给服务端,以为简单不就是一个发送消息么,这不是一…...
使用Quick 录屏为视频生成二维码
Quick 可以将 录屏视频、截图、录音等生成二维码或链接分享给任何人,通过设置访问权限,仅对允许的访客开放。 首先下载安装Quick客户端,安装完成后打开界面如下 点击 选区录制 ,按住鼠标左键拖动选区待录制区域 释放鼠标左键&…...
harmony数据保存-数据持久化
preference的介绍 preference的使用 数据库 sqlite的使用 可以写sql语句用executsql进行增删改查. 也可以使用提供的接口(insert,delete,update,query)进行增删改查。...
【Spring AI】Spring AI Alibaba的简单使用
提示:文章最后有详细的参考文档。 前提条件 SpringBoot版本为3.x以上JDK为17以上申请api-key,地址:百炼平台 引入依赖 说明:我的springboot版本为3.2.4,spring-ai-alibaba-starter版本为1.0.0-M2.1(对应spring-ai版本…...
redhawk如何看高toggle rate instance
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 redhaw...
C语言学习笔记(2)
在学习前,需要有一定的C语言基础。不必很深入,只需要知道函数,头文件,指针,数组等的概念就可以,但并非0基础笔记。 由于写到后面,不好编辑了,决定分成多篇写,请按编号学…...
macos 隐藏、加密磁盘、文件
磁盘加密 打开磁盘工具 点击添加 设置加密参数 设置密码 查看文件 不用的时候右键卸载即可使用的时候装载磁盘,并输入密码即可 修改密码 解密 加密,输入密码即可 禁止开机自动挂载此加密磁盘 如果不禁止自动挂载磁盘,开机后会弹出输入…...
机器学习(二)-简单线性回归
文章目录 1. 简单线性回归理论2. python通过简单线性回归预测房价2.1 预测数据2.2导入标准库2.3 导入数据2.4 划分数据集2.5 导入线性回归模块2.6 对测试集进行预测2.7 计算均方误差 J2.8 计算参数 w0、w12.9 可视化训练集拟合结果2.10 可视化测试集拟合结果2.11 保存模型2.12 …...
TP5 动态渲染多个Layui表格并批量打印所有表格
记录: TP5 动态渲染多个Layui表格每个表格设置有2行表头,并且第一行表头在页面完成后动态渲染显示内容每个表格下面显示统计信息可点击字段排序一次打印页面上的所有表格打印页面上多个table时,让每个table单独一页 后端代码示例: /*** Nod…...
Random模拟概率问题
问题背景: 使用 random.nextInt(100) < 10 这段代码来模拟 10% 的概率,其中: random.nextInt(100) 会生成一个 0 到 99 之间的整数。 如果结果小于 10,则表示触发事件,概率为 10/100 10%。 核心问题:…...
适用于Synology NAS的在线办公套件:ONLYOFFICE安装指南
使用 Synology NAS 上的 ONLYOFFICE 文档,您能在私有云中直接编辑文本文档、电子表格、演示文稿和 PDF,确保工作流程既安全又高效。本指南将分步介绍如何在 Synology 上安装 ONLYOFFICE 文档。 关于 Synology Synology NAS(网络附加存储&…...
Go的defer原理
Go 语言中的 defer 语句用于延迟执行一个函数,直到包含该 defer 语句的函数执行完毕时才执行。defer 主要用于资源清理、文件关闭、解锁互斥锁等操作,以确保这些操作在函数返回前被执行,无论函数是正常返回还是由于错误提前返回。 以下是 de…...
达梦数据库迁移到MySQL字段注释缺失问题处理
目录 1、环境信息 2、问题详情 3、处理方案 3.1、提取备用库字段注释 3.2、生成正式库字段注释 1、环境信息 达梦数据库版本:v8 MySQL数据库版本:5.7.11 正式库:通过DTS迁移后的MySQL数据库 备用库:表结构与正式库一致&#…...
IntelliJ Idea常用快捷键详解
文章目录 IntelliJ Idea常用快捷键详解一、引言二、文本编辑与导航1、文本编辑2、代码折叠与展开 三、运行和调试四、代码编辑1、代码补全 五、重构与优化1、重构 六、使用示例代码注释示例代码补全示例 七、总结 IntelliJ Idea常用快捷键详解 一、引言 在Java开发中ÿ…...
Java操作Xml
一、数据准备 1、文件头实体类 package com.xiaobai.xmlpractice;import lombok.AllArgsConstructor; import lombok.Data;/*** Author 王天文* Date 2024/12/18 21:46* Description: xml头*/ AllArgsConstructor Data public class Head {private String desc;private Strin…...
CI/CD是什么?
CI/CD 定义 CI/CD 代表持续集成和持续部署(或持续交付)。它是一套实践和工具,旨在通过自动化构建、测试和部署来改进软件开发流程,使您能够更快、更可靠地交付代码更改。 持续集成 (CI):在共享存储库中自动构建、测试…...
某些iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题
一些型号的iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题 延迟问题 navigator.mediaDevices.getUserMedia({ audio: true }) .then((stream) > {console.log(stream) })从开始到获取stream会有将近2s的延迟 导致按下按钮开始录音 会有前…...
基础优化方法
梯度下降 学习率代表每一次沿着这个方向走多远, batchsize的概念 梯度下降通过不断沿着反梯度方向更新参数求解 两个重要的超参数是 batchsize 和 学习率...
linux系统上SQLPLUS的重“大”发现
SQL plus版本: [oraclepg-xc2 ~]$ sqlplus -v SQL*Plus: Release 19.0.0.0.0 - Production Version 19.3.0.0.0 操作系统:CentOS Linux 7 (Core) 数据库:Oracle 19c Version 19.3.0.0.0 同样的SQL脚本在windos CMD sqlplus 执行没问题。…...
【0x001F】HCI_Read_Clock_Offset命令详解
目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Read_Clock_Offset 命令格式 2.2. Connection_Handle 三、生成事件 3.1. HCI_Command_Status 事件 3.2. HCI_Read_Clock_Offset_Complete 事件 四、命令执行流程 4.1. 命令发送阶段 4.2. 命令接收与初步反馈阶段 …...
UML(统一建模语言)及其图例使用指南
UML(统一建模语言)及其图例使用指南 一、UML 介绍二、UML 图表1. 用例图(Use Case Diagram)2. 类图(Class Diagram)3. 对象图(Object Diagram)4. 序列图(Sequence Diagra…...
AI写标书工具:高效智能的标书撰写助手——标小兔
在现代商业竞争中,投标是许多企业获得项目的关键途径。而标书的质量直接影响中标的几率。传统的标书撰写过程繁琐,且容易出错,尤其是涉及到大量的数据整理、文字表达和排版工作,这些任务既费时又容易让人产生疲劳感。为了提升工作…...