961浏览
查看: 961|回复: 2

[ESP8266/ESP32] FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统

[复制链接]
本帖最后由 _深蓝_ 于 2023-9-6 16:47 编辑

FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统
一、项目背景
相比非寄宿制学校,初中寄宿制学校的学生管理让人头疼,学生的管理不单单是白天的课堂上和下课后,晚上的管理会出更多的问题。以及初中的青少年都处于青春的萌芽状态,早恋现象也时而发生。更有甚者,在校园的印记处经常会出现校园欺凌,霸凌事件。由于欺凌霸凌事件的隐蔽性,突然性,常常使得值周老师无可奈何。
为了有效的防止青少年早恋以及欺凌霸凌的行为,专门设计了校园隐蔽空间可视化预警系统。
FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统图1
二、方案设计
1、使用mind+1.8制作校园监控及预警大屏。
2、使用行空板自带的SIOT2.0物联网平台,存储和物联通信。
3、项目共设计了大屏数据监测和视频监控系统。使用行空板自带的光照传感器和声强传感器采集数据,并上传到物联网平台,连接可视化大屏,可以看到当前光照情况和声音强度。便于值周老师对于环境的直观认识。
4、由于青少年早恋以及欺凌霸凌的行为都发生在空间隐蔽,或者光照昏暗的场所,使用行空板的光照传感器检测光照的强度。另外发生青少年早恋以及欺凌霸凌的行为时伴随着声音强度的变化,使用行空板自带的声强传感器可以检测户外声强的变化。
本项目设计思维导图如下所示
FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统图2
5、使用行空板和FireBeetle 2 ESP32-S3主控板完成本次项目
行空板
FireBeetle 2 ESP32-S3(已安装摄像头和天线)

三、制作过程
(一)数据版面大屏设计
利用Mind+的可视化面板,设计“校园隐蔽空间可视化预警系统”大屏。大屏内容包括:当前时间、户外光照、户外声强、摄像头视频、报警按钮。
FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统图3

(二)SIOT设计
利用行空板自带的SIot,设计了以下的数据管理:
FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统图4

(三)行空板程序
积木程序如下:
FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统图5
代码如下:(可复制)

  1. #  -*- coding: UTF-8 -*-
  2. # MindPlus
  3. # Python
  4. import base64
  5. from io import BytesIO
  6. from PIL import Image
  7. from pinpong.extension.unihiker import *
  8. from pinpong.board import Board,Pin
  9. from unihiker import Audio
  10. from unihiker import GUI
  11. import time
  12. import siot
  13. import cv2
  14. # 自定义函数
  15. def LaXiangJingBao():
  16.     for my_variable in range(200, 801):
  17.         buzzer.pitch(my_variable)
  18.         time.sleep(0.005)
  19.     time.sleep(3)
  20.     for my_variable in range(800, 199, -1):
  21.         buzzer.pitch(my_variable)
  22.         time.sleep(0.005)
  23. # 事件回调函数
  24. def on_message_callback(client, userdata, msg):
  25.     if (msg.payload.decode() == "on"):
  26.         LaXiangJingBao()
  27. def u_thread1_function():
  28.     vd = cv2.VideoCapture()
  29.     vd.open("http://192.168.97.90:81/stream")
  30.     if vd.isOpened():
  31.         while not (False):
  32.             if vd.grab():
  33.                 ret, grab = vd.read()
  34.                 cv2.imshow("Mind+.png", grab)
  35.                 siot.publish(topic="siot/video", data=base642base64(grab))
  36.                 if cv2.waitKey(20) & 0xff== 65:
  37.                     break
  38. siot.init(client_id="45850317527391704",server="192.168.97.139",port=1883,user="siot",password="dfrobot")
  39. u_gui=GUI()
  40. u_audio = Audio()
  41. Board().begin()
  42. siot.connect()
  43. siot.loop()
  44. siot.set_callback(on_message_callback)
  45. def frame2base64(frame):
  46.     frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
  47.     img = Image.fromarray(frame) #将每一帧转为Image
  48.     output_buffer = BytesIO() #创建一个BytesIO
  49.     img.save(output_buffer, format='JPEG') #写入output_buffer
  50.     byte_data = output_buffer.getvalue() #在内存中读取
  51.     base64_data = base64.b64encode(byte_data) #转为BASE64
  52.     return base64_data #转码成功 返回base64编码
  53. def base642base64(frame):
  54.     data=str('data:image/png;base64,')
  55.     base64data = str(frame2base64(frame))
  56.     framedata = base64data[2:(len(base64data)-1)]
  57.     base642base64_data = data + str(framedata)
  58.     return base642base64_data
  59. siot.getsubscribe(topic="siot/警报")
  60. thread1=u_gui.start_thread(u_thread1_function)
  61. while True:
  62.     siot.publish_save(topic="siot/声音", data=u_audio.sound_level())
  63.     siot.publish_save(topic="siot/光照", data=light.read())
  64.     time.sleep(3)
