ESP32-CAM ——Blinker平台

ESP32-CAM,点灯云平台Blinker,MQTT协议,APP控制,Wifi视频监控,点灯,控制舵机。

一 环境搭建

两个宝藏网站

 点灯科技 (diandeng.tech)

软件下载 - Arduino中文社区

第一次体验Arduino

按照上面教程安装ESP32固件包

语言改为中文

二 常用基本语法 

学过stm32再看Arduino代码,有种看少儿编程的感觉哈哈哈 

串口println

用串口连接电脑,5V

RX-UoT

TX-UnR

IO0 需要连接 GND

工具=》选择开发板=》esp32=》AIThinker ESP32-CAM

下面代码为设置波特率

setup 可以理解为 main 函数 while(1) 之前

loop 理解为 while(1) 里

loop内循环打印字符串, 

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("hello world");
}

选择端口,点击上传即可

一直显示Connecting就按一下reset 

上传完毕,IO0 断开 GND,按下RESET,打开串口监视器,可看见循环打印字符串

点个灯

由图可知GPIO4对应LED 

文件=》例程

提供了很多模板,一看就懂

int led = 4;

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(led, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(led, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(led, LOW);   // turn the LED off by making the voltage LOW
  delay(1000);                      // wait for a second
}

舵机控制

GPIO12输出PWM

#define ServoPin 12

void Myservo(int angle)
{
  for (int i = 0; i < 5; i++) {
    int pulsewidth = (angle * 11) + 500;        //将角度转化为500-2480的脉宽值
    digitalWrite(ServoPin, HIGH);               //将舵机接口电平至高
    delayMicroseconds(pulsewidth);              //延时脉宽值的微秒数
    digitalWrite(ServoPin, LOW);                //将舵机接口电平至低
    delayMicroseconds(20000 - pulsewidth);      //延时脉宽值的微秒数
  }
  delay(10);
}

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(ServoPin, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  Myservo(0);
  delay(1000);                      // wait for a second
  Myservo(45);
  delay(1000);                      // wait for a second
  Myservo(90);
  delay(1000);                      // wait for a second
  Myservo(135);
  delay(1000);                      // wait for a second
  Myservo(180);
  delay(1000);                      // wait for a second
}

超声波测距

最后加了个if,软件过滤掉误差

#define Echo 13
#define Trag 15

long gettime()
{
  digitalWrite(Trag,HIGH);
  delayMicroseconds(10);
  digitalWrite(Trag,LOW);

  return pulseIn(Echo,HIGH);
}

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(Echo, INPUT);
  pinMode(Trag, OUTPUT);
  Serial.begin(115200);
}

// the loop function runs over and over again forever
void loop() {
  long dis = gettime()/58;
  if(dis > 2) Serial.println(dis);
}

三 摄像头使用

前面都是小卡拉米,正戏这里开始。

先嫖个示例 

改为使用 AI_THINKER ,Wifi名密码改成自己的手机热点

// ===================
// Select camera model
// ===================
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
//#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM
#define CAMERA_MODEL_AI_THINKER // Has PSRAM
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM
//#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM
// ** Espressif Internal Boards **
//#define CAMERA_MODEL_ESP32_CAM_BOARD
//#define CAMERA_MODEL_ESP32S2_CAM_BOARD
//#define CAMERA_MODEL_ESP32S3_CAM_LCD

#include "camera_pins.h"

// ===========================
// Enter your WiFi credentials
// ===========================
const char* ssid = "IQOO 5";
const char* password = "88888888";
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6388
entry 0x400806b4
E (79) psram: PSRAM ID read error: 0xffffffff

.......
WiFi connected
Starting web server on port: '80'
Starting stream server on port: '81'
Camera Ready! Use 'http://192.168.100.9' to connect

电脑和cam都连接上手机热点,烧录完成后,访问串口提供的网址 

四 使用Blinker云平台

监控视频传输

下载点灯科技云平台APP,注册,添加设备,选择网络设备,可以得到一个“密钥”

例程选择最下面的 Blinker 里的 Blinker_ESP32_CAM。

