宠物喂食器,基于涂鸦智能的解决方案

宠物喂食器,基于涂鸦智能的解决方案

  • 作品描述
  • 作品介绍
    • 硬件部分
    • 软件部分
  • 开发流程
    • 代码编写
      • 1. 产品创建
      • 2. MCU SDK 移植
      • 3. 时间系统实现
      • 4. 快速喂食功能实现
      • 5. 余粮检测功能
      • 6. 已出粮剩余量检测功能
      • 7. 计划喂食功能实现
      • 8. 手动喂食功能实现
      • 9. 小夜灯功能实现
      • 10. 语音控制功能实现
    • 外壳制作
      • 1. 粮仓制作
      • 2. 重量检测平台制作
      • 3. 喂食波轮制作
      • 4. 主体结构制作
      • 5. 完成效果

本项目通信板、电源板、驱动板、涂鸦智能APP以及物联网云平台由 涂鸦智能提供支持。
本文章允许涂鸦智能转载使用。

作品描述

pet_feeder,一款宠物喂食器,基于涂鸦IoT平台及三明治开发板开发。
项目地址:
gitee: pet_feeder
github: pet_feeder

作品介绍

硬件部分

主控:stm32f103芯片;
通信板:涂鸦VWXR2 Wi-Fi通信板;
物联网云平台:接入涂鸦IoT云平台;
喂食器执行电机:42微型步进电机;
电机驱动:RQSM240驱动器;
余粮和出粮检测模块:电阻应变片式压力传感器+HX711AD模块;
小夜灯:普通LED灯;
手机控制端:涂鸦智能APP;
外壳:自主DIY.
硬件框架
硬件框架

软件部分

操作系统:rt-thread-3.1.3-nano;
云端对接方式:涂鸦标准模组MCU SDK;
通信模组固件:涂鸦通用Wi-Fi通信模块固件;
MCU与模组通信方式:USART;
语音平台:涂鸦小智管家;
功能模块
线程
time_sys_thread: 时间系统线程,为计划喂食功能提供当前时间,通过涂鸦IoT平台校准时间;
wifi_usart_service_thread: 串口通信服务线程,用于处理MCU与同学模组之间的通信数据;
granary_weight_thread: 余粮检测线程,检测当前粮桶余粮情况,每变化50g向云端上报一次;
export_weight_thread: 出粮检测线程,检测当前已出粮的剩余重量,每变化50g向云端上报一次;
quick_feed_thread: 快速喂食线程,提供快速喂食服务,支持本地按键控制和手机APP控制,按一次或点击一次喂食一份;
key_scan_thread: 按键检测线程,检测快速喂食控制按钮是否被按下;
信号量:
Quick_feed_sem: 记录按键按下次数,或APP点击次数,为快速喂食提供信号,实现连续多份快速喂食;
软件框架
软件框架

开发流程

代码编写

1. 产品创建

参考涂鸦官方教程产品创建流程

2. MCU SDK 移植

参考涂鸦官方教程MCU SDK 移植

3. 时间系统实现

时间系统主要服务于计划喂食功能,而喂食计划由星期、时、分、喂食量构成。因此时间系统不需要过于细致的功能,能提供所需的数据即可,必要时可通过涂鸦云平台进行更新校准。通过rt-thread提供的ms级延时函数rt_thread_mdeay()实现时间秒针,进而实现时间系统功能。每分钟检查一次喂食计划,每小时校准一下时间。具体实现方式如下:

