查看: 681|回复: 3

【0531更新教程】Blynk+M5timer_camera,易于实现部署的家居检测

[复制链接]

该用户从未签到

发表于 2021-5-13 22:09 | 显示全部楼层 |阅读模式
本帖最后由 沧海笑1122 于 2021-5-31 19:15 编辑

   Blynk+M5timer_camera(esp32 core),易于实现部署的家居监测(0531更新详见四楼
【背景故事】
本教程源于B站自制 ESP32+Blynk 无线 Wi-Fi 监控系统,实时画面 作者:乐鑫物联网学院
作者说明 原始搬运自:https://www.youtube.com/watch?v=PaiDT1t07DU


本人用M5stack timer camera(ESP32)进行复现。
先看一下效果。

M5stack timer camera链接:m5-docs(m5stack.com)
docs1.PNG
基本思路:
手机部分采用blynk,blynk里面有一个获取网络图片的组件,M5 camera和blynk app在一个网段内,触发拍摄后,给bkynk server 一个图片链接,app访问并且显示。
关于触发拍摄按钮,是在blynk 构建一个按钮,关联gpio14,即可形成一个按钮事件,放置在程序主循环里,当按钮按动时,即触发一个拍摄,把图片链接通过虚拟pinV1 推送给blynk server ,从而由app获取并且显示在手机上。

     一、软硬件
硬件:安卓手机一部+ M5timer_camera(esp32core)
软件:arduino IDE 1.8.13

      Blynk以及arduino 库
微信图片_20210513220536.jpg 微信图片_202105132205361.jpg 微信图片_202105132205362.jpg
二、代码
  1. /*************************************************************
  2.   Download latest Blynk library here:
  3.     https://github.com/blynkkk/blynk-library/releases/latest

  4.   Blynk is a platform with iOS and Android apps to control
  5.   Arduino, Raspberry Pi and the likes over the Internet.
  6.   You can easily build graphic interfaces for all your
  7.   projects by simply dragging and dropping widgets.

  8.     Downloads, docs, tutorials: http://www.blynk.cc
  9.     Sketch generator:           http://examples.blynk.cc
  10.     Blynk community:            http://community.blynk.cc
  11.     Follow us:                  http://www.fb.com/blynkapp
  12.                                 http://twitter.com/blynk_app

  13.   Blynk library is licensed under MIT license
  14.   This example code is in public domain.

  15. *************************************************************
  16.   This example runs directly on ESP32 chip.

  17.   Note: This requires ESP32 support package:
  18.     https://github.com/espressif/arduino-esp32

  19.   Please be sure to select the right ESP32 module
  20.   in the Tools -> Board menu!

  21.   Change WiFi ssid, pass, and Blynk auth token to run :)
  22.   Feel free to apply it to any other example. It's simple!
  23. *************************************************************/
  24. //2021-05-03
  25. //blynk+m5stack timer_cam ,it works
  26. //https://www.bilibili.com/video/BV1Si4y1L7gZ
  27. //https://www.youtube.com/watch?v=PaiDT1t07DU

  28. /* Comment this out to disable prints and save space */
  29. #define BLYNK_PRINT Serial
  30. #include "esp_camera.h"

  31. #include <WiFi.h>
  32. #include <WiFiClient.h>
  33. #include <BlynkSimpleEsp32.h>
  34. #include "camera_pins.h"
  35. String local_IP;
  36. int count = 0;
  37. void startCameraServer();

  38. // You should get Auth Token in the Blynk App.
  39. // Go to the Project Settings (nut icon).
  40. const char* auth = "your auth";


  41. // Your WiFi credentials.
  42. // Set password to "" for open networks.
  43. const char* ssid = "your ssid";
  44. const char* pass = "your pass";
  45. char domain[]="blynk.mixly.org";

  46. #define PHOTO 14      //ESP32 CAM 1 拍摄按钮

  47. #define LED 2  //定义led灯,拍摄时闪动
  48. void takePhoto()
  49. {
  50.   digitalWrite(LED, HIGH);//led闪动,表明一个拍摄过程
  51.   delay(200);
  52.   uint32_t randomNum = random(50000);
  53.   Serial.println("http://"+local_IP+"/capture?_cb="+ (String)randomNum);
  54.   Blynk.setProperty(V1, "urls", "http://"+local_IP+"/capture?_cb="+(String)randomNum); //将cam拍摄的图片通过V1发送至blynk server,从而由blynk图片组件获取后访问并且显示在页面
  55.   digitalWrite(LED, LOW);
  56.   delay(1000);
  57. }

  58. void setup()
  59. {

  60.   Serial.begin(115200);
  61.   Serial.setDebugOutput(true);
  62.   Serial.println();
  63.   pinMode(LED, OUTPUT);
  64.   digitalWrite(LED, HIGH);
  65.   //cam初始化
  66.   camera_config_t config;
  67.   config.ledc_channel = LEDC_CHANNEL_0;
  68.   config.ledc_timer = LEDC_TIMER_0;
  69.   config.pin_d0 = Y2_GPIO_NUM;
  70.   config.pin_d1 = Y3_GPIO_NUM;
  71.   config.pin_d2 = Y4_GPIO_NUM;
  72.   config.pin_d3 = Y5_GPIO_NUM;
  73.   config.pin_d4 = Y6_GPIO_NUM;
  74.   config.pin_d5 = Y7_GPIO_NUM;
  75.   config.pin_d6 = Y8_GPIO_NUM;
  76.   config.pin_d7 = Y9_GPIO_NUM;
  77.   config.pin_xclk = XCLK_GPIO_NUM;
  78.   config.pin_pclk = PCLK_GPIO_NUM;
  79.   config.pin_vsync = VSYNC_GPIO_NUM;
  80.   config.pin_href = HREF_GPIO_NUM;
  81.   config.pin_sscb_sda = SIOD_GPIO_NUM;
  82.   config.pin_sscb_scl = SIOC_GPIO_NUM;
  83.   config.pin_pwdn = PWDN_GPIO_NUM;
  84.   config.pin_reset = RESET_GPIO_NUM;
  85.   config.xclk_freq_hz = 20000000;
  86.   config.pixel_format = PIXFORMAT_JPEG;
  87.   config.frame_size = FRAMESIZE_UXGA;
  88.   config.jpeg_quality = 4;  //default=10
  89.   config.fb_count = 2;

  90.   // camera init
  91.   esp_err_t err = esp_camera_init(&config);
  92.   if (err != ESP_OK) {
  93.     Serial.printf("Camera init failed with error 0x%x", err);
  94.     return;
  95.   }

  96.   sensor_t * s = esp_camera_sensor_get();
  97.   //initial sensors are flipped vertically and colors are a bit saturated
  98.   s->set_vflip(s, 1);//flip it back
  99.   s->set_brightness(s, 1);//up the blightness just a bit
  100.   s->set_saturation(s, -2);//lower the saturation

  101.   //drop down frame size for higher initial frame rate
  102.   s->set_framesize(s, FRAMESIZE_QVGA);

  103. //建立wifi连接,主要为了获取local_IP
  104.    WiFi.begin(ssid, pass);

  105.   while (WiFi.status() != WL_CONNECTED) {
  106.     delay(500);
  107.     Serial.print(".");
  108.   }
  109.   Serial.println("");
  110.   Serial.println("WiFi connected");
  111.   
  112.   startCameraServer();
  113.     Serial.print("Camera Ready! Use 'http://");
  114.   Serial.print(WiFi.localIP());
  115.   
  116.   local_IP = WiFi.localIP().toString();  //获取local_IP
  117.   Serial.println("' to connect");
  118.   Blynk.begin(auth, ssid, pass,"Blynk.mixly.org",8080);
  119. }

  120. void loop()
  121. {
  122.   // put your main code here, to run repeatedly:

  123.     Blynk.run();
  124.   //用户在app上按动拍摄按钮,则触发本事件
  125.   if(digitalRead(PHOTO) == HIGH){  
  126.     takePhoto();
  127.     }
  128. }
复制代码
一、后续

后续我会利用一个二自由度云台,加上m5的舵机驱动模块,形成一个简单的可以调整摄像头拍摄角度的家具监测。
next1.jpg
感谢裘师兄提供blynk.mixly.org服务器。
感谢M5提供好玩有趣的极客工具。
感谢arduino.cn提供平台。
最重要感谢原创者:https://www.youtube.com/watch?v=PaiDT1t07DU
以及乐鑫物联网学院在B站的搬运。
已经立夏,万物勃发。

沧海抱拳。

代码如下:

ESP32_WiFi_cam_upload_0513.zip (2.39 KB, 下载次数: 3)

签到天数: 117 天

[LV.6]常住居民II

发表于 2021-5-14 00:31 | 显示全部楼层
谢谢沧海笑1122老师的分享,一起学习一起进步!

该用户从未签到

 楼主| 发表于 2021-5-14 10:50 | 显示全部楼层
topdog 发表于 2021-5-14 00:31
谢谢沧海笑1122老师的分享,一起学习一起进步!

感谢师兄支持鼓励

该用户从未签到

 楼主| 发表于 2021-5-31 19:13 | 显示全部楼层
本帖最后由 沧海笑1122 于 2021-5-31 19:16 编辑

【0531更新】
通过舵机控制板+二自由度舵机云台实现了简易的家居监测。用户在手机blynk APP上通过滑动棒来改变舵机的水平旋转或者仰角角度,从而对不同的家居目标进行拍摄,在设置好摄像头位置后,按动拍摄按钮,即可从blynk APP上观察到家居目标的拍摄情况。
先看一下效果。
l  基本思路:
手机部分安装blynk APP,blynk里面有一个获取网络图片的组件,M5 camera和blynk app在一个网段内,用户触发拍摄后,M5Stack Timer Camera将建立一个照片服务,给blynk server发送一个图片链接,blynk APP访问此链接并且显示。
触发拍摄按钮,就是在blynk 构建一个按钮,关联M5Stack Timer Camera的gpio14,即可形成一个按钮事件,放置在程序主循环里,当按钮按动时,触发一个拍摄行为,M5StackTimer Camera把图片链接通过虚拟pinV1 推送给blynkserver ,从而由app获取并且显示在手机上。
    舵机控制部分的用户界面也在blynk APP上,通过两个slider(滑动棒)组件进行参数设置,很方便拖动设置舵机旋转角度,通过V2和V3下发给仰角以及水平旋转舵机。
l  核心知识点:
1、 blynk的图片组件,可以以虚拟针的方式从M5Stack Timer Camera(内核是esp32)读取照片的链接,展示在手机APP上。
2、 M5Stack Timer Camera在摄像头拍摄照片后,实际上建立了一个基于网络的照片服务器,使得其他客户端可以通过各种形式来访问刚刚拍摄的照片。
3、 M5Stack Timer Camera与M5StickC之间用json格式来传送舵机控制指令,算是这个小玩具的第三个知识点。
下图是Blynk的主要界面以及参数设计:
IMG_20210523_174533_a.jpg 全景a_a_a.jpg
l  难度以及有趣指数评估:
难度指数:★★
有趣指数:★★★☆
同样是一个易于上手的小项目,便于加深对M5Stack Timer Camera照片服务以及blynk通信机制的理解。

【制作过程】
一、软硬件
硬件:
  
  
内容
参数及版本
备注
1
安卓手机一部
安卓4.44以上
含blynk APP
2
M5Stack Timer Camera
esp32 core

3
8舵机控制板
含750mah电池
M5Stack出品
4
M5StickC

舵机控制的执行元件
5
二自由度舵机云台
9G舵机

IMG_20210523_124910_a.jpg IMG_20210523_161900_a.jpg
软件:
  
  
内容
参数及版本
备注
1
arduino IDE
1.8.13

2
BlynkAPP 以及arduino 库



连线:
M5StickC与8舵机控制板直接插接即可,二自由度舵机云台的水平旋转舵机以及垂直仰角舵机分别接8舵机控制板的CH1和CH2。
二自由度舵机云台与摄像头的装配

二、逻辑示意图
cam流程_a.jpg C流程图_a.jpg 原理说明1_a.jpg

三、代码:
  1. /*舵机控制的json数据格式
  2. {
  3.   "CH": 1,
  4.   "value":90
  5. }
  6.   s_json="{"CH":+str(1)+","value":+str(pinValue1)}"


  7. */

  8. //编写调试:2021-05-03
  9. //整理于2021-05-26
  10. //blynk+m5stack timer_cam ,it works
  11. //https://www.bilibili.com/video/BV1Si4y1L7gZ
  12. //https://www.youtube.com/watch?v=PaiDT1t07DU

  13. /* Comment this out to disable prints and save space */
  14. #define BLYNK_PRINT Serial
  15. #include "esp_camera.h"

  16. #include <WiFi.h>
  17. #include <WiFiClient.h>
  18. #include <BlynkSimpleEsp32.h>
  19. #include "camera_pins.h"
  20. String local_IP;
  21. int count = 0;
  22. String s_json1;
  23. String s_json2;
  24. #include "HardwareSerial.h"
  25. HardwareSerial MySerial(1);

  26. void startCameraServer();

  27. // You should get Auth Token in the Blynk App.
  28. // Go to the Project Settings (nut icon).
  29. const char* auth = "your auth";

  30. // Your WiFi credentials.
  31. // Set password to "" for open networks.
  32. const char* ssid = "your ssid";
  33. const char* pass = "your psw";
  34. char domain[]="blynk.mixly.org";

  35. #define PHOTO 14      //ESP32 CAM
  36. #define LED 2

  37. void takePhoto()
  38. {
  39.   digitalWrite(LED, HIGH); //板载led闪动,表明一次拍摄过程
  40.   delay(200);
  41.   uint32_t randomNum = random(50000);
  42.   Serial.println("http://"+local_IP+"/capture?_cb="+ (String)randomNum);
  43.   Blynk.setProperty(V1, "urls", "http://"+local_IP+"/capture?_cb="+(String)randomNum); //将本次拍摄照片的网络链接发送给V1,用于blynk APP展示
  44.   digitalWrite(LED, LOW);
  45.   delay(1000);
  46. }
  47. //垂直仰角舵机控制CH2---V2
  48. BLYNK_WRITE(V2) {
  49.   int pinValue2 = param.asInt(); // assigning incoming value from pin V2 to a variable
  50.   // process received value
  51.   Serial.print("V2: ");
  52.   Serial.println(pinValue2);
  53.   //生成一个json串,带有通道号以及旋转角度等参数
  54.   s_json2="{"CH":"+String(2)+","value":"+String(pinValue2)+"}";
  55.   MySerial.println(s_json2);
  56.   delay(50);
  57. }

  58. //水平旋转舵机控制CH1---V3
  59. BLYNK_WRITE(V3) {
  60.   int pinValue1 = param.asInt(); // assigning incoming value from pin V3 to a variable
  61.   // process received value
  62.   Serial.print("V3: ");
  63.   Serial.println(pinValue1);
  64.    //生成一个json串,带有通道号以及旋转角度等参数
  65.   s_json1="{"CH":"+String(1)+","value":"+String(pinValue1)+"}";
  66.   MySerial.println(s_json1);
  67.   delay(50);
  68. }

  69. void setup()
  70. {

  71.   Serial.begin(115200);
  72.   //自定义硬串口
  73.   MySerial.begin(9600, SERIAL_8N1, 13, 4);  //rx 13  white   tx 4 yellow
  74.   Serial.setDebugOutput(true);
  75.   Serial.println();
  76.   pinMode(LED, OUTPUT);
  77.   digitalWrite(LED, HIGH);
  78.   //camera_config
  79.   camera_config_t config;
  80.   config.ledc_channel = LEDC_CHANNEL_0;
  81.   config.ledc_timer = LEDC_TIMER_0;
  82.   config.pin_d0 = Y2_GPIO_NUM;
  83.   config.pin_d1 = Y3_GPIO_NUM;
  84.   config.pin_d2 = Y4_GPIO_NUM;
  85.   config.pin_d3 = Y5_GPIO_NUM;
  86.   config.pin_d4 = Y6_GPIO_NUM;
  87.   config.pin_d5 = Y7_GPIO_NUM;
  88.   config.pin_d6 = Y8_GPIO_NUM;
  89.   config.pin_d7 = Y9_GPIO_NUM;
  90.   config.pin_xclk = XCLK_GPIO_NUM;
  91.   config.pin_pclk = PCLK_GPIO_NUM;
  92.   config.pin_vsync = VSYNC_GPIO_NUM;
  93.   config.pin_href = HREF_GPIO_NUM;
  94.   config.pin_sscb_sda = SIOD_GPIO_NUM;
  95.   config.pin_sscb_scl = SIOC_GPIO_NUM;
  96.   config.pin_pwdn = PWDN_GPIO_NUM;
  97.   config.pin_reset = RESET_GPIO_NUM;
  98.   config.xclk_freq_hz = 20000000;
  99.   config.pixel_format = PIXFORMAT_JPEG;
  100.   config.frame_size = FRAMESIZE_UXGA;
  101.   config.jpeg_quality = 4;  //default=10
  102.   config.fb_count = 2;

  103.   // camera init
  104.   esp_err_t err = esp_camera_init(&config);
  105.   if (err != ESP_OK) {
  106.     Serial.printf("Camera init failed with error 0x%x", err);
  107.     return;
  108.   }
  109.   
  110.   sensor_t * s = esp_camera_sensor_get();
  111.   //initial sensors are flipped vertically and colors are a bit saturated
  112.   s->set_vflip(s, 1);//flip it back
  113.   s->set_brightness(s, 1);//up the blightness just a bit
  114.   s->set_saturation(s, -2);//lower the saturation

  115.   //drop down frame size for higher initial frame rate
  116.   s->set_framesize(s, FRAMESIZE_QVGA);

  117.   WiFi.begin(ssid, pass);
  118.   //wifi连接并且返回一个local_IP,用于传递图片服务器链接
  119.   while (WiFi.status() != WL_CONNECTED) {
  120.     delay(500);
  121.     Serial.print(".");
  122.   }
  123.   Serial.println("");
  124.   Serial.println("WiFi connected");
  125.   
  126.   startCameraServer();
  127.     Serial.print("Camera Ready! Use 'http://");
  128.   Serial.print(WiFi.localIP());
  129.   
  130.   local_IP = WiFi.localIP().toString();
  131.   Serial.println("' to connect");
  132.   //Blynk Server连接
  133.   Blynk.begin(auth, ssid, pass,"Blynk.mixly.org",8080);
  134.   
  135. }

  136. void loop()
  137. {
  138.   // put your main code here, to run repeatedly:
  139.     Blynk.run();
  140.   //判断是否拍摄按钮在Blynk APP中被按下,photo Pin=gp14
  141.   if(digitalRead(PHOTO) == HIGH){
  142.     takePhoto();
  143.     }
  144. }
复制代码
C端代码

  1. /*
  2. M5StickC端控制程序(来自M5Stack Timer Camera的uart)
  3. M5StickC端舵机控制json数据格式
  4. {
  5.   "CH": 1,
  6.   "value":90
  7. }
  8. 整理:2021-05-26
  9. */
  10. #include <M5StickC.h>
  11. #include "IIC_servo.h"
  12. #include <ArduinoJson.h>
  13. #include "HardwareSerial.h"
  14. HardwareSerial MySerial(1);
  15. // the setup routine runs once when M5StickC starts up
  16. void setup(){
  17.   // Initialize the M5StickC object
  18.   M5.begin();
  19.   // LCD display
  20.   M5.Lcd.println("  IIC_servo");
  21.   //自定义硬串口
  22.   MySerial.begin(9600, SERIAL_8N1, 32, 33);  //rx 32 yellow   tx33 white
  23.   IIC_Servo_Init();     //sda  0     scl  26
  24.   M5.Lcd.println("  begin :");

  25. }

  26. // the loop routine runs over and over again forever
  27. void loop() {
  28.   while (!MySerial.available())
  29.    delay(100);
  30.   // Deserialize the JSON document
  31.   const size_t capacity = JSON_OBJECT_SIZE(4) + 50;//定义来自arduinojson.org的助手生成
  32.   DynamicJsonDocument doc(capacity);
  33.   DeserializationError error = deserializeJson(doc, MySerial); //解析来自MySerial的数据流
  34.   // Test if parsing succeeds.
  35.   if (error) {
  36.     Serial.print(F("deserializeJson() failed: "));
  37.     Serial.println(error.c_str());
  38.     return;
  39.   }
  40. int i_ch=doc["CH"]; //解析第X(1或2)路舵机
  41. int i_value=doc["value"]; //解析角度值
  42. Servo_angle_set(i_ch,i_value);    //执行,对CHX设定角度value°
  43. Serial.print(i_ch);
  44. Serial.print("*");
  45. Serial.println(i_value);
  46. delay(100);
  47. }
复制代码

一、后记
Blynk+M5Stack Timer Camera+M5StickC以及一个二自由度云台(当然少不了M5Stack的舵机驱动模块),就形成一个简单的可以调整摄像头拍摄角度的家具监测。
感谢裘师兄提供blynk.mixly.org服务器。
最重要感谢原创者:https://www.youtube.com/watch?v=PaiDT1t07DU
以及乐鑫物联网学院在B站的搬运。
最好人生是小满,花未全开月未圆。
沧海抱拳。

IMG_20210523_174423_a.jpg
全景背后a.jpg
仰视全景1_a.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

blinker物联网教程——11、自动灌溉
blinker物联网教程——11
简介[hr] 农业是用水大户,近年来农业用水量约占经济社会用水总量的62%,部分地区高达
【Arduino】168种传感器模块系列实验(43)---单路继电器模块
【Arduino】168种传感器模
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
为什么电平为LOW时LED亮而反之不亮
为什么电平为LOW时LED亮而
如题,刚入门ESP8266,买了个开发板回来感到大惑不解,代码如图 此时板载LED常亮,利用串
想在原有的项目上加上一个呼吸灯怎么做才不影响原程序
想在原有的项目上加上一个
如题,想在原来的程序上加上一个呼吸灯,但是程序中的delay会影响到程序的其他部分,
串口分析字符操作符,灵活的实现自动化控制。
串口分析字符操作符,灵活
Arduino String可以分析串口读取的字符是何种操作符,一共十三种: isAlphaNumeric
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表