“密钥”、Wifi和密码,填入程序, Blinker.begin()入参“密钥”、Wifi和密码

#define BLINKER_WIFI
//#define BLINKER_ESP_SMARTCONFIG

#include <Blinker.h>
#include "ESP32_CAM_SERVER.h"

//blinker提供的密钥,WiFi名密码
char auth[] = "8578f8f1626f";
char ssid[] = "iQOO 5";
char pswd[] = "88888888";
//默认摄像头不开启
bool setup_camera = false;
//反馈设备状态
void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

    Blinker.vibrate();//按下APP按键产生震动
    
    uint32_t BlinkerTime = millis();
    
    Blinker.print("millis", BlinkerTime);
}

void setup()
{
    Serial.begin(115200);//串口使得能
    BLINKER_DEBUG.stream(Serial);//blinker串口debug

    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);
    
    Blinker.begin(auth,ssid,pswd);//通过WiFi账号密码连接平台
    Blinker.attachData(dataRead);//反馈设备状态
}

void loop()
{
    Blinker.run();//blinker运行 包括连接blinker云 MQTT协议
    //判断设备是否正常执行 正常就输入ip地址
    if (Blinker.connected() && !setup_camera)
    {
        setupCamera();
        setup_camera = true;

        Blinker.printObject("video", "{\"str\":\"mjpg\",\"url\":\"http://"+ WiFi.localIP().toString() + "\"}");
    }
}

编译出错         exit status 1        就把Blinker库卸载重新导入,去除原zip名里的防重“(1)”这种

APP添加一个“视频”,mjpg,输入获得的网址

[2786] WiFi Connected.
[2786] IP Address: 
[2786] 192.168.100.9
[4410] Freeheap: 177596
[4414] mDNS responder started
[4417] webSocket_MQTT server started
[4417] ws://DAFE7962GYXI01DUHFFY724S.local:81

MQTT控灯

官网找到按钮示例 

 点灯科技 (diandeng.tech)

 添加一个按钮控制GPIO输出,实现开灯关灯


#define BLINKER_WIFI
//#define BLINKER_ESP_SMARTCONFIG

#define led 4

#include <Blinker.h>
#include "ESP32_CAM_SERVER.h"

// 新建组件对象
BlinkerButton Button1("led");

// 按下按键即会执行该函数
void button1_callback(const String & state) {
    BLINKER_LOG("get button state: ", state);
    digitalWrite(led, !digitalRead(led));
}

//blinker提供的密钥,WiFi名密码
char auth[] = "8578f8f1626f";
char ssid[] = "iQOO 5";
char pswd[] = "88888888";
//默认摄像头不开启
bool setup_camera = false;
//反馈设备状态
void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

    Blinker.vibrate();//按下APP按键产生震动
    
    uint32_t BlinkerTime = millis();
    
    Blinker.print("millis", BlinkerTime);
}

void setup()
{
    Serial.begin(115200);//串口使得能
    BLINKER_DEBUG.stream(Serial);//blinker串口debug
    
    pinMode(led, OUTPUT);
    digitalWrite(led, LOW);
    
    Blinker.begin(auth,ssid,pswd);//通过WiFi账号密码连接平台
    Blinker.attachData(dataRead);//反馈设备状态
    Button1.attach(button1_callback);//关联处理按钮函数
}

添加按钮和监视器,按钮内容改为led与代码一致 

 

MQTT控制舵机

一个最大值为180的滑块。 

 

 完整代码

#define BLINKER_WIFI
//#define BLINKER_ESP_SMARTCONFIG

#define led 4
#define ServoPin 12          //控制舵机

#include <Blinker.h>
#include "ESP32_CAM_SERVER.h"

// 新建组件对象
BlinkerButton Button1("led");
// 新建组件对象
BlinkerSlider Slider0("duoji");   //位置0-3 滑块 数据键名  舵机范围0-180

