首页 文章 精选 留言 我的

精选列表

搜索[开源生态],共10000篇文章
优秀的个人博客,低调大师

每日一博 | 如何利用开源中国 Markdown/编辑器优雅的写出数学公式?

小伙伴经常遇到需要展示数学公式的情况,但是用截图即影响排版又不美观优雅,现在可以使用KaTeX来实现优雅的数学公式书写啦! 插入公式 具体有如下两种: 行内(内嵌)公式 爱因斯坦质能方程$E=mc^2$揭示了物质的质量和能量之间的关系 写法:爱因斯坦质能方程$E=mc^$揭示了物质的质量和能量之间的关系 在一个$之间书写公式就可以在行内使用数学公式 整行(独立)公式 $$f(x)=\int_{-\infty}^\infty\widehat f\xi,e^{2\pi i\xi x},d\xi$$ 写法:$$f(x)=\int_{-\infty}^\infty\widehat f\xi\,e^{2\pi i\xi x}\,d\xi$$ 在两个$之间书写公式就可以使用整行的数学公式 编写公式 像这样的公式: $$\frac{n(n-1)!}{(i-1)![(n-1)-(i-1)]}t^{i-1}(1-t)^{(n-1)(t-1)}$$ 想要正确地写出它的文本形式可不容易: $$\frac{n(n-1)!}{(i-1)![(n-1)-(i-1)]}t^{i-1}(1-t)^{(n-1)(t-1)}$$ 如果仅仅为了写个公式,就去学LaTeX语法,那没有十天半月的肯定不行。这个时候,你需要一个可视化公式编辑器的神器,它可以让我们可视化地编辑公式,然后自动得到它的LaTeX文本: 还可以使用手写哦~(手残党慎用) 概率论、微积分等等能人大牛快来和数学公式愉快的玩耍吧~ 最后 $$128\sqrt{e980}$$ $$128\sqrt{e980}$$ 这个数学公式送给大家~快用这个来向你喜欢的人表白吧~

优秀的个人博客,低调大师

【RT-Thread 开源作品秀】基于 RT-Thread 的“数码小精灵”设计与实现

