跳到主要内容

按键拍照并发送至云端

一、本例程实现功能

每当按下 ShineBlink Mini 开发板上的 BTN2 按钮时,ESP32-CAM摄像头拍一张图片,并将图片通过 Http Post 方式向发送给指定的远程云服务器。

二、举一反三

本例实现了按键触发一次采集图片并通过网络发送给远程服务端的功能,同样也可以采样其他策略来触发,比如:

  • 红外人体/动物感应触发
  • 传感器数值,比如温度大于某个值触发
  • AD电压值大于某个值触发
  • GPIO控制触发等

这些功能的实现都非常简单,参考官网文档教程栏目中相对应的模块教程即可。

三、CAM 底板硬件介绍

  • 供电:USB 5v 供电或 5v 引脚供电
  • 可板载 ESP32-CAM 摄像头模块、SHT30 IIc 温湿度模块、以及 ShineBlink Mini 开发板
  • 支持 8 路 IO 控制、4 路 AD 电压采集、1 路 Uar t串口通信、1 路 IIc 通信扩展

product

ESPCAM

四、CAM底板结构图

layout

五、材料清单

  • 自制 Cam PCB 底板(开源资料请参考 《CAM 底板开源硬件资料》文件)

  • ShineBlink Mini 开发板

六、完整代码

HW = 
{
"abc1103",--Wifi账号
"yy123321123",--Wifi密码
"FRAMESIZE_SVGA",--摄像头采集图片尺寸为SVGA,SVGA:800*600,尽量不要高于SVGA
"12"--摄像头采集图片的质量为12,必须为"1"~"63",其中"1"质量最高
}
IP =
{
"Dynamic",--表示动态IP模式,动态IP模式下,忽略下面5项,"Static"时需要配置下面5项
"0.0.0.0",--本机IP地址
"0.0.0.0",--gateway地址
"0.0.0.0",--subnet地址
"0.0.0.0",--首选DNS地址
"0.0.0.0"--次选DNS地址
}
SERVER =
{
"hey.shineblink.com.cn",--服务器地址
"80"--服务器端口号
}
H1 = --Http header first part
{
"POST /api/heycxenter/uploadpic?deviceno=010101020202030303 HTTP/1.1\r\n",
"User-Agent: PostmanRuntime/7.28.4\r\n",
"Host: hey.shineblink.com.cn\r\n",
"Accept: */*\r\n",
"Accept-Encoding: gzip, deflate, br\r\n",
"Connection: keep-alive\r\n",
"Content-Type: multipart/form-data; boundary=123456789000000000987654321\r\n",
"Content-Length: %d\r\n\r\n"
}
--注意: 上面H1中Content-Length后面的%d一定不要删除,它会自动计算H2+图片+H3的长度总和
H2 = --Http header second part
{
"--123456789000000000987654321\r\n",
"Content-Disposition: form-data; name=\"file\"; filename=\"camera.jpg\"\r\n",
"Content-Type: application/octet-stream;chartset=UTF-8\r\n\r\n"
}
--Http header boundary end
H3 = "\r\n--123456789000000000987654321--\r\n"
--计时器变量
Timer10MsCnt=0
--定义10毫秒定时器的回调函数,函数名字必须是LIB_10msTimerCallback
function LIB_10msTimerCallback()
Timer10MsCnt = Timer10MsCnt + 10
end
--使能USB串口调试打印
LIB_UsbConfig("CDC")
--配置D8端口为普通输出(Core电路板上的LED1灯和D8端口是固定连接的)
LIB_GpioOutputConfig("D8","STANDARD")
--D8口输出高电平,板子上的LED1灭
LIB_GpioWrite("D8",1)
--设置按键"BTN2"(占用D11口)以低电平有效的方式检测按键动作
LIB_ButtonConfig("BTN2","D11","L")
--使能系统10毫秒定时器开始工作
LIB_10msTimerConfig("ENABLE")
--初始化
Res,Info=LIB_EspCamOp("Config","REMOTE_PHOTO","UART0",HW,IP,SERVER,H1,H2,H3)
if Res == 0 then
print(Info) --打印初始化失败原因
end
--开始大循环
while(GC(1) == true)
do
--轮询按键事件
key_value = LIB_ButtonQuery("BTN2")
--如果按键1短按过,拍照并通过Http Post方式发送一张图片给server
if key_value == 1 then
--发送图片给服务器,并等待最多20秒服务器返回消息,闪光灯提前亮0.5秒
Res,Info=LIB_EspCamOp("PostPhoto","{","}",20000,500)--该函数会阻塞最多达20秒,取决于整套流程的网络传输时间
--发送成功,并收到服务器返回的以"{"开头和"}"结尾的json消息体
if Res == 1 then
print(Info)--打印返回的信息
--并打印json消息体中关心的内容,比如Key为data的value
print("data="..LIB_JsonParse(Info, "$.data"))
else
print(Info)--打印失败原因
end
end
--三秒查询一次WIFI连接状态
if Timer10MsCnt >= 3000 then
Timer10MsCnt = 0
Res,Info=LIB_EspCamOp("WifiStatus")
if Res == 1 then
print(Info) --打印IP
LIB_GpioWrite("D8",0) --开发板上的Led1灯亮,表明WIFI已连接
else
LIB_GpioWrite("D8",1) --开发板上的Led1灯灭,表明WIFI未连接
print(Info) --打印WIFI未连接时的状态
end
end
end
如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

提示:我们可以将H1中的deviceno=010101020202030303中的9位ID换成本机的唯一ID,这样服务端就可以识别出是哪个设备向其发送的图片了,本机的9位唯一ID获取方法为调用函数 LIB_GetSysUniID() , 调用该函数后,会返回一个属于本机的9字节唯一ID号字符串,例如"0102030405A6B7C8D9" 。

七、代码运行结果

实现本例程还需在服务器开发相应的服务端应用程序,所以在这里就不展示实验效果了。