/*** @brief  时间系统* @param  Null* @return Null* @note   Null*/
void time_sys(void* parameter)
{time_now.year = 2020;time_now.month = 1;time_now.day = 1;time_now.hour = 0;time_now.min = 0;time_now.sec = 0;time_now.week = 1;time_now.updata_state = ERROR;while(1){rt_thread_mdelay(1000);time_now.sec ++;if(time_now.updata_state != SUCCESS){mcu_get_system_time();//更新时间日期get_nearly_meal_plan();}if(time_now.sec >= 60){time_now.sec = 0;time_now.min ++;meal_plan_check();//喂食计划检测if(time_now.min >= 60){time_now.min = 0;time_now.hour ++;time_now.updata_state = ERROR;//日期的更新靠联网实现if(time_now.hour >= 24){time_now.hour = 0;time_now.week++;if(time_now.week >= 8){time_now.week = 1;}time_now.updata_state = ERROR;//日期的更新靠联网实现	}}}}
}

4. 快速喂食功能实现

快速喂食功能提供两种控制方式,手动按键与APP控制。APP通过云平台下发数据后进入功能点下发处理函数:

/*****************************************************************************
函数名称 : dp_download_quick_feed_handle
功能描述 : 针对DPID_QUICK_FEED的处理函数
输入参数 : value:数据源数据: length:数据长度
返回参数 : 成功返回:SUCCESS/失败返回:ERROR
使用说明 : 可下发可上报类型,需要在处理完数据后上报处理结果至app
*****************************************************************************/
static unsigned char dp_download_quick_feed_handle(const unsigned char value[], unsigned short length)
{//示例:当前DP类型为BOOLunsigned char ret;//0:关/1:开unsigned char quick_feed;quick_feed = mcu_get_dp_download_bool(value,length);if(quick_feed == 0){//开关关}else {//开关开feed(1);}//处理完DP数据后应有反馈ret = mcu_dp_bool_update(DPID_QUICK_FEED,quick_feed);if(ret == SUCCESS)return SUCCESS;elsereturn ERROR;
}

本地按键按下后被按键检测线程捕获进而向快速喂食线程释放信号量:

/*** @brief  按键1扫描* @param  Null* @return Null* @note   Null*/
void key1_scan(void* parameter)
{while(1){rt_thread_delay(50);if( GPIO_ReadInputDataBit(KEY1_INT_GPIO_PORT, KEY1_INT_GPIO_PIN) == KEY_ON ){// 松手检测while( GPIO_ReadInputDataBit(KEY1_INT_GPIO_PORT, KEY1_INT_GPIO_PIN) == KEY_ON );rt_sem_release(quick_feed_sem);}}	
}

功能点下发处理函数和快速喂食线程最终都调用喂食执行函数void feed(uint8_t n)通过步进电机驱动实现喂食。

/*** @brief  反转n圈* @param  n:转动圈数* @retval 无*/
void step_motor_reverse(uint8_t n)
{step_motor_enable();set_dir_reverse();for(uint8_t i=0; i<n; i++){step_motor_rotate_1();}	
}

步进电机执行喂食需要一定的时间,如果多次按下按键可能会被遗漏执行,这里采用信号量决绝该问题。
步进电机初始化如下所示:

/*** @brief  初始化控制步进电机的IO* @param  无* @retval 无*/
void STEP_MOTOR_GPIO_Config(void)
{		/*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启步进电机相关的GPIO外设时钟*/RCC_APB2PeriphClockCmd( STEP_MOTOR_DIR_GPIO_CLK | STEP_MOTOR_PLUSE_GPIO_CLK | STEP_MOTOR_OFFLINE_GPIO_CLK, ENABLE);/*选择要控制的GPIO引脚*/GPIO_InitStructure.GPIO_Pin = STEP_MOTOR_DIR_GPIO_PIN;	/*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   /*设置引脚速率为50MHz */   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIO*/GPIO_Init(STEP_MOTOR_DIR_GPIO_PORT, &GPIO_InitStructure);	/*选择要控制的GPIO引脚*/GPIO_InitStructure.GPIO_Pin = STEP_MOTOR_PLUSE_GPIO_PIN;/*调用库函数,初始化GPIO*/GPIO_Init(STEP_MOTOR_PLUSE_GPIO_PORT, &GPIO_InitStructure);/*选择要控制的GPIO引脚*/GPIO_InitStructure.GPIO_Pin = STEP_MOTOR_OFFLINE_GPIO_PIN;/*调用库函数,初始化GPIOF*/GPIO_Init(STEP_MOTOR_OFFLINE_GPIO_PORT, &GPIO_InitStructure);/* 使能步进电机	*/GPIO_SetBits(STEP_MOTOR_OFFLINE_GPIO_PORT, STEP_MOTOR_OFFLINE_GPIO_PIN);/* 设置转动方向	*/GPIO_SetBits(STEP_MOTOR_DIR_GPIO_PORT, STEP_MOTOR_DIR_GPIO_PIN);
}

5. 余粮检测功能

HX711AD模块初始化:

/*** @brief  初始化控制hx711的IO* @param  无* @retval 无*/
void HX711_GRANARY_GPIO_Config(void)
{		/*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启hx711相关的GPIO外设时钟*/RCC_APB2PeriphClockCmd( HX711_GRANARY_DOUT_GPIO_CLK | HX711_GRANARY_SCK_GPIO_CLK, ENABLE);/*选择要控制的GPIO引脚*/GPIO_InitStructure.GPIO_Pin = HX711_GRANARY_DOUT_GPIO_PIN;	/*设置引脚模式为浮空输入*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   /*设置引脚速率为50MHz */   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIO*/GPIO_Init(HX711_GRANARY_DOUT_GPIO_PORT, &GPIO_InitStructure);	/*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*选择要控制的GPIO引脚*/GPIO_InitStructure.GPIO_Pin = HX711_GRANARY_SCK_GPIO_PIN;/*调用库函数,初始化GPIO*/GPIO_Init(HX711_GRANARY_SCK_GPIO_PORT, &GPIO_InitStructure);
}

读取压力传感器值:

/*** @brief  读取HX711* @param  Null* @return 压力传感器值* @note   Null*/
uint16_t hx711_granary_read(void)	//增益128
{uint32_t count;uint16_t granary_weight;uint8_t i; set_hx711_dout(); rt_thread_delay(5);reset_hx711_sck();count=0;while(read_dout());for(i=0;i<24;i++){ set_hx711_sck(); count=count<<1; reset_hx711_sck(); if(read_dout())count++; } set_hx711_sck(); count=count^0x800000;//第25个脉冲下降沿来时,转换数据rt_thread_delay(5);reset_hx711_sck(); granary_weight = (unsigned long)((float)count/gapvalue_granary);return(granary_weight);
}

在线程中实现重量检测,余粮剩余情况采用百分制表示,定义3Kg,full_granary=3000为满箱状态。余粮每变化1% 向云端上报一次。

/*** @brief  粮桶余粮重量检测* @param  Null* @return Null* @note   Null*/
void granary_weight(void* parameter)
{uint32_t tem, granary_weight, diff;uint8_t granary_weight_percent;while(1){rt_thread_delay(50);tem = hx711_granary_read() - granary_peel;if(tem > granary_weight){diff = tem - granary_weight;}else{diff = granary_weight - tem;}if(diff > full_granary/100){granary_weight = tem;if( granary_weight >= full_granary ){granary_weight_percent = 100;mcu_dp_value_update(DPID_SURPLUS_GRAIN, granary_weight_percent);}else{granary_weight_percent = (granary_weight) / (full_granary/100);mcu_dp_value_update(DPID_SURPLUS_GRAIN, granary_weight_percent);}}}
}

6. 已出粮剩余量检测功能

HX711初始化和压力传感器值读取方法与余粮检测功能中相似,在此不再赘述。已出粮剩余情况采用重量表示,没变化50g向云端上报一次。

/*** @brief  已出粮剩余重量检测* @param  Null* @return Null* @note   Null*/
void export_weight(void* parameter)
{uint32_t tem, export_weight, diff;while(1){rt_thread_delay(50);tem = hx711_export_read() - export_peel;if(tem > export_weight){diff = tem - export_weight;}else{diff = export_weight - tem;}if(diff > 50){export_weight = tem;mcu_dp_value_update(DPID_WEIGHT, export_weight);}}
}

7. 计划喂食功能实现

喂食计划下发后进入功能点下发处理函数,在此处根据通讯协议对喂食计划进行解析提取并存入meal_plan结构体中。

/*****************************************************************************
函数名称 : dp_download_meal_plan_handle
功能描述 : 针对DPID_MEAL_PLAN的处理函数
输入参数 : value:数据源数据: length:数据长度
返回参数 : 成功返回:SUCCESS/失败返回:ERROR
使用说明 : 可下发可上报类型,需要在处理完数据后上报处理结果至app
*****************************************************************************/
static unsigned char dp_download_meal_plan_handle(const unsigned char value[], unsigned short length)
{uint8_t i, k=0;//示例:当前DP类型为RAWunsigned char ret;//RAW类型数据处理meal_plan_amount = 0;for(i=0; i<length/5; i++){if((uint16_t)value[5*(i+1)-1] != 0){meal_plan_amount++;meal_plan[k].week   = value[5*i+0];meal_plan[k].hour   = value[5*i+1];meal_plan[k].min    = value[5*i+2];meal_plan[k].amount = value[5*i+3];k++;}}//	for(i=0; i<meal_plan_amount; i++)
//	{
//		rt_kprintf("meal plan %d: %d %d %d %d\n", i, meal_plan[i].week, meal_plan[i].hour, meal_plan[i].min,meal_plan[i].amount);
//	}
//	rt_kprintf("\n");get_nearly_meal_plan();//处理完DP数据后应有反馈ret = mcu_dp_raw_update(DPID_MEAL_PLAN,value,length);if(ret == SUCCESS)return SUCCESS;elsereturn ERROR;
}

喂食计划需要每分钟都与当前时间进行一次比较以确保喂食计划的执行不被遗漏。然后喂食计划最多可设置10 个,若每次都将10个喂食计划一一与当前时间进行比较将占用较多系统资源。因此在获取全部喂食计划后对最近的一次喂食计划进行提取,这样每次只需将当前时间与进行喂食计划进行对比,大大节约系统资源。最近喂食计划获取方法如下所示:

/*** @brief  获取最近的喂食计划* @param  Null* @return Null* @note   Null*/
void get_nearly_meal_plan(void)
{uint16_t distance, nearly_distance = 24*60;//将当前时间的星期数转换为one-hot型表示方法uint8_t week_day_form = 0x01;week_day_form = week_day_form << (7 - time_now.week);nearly_meal_plan.week = 0x80;//确保日期不是当天的nearly_meal_plan不生效for(uint8_t i=0; i<meal_plan_amount; i++){if( ((week_day_form & meal_plan[i].week) != 0) && (meal_plan[i].hour >= time_now.hour) && (meal_plan[i].min > time_now.min)){distance = (meal_plan[i].hour - time_now.hour)*60 + (meal_plan[i].min - time_now.min);if(distance < nearly_distance){nearly_distance = distance;nearly_meal_plan = meal_plan[i];}}}
}

分别计算喂食计划于当前时间相隔的分钟数,最小的即为最近喂食计划。这里需要注意,当前时间的星期数采用十进制表示而喂食计划的星期数采用one-hot编码,因此在比较时需先进行转化。同时,为避免混淆将星期数最高为初始化为1,表该计划不生效。因为one-hot编码仅适用低7位,十进制表示方法显然也用不到最高位。因此将最高位用于表示喂食计划是否生效不会造成干涉。获取最近喂食后只需在每分钟检查一次是否到达喂食时间即可,当到达喂食计划的时间则调用喂食执行函数进行喂食,实现方法如下:

/*** @brief  喂食计划检查* @param  Null* @return Null* @note   Null*/
static void meal_plan_check(void)
{if(((nearly_meal_plan.week & 0x80) == 0) && time_now.min == nearly_meal_plan.min && time_now.hour == nearly_meal_plan.hour){feed(nearly_meal_plan.amount);get_nearly_meal_plan();}
}

8. 手动喂食功能实现

APP下发手动喂食指令后,下发数据后进入功能点下发处理函数,在此处调用喂食执行函数喂食指定的份数即可,实现方法如下:

/*****************************************************************************
函数名称 : dp_download_manual_feed_handle
功能描述 : 针对DPID_MANUAL_FEED的处理函数
输入参数 : value:数据源数据: length:数据长度
返回参数 : 成功返回:SUCCESS/失败返回:ERROR
使用说明 : 可下发可上报类型,需要在处理完数据后上报处理结果至app
*****************************************************************************/
static unsigned char dp_download_manual_feed_handle(const unsigned char value[], unsigned short length)
{//示例:当前DP类型为VALUEunsigned char ret;unsigned long manual_feed;manual_feed = mcu_get_dp_download_value(value,length);//VALUE类型数据处理feed(manual_feed);//处理完DP数据后应有反馈ret = mcu_dp_value_update(DPID_MANUAL_FEED,manual_feed);if(ret == SUCCESS)return SUCCESS;elsereturn ERROR;
}

9. 小夜灯功能实现

对小夜灯的控制相当于普通GPIO的控制,引脚初始化这里不再赘述。具体控制在功能点下发处理函数 unsigned char dp_download_light_handle(const unsigned char value[], unsigned short length) 实现,其中 LIGHT_ON 和 LIGHT_OFF 为宏定义,实现引脚的高低电平控制。

/*****************************************************************************
函数名称 : dp_download_light_handle
功能描述 : 针对DPID_LIGHT的处理函数
输入参数 : value:数据源数据: length:数据长度
返回参数 : 成功返回:SUCCESS/失败返回:ERROR
使用说明 : 可下发可上报类型,需要在处理完数据后上报处理结果至app
*****************************************************************************/
static unsigned char dp_download_light_handle(const unsigned char value[], unsigned short length)
{//示例:当前DP类型为BOOLunsigned char ret;//0:关/1:开unsigned char light;light = mcu_get_dp_download_bool(value,length);if(light == 0){LIGHT_OFF;}else{LIGHT_ON;}//处理完DP数据后应有反馈ret = mcu_dp_bool_update(DPID_LIGHT,light);if(ret == SUCCESS)return SUCCESS;elsereturn ERROR;
}

10. 语音控制功能实现

涂鸦 VWXR2 Wi-Fi 模组自带两个mic和一个扬声器,只需在涂鸦云平台完成语音配置,使语音与对应的功能点对应起来即可实现喂食器部分功能的语音控制。配置方法如下图所示:
语音配置
这里配置了三项语音功能,包括小夜灯的开关控制、快速喂食和粮桶余粮查询。
语音模块收到小夜灯的开关控制和快速喂食指令后会按照设置向MCU下发对应的指令,与APP控制相同,语音控制最终也是进入到功能点下发处理函数执行对应的操作。具体实现方式前面已经介绍过。
粮桶余粮为查询类指令,模块收到指令后直接读取粮桶余粮功能点的数据。

外壳制作

1. 粮仓制作

粮仓

2. 重量检测平台制作

重量检测平台

3. 喂食波轮制作

喂食波轮

4. 主体结构制作

主体结构

5. 完成效果

完成效果
完成效果
.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37806.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读书笔记——《2001太空漫游》

阿瑟克拉克神作&#xff0c;任何一个科幻迷都绕不开的一部作品。很早就听说过其大名&#xff0c;因为之前看过电影版的&#xff0c;总感觉少了点新鲜感&#xff0c;这本书就一直在书架上没有拿出来看。但是看过这本书后&#xff0c;我可以很负责任的说&#xff0c;全书都充满新…

仿PC端小红书主页

前端基础阶段 用原生的html和css来写页面是几乎每个初学前端的人第一次接触前端做的事&#xff0c;写出一个好看的前端页面也能让你成就感爆棚&#xff0c;小红书界面用视频做背景看起来高大上其实也是非常简单的几句代码能搞定的具体的如下 小红书页面详情 仿小红书页面,用纯…

chatgpt赋能python:Python海龟图:如何将海龟进行编程,并让它转起来

Python海龟图&#xff1a;如何将海龟进行编程&#xff0c;并让它转起来 Python中的海龟图(Turtle Graphics)是一种基本的图形绘制方法。通过编写Python代码&#xff0c;我们可以控制“海龟”来画出我们需要的任何图形。本文将介绍如何使用Python海龟图绘制旋转的图形&#xff…

TCP通信客户端和服务器端网络编程

一 客户端和服务器端通信的步骤 二 TCP通信的客户端网络编程 TCP协议是严格区分客户端和服务器端的 1. TCP通信的客户端 向服务器端发送连接请求给服务器端发送数据读取服务器端回写的数据 2. 在Java中&#xff0c;提供了java.net包下的Socket类来表示客户端。Socket也叫&q…

收发Hotmail和Yahoo邮件

Hotmail和Yahoo作为国际性的电子邮箱提供商&#xff0c;凭借着完全免费的服务策略和优良的稳定性吸引了大量的用户。可是无法直接用Foxmail等邮件客户端软件收发Hotmail和Yahoo邮箱中的邮件也一直是一个困扰大家的问题。其实&#xff0c;只要进行一些必要的设置&#xff0c;我们…

记录下javaMail发送邮件遇到的问题-(邮件中文昵称)

最近在做邮箱功能&#xff0c;其中发件时也需要记录下邮箱的昵称&#xff0c;所以代码中的邮箱地址前会有中文昵称&#xff0c;这也导致邮件发送失败 后台显示邮件发送成功&#xff0c;但是却被退回 Mail delivery failed: returning message to sender 其中&#xff0c;收件地…

格子达ai辅助降重:查看相关的ai报告

五月毕业季&#xff0c;很多同学都会出现ai辅助过高的情况&#xff0c;但是学校的格子达里面却没有ai句子分析。接下来告诉大家如何免费使用ai分析&#xff1a; 一、第一步点击下方连接注册一个自己的账号 https://www.gezida.com//checkReport/aiShare.do?sourceKeyd924bb0…

GTC 火山引擎线上专场 | 解码字节跳动多场景技术内核及应用

活动简介 12 月 19 日&#xff0c;GTC 智能增长技术专场&#xff0c;火山引擎将以「智能增长」为主题&#xff0c;为大家带来字节跳动在机器学习领域沉淀的技术经验&#xff0c;智能平台、数据智能、语音识别、联邦学习等场景的前沿应用&#xff0c;以及通过火山引擎这一平台在…

元宇宙新星升起,华英会加入NFT混战

如果说起2021这一年,那么有两个关键词一定会被提及,“新冠疫情”以及“元宇宙”,除了路人皆知的诸如facebook这样的互联网巨头们纷纷抢占风口,扩张地盘之外,通过相关区块链工具以及交易数据,我们还发现,一些低调的乃至神秘的公司及团体也正在这个新晋热点上,悄悄的开始了他们的…

专注于元宇宙实际应用方案的企业

元宇宙的话题持续火热。国内互联网大厂正在加大对元宇宙相关技术和应用的研发&#xff0c;元宇宙正在逐步成为创新创业的主战场。企业元宇宙在教育、会展、文创、旅游、博物馆、文化艺术、娱乐、社交、版权、零售等等领域发力&#xff0c;增加客户对企业的认同。 也许未来只需一…

Mixlab 在元宇宙盘了块 “地” 正式进军元宇宙

Mix 「 据 2022-1-19 微软官方新闻稿 」 微软&#xff08;纳斯达克股票代码&#xff1a;MSFT&#xff09;宣布收购游戏开发和互动娱乐内容发行商公司动视暴雪 Activision Blizzard Inc.&#xff08;ATVI&#xff09;。微软以每股 95.00 USD 的价格收购动视暴雪&#xff0c;总收…

c语言实现文件管理系统(对文本内内容操作)

文件管理系统 代码思路 1、利用两个文本文件&#xff0c;一个文本文件保存需要的数据&#xff0c;另一个保存需要处理的数据&#xff0c;对需要处理的文本内容进行最小值&#xff0c;最大值&#xff0c;平均值的求解。 2、把处理的数据存入数组&#xff0c;转化性质&#xff…

ChatGPT win下C语言串口通信

文章目录 1.ChatGPT2.对ChatGPT进行代码封装 关键词&#xff1a;win环境 C语言 串口通信 ChatGPT 1.ChatGPT - com<com9可以用直接赋值 COMx - com>com9需要 \\\\.\\COMx 重点//eg:COM1&#xff0c;COM2 , COM10 use \\\\.\\COM10ChatGPT&#xff1a;Write a serial c…

c#实现QQ群成员列表导出及邮件群发之模拟QQ登陆

前言 本文的重要部分&#xff1a; 1、抓包获取QQ空间或者邮箱登陆地址&#xff0c;分析参数&#xff0c;用户名&#xff0c;密码&#xff0c;验证码&#xff0c;gtk&#xff0c;随即数。 2、获取每次登陆需要的验证码 3、用户名&#xff0c;密码&#xff0c;验证码加密得到登陆…

快速导出qq群所有qq号码

打开http://qun.qq.com/member.html 登录自己的qq 登录以后的页面 选择要导出的qq群 然后按F12(打开开发者模式) 将下面的代码复制到控制台后敲回车执行即可。 function savefiles(data, name) {var urlObject = window.URL || window.webkitURL || window;var export_b…

​GPT-3好“搭档”:这种方法缓解模型退化,让输出更自然

文本生成对于许多自然语言处理应用来说都是非常重要的。 但神经语言模型的基于最大化的解码方法&#xff08;如 beam search&#xff09;往往导致退化解&#xff0c;即生成的文本是不自然的&#xff0c;并且常常包含不必要的重复。现有的方法通过采样或修改训练目标来引入随机…

技术创新,让企业拥有智能“伯乐”,实现精准识人

过去&#xff0c;“得人才者得天下&#xff0c;世有伯乐&#xff0c;然后有千里马。” 这些都是我们耳熟能详古人对于人才渴求的描写。能否及时发现人才、培养人才、发挥人才作用的关键&#xff0c;都是历代管理者或经营者关注的问题。自古发现人才并没有那么容易&#xff0c;过…

LLM in Medical Domain: 一文速览大语言模型在医学领域的应用

© 作者&#xff5c;杨锦霞 机构&#xff5c;中国人民大学 研究方向&#xff5c;多模态学习 来自&#xff1a;RUC AI Box 进NLP群—>加入NLP交流群 引言&#xff1a;近期&#xff0c;大型语言模型在各种任务上展现出优异的性能&#xff0c;展示了广阔的应用前景。然而&a…

【NLP】首个支持联网的中文 AI 问答模型,开源了!

2021 年 12 月&#xff0c;OpenAI 正式推出 WebGPT&#xff0c;该项目的横空出世&#xff0c;标志着基于网页搜索的问答新范式的诞生。 在此之后&#xff0c;New Bing 首先将网页搜索功能整合发布&#xff0c;随后 OpenAI 也发布了支持联网的插件 ChatGPT Plugins。 大模型在联…

清华ACL2023 | WebCPM:首个联网支持中文问答开源模型

来自&#xff1a;PaperWeekly 进NLP群—>加入NLP交流群 2021年12月 WebGPT 的横空出世标志了基于网页搜索的问答新范式的诞生&#xff0c;在此之后&#xff0c;New Bing 首先将网页搜索功能整合发布&#xff0c;随后 OpenAI 也发布了支持联网的插件 ChatGPT Plugins。大模型…