复制代码



(四)使用FireBeetle 2 ESP32-S3驱动摄像头实现web图传
1、环境配置
环境配置可以查看以下网址:
FireBeetle 2 ESP32-S3初体验之教师投影辅助神器 https://mc.dfrobot.com.cn/thread-316867-1-1.html
Arduino环境配置  https:wiki.dfrobot.com.cn/_SKU_DFR0975_FireBeetle_2_Board_ESP32_S3#target_5

2、编写代码

FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统图6
代码如下:(可复制)
  1. #include "esp_camera.h"
  2. #include <WiFi.h>
  3. // ===================
  4. // Select camera model
  5. // ===================
  6. #define PWDN_GPIO_NUM     -1
  7. #define RESET_GPIO_NUM    -1
  8. #define XCLK_GPIO_NUM     45
  9. #define SIOD_GPIO_NUM     1
  10. #define SIOC_GPIO_NUM     2
  11. #define Y9_GPIO_NUM       48
  12. #define Y8_GPIO_NUM       46
  13. #define Y7_GPIO_NUM       8
  14. #define Y6_GPIO_NUM       7
  15. #define Y5_GPIO_NUM       4
  16. #define Y4_GPIO_NUM       41
  17. #define Y3_GPIO_NUM       40
  18. #define Y2_GPIO_NUM       39
  19. #define VSYNC_GPIO_NUM    6
  20. #define HREF_GPIO_NUM     42
  21. #define PCLK_GPIO_NUM     5
  22. #include "DFRobot_AXP313A.h"
  23. DFRobot_AXP313A axp;
  24. // ===========================
  25. // Enter your WiFi credentials
  26. // ===========================
  27. const char* ssid = "HHZX";
  28. const char* password = "123456789";
  29. void startCameraServer();
  30. void setup() {
  31.   Serial.begin(115200);
  32.   Serial.setDebugOutput(true);
  33.   Serial.println("waiting...");
  34.   while(axp.begin() != 0){
  35.     Serial.println("init error");
  36.     delay(1000);
  37.   }
  38.   axp.enableCameraPower(axp.eOV2640);//设置摄像头供电
  39.   camera_config_t config;
  40.   config.ledc_channel = LEDC_CHANNEL_0;
  41.   config.ledc_timer = LEDC_TIMER_0;
  42.   config.pin_d0 = Y2_GPIO_NUM;
  43.   config.pin_d1 = Y3_GPIO_NUM;
  44.   config.pin_d2 = Y4_GPIO_NUM;
  45.   config.pin_d3 = Y5_GPIO_NUM;
  46.   config.pin_d4 = Y6_GPIO_NUM;
  47.   config.pin_d5 = Y7_GPIO_NUM;
  48.   config.pin_d6 = Y8_GPIO_NUM;
  49.   config.pin_d7 = Y9_GPIO_NUM;
  50.   config.pin_xclk = XCLK_GPIO_NUM;
  51.   config.pin_pclk = PCLK_GPIO_NUM;
  52.   config.pin_vsync = VSYNC_GPIO_NUM;
  53.   config.pin_href = HREF_GPIO_NUM;
  54.   config.pin_sscb_sda = SIOD_GPIO_NUM;
  55.   config.pin_sscb_scl = SIOC_GPIO_NUM;
  56.   config.pin_pwdn = PWDN_GPIO_NUM;
  57.   config.pin_reset = RESET_GPIO_NUM;
  58.   config.xclk_freq_hz = 20000000;
  59.   config.frame_size = FRAMESIZE_UXGA;
  60.   config.pixel_format = PIXFORMAT_JPEG; // for streaming
  61.   //config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition
  62.   config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
  63.   config.fb_location = CAMERA_FB_IN_PSRAM;
  64.   config.jpeg_quality = 12;
  65.   config.fb_count = 1;
  66.   // if PSRAM IC present, init with UXGA resolution and higher JPEG quality
  67.   //                      for larger pre-allocated frame buffer.
  68.   if(config.pixel_format == PIXFORMAT_JPEG){
  69.     if(psramFound()){
  70.       config.jpeg_quality = 10;
  71.       config.fb_count = 2;
  72.       config.grab_mode = CAMERA_GRAB_LATEST;
  73.     } else {
  74.       // Limit the frame size when PSRAM is not available
  75.       config.frame_size = FRAMESIZE_SVGA;
  76.       config.fb_location = CAMERA_FB_IN_DRAM;
  77.     }
  78.   } else {
  79.     // Best option for face detection/recognition
  80.     config.frame_size = FRAMESIZE_240X240;
  81. #if CONFIG_IDF_TARGET_ESP32S3
  82.     config.fb_count = 2;
  83. #endif
  84.   }
  85. #if defined(CAMERA_MODEL_ESP_EYE)
  86.   pinMode(13, INPUT_PULLUP);
  87.   pinMode(14, INPUT_PULLUP);
  88. #endif
  89.   // camera init
  90.   esp_err_t err = esp_camera_init(&config);
  91.   if (err != ESP_OK) {
  92.     Serial.printf("Camera init failed with error 0x%x", err);
  93.     return;
  94.   }
  95.   sensor_t * s = esp_camera_sensor_get();
  96.   // initial sensors are flipped vertically and colors are a bit saturated
  97.   if (s->id.PID == OV3660_PID) {
  98.     s->set_vflip(s, 1); // flip it back
  99.     s->set_brightness(s, 1); // up the brightness just a bit
  100.     s->set_saturation(s, -2); // lower the saturation
  101.   }
  102.   // drop down frame size for higher initial frame rate
  103.   if(config.pixel_format == PIXFORMAT_JPEG){
  104.     s->set_framesize(s, FRAMESIZE_QVGA);
  105.   }
  106. #if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
  107.   s->set_vflip(s, 1);
  108.   s->set_hmirror(s, 1);
  109. #endif
  110. #if defined(CAMERA_MODEL_ESP32S3_EYE)
  111.   s->set_vflip(s, 1);
  112. #endif
  113.   WiFi.begin(ssid, password);
  114.   WiFi.setSleep(false);
  115.   while (WiFi.status() != WL_CONNECTED) {
  116.     delay(500);
  117.     Serial.print(".");
  118.   }
  119.   Serial.println("");
  120.   Serial.println("WiFi connected");
  121.   startCameraServer();
  122.   Serial.print("Camera Ready! Use 'http://");
  123.   Serial.print(WiFi.localIP());
  124.   Serial.println("' to connect");
  125. }
  126. void loop() {
  127.   // Do nothing. Everything is done in another task by the web server
  128.   delay(10000);
  129. }
