ESP32-CAM ——Blinker平台

news2024/11/25 2:44:03

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() + "\"}");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/845253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++笔记之两个类的实例之间传递参数的各种方法

C笔记之两个类的实例之间传递参数的各种方法 code review! 文章目录 C笔记之两个类的实例之间传递参数的各种方法1.构造函数参数传递2.成员函数参数传递3.友元函数4.友元类5.传递指针或引用6.静态成员变量7.静态成员函数8.全局变量或命名空间9.回调函数和函数指针10.观察者模…

【第五章 flutter学习之flutter进阶组件-上篇】

文章目录 一、列表组件1.常规列表2.动态列表 二、FridView组件三、Stack层叠组件四、AspectRatio Card CircleAvatar组件五、按钮组件六、Stack组件七、Wrap组件八、StatefulWidget有状态组件总结 一、列表组件 1.常规列表 children: const <Widget>[ListTile(leading: …

喀麦隆ECTN(BESC)申请流程

据CAMEROON喀麦隆法令&#xff0c;所有发货至喀麦隆的货物都必须申请ECTN(BESC)电子货物跟踪单。如果没有申请&#xff0c;将被视为触犯喀麦隆的条例&#xff0c;并在目的港受到严厉惩罚。ECTN是英语ELECTRONIC CARGO TRACKING NOTE的简称&#xff1b;BESC是法语BORDEREAU ELEC…

开关电源控制--bode图相角裕量的选择

什么是相角裕量 在Bode图中&#xff0c;相角裕量是指系统的相位裕量&#xff0c;用于评估系统的稳定性和频率响应特性。 Bode图是一种常用的频率响应图&#xff0c;将系统的增益和相位随频率变化的情况绘制出来。在Bode图中&#xff0c;相角裕量表示系统的相位与-180度&#…

ensp与虚拟机搭建测试环境

1.虚拟机配置 ①首先确定VMnet8 IP地址&#xff0c;若要修改IP地址&#xff0c;保证在启动Ensp前操作 ②尽量保证NAT模式 2.ensp配置 (1)拓扑结构 (2)Cloud配置 ①首先点击 绑定信息 UDP → 增加 ②然后点击 绑定信息 VMware ... → 增加 ③最后在 端口映射设置上点击双向通…

编译工具:CMake(二)| 最简单的实例[构建、解析、外部构建]

编译工具&#xff1a;CMake&#xff08;二&#xff09;| 最简单的实例[构建、解析、外部构建] 编写代码与文件构建工程解析PROJECT 指令的语法是&#xff1a;SET 指令的语法是&#xff1a;MESSAGE 指令的语法是&#xff1a;ADD_EXECUTABLE 指令${} 指令 外部构建 # 前言 按照程…

github 无语的问题,Host does not existfatal: Could not read from remote repository.

Unable to open connection: Host does not existfatal: Could not read from remote repository. image.png image.png image.png Please make sure you have the correct access rights and the repository exists. 如果github desktop和git pull 和git clone全部都出问题了&…

ebay儿童书包产品CPC认证

儿童书包是一种能够盛放书本或者文具的包。现在的书包五花八门&#xff0c;以普通的布料或者是帆布等制成&#xff0c;有背带&#xff0c;包内一般分栏。一般分三种&#xff0c;背在身后的&#xff0c;挎在肩上的&#xff0c;轮式&#xff08;可以拖行&#xff09;的。 一、美国…

探索未来:直播实时美颜SDK在增强现实(AR)直播中的前景

在AR直播中&#xff0c;观众可以与虚拟元素实时互动&#xff0c;为用户带来更加丰富、沉浸式的体验。那么&#xff0c;直播美颜SDK在AR中有哪些应用呢&#xff1f;下文小编将于大家一同探讨美颜SDK与AR有哪些关联。 一、AR直播与直播实时美颜SDK的结合 增强现实技术在直播中…

使用C#的窗体显示与隐藏动画效果方案 - 开源研究系列文章

今天继续研究C#的WinForm的显示动画效果。 上次我们实现了无边框窗体的显示动画效果(见博文&#xff1a;基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章 )&#xff0c;这次介绍的是未在任务栏托盘中窗体的显示隐藏动画效果的实现代码。 1、 项目目录&#xff1b…

(03)Unity HTC VRTK 基于 URP 开发记录

1.简介 本篇主要内容为&#xff1a;URP如何与VRTK结合、URP需要注意的地方、VRTK的功能进行阐述。 因项目本身要求要渲染出比较好的画质&#xff0c;所以抛弃了Unity默认渲染管线Built-in&#xff0c;使用URP进行渲染&#xff0c;当然也可以选HDRP&#xff0c;但考虑到后期项目…

STM32 4G学习(二)

特性参数 ATK-IDM750C是正点原子开发的一款高性能4G Cat1 DTU产品&#xff0c;支持移动4G、联通4G和电信4G手机卡。 它以高速率、低延迟和无线数传作为核心功能&#xff0c;可快速解决应用场景下的无线数传方案。 它支持TCP/UDP/HTTP/MQTT/DNS/RNDIS/NTP协议&#xff0c;支持…

第八篇: K8S Prometheus Operator实现Ceph集群企业微信机器人告警

Prometheus Operator实现Ceph集群企业微信告警 实现方案 我们的k8s集群与ceph集群是部署在不同的服务器上&#xff0c;因此实现方案如下&#xff1a; (1) ceph集群开启mgr内置的exporter服务&#xff0c;用于获取ceph集群的metrics (2) k8s集群通过 Service Endponit Ser…

Nacos源码 (2) 核心模块

返回目录 整体架构 服务管理&#xff1a;实现服务CRUD&#xff0c;域名CRUD&#xff0c;服务健康状态检查&#xff0c;服务权重管理等功能配置管理&#xff1a;实现配置管CRUD&#xff0c;版本管理&#xff0c;灰度管理&#xff0c;监听管理&#xff0c;推送轨迹&#xff0c;聚…

计算机组成原理-笔记-第一章

目录 一、第一章——计算机系统概述&#xff08;硬件软件&#xff09; 1、计算机发展 &#xff08;1&#xff09;小结 2、硬件的基本组成&#xff08;冯诺依曼机&#xff09; &#xff08;1&#xff09;冯诺依曼机——运算器为中心 &#xff08;2&#xff09;现代计算器结…

微服务 云原生:搭建 Harbor 私有镜像仓库

Harbor官网 写在文前&#xff1a; 本文中用到机器均为虚拟机 CentOS-7-x86_64-Minimal-2009 镜像。 基础设施要求 虚拟机配置达到最低要求即可&#xff0c;本次系统中使用 docker 24.0.4、docker-compose 1.29.2。docker 及 docker-compose 的安装可以参考上篇文章 微服务 &am…

《HeadFirst设计模式(第二版)》第七章代码——适配器模式

代码文件目录&#xff1a; Example1: Duck package Chapter7_AdapterAndFacadePattern.Adapter.Example1;/*** Author 竹心* Date 2023/8/7**/public interface Duck {public void quack();public void fly(); }DuckTestDrive package Chapter7_AdapterAndFacadePattern.Ada…

Vue2源码分析-day1

初始化数据 vue中最核心的我们都知道那就是响应式数据&#xff0c;数据的变化视图自动更新。那么我们来new一个我们自己的vue 在index.html文件下加入如下代码&#xff0c;这也是vue最常见的基本结构。data已经有了下面我们来获取data的数据 <script src"./vue.js&qu…

怎么快速搭建BI?奥威BI系统做出了表率

搭建BI系统有两大关键&#xff0c;分别是环境搭建和数仓建设。这两点不管是哪一个都相当地费时费力&#xff0c;那要怎么才能快速搭建BI平台&#xff0c;顺利实现全企业数字化运营决策&#xff1f;奥威BI系统方案&#xff0c;你值得拥有&#xff01; 奥威BI系统方案&#xff0…

VS+Qt环境下解决中文乱码问题

目录 原因解决方案总结 原因 使用VSQt出现中文乱码的情况一般都是给控件添加中文文本时出现&#xff0c;而控件需要的字符串类型是QString&#xff0c;默认是utf-8。在 Visual Studio 中&#xff0c;源代码文件的默认执行字符集可能是 Windows 默认的 ANSI 字符集&#xff0c;…