//舵机控制代码
void Myservo(int angle)
{
  for (int i = 0; i < 5; i++) {
    int pulsewidth = (angle * 11) + 500;        //将角度转化为500-2480的脉宽值
    digitalWrite(ServoPin, HIGH);               //将舵机接口电平至高
    delayMicroseconds(pulsewidth);              //延时脉宽值的微秒数
    digitalWrite(ServoPin, LOW);                //将舵机接口电平至低
    delayMicroseconds(20000 - pulsewidth);      //延时脉宽值的微秒数
  }
  delay(10);
}

//滑块任务函数
void slider0_callback(int32_t value) //滑块0
{
    int servo=value;
    Myservo(servo);//转动角度}
}

// 按下按键即会执行该函数
void button1_callback(const String & state) {
    BLINKER_LOG("get button state: ", state);
    digitalWrite(led, !digitalRead(led));
}

//blinker提供的密钥,WiFi名密码
char auth[] = "8578f8f1626f";
char ssid[] = "iQOO 5";
char pswd[] = "88888888";
//默认摄像头不开启
bool setup_camera = false;
//反馈设备状态
void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

    Blinker.vibrate();//按下APP按键产生震动
    
    uint32_t BlinkerTime = millis();
    
    Blinker.print("millis", BlinkerTime);
}


void setup()
{
    Serial.begin(115200);//串口使得能
    BLINKER_DEBUG.stream(Serial);//blinker串口debug
    
    pinMode(led, OUTPUT);
    digitalWrite(led, LOW);

    pinMode(ServoPin, OUTPUT);
    digitalWrite(ServoPin, LOW);

    Blinker.begin(auth,ssid,pswd);//通过WiFi账号密码连接平台
    Blinker.attachData(dataRead);//反馈设备状态
    Button1.attach(button1_callback);//关联处理按钮函数
    Slider0.attach(slider0_callback);//关联滑动开关

}