复制代码


3、程序调试
踩坑ONE.....在上传程序时,打开串口监视器,没有内容。有可能是没有配置如下设置(当您选择 Disabled 时,串口为RX(44)、TX(43),如果您需要通过USB在Arduino监视器上打印,您需要选择Enable)
踩坑TWO......将程序上传到行空板出现如下提示:
FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统图11
FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统图12
这种情况都是编写代码不当造成的,将openCV模块的代码改写如下,程序运行正常。
FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统图13
今天你走过了人生所有的弯路,从此人生尽是坦途。
FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统图7
图传完成后调试行空板,一切顺利的话,可以使用了。
4、外观设计
使用订书钉的盒子,将板子粘贴到盒子内部,天线固定盒外,摄像头固定在盒子上,看起来很简单的样子。
四、效果展示
本例是使用行空板连接FireBeetle 2 ESP32-S3图传的视频数据,并显示到行空板和数据大屏上。
下图可以看到行空板上出现摄像头拍摄画面。
FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统图8

siot服务器还采集了光照强度和声音强度的数据,这些数据都会可视化的方式显示在大屏中。
FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统图9
FireBeetle 2 ESP32-S3助力校园隐蔽空间可视化预警系统图10
如下所示是可视化大屏拍摄到画面和显示当前声音强度和光照强度的截图。
在教室办公的老师发现大屏中出现异常情况,如有小青年在这里打情骂俏,或者出现打架的行为,可以点击响铃按钮,出现防空警报的铃声,这样可以让学生受到惊吓,而不敢在触犯校园规定。

五、附件



欺凌.jpg
早恋.png

行空板程序校园隐蔽空间可视化预警系统.rar

212.11 KB, 下载次数: 43

行空板程序文件

可视化大屏系统校园隐蔽空间可视化预警系统.rar

655.37 KB, 下载次数: 33

行空板可视化大屏设计文件

CameraWebServer.rar

49.24 KB, 下载次数: 39

FireBeetle 2 ESP32-S3图传代码文件

rzyzzxw  版主

发表于 2023-9-9 07:29:07

感谢分享。
回复

使用道具 举报

_深蓝_  中级技师
 楼主|

发表于 2023-9-12 16:41:44


可以试试。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail