大家好,网站源码分享模块相信很多的网友都不是很明白,包括网站源码制作也是一样,不过没有关系,接下来就来为大家分享关于网站源码分享模块和网站源码制作的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
作者|Haor.L
责编|王晓曼
出品|CSDN博客
笔者最近参加了校内的一场物联网开发竞赛,从零开始,踩坑无数,感觉很多时候事情都不像预料的一样发展,离开了美好的IDE,太多事情要在板子上一步步摸索。运行失败还好,运行成功但BUG了,简直不知道从何查起。
但认识了M5Stack简单的线上系统,学习了MQTT,HTTP等数据传输方式,入门Arduino和MIrcopython等开发语言,接触ESP32的板子,感受最深的一点就是,物联网的准入门槛并没有那么高,成本也没有那么高,但这还是一片混沌未开的区域,进场者真的可以大有所为,起码方便自己的日常生活是绰绰有余的。
总的来说,这次物联网入坑,值得!
阅读本文后你将收获:
了解M5STACK这款新兴的片上系统
了解这款板子的开发环境如何配置
掌握ONENET数据传输
掌握HTTP的GET方法
会搭建笔者前几天做的项目雏形:健康码追踪系统
开发准备
本博客作为学习物联网开发的笔记,也简单的将自己的片上系统作为例程写出来。
ESP-IDF工具链配置:乐鑫文档UIflow在线IDEM5STACK的官方开发文档(很全,如果你也打算使用M5STACK系列的开发板,强烈建议从此入门)本博客项目的代码仓库(欢迎赏星):https://github.com/haoruilee/M5Stack_Healthy_code_tracer
M5STACK简介
M5STACK是一款对初学者非常友好的ESP32开发板,可以用Micropython和C编程,也可以用很简单的拖拽式编程,拥有庞大的官方文档,只是国内只在最近开始流行,油管和B站上都有官方的教学视频,也在常常更新,很有创造力的一个产品。
结构上主要分为Core和Unit,Core作为核心控件,Unit作为传感器采集数据。
下图图就是笔者自己做的产品雏形,中间的小屏幕是Core,作为主控,周围有GPS和RFID,摄像头等单元用来采集数据。
设计雏形:
由于所有的M5产品都预设了乐高块,所有你可以把他们拼在乐高模组上,油管上还有不少人用它做乐高机器人,确实是很有创意的一款产品,颜值也不错,所以笔者选择它用来开发。
环境配置
UIFlow环境
在线编程地址:UIFlow
前几天GIthub发布了远程编译器Codespace,可以看出远程编译确实是大势所趋。
这里不得不说UIFlow把物联网的门槛大大降低了,笔者配置ESP-IDF用了将近一天,而使用UIFlow可以免去一切环境配置的痛苦。
支持拖拽编程,可视化UI设计,自带例程,确实是良心产品。
ESP-IDF环境
方法一
笔者配置ESP-IDF工具链时,一开始是使用Windows系统的工具安装器。
ESP-IDF工具安装器可在“开始”菜单中,创建一个打开ESP-IDF命令提示符窗口的快捷方式。本快捷方式可以打开Windows命令提示符(即cmd.exe),并运行export.bat脚本以设置各环境变量(比如PATH,IDF_PATH等)。
(不得不说,这个安装器的健壮性非常差!!)
安装心得:上网技巧+把系统的PATH重新检查一遍,有些卸载残余的PATH会导致玄学问题!
方法二(更推荐)
宇宙第一VScode中有插件ESPRESSIF
可以更清楚每时每刻在干什么,也更清楚出了BUG去哪里修补。
感知模块
M5开发了很多环境传感器,包括温湿度,人体感应,RFID,摄像头等等,在官方开发文档上也都给出了相关例程和GIthub的源码链接。
笔者自己的项目使用的是RFID、GPS和Camera模块,其中除了Camera只能用ESP-IDF编程,其他单元都支持在UIFlow上在线编程,再加上,Micropython确实比C++舒服太多。
网络连接
Wi-Fi链接
M5Stack已经自己预置了Wi-Fi链接,开机就是,不过在Mircopython里写起来也很简单,下面是一个范例:
importnetworkSSID=”YOUR-WIFI-NAME”PASSWORD=”YOUR-WIFI-PASSWORD”wlan=Nones=NonedefconnectWifi(ssid,passwd):”’连接指定wifi”’globalwlanwlan=network.WLAN(network.STA_IF)wlan.active(True)wlan.disconnectwlan.connect(ssid,passwd)while(wlan.ifconfig[0]==’0.0.0.0′):time.sleep(1)returnTrue
使用Mircoython的Wi-Fi模块,connect(ssid,password),就可以进入可爱的Wi-Fi连接界面了,M5GO的封装还是不错的。
NB-IOT
IOT模组需要额外配一张NB卡,某宝20就可以拿下一年500M流量,不过笔者没有继续尝试,已经有可爱的M5GO和稳定的Wi-Fi,就没探索用3G进行通讯。
HTTP通讯
接下来介绍物联网的精髓,“联网”,采集到了数据,那数据上报和传输是重中之重。
笔者觉得HTTP是最好理解,好入门的通讯协议,这里也先介绍这种方法。
建议参考视频:B站:接入中国移动ONENET平台
笔者尝试过诸如阿里云和一些外国的平台,最后发现都不如中国移动专门为物联网开发的ONENET,一来稳定,不用担心服务商跑路,而来阿里云显得太过臃肿,对入门者很不友好,最终选择了ONENET,他的HTTP封装好了很好看的数据流模板,如:
位置信息可视化:
自动折线图
POST上传数据创建流模板
首先需要创建一个数据流模板,用于接收传过来的数据:
发送请求
请求方式:POST
URL:http://api.heclouds.com/devices/device_id/datapoints
其中,device_id:需要替换为设备ID
注意:ONENET默认post的数据叫Datastreams,参数配置见表:
请求实例:
{“datastreams”:[{“id”:”temperature”,”datapoints”:[{“at”:”2013-04-22T00:35:43″,”value”:”bacd”},{“at”:”2013-04-22T00:55:43″,”value”:84}]},{“id”:”key”,”datapoints”:[{“at”:”2013-04-22T00:35:43″,”value”:{“x”:123,”y”:123.994}},{“at”:”2013-04-22T00:35:43″,”value”:23.001}]}]}
使用ONENET的模拟API调用可以快速熟悉数据的模式:
其中,URL的device_id,和下面的API_key换成自己设备的,可以在设备列表找到,就可以往自己设备的数据流模板传一个值为3的value。
Micropython用HTTPUIFlow里自带了HTTP模块,但是很玄学,很难用!
这里笔者用Micropython自己写了一份HTTP的传输:
defhttp_put_data(data):wlan.disconnect循环判断是否有卡片接近while(True):清空Emoji显示emoji0.show_map([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]],0x000000)有卡片接近显示对号emoji0.show_map([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,1],[0,0,0,0,0,1,1],[1,0,0,0,1,1,0],[0,1,1,1,1,0,0],[0,0,1,1,0,0,0]],0x33ff33)完成后指示灯变绿rgb.setColorAll(0x33ff33)rgb.setBrightness(10)else:wlan.disconnect等待卡片接近时,Emoji展示”。。。”emoji0.show_map([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,1,0,1,0,1,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]],0x000000)wait(1)
这里的Emoji模块是先在UIFlow里敲好,再进Micropython里查看的。
HTTP传输块
HTTP传输在上文已经讲了不少,这里优先介绍GPS的传输:
GPS的命令也是要加“value:”的,形如value:{“lon”:lon,“lat”:lat},这个地方一开始把笔者坑的不轻!
defhttp_put_location(lon,lat):”’传输地理位置数据点至ONENET平台的location数据流lon:longitude,经度lat:latitude,纬度url:http的post地址values:请参考https://open.iot.10086.cn/doc/multiprotocol/文档中的”HTTP协议上传数据点模块,配置json格式信息”API_KEY:设备发送HTTP请求的证书,请参考https://open.iot.10086.cn/doc/multiprotocol/book/develop/http/api/api-usage.html文档中的”鉴权说明””’url=’http://api.heclouds.com/devices/YOUR-DEVICE-ID/datapoints’values={‘datastreams’:[{“id”:”location”,”datapoints”:[{“value”:{“lon”:lon,”lat”:lat}}]}]}jdata=json.dumps(values)r=urequests.post(url,data=jdata,headers={“api-key”:API_KEY})returnr
这里请把YOUR-DEVICE-ID替换为自己的数据流中设备编号,参考ONENET手册。Wi-Fi连接块
UIflow里封装了很好的Wi-Fi-connect:
wifiCfg.doConnect(SSID,PASSWORD)
如果你的Micropython里没有一键Wi-Fi连接,笔者自己也实现了一个:
defconnectWifi(ssid,passwd):”’如果您的Micropython不携带WifiCfg.doconnect,请参考本函数函数作用:连接至名称为SSID,密码为passwd的wifi”’globalwlanwlan=network.WLAN(network.STA_IF)wlan.active(True)wlan.disconnectwlan.connect(ssid,passwd)while(wlan.ifconfig[0]==’0.0.0.0′):time.sleep(1)returnTrue
二维码识别块
本部分使用ESP-IDF编程
使用的摄像头是M5CAMERA
属性是OV2640
参考官方例程:
//拍摄camera_fb_t*esp_camera_fb_get{if(s_state==){return;}if(!I2S0.conf.rx_start){if(s_state->config.fb_count>1){ESP_LOGD(TAG,”i2s_run”);}if(i2s_run!=0){return;}}if(s_state->config.fb_count==1){xSemaphoreTake(s_state->frame_ready,portMAX_DELAY);}if(s_state->config.fb_count==1){return(camera_fb_t*)s_state->fb;}camera_fb_int_t*fb=;if(s_state->fb_out){xQueueReceive(s_state->fb_out,&fb,portMAX_DELAY);}return(camera_fb_t*)fb;}//二维码识别voidqr_recoginze(void*pdata){camera_fb_t*camera_config=pdata;if(pdata==){ESP_LOGI(TAG,”CameraSizeerr”);return;}structquirc*q;structquirc_dataqd;uint8_t*image;q=quirc_new;if(!q){printf(“can’tcreatequircobject\\r\\n”);vTaskDelete;}//printf(“begintoquirc_resize\\r\\n”);if(quirc_resize(q,camera_config->width,camera_config->height)<0){printf(“quirc_resizeerr\\r\\n”);quirc_destroy(q);vTaskDelete;}image=quirc_begin(q,,);memcpy(image,camera_config->buf,camera_config->len);quirc_end(q);intid_count=quirc_count(q);if(id_count==0){quirc_destroy(q);return;}structquirc_codecode;quirc_extract(q,0,&code);quirc_decode(&code,&qd);dump_info(q);quirc_destroy(q);}
这里依赖了太多官方库…建议去代码仓库翻一翻。
K210的二维码识别上文是ESP32类型的开发板识别代码,可以看到非常繁琐,改起来简直要了老命…使用Micropython的话,代码就变的可爱多了~
【此部分使用Maxipy编程】
importsensorimportimageimportlcdimporttimeclock=time.clocklcd.initsensor.resetsensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QVGA)sensor.set_vflip(1)sensor.run(1)sensor.skip_frames(30)whileTrue:clock.tickimg=sensor.snapshotres=img.find_qrcodesfps=clock.fpsiflen(res)>0:img.draw_string(2,2,res[0].payload,color=(0,128,0),scale=2)print(res[0].payload)lcd.display(img)
这里Maxipy的官方文档还给出了修正图像的方法:如果使用了镜头,画面会有扭曲,需要矫正画面使用lens_corr函数来矫正,比如2.8mm,img.lens_corr(1.8)
(没事翻一翻这个Maxipy的文档还是很有启发的,大概两小时就能通读一遍)
GPS传输块
室内经常没有信号(实测室外也很少有…)因此在传递GPS的时候笔者额外设计了防止无信号的代码。
GPS的http传输函数已经在上文讲了,此处和RFID卡片控制进行结合:
ifrfid0.isCardOn:发送RFID读取到的卡片IDrsp_RFID=http_put_RFID((str(rfid0.readUid)))默认北京lon=gps0.longitudelat=gps0.latitudetry:rsp_LOCATION=http_put_location(float(lon),float(lat))except:emoji0.show_map([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,1],[0,0,0,0,0,1,1],[1,0,0,0,1,1,0],[0,1,1,1,1,0,0],[0,0,1,1,0,0,0]],0xff0000)完成后指示灯变绿rgb.setColorAll(0x33ff33)rgb.setBrightness(10)else:wlan.disconnect等待卡片接近时,Emoji展示”。。。”emoji0.show_map([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,1,0,1,0,1,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]],0x000000)wait(1)
后记
参赛时间仓促,没能完全搞明白每个引脚的用途,没有好好触摸一遍C和开发板,没有用NB-IOT通讯。没有做蓝牙通讯解包…还是有很多遗憾的,还好设备还在,可以继续探索物联网的神奇。
成果效果:
版权声明:本文为CSDN博主「Haor.L」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46233323/article/details/106054434」
?程序员在家办公没显示屏,我被领导鄙视了
?Get!读懂数据科学和机器学习,看这文就够了
?深度剖析数据库国产化迁移之路
?Go远超Python,机器学习人才极度稀缺,全球16,655位程序员告诉你这些真相
?我佛了!用KNN实现验证码识别,又Get到一招
?超级账本HyperledgerFabric中的Protobuf到底是什么?
好了,文章到此结束,希望可以帮助到大家。