作者:赵俊涛 一、概述 随着近年来智能化设备的不断增长,平板电脑、智能数字音视频播放器、移动数码相机等各类数码产品,正越来越受到城乡居民欢迎。特别是“云生活”让人们对数码产品有了更多需求,加上互联网技术、5G 技术、智能化新产品、新型分期消费模式等的出现,让数码产品消费热潮涌动。 本设计为基于 RT-Thread 的“数码小精灵”设计,硬件采用了以 BK7252 为主控芯片的麻雀一号开发板开发。BK7252 , 是一款高性能 WiFi 模块,采用高集成的无线射频芯片,内部集成 2.4GHz Wi-Fi 1T1R 先进技术,支持摄像头图像输出,拥有最佳的功耗性能、射频性能、稳定性、通用性和可靠性,适用于各种应用和不同产品需求。模块内部拥有 512KB 内嵌 RAM 和 4Mbyte Flash 空间,CPU 主频高达 180Mhz。 本设计在此基础上主要实现了以下功能,包括天气和疫情数据更新显示、MP3 音乐播放器以及数码拍照相机的功能。其中 MP3 播放器具有音量调节,播放/停止控制和歌曲切换的功能;数码相机将拍照图片进行 LCD 屏显示,同 时具有 SD 卡存储和 OneNet 云平台存储功能。该产品可以充当家庭数码助理的角色,因此取名“数码小精灵”。同时本作品完成的过程中参考了部分网络资料和网友的思路,在此一并表示感谢。 二、RT-Thread 使用情况概述 本设计基于麻雀一号开发板 SDK 进行开发,其 RT-Thread 为 3.1.0 版本。 图 1 RT-Thread 版本 在 RT-Thread 系统上的设备注册列表,其中主要使用了 rtc,sd0,w0,sound,uart1 等设备。使用到的 RT-Thread 组件包括了 FinSH 控制台,虚拟文件系统,POSIX 接口。在软件包上面涉及到网络工具及 NetUtils,WebClient,cJSON,EasyFlash,rt_ota,TJpgDec,Player 等。 图2设备注册列表 三、硬件框架 麻雀一号开发板外设资源丰富,但资源相当丰富,集成 WiFi、BLE、摄像头、音频扬声器、MIC 录音、TF 卡座、五向按键、还有一个 1.44 寸的 LCD 屏,使用常见的 TypeC 接口作为供电和调试串口,预留支持锂电池供电接口。 本设计的人机交互部分主要利用了开发板的五向按键和 LCD 显示屏,其中按键用于功能选择,数据刷新以及音乐播放控制功能。 普通模式下:“←”:音乐播放 、“⭕”:天气和疫情数据刷新 、“→”:相机拍照 音乐播放模式下:“↑”:音量加、“↓”:音量减 、“←”:下一曲 、“⭕”:停止播放 设备联网采用 WIFI 连接,上电自动连接网络。数据显示 LCD 进行显示,同时设备接有 SD 进行相机拍照的存储。此外照片同时可以通过 WIFI 上传至OneNet 云平台,进行远端网页或者手机等智能终端进行查看。 四、软件框架说明 系统软件流程框图如下图所示,设备上电后启动 RT-Thread 操作系统,同 时进行相关硬件设备的初始化操作,如 LCD 显示屏,音频扬声器,以及挂在SD 卡到文件系统等操作,之后进行设备的网络连接。网络连接后输入应用程序启动命令进行程序启动,LCD 显示欢迎界面,接下来用户可以通过五向按键进 行功能选择,主要是天气疫情数据更新显示、MP3 播放器功能以及数码相机的功能。相机拍照后会进行本地 SD 卡数据存储以及 OneNet 云端存储。 五、软件模块说明 1. 设备联网 设备联网主要使用到了 RT-Thread 组件中的 wlan 驱动程序实现,上电初始化完成后在主程序中查询 wlan 无线设备,并根据用户配置的 SSID 和PASSWORD 进行 WIFI 网络的连接。该部分的具体代码实现如下所示: 1staticintiot_station_connect(char*ssid,char*passwd){ 2rt_err_tresult=RT_EOK; 3structrt_wlan_infoinfo; 4structrt_wlan_device*wlan; 5rt_tick_ttick=0; 6wlan=(structrt_wlan_device*)rt_device_find(WIFI_DEVICE_STA 7_NAME); 8if(!wlan) 9{10rt_kprintf("nowlan:%sdevice\n",WIFI_DEVICE_STA_NAME);11return-1;}12result=rt_wlan_init(wlan,WIFI_STATION);13rt_wlan_register_event_handler(wlan,WIFI_EVT_STA_CONNECTED,i14ot_wlan_sta_connected_event);15rt_wlan_register_event_handler(wlan,WIFI_EVT_STA_DISCONNECTED16,iot_wlan_sta_disconnected_event);17rt_wlan_info_init(&info,WIFI_STATION,SECURITY_WPA2_AES_PSK,18ssid);19result=rt_wlan_connect(wlan,&info,passwd);20rt_wlan_info_deinit(&info);21returnresult;22} 2. NTP 网络时间同步 网络时间同步主要思路就是通过调用网络工具包中的 ntp 同步函数来实现,通过创建独立时间同步线程,达到定时同步网络时间的目的。该部分使用时需要启用 RT-Thread 中的 RTC 功能。相关代码如下: 1{ 2time_tcur_time=ntp_sync_to_rtc(); 3if(cur_time) 4{ 5rt_kprintf("GetlocaltimefromNTPserver:%s",ctime((constt 6ime_t*)&cur_time)); 7rt_kprintf("Thesystemtimeisupdated.Timezoneis%d.\n",NTP 8_TIMEZONE); 9}}10staticrt_thread_ttid1=RT_NULL;11staticvoidntcthread1_entry(void*parameter){12while((1))13{14time_tcur_time=ntp_sync_to_rtc();15if(cur_time)16{17rt_kprintf("GetlocaltimefromNTPserver:%s",ctime((consttim18e_t*)&cur_time));19rt_kprintf("Thesystemtimeisupdated.Timezoneis%d.\n",NTP_T20IMEZONE);21break;}22else23{24rt_thread_mdelay(1000);25}}}26voidNTCThreadInit(void){27if(tid1!=RT_NULL)28{29rt_kprintf("ntcthreadstillrun\n");30return;}31rt_kprintf("NTCthreadinit\n");32tid1=rt_thread_create("NTC",33ntcthread1_entry,RT_NULL,34THREAD_STACK_SIZE,35THREAD_PRIORITY,THREAD_TIMESLICE);36if(tid1!=RT_NULL)37rt_thread_startup(tid1);38} 3. 天气疫情数据更新 该部分主要是利用了 webclient 工具包的功能,通过调用天气和疫情数据API 接口获取相关 Json 数据,并利用 CJson 工具包进行返回 Json 数据的解析。最后通过 LCD 进行数据显示。相关代码如下: 1#defineGET_URI"http://www.weather.com.cn/data/sk/%s.html"// 2获取天气的API 3#defineGET_FY2020_URI"http://www.dzyong.top:3005/yiqing/total"//疫情 4数据API 5voidget_weather(intargc,char**argv){ 6rt_uint8_t*buffer=RT_NULL; 7intresp_status; 8structwebclient_session*session=RT_NULL; 9char*weather_url=RT_NULL; 10intcontent_length=-1,bytes_read=0; 11intcontent_pos=0; 12char*city_name=rt_calloc(1,255); 13/*为weather_url分配空间*/ 14weather_url=rt_calloc(1,GET_URL_LEN_MAX); 15if(weather_url==RT_NULL) 16{ 17rt_kprintf("Nomemoryforweather_url!\n"); 18goto__exit; 19} 20if(argc==1){ 21strcpy(city_name,AREA_ID); 22} 23elseif(argc==2){ 24strcpy(city_name,argv[1]); 25} 26/*拼接GET网址*/ 27rt_snprintf(weather_url,GET_URL_LEN_MAX,GET_URI,city_name); 28/*创建会话并且设置响应的大小*/ 29session=webclient_session_create(GET_HEADER_BUFSZ); 30if(session==RT_NULL) 31{ 32rt_kprintf("Nomemoryforgetheader!\n"); 33goto__exit; 34} 35/*发送GET请求使用默认的头部*/ 36if((resp_status=webclient_get(session,weather_url))!=200){ 37rt_kprintf("webclientGETrequestfailed,response(%d)error.\n",resp_ 38status); 39goto__exit; 40} 41/*分配用于存放接收数据的缓冲*/ 42buffer=rt_calloc(1,GET_RESP_BUFSZ); 43if(buffer==RT_NULL) 44{ 45rt_kprintf("Nomemoryfordatareceivebuffer!\n"); 46goto__exit; 47} 48content_length=webclient_content_length_get(session); 49if(content_length<0){ 50/*返回的数据是分块传输的.*/ 51do 52{ 53bytes_read=webclient_read(session,buffer,GET_RESP_BUFSZ); 54if(bytes_read<=0){ 55break;}}while(1);} 56else 57{ 58do 59{ 60bytes_read=webclient_read(session,buffer, 61content_length-content_pos>GET_RESP 62_BUFSZ? 63GET_RESP_BUFSZ:content_length-conte 64nt_pos); 65if(bytes_read<=0){ 66break;} 67content_pos+=bytes_read; 68}while(content_pos<content_length); 69} 70/*天气数据解析*/ 71weather_data_parse(buffer); 72__exit: 73/*释放网址空间*/ 74if(weather_url!=RT_NULL) 75rt_free(weather_url); 76/*关闭会话*/ 77if(session!=RT_NULL) 78webclient_close(session); 79/*释放缓冲区空间*/ 80if(buffer!=RT_NULL) 81rt_free(buffer); 82if(city_name!=RT_NULL) 83rt_free(city_name); 84} 85/*天气数据解析*/ 86voidweather_data_parse(rt_uint8_t*data){ 87uint8_ttemp[100]; 88cJSON*root=RT_NULL,*object=RT_NULL,*item=RT_NULL; 89root=cJSON_Parse((constchar*)data); 90if(!root) 91{ 92rt_kprintf("NomemoryforcJSONroot!\n"); 93return;} 94object=cJSON_GetObjectItem(root,"weatherinfo"); 95item=cJSON_GetObjectItem(object,"city"); 96rt_kprintf("\ncity:%s",item->valuestring); 97lcd_clear(BLACK); 98item=cJSON_GetObjectItem(object,"temp"); 99rt_kprintf("\ntemp:%s",item->valuestring);100rt_sprintf(temp,"温度:%s",item->valuestring);101lcd_disp_str_en_ch(0,20,temp,BLACK,WHITE);102item=cJSON_GetObjectItem(object,"WD");103rt_kprintf("\nwd:%s",item->valuestring);104item=cJSON_GetObjectItem(object,"WS");105rt_kprintf("\nws:%s",item->valuestring);106item=cJSON_GetObjectItem(object,"SD");107rt_kprintf("\nsd:%s",item->valuestring);108rt_sprintf(temp,"湿度:%s",item->valuestring);109lcd_disp_str_en_ch(0,40,temp,BLACK,WHITE);110item=cJSON_GetObjectItem(object,"time");111rt_kprintf("\ntime:%s\n",item->valuestring);112item=cJSON_GetObjectItem(object,"AP");113rt_kprintf("\nap:%s",item->valuestring);114rt_sprintf(temp,"气压:%s",item->valuestring);115lcd_disp_str_en_ch(0,60,temp,BLACK,WHITE);116item=cJSON_GetObjectItem(object,"WSE");117rt_kprintf("\nwse:%s",item->valuestring);118rt_sprintf(temp,"风力:%s",item->valuestring);119lcd_disp_str_en_ch(0,80,temp,BLACK,WHITE);120if(root!=RT_NULL)121cJSON_Delete(root);122}123/*疫情数据解析*/124voidfy2020_data_parse(rt_uint8_t*data){125uint8_ttemp[100];126cJSON*root=RT_NULL,*object=RT_NULL,*item=RT_NULL;127root=cJSON_Parse((constchar*)data);128if(!root)129{130rt_kprintf("NomemoryforcJSONroot!\n");131return;}1324.音乐播放模块133该部分的功能主要通过使用player软件包的接口函数实现,包括音乐播134放,停止,歌曲切换以及音量控制等功能。该部分的部分代码如下图所示:135cJSON*dataArray=cJSON_GetObjectItem(root,"data");//取数组136intarraySize=cJSON_GetArraySize(dataArray);//取数组大小137cJSON*dataList=dataArray->child;138while(dataList!=RT_NULL)139{140rt_kprintf("\ndiagnosed:%d\n",cJSON_GetObjectItem(dataList,"diagn141osed")->valueint);142rt_kprintf("\ndeath:%d\n",cJSON_GetObjectItem(dataList,"death")->143valueint);144rt_kprintf("\ncured:%d\n",cJSON_GetObjectItem(dataList,"cured")->145valueint);146rt_kprintf("\ndate:%s\n",cJSON_GetObjectItem(dataList,"date")->va147luestring);148//LCD屏打印信息149rt_sprintf(temp,"累计确150诊:%d",cJSON_GetObjectItem(dataList,"diagnosed")->valueint);151lcd_disp_str_en_ch(0,120,temp,BLACK,WHITE);152rt_sprintf(temp,"累计死153亡:%d",cJSON_GetObjectItem(dataList,"death")->valueint);154lcd_disp_str_en_ch(0,140,temp,BLACK,WHITE);155rt_sprintf(temp,"累计治156愈:%d",cJSON_GetObjectItem(dataList,"cured")->valueint);157lcd_disp_str_en_ch(0,160,temp,BLACK,WHITE);158rt_sprintf(temp,"更新时159间:%s",cJSON_GetObjectItem(dataList,"date")->valuestring);160lcd_disp_str_en_ch(0,180,temp,BLACK,WHITE);161dataList=dataList->next;162} 4. 音乐播放模块 该部分的功能主要通过使用 player 软件包的接口函数实现,包括音乐播放,停止,歌曲切换以及音量控制等功能。该部分的部分代码如下图所示: 1LCDShowMusic(); 2rt_sprintf(music,"/sd/music/%d.mp3",count); 3rt_kprintf("keyleftispress...\r\n"); 4rt_kprintf("////////////////////////////player_play\n"); 5player_stop(); 6player_set_uri(music); 7player_play(); 8player_status=1; 9count++;10if(count>=8)11count=0;12rt_kprintf("////////////////////////////player_playend\n"); 5. 相机功能实现 该部分主要通过 IPC 事件获取相机采集图像数据,并将采集到的图像数据经过 TJpgDec 软件包进行解码后在 LCD 进行显示,同时会将相机数据通过写文件的形式存储到 SD 卡,通过 HTTP 协议推送到 OneNet 云平台。 1voidtake_photo(void)//手动拍照 2{ 3//创建摄像头接收一帧图片的事件 4session.event=rt_event_create("vt_event",RT_IPC_FLAG_FIFO); 5camera_start();//开启摄像头传输照片 6tvideo_capture(1); 7rt_event_recv(session.event,SEND_FRAME_EVENT,RT_EVENT_FLAG_OR|RT_EVE 8NT_FLAG_CLEAR,RT_WAITING_FOREVER,RT_NULL); 9intfd,res;10time_tcur_time;11structtm*cur_tm;12chartime_now[50];//保存文件到sd卡指定路径13/*outputcurrenttime*/14cur_time=time(RT_NULL);15cur_tm=localtime(&cur_time);16rt_sprintf(time_now,"%04d-%02d-%02d-%02d-%02d-%02d",cur_tm->tm_year+191700,cur_tm->tm_mon+1,cur_tm->tm_mday,cur_tm->tm_hour,cur_tm->tm_min,cur18_tm->tm_sec);19rt_sprintf(file_name,"/sd/images/%s.jpg",time_now);20rt_kprintf("name=%s\n",file_name);21fd=open(file_name,O_WRONLY|O_CREAT);22if(fd>=0){23write(fd,session.buf,session.total_len);24close(fd);25rt_kprintf("save%sok!!!\n",file_name);26res=Decode_Jpg(file_name);27rt_kprintf("res=%d\n",res);28}29else30{31rt_kprintf("savepicfailed!!!\n");32}33//拍照数据上传34webclient_post_pic(session.buf,session.total_len);35tvideo_capture(0);36}37MSH_CMD_EXPORT(take_photo,take_photo); 六、演示效果 七、代码地址 🔗链接:https://gitee.com/hb_zhaojuntao/DigitalElves.git 麻雀一号购买链接:https://m.tb.cn/h.4ccA1wD?sm=37cdbc 欢迎向RT-Thread公众号投稿文章(有赏) 微信:17775982065 你可以添加微信17775982065为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群! RT-Thread 让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。 长按二维码,关注我们 点击阅读原文进入RT-Thread官网 你点的每个“在看”,我都认真当成了喜欢 本文分享自微信公众号 - RTThread物联网操作系统(RTThread)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册