void loop()
{
    Blinker.run();//blinker运行 包括连接blinker云 MQTT协议
    //判断设备是否正常执行 正常就输入ip地址
    if (Blinker.connected() && !setup_camera)
    {
        setupCamera();
        setup_camera = true;

        Blinker.printObject("video", "{\"str\":\"mjpg\",\"url\":\"http://"+ WiFi.localIP().toString() + "\"}");
    }
}
  • 33
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
在上一期的免费项目:高性价比WIFI图传方案快速入门教程的介绍中,详细地介绍了ESP32-CAM模块的简单使用 ,其裁剪了官方图传和人脸识别的代码改造成简单的图传代码,由官方四个文件的代码缩减成一个文件的代码。目的就是让买家能快速上手这个源码。让这个源码复杂度降低很多,利于阅读和学习。 在这一期的免费项目:修改了上一期的项目的源码,实现嵌入式web server功能实现远程浏览器WIFI点灯的操作(PIN4的IO口集成了闪光灯LED,所以不用外接灯了,亮瞎眼的亮度),实现了将服务器嵌入到单片机单片机wifi联网之后,局域网访问单片机主页(通过串口打印的网址)就可以在网页里面控制开发板的灯,该设计是ESP32-CAM物联网应用的一个巨大的尝试,本人浪费生命值写了两天代码,踩了很多坑,也学到很多,写了一共三个版本的代码,此版本的代码是最便宜的一个版本,呵呵,不会接线和操作的看上期的项目即可,这里不再重复说明了,重要的事情说一遍:我有收费版的代码,服务更周到。 下面请看模块运行效果图: 下面是实物图: 模块的原理图: 电脑接上串口CH340,CH340接上ESP32-CAM之后,打开串口调试助手,调试效果如下: 服务器返回消息: 真源码截图(绝对给力): 项目总结:这次是利用ESP32-CAM模块对物联网应用的一次巨大的尝试,在电路城目前好像还没有相关的教程,在B站虽然有类似的项目,但是根本没有源码,也没有教程,而且功能没有我这个那么强大,因为我这个嵌入式服务器是有反馈的,而且支持网页手动输入指令,开灯或者关灯指令发送之后服务器会给客户端一个响应的,代码都是自己手工完成的,也借鉴过很多相关的项目。只要掌握这个嵌入式服务器远程点灯的项目,那么其他类似的设计就可以举一反三了。需要注意的是这个版本的代码是没有任何注释的,代码冗余度也很大,收费版的代码更加精简和加入详细注释(最关键)和调试代码。如下所示: 后期的的项目会涉及到图像处理(颜色识别,人脸检测,人脸识别,颜色跟踪,智能小车,手机app客户端控制,云平台语音识别,云平台图像识别等等,私有云图像处理,私有云监控搭建)全部原创开源,敬请期待。
好的,以下是用 ESP32-CAM 实现可以用 Blinker 蓝牙控制的监控的代码: ```C++ #include <Blinker.h> #include <WiFi.h> #include <WiFiClient.h> #include <WebServer.h> #include "esp_camera.h" // Replace with your network credentials const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; // Blinker configuration #define BLINKER_WIFI #define BLINKER_DEBUG_ALL #define BLINKER_AUTH_MODE BLINKER_AUTH_SSID #define BLINKER_AUTH ssid, password #define BLINKER_DEVICE_TYPE "your_device_type" #define BLINKER_DEVICE_ID "your_device_id" #define BLINKER_DEVICE_NAME "your_device_name" #define BLINKER_SERVER_PORT 8080 WebServer server(80); void setup() { Serial.begin(115200); // Connect to WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("WiFi connected."); // Blinker initialization Blinker.begin(); // Camera initialization camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = 5; config.pin_d1 = 18; config.pin_d2 = 19; config.pin_d3 = 21; config.pin_d4 = 36; config.pin_d5 = 39; config.pin_d6 = 34; config.pin_d7 = 35; config.pin_xclk = 0; config.pin_pclk = 22; config.pin_vsync = 25; config.pin_href = 23; config.pin_sscb_sda = 26; config.pin_sscb_scl = 27; config.pin_pwdn = 32; config.pin_reset = -1; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; config.frame_size = FRAMESIZE_VGA; config.jpeg_quality = 10; config.fb_count = 2; esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); return; } Serial.println("Camera initialized."); // Web server initialization server.on("/", [](){ String html = "<!DOCTYPE html><html><head><title>ESP32-CAM Blinker Monitor</title><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head><body><img src=\"/stream\"></body></html>"; server.send(200, "text/html", html); }); server.on("/stream", [](){ camera_fb_t* fb = NULL; fb = esp_camera_fb_get(); if (!fb) { Serial.println("Camera capture failed."); server.send(500, "text/plain", "Camera capture failed."); return; } server.sendContent_P(200, "image/jpeg", (const char*)fb->buf, fb->len); esp_camera_fb_return(fb); }); server.begin(); Serial.println("Web server started."); } void loop() { Blinker.run(); server.handleClient(); } // Blinker control callback void blinkerControl(const String& message) { Serial.println("Blinker control: " + message); if (message == "on") { digitalWrite(4, HIGH); Blinker.print("switch", "on"); } else if (message == "off") { digitalWrite(4, LOW); Blinker.print("switch", "off"); } } // Blinker heartbeat callback void blinkerHeartbeat() { Blinker.print("state", "on"); } // Blinker message callback void blinkerMessage(const String& message) { Serial.println("Blinker message: " + message); } ``` 这个代码实现了以下功能: 1. 连接到您的 Wi-Fi 网络。 2. 初始化 Blinker 库。 3. 初始化 ESP32-CAM 相机。 4. 初始化 Web 服务器,以便在浏览器中查看监控画面。 5. 实现 Blinker 的控制回调函数,以便控制开关。 6. 实现 Blinker 的心跳回调函数,以便在 Blinker 控制台上显示在线状态。 7. 实现 Blinker 的消息回调函数,以便处理来自 Blinker 控制台的消息。 请注意,在上述代码中,我假设您已经将 Blinker 库正确安装到您的 Arduino IDE 中。另外,您还需要将代码中的 `your_SSID` 和 `your_PASSWORD` 替换为您的 Wi-Fi 网络凭据,并将 `your_device_type`,`your_device_id` 和 `your_device_name` 替换为您的 Blinker 设备的类型,ID 和名称。最后,将代码上传到您的 ESP32-CAM 板上,您将能够使用 Blinker 控制台远程控制您的监控。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值