使用esp32 cam + SR602人体感应模块制作一个小型的监控
需求:
做一个小型的监控,类似电子猫眼,监测到人之后,取一张图 然后发送到自己的邮箱。
架构:
1.sr602 传感器监测到人
2. esp32 cam 取图 并通过mqtt协议传到远端服务器
3, 服务器利用python 搭建一个mqtt客户端,订阅到数据后 将图片保存,并发送到指定邮箱

硬件连接:

结构设计:

软件:
服务端代码
#mqtt客户端
import paho.mqtt.client as mqtt
import logging
import os
import email_sendAPPEAR_TOPIC = "APPEAR_TOPIC"
DETAIL_TOPIC = "DETAIL_TOPIC"
mqtt_server = 'xxxxxxxxxx'
image_path="images"image_index=0def on_connect(client, userdata, flags, rc):logging.info('连接到MQTT服务器 '+str(rc))def on_message(client, userdata, msg):print(msg.topic + " " + str(msg.payload))global image_indexif msg.topic ==APPEAR_TOPIC:if image_index!=0:#发送全部图片image_index=0email_send.send_email(image_path)logging.info('发送到邮箱完毕')if msg.topic == DETAIL_TOPIC:logging.info('收到图片,准备保存到本地')save_location = "images/"+str(image_index)+".jpg" f = open(save_location, 'wb') data = msg.payload f.write(data) f.close()image_index+=1logging.info('图片保存到本地完毕')def run():logging.basicConfig(level=logging.INFO)client = mqtt.Client(protocol=3)client.on_connect = on_connectclient.on_message = on_messageclient.connect(host=mqtt_server,port=1883,keepalive=60,bind_address="")client.subscribe(APPEAR_TOPIC)client.subscribe(DETAIL_TOPIC)logging.info('启动 MQTT客户端... \n')try:client.loop_forever()except KeyboardInterrupt:passlogging.info('停止 MQTT 客户端\n')if __name__ =='__main__':run()#邮件发送import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from datetime import datetime
import logging
import os
import shutildef send_email(img_path=""):# 设置发件人、收件人和邮件主题from_email = "xxxx"to_email = "xxxx"subject = "注意,有人出现"logging.info('设置收发地址...')# 创建邮件对象msg = MIMEMultipart()msg['From'] = from_emailmsg['To'] = to_emailmsg['Subject'] = subject# 添加邮件正文body = datetime.now().strftime("%Y-%m-%d %H:%M:%S")msg.attach(MIMEText(body, 'plain'))logging.info('添加正文...')for root,dirs,files in os.walk(img_path):for file in files:if file.endswith(".jpg"):img = os.path.join(root,file)# 添加附件attachment_filename = imgattachment_path = imgattachment = open(attachment_path, "rb")part = MIMEBase('application', 'octet-stream')part.set_payload(attachment.read())encoders.encode_base64(part)part.add_header('Content-Disposition', f'attachment; filename= {attachment_filename}')msg.attach(part) # 连接到SMTP服务器smtp_server = "smtp.yeah.net" # 修改为你的SMTP服务器smtp_port = 465smtp_username = "xxxx" # 修改为你的邮箱地址smtp_password = "xxxx" # 修改为你的邮箱密码server = smtplib.SMTP_SSL(smtp_server,smtp_port)logging.info('登录邮件服务器...')server.login(smtp_username, smtp_password)logging.info('发送邮件')# 发送邮件server.sendmail(from_email, to_email, msg.as_string())# 关闭连接server.quit()shutil.rmtree(img_path)# 重新创建空文件夹os.makedirs(img_path)if __name__ =='__main__':logging.basicConfig(level=logging.INFO)send_email("images",True)
客户端代码
#include "esp_camera.h"
#include <WiFi.h>
#include <PubSubClient.h>#define CAMERA_MODEL_AI_THINKER
#include "camera_pins.h"//WIFI 用户名 密码
//const char* ssid = "xxxx";
//const char* password = "xxxx";
const char* ssid = "xxxx";
const char* password = "xxxx";//MQTT 服务器地址
const char* mqttServer = "xxxx";
uint16_t mqttPort = 1883;
const char* APPEAR_TOPIC = "APPEAR_TOPIC";
const char* DETAIL_TOPIC = "DETAIL_TOPIC";//检测是否有人
uint8_t FOUND_PEOPLE_PIN = 14;//人出现的次数
uint8_t found_count = 0;WiFiClient espClient;
PubSubClient client(espClient);void setup() {//调试串口Serial.begin(115200);Serial.setDebugOutput(true);//人体红外检测引脚pinMode(FOUND_PEOPLE_PIN, INPUT);//配置相机camera_config_t config;config.ledc_channel = LEDC_CHANNEL_0;config.ledc_timer = LEDC_TIMER_0;config.pin_d0 = Y2_GPIO_NUM;config.pin_d1 = Y3_GPIO_NUM;config.pin_d2 = Y4_GPIO_NUM;config.pin_d3 = Y5_GPIO_NUM;config.pin_d4 = Y6_GPIO_NUM;config.pin_d5 = Y7_GPIO_NUM;config.pin_d6 = Y8_GPIO_NUM;config.pin_d7 = Y9_GPIO_NUM;config.pin_xclk = XCLK_GPIO_NUM;config.pin_pclk = PCLK_GPIO_NUM;config.pin_vsync = VSYNC_GPIO_NUM;config.pin_href = HREF_GPIO_NUM;config.pin_sccb_sda = SIOD_GPIO_NUM;config.pin_sccb_scl = SIOC_GPIO_NUM;config.pin_pwdn = PWDN_GPIO_NUM;config.pin_reset = RESET_GPIO_NUM;config.xclk_freq_hz = 20000000;config.pixel_format = PIXFORMAT_JPEG;config.frame_size = FRAMESIZE_VGA;config.jpeg_quality = 10;config.fb_count = 1;// 相机初始化esp_err_t err = esp_camera_init(&config);if (err != ESP_OK) {Serial.printf("Camera init failed with error 0x%x", err);return;}sensor_t* s = esp_camera_sensor_get();s->set_vflip(s, 1);s->set_brightness(s, 2);s->set_saturation(s, -2);s->set_framesize(s, FRAMESIZE_VGA);//连接 WIFIWiFi.begin(ssid, password);WiFi.setSleep(false);while (WiFi.status() != WL_CONNECTED) {Serial.println("Connecting to WIFI ...");delay(500);}Serial.println("WiFi connected");//连接mqtt 服务器。 640*480 图片大小client.setBufferSize(50 * 1024);client.setServer(mqttServer, mqttPort);while (!client.connected()) {if (client.connect("app")) {Serial.println("Connected to MQTT");} else {Serial.println("Failed to connect to MQTT server, ");Serial.print(client.state());delay(1000);}}Serial.print(WiFi.localIP());
}//上传图片
void take_send_photo() {Serial.println("Taking picture...");camera_fb_t* fb = NULL;fb = esp_camera_fb_get();if (!fb) {Serial.println("Camera capture failed");return;}if (client.beginPublish(DETAIL_TOPIC, fb->len + sizeof(long), false)) {unsigned long m = millis();int noBytes;noBytes = client.write(fb->buf, fb->len);noBytes = client.write((byte*)&m, sizeof(long));if (!client.endPublish()) {Serial.println("\nupload image error.");}}esp_camera_fb_return(fb);Serial.println("upload image ok.");
}void loop() {//检测到有人后 拍照并上传if (digitalRead(FOUND_PEOPLE_PIN) == 1) {take_send_photo();found_count += 1;delay(2000);} else {found_count = 0;}if (found_count >= 3) {found_count = 0;client.publish(APPEAR_TOPIC, "", 0);}client.loop();
}
注意事项:
1,接收图片的邮箱,需要开通smtp服务。
2,mqtt发送图片,不需要转成base64格式,但是需要重新设置下缓存大小。
3,这个玩意 发热很严重,还没测试 两节18650电池能用多久。
相关文章:
使用esp32 cam + SR602人体感应模块制作一个小型的监控
需求: 做一个小型的监控,类似电子猫眼,监测到人之后,取一张图 然后发送到自己的邮箱。 架构: 1.sr602 传感器监测到人 2. esp32 cam 取图 并通过mqtt协议传到远端服务器 3, 服务器利用python 搭建一个mqtt客户端&…...
vim最简单命令学习
安装vim sudo apt install vim在终端随便打开一个文本文件,或者源文件, vim filepath输入该命令后,从终端进入vim编辑器,此时为普通模式(Normal)。 按i键进入编辑模式(Insert),按Esc键返回普通模式(Normal)。 在编辑…...
论文阅读-通过云特征增强的深度学习预测云工作负载转折点
论文名称:Cloud Workload Turning Points Prediction via Cloud Feature-Enhanced Deep Learning 摘要 云工作负载转折点要么是代表工作负载压力的局部峰值点,要么是代表资源浪费的局部谷值点。预测这些关键点对于向系统管理者发出警告、采取预防措施以…...
Android Studio从零基础到APP上线(3)
第3章 简单控件 本章介绍App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图,容纳视图的常用布局,响应点击的按钮控件,显示图片的图像视图等。然后结合本章所学的知识,演示一个实战项目“简单计算器”的设计与实现。 3.1 文本显示 本节介绍如何在文本视图Tex…...
springboot Feign方式注入注解详解
一、FeignClient注解详解 FeignClient是Spring Cloud中用于声明Feign客户端的注解,它使得编写HTTP客户端变得更简单。通过Feign的自动化配置机制,可以很容易地编写HTTP API客户端。以下是FeignClient的详解: 作用:FeignClient注解…...
自然语言处理(NLP)—— Dialogflow ES聊天机器人
1. 背景介绍 这个实验室的目标是让你了解并使用Google的Dialogflow服务。Dialogflow是一个可以让你创建聊天机器人的服务,这个过程不需要或者只需要很少的编程技能。 1.1 账号的创建 为了完成这个实验室,你需要在以下网站上创建账号:…...
C++俄罗斯方块 -- 菜单展示和选择 -- 方法
short Menu() //选中开始游戏返回1,离开则返回2 {short choice 1;//跟踪用户选中的选项char c; //记录用户按键信息system("cls");SetPos(9, 12); //设置输出坐标,12行9列cout << "┌────────┐";SetPos(9, 13);cou…...
面试150 颠倒二进制位 位运算分治 逻辑右移
Problem: 190. 颠倒二进制位 文章目录 思路复杂度位运算分治法 思路 👨🏫 参考题解 >>>:逻辑右移(符号位一起移动,高位补零) 复杂度 时间复杂度: O ( log n ) O(\log{n}) O(logn) 空间…...
php 函数三
一 对称加密 1.1 openssl 1.1.1 openssl_get_cipher_methods(bool $aliases false) 获取可用的加密算法。包含可用加密算法的array。 请注意:在 OpenSSL 1.1.1 版本之前,返回加密算法的拼法大小写都有; 从 OpenSSL 1.1.1 开始,…...
Windows下配置多个账号的git ssh
生成密钥 已经有一个密钥的情况下,用下面的命令生成一个新密钥,注意为了防止原始密钥文件被覆盖,需要给一个新名字: ssh-keygen -t rsa -f C:\\Users\\xxx\\.ssh\\id_rsa_xxx -C "xxxemail.com"给GitHub配置SSH Key …...
【漏洞复现】电信网关配置管理系统SQL注入漏洞
Nx01 产品简介 电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远程监控、配置、升级和故障排除等功能,从而确保网络的正常运行和高效性能。 Nx02 漏洞描述 电信网关配置管理系统存在SQL注入漏洞,攻…...
2018年苏州大学837复试机试C/C++
2018年苏州大学复试机试 要求 要求用C/C编程;对程序中必要的地方进行注释。上机规则 请在电脑桌面上新建一个文件夹文件夹名为考试姓名(中文);考试完毕后,将所编写的文件放在上述文件中。 第一题(20分&…...
【Jenkins】pipeline基本使用
目录 一、pipeline 二、创建pipeline项目 1、安装pipeline插件 2、创建pipeline项目 三、pipeline语法 1、pipeline组成 2、agent:指定流水线的执行位置,流水线中每个阶段都必须在某个地方执行 3、stage:阶段,代表流水线的…...
Bytebase 签约 Vianova,助力欧洲城市交通智能平台中 Snowflake 和 PG 的变更自动化及版本控制
在数字化发展的浪潮中,自动化数据库变更管理成为提升产品上线效率、降低人为失误风险的关键工具,同时促进流程的一致性与标准化,确保合规性和变更的可追溯性。近日,数据库 DevOps 团队协同管理工具 Bytebase 签约欧洲交通数据管理…...
SpringBoot 事务管理Transactional 数据回滚 数据一致性
介绍 SpringBoot当中的事物他保证了一致性,要么全部一起成功(提交),要么一起失败,失败(回滚)后数据会回到当初的样子,是一组操作的集合。 事物类型 开启事物提交事物回滚事物 案…...
vue使用pdf.js实现在线查看pdf文件
需求:有一个列表页,用户点击查看,弹层展示后台接口返回的pdf内容(不是文件、地址之类的,乱码的pdf铭文(二进制文件流)) 1、pdf.js安装 npm install --save vue-pdf2、正文代码 <template><div><el-table :data&q…...
java---查找算法(二分查找,插值查找,斐波那契[黄金分割查找] )-----详解 (ᕑᗢᓫ∗)˒
目录 一. 二分查找(递归): 代码详解: 运行结果: 二分查找优化: 优化代码: 运行结果(返回对应查找数字的下标集合): 编辑 二分查找(非递归…...
鸿蒙应用/元服务开发-窗口(Stage模型)设置悬浮窗
一、设置悬浮窗说明 悬浮窗可以在已有的任务基础上,创建一个始终在前台显示的窗口。即使创建悬浮窗的任务退至后台,悬浮窗仍然可以在前台显示。通常悬浮窗位于所有应用窗口之上;开发者可以创建悬浮窗,并对悬浮窗进行属性设置等操…...
springboot集成easypoi导出多sheet页
pom文件 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version> </dependency> 导出模板: 后端代码示例: /*** 导出加油卡进便利店大额审批列…...
自己动手打包element UI官方手册文档教程
经常用element ui朋友开发的比较郁闷,官方文档网基本上都是打不开的, 官方:https://element.eleme.io/ 一直打不开,分析下是里面用的cdn链接ssl证书无效。 就想着自己搭建一个element UI文档 自己搭建的: Element文档网…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
