网络摄像机+温湿度+LED灯控

本文基于 FlexLua 低代码单片机技术,无需复杂单片机C语言开发。即使新手也可很容易用FlexLua零门槛开发各种功能丰富稳定可靠的 IoT 硬件,更多学习教程可参考 FlexLua 官网。

一、本例程实现功能

一、本例程实现功能

让开发板在局域网环境变成一台网络摄像机,不仅可以通过电脑或手机Web浏览器查看实时视频流,还可以控制开发板上的Led灯亮灭,以及获取开发板上温湿度并在网页上实时显示。需要注意的是电脑或手机也需要是在此局域网内。

打开网易新闻 查看精彩图片

二、举一反三

二、举一反三

基于本例程还可以很容易衍生出一些更实用的方案:

  1. 远程视频监控+远程继电器控制
  2. 远程视频监控+远程舵机控制
  3. 远程视频监控+远程传感器数据读取、
  4. 远程视频监控+IO读取
三、ShineBlink Cam 传感器介绍
  1. 供电:USB 5v供电或5v引脚供电
  2. 板载摄像头模块、温湿度模块、以及ShineBlink开发板
  3. 支持8路IO控制、4路AD电压采集、1路Uart串口通信、1路IIc通信扩展

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

四、CAM底板结构图

四、CAM底板结构图

打开网易新闻 查看精彩图片

五、材料清单

五、材料清单

  1. 自制 Cam PCB 底板(开源资料请参考 《CAM 底板开源硬件资料》文件)
  2. ShineBlink Mini 开发板(已含 Led 灯)
  3. SHT30 IIc 温湿度传感器模块
六、完整代码

六、完整代码

(1)ShineBlink Mini开发板Lua源代码如下:

HW =
{
"1103",--Wifi账号
"123321123",--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 =
{
"80",--本机视频流Web http Server端口号
"81"--本机视频流服务端口号
}
H1 = --Http server vedio stream response H1
{
"multipart/x-mixed-replace;boundary=123456789000000000987654321"
}
H2 = --Http server vedio stream response H2
{
"Content-Type: image/jpeg\r\nContent-Length: %d\r\n\r\n"
}
--注意:上面H2中的%d占位符一定不要去掉,它会自动计算每次发送的图片尺寸大小并填充进去。
H3 = "\r\n--123456789000000000987654321\r\n" --H3 stream boundary
--全局变量
Timer10MsCnt=0
Timer10MsCnt1=0
temprature = 0.0
humidity = 0.0
--定义10毫秒定时器的回调函数,函数名字必须是LIB_10msTimerCallback
function LIB_10msTimerCallback()
Timer10MsCnt = Timer10MsCnt + 10
Timer10MsCnt1 = Timer10MsCnt1 + 10
end
--使能USB串口打印
LIB_UsbConfig("CDC")
--配置D8 Wifi Led指示灯(Core电路板上的LED1灯和D8端口是固定连接的)
LIB_GpioOutputConfig("D8","STANDARD")
--配置D9 Wifi Led指示灯(Core电路板上的LED2灯和D9端口是固定连接的)
LIB_GpioOutputConfig("D9","STANDARD")
--LED1灭
LIB_GpioWrite("D8",1)
--LED2灭
LIB_GpioWrite("D9",1)
--初始化sht3x传感器占用SCL0和SDA0引脚,10Hz频率工作,"HIGH"时精度最高
LIB_Sht3xConfig("IIC0","10","HIGH")
--初始化,Vedio Web Server开始工作
Res,Info=LIB_EspCamOp("Config","WEB_VEDIO_ENHANCE","UART0",HW,IP,SERVER,H1,H2,H3)
if Res == 0 then
print(Info) --打印初始化失败原因
end
--使能系统10毫秒定时器开始工作
LIB_10msTimerConfig("ENABLE")
--开始大循环
while(GC(1) == true)
do
--查询sht3x传感器是否出数
sht3x_flag,sht3x_temp,sht3x_humi = LIB_Sht3xGetResult()
--如果传感器有新的温湿度数据产生
if sht3x_flag == 1 then
temprature = sht3x_temp
humidity = sht3x_humi
end
--每200ms更新一次传感器值,这样Web客户端就能看到传感器值的变化,并且能及时收到客户端发来的命令
if Timer10MsCnt1 > 200 then
Timer10MsCnt1 = 0
Res,Info=LIB_EspCamOp("WebserverUpdate",string.format("{\"temp\":\"%.2f\",\"humi\":\"%.2f\"}", temprature, humidity))
if Res == 1 then
if Info ~= "null" then --收到客户端发来的cmd命令
print(Info)
--网页端上的按钮按下后发来的Info字符串的形式如:"xxx=yyy"
xxx,yyy = string.match(Info, "(%a+)=(%a+)") --用通配符提取出xxx和yyy这两个字符串
if xxx == "cmd" then
if yyy == "LedOn" then
LIB_GpioWrite("D9",0) --LED2亮
elseif yyy == "LedOff" then
LIB_GpioWrite("D9",1) --LED2灭
else
end
end
end
end
end
--每三秒查询一次WIFI连接状态
if Timer10MsCnt > 3000 then
Timer10MsCnt = 0
Res,Info=LIB_EspCamOp("WifiStatus")
if Res == 1 then
WifiIsConnect = 1
print(Info) --打印IP
LIB_GpioWrite("D8",0)--WIFI连接时,开发板上的Led1灯亮
else
LIB_GpioWrite("D8",1)--WIFI未连接时,开发板上的Led1灯灭
print(Info) --打印WIFI未连接时的状态
end
end
end

如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

(2)除了需将以上代码下载到 ShineBlink Mini 开发板,还需要将 index.html 文件放入 ESP32-CAM 摄像头模块板子上的 TF 卡中。index.html 中的代码没做过前端开发的同学可能会比较陌生,但并不难,花几分钟仔细看一下应该能看懂,看懂了稍微修改一下,即可很容易改出各种定制化的页面和项目。

index.html 文件放在{FlexLua开源网盘}->{Hardware}->{OTHERS}->{ESPCAM} 文件夹中。

七、代码运行结果

七、代码运行结果

代码运行之后,我们可以通过串口调试助手看到开发板被动态分配的IP地址:

打开网易新闻 查看精彩图片

然后在处于同一局域网内的电脑浏览器上输入这个192.168.43.224 IP地址即可访问视频:

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

八、如何实现外网访问局域网内的摄像头+Webserver

八、如何实现外网访问局域网内的摄像头+Webserver

在上面的举一反三中已经提到如何通过外网访问内网:

  1. 花生壳内网穿透。
  2. 路由器WAN口带公网I。

在此之前开发者还需要将开发板的IP地址由动态分配方式改成静态IP,实现方式很简单,只需改动Lua代码中的IP配置table列表中的内容即可,类似改动如下,请结合自己的局域网配置更改,下面的只是个参考例子:

IP =
{
"Static",
"192.168.43.55",--本机IP地址
"192.168.43.1",--gateway地址
"255.255.255.0",--subnet地址
"8.8.8.8",--首选DNS地址
"114.114.114.114"--次选DNS地址
}