ESP32-CAM微信小程序开发

本文介绍了如何将代码上传到ESP32-CAM模块上,包括使用ESP32-CAM烧录底座或TTL转USB驱动的硬件连接方法,强调了供电稳定性和引脚连接规则。在软件方面,提到了Arduino环境的设置和代码上传流程。
摘要由CSDN通过智能技术生成

一、硬件准备

想要让代码上传到ESP32-CAM上运行,需要配合TTL转USB的驱动或者ESP32-CAM自带的烧录底座。二选一就行。两种方法我都会详细教学。

如果使用的是ESP32-CAM的烧录底座,那么很简单,直接连接ESP32-CAM和底座就行。

如果使用的是TTL转USB的驱动,那么就按照下图来使用杜邦线进行连接。

1、供电方面的问题

Q:为什么短接帽要接在5V和S1?这是必须的吗?

A:并不是必须,而是ESP32-CAM所需的功率较高。官方提供的输入电源要求是5V2A,如果使用3V3的供电,程序可以正常运行,但是图片会有更高的几率出现水波纹。这是由于供电不稳定导致的。

所以如果有5V的供电条件,最好还是选择5V供电。如果想要尝试3V3供电,那么需要把短接帽接在S1与3V3引脚上,然后把“驱动板 5V,ESP32-CAM 5V”的连接线转移到“驱动板 3V3,ESP32-CAM 3V3”。

Q:如果我连接“驱动板 3V3,ESP32-CAM 5V”会怎么样?反过来呢?如果我短接帽接在S1与3V3引脚上然后使用驱动板的5V供电会怎么样?反过来呢?

A:如果连接“驱动板 3V3,ESP32-CAM 5V”,结果来说和“驱动板 3V3,ESP32-CAM 3V3”没有区别。这种低电平输出不会损坏ESP32-CAM,而且大部分3.3V供电输出高电平的时候也能够满足5V硬件的高电平输入标准,也不需要进行电平转换。

如果连接“驱动板 5V,ESP32-CAM 3V3”,那么会以5V的输出给3V3的输入供电。虽然有些3V3的输入端在设计中已经被设计为可容忍5V输入、这样硬件就可以直接使用5V的主控来直接驱动,但是绝大多数情况下这样会对硬件端造成损伤。3V3的输入端能够容忍5V输出是为了减少错误操作所带来的后果,而不是鼓励使用5V输出端与3V3的输入端进行连接。在不了解硬件的具体参数下最好还是不要进行反常识的连接。举个例子:支持IPX6防水的手机可以在洗手台、浴室内使用,但只是保障手机遇到日常用水的场景不会损毁,而不是鼓励你在有水的环境下使用手机。

短接帽接在S1与3V3引脚上然后使用驱动板的5V供电,大概率不会进行供电。相反也是同理。需要注意的是,这种情况一般只发生在具有5V-S1-3V3可供选择短接的USB-TTL的驱动器上。如果你的驱动器上并没有选择电源的短接引脚,那么5V与3V3都可以直接使用。使用选择电源的短接引脚有一定的原因:在只使用一个供电接口的情况下,只给一个输出端供电,这样就保证了输出功率。如果不提供选择电源的引脚,那么就会两个输出端同时供电,这反而是不太合理的做法。

2、引脚方面的问题

Q:驱动板和ESP32-CAM之间的通讯是如何做到的

A:驱动板上的TXD指的是Transmit Data,也就是用于发送数据的output。RXD指的是Receive Data,也就是用于接收数据的input。同理,ESP32-CAM上的U0T和U0R指的是UART0 Transmit和UART0 Receive。连接记住一个原则:T和R连就行。也就是TXD-U0R,驱动板向ESP32-CAM传数据,或是RXD-U0T,ESP32-CAM向驱动板传数据。

Q:为什么ESP32-CAM上的IO0要和GND连接?

A:一般的ESP32上会有两个按钮,一个是RST,一个是BOOT。一个按钮进入下载模式,一个按钮进入运行模式。而ESP32-CAM上只有一个RST按钮,所以需要通过IO0的接地情况来判断ESP32-CAM当前处于什么模式:当IO0接地时,按下RST进入下载模式,此时Arduino点击上传,ESP32-CAM就能正确地烧录驱动;当IO0不接地,按下RST进入运行模式。此时ESP32-CAM会运行已经烧录的程序。

有些ESP-32CAM提供了烧录底座,如下图。

 可以看到,底座上有两个按钮,这里的RST按钮和ESP32-CAM上的RST有相同的效果,IO0按钮则是按下时相当于IO0接地。

二、软件准备

下载arduino,选择工具->首选项->附加开发板管理器地址:https://dl.espressif.com/dl/package_esp32_index.json

工具->开发板->ESP32 Wrover Module

工具->端口->选择连接ESP32-CAM的开发板

工具->串口监视器->波特率115200

arduino代码如下,更改无线网的名称,密码,巴法云uid和主题这四项就行。然后编译运行。

最后给出详细的上传代码的流程:

1.使用TTL转USB驱动板:按照一开始的图连线,插入USB,Arduino选择串口和开发板,按下RST,Arduino点击上传,确认上传完毕后拔掉IO0和GND的连线,Arduino打开串口调整波特率,按下RST。

2.使用ESP32-CAM底座:连接ESP32-CAM和底座,使用USB-MicroUSB数据线插入电脑,Arduino选择串口和开发板,按下IO0按钮不松手后按下RST按钮,然后松开两个按钮,Arduino点击上传,确认上传完毕后打开串口。

#include "esp_http_client.h"
#include "esp_camera.h"
#include <WiFi.h>
#include <ArduinoJson.h>
const char* ssid = "无线网名称";
const char* password = "无线网密码";
int capture_interval = 20 * 1000;
const char*  uid = "巴法云的uid";
const char*  topic = "巴法云图存储的主题";
const char*  wechatMsg = "";
const char*  wecomMsg = "";
const char*  urlPath = "";
const char*  post_url = "http://images.bemfa.com/upload/v1/upimages.php";
static String httpResponseString;
bool internet_connected = false;
long current_millis;
long last_capture_millis = 0;
unsigned long previousMillis = 0;
unsigned long interval = 30000;

#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27
#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22

void setup()
{
  Serial.begin(115200);
  if (init_wifi()) {
    internet_connected = true;
    Serial.println("Internet connected");
  }
  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_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_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;
  if (psramFound()) {
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    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;
  }
}

bool init_wifi()
{
  Serial.println("\r\nConnecting to: " + String(ssid));
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED ) {
    delay(1000);
    Serial.print(".");
  }
  return true;
}

esp_err_t _http_event_handler(esp_http_client_event_t *evt)
{
  if (evt->event_id == HTTP_EVENT_ON_DATA)
  {
    httpResponseString.concat((char *)evt->data);
  }
  return ESP_OK;
}

static esp_err_t take_send_photo()
{
  Serial.println("Taking picture...");
  camera_fb_t * fb = NULL;
  esp_err_t res = ESP_OK;
  fb = esp_camera_fb_get();
  if (!fb) {
    Serial.println("Camera capture failed");
    return ESP_FAIL;
  }
  httpResponseString = "";
  esp_http_client_handle_t http_client;
  esp_http_client_config_t config_client = {0};
  config_client.url = post_url;
  config_client.event_handler = _http_event_handler;
  config_client.method = HTTP_METHOD_POST;
  http_client = esp_http_client_init(&config_client);
  esp_http_client_set_post_field(http_client, (const char *)fb->buf, fb->len);
  esp_http_client_set_header(http_client, "Content-Type", "image/jpg");
  esp_http_client_set_header(http_client, "Authorization", uid);
  esp_http_client_set_header(http_client, "Authtopic", topic);
  esp_http_client_set_header(http_client, "wechatmsg", wechatMsg);
  esp_http_client_set_header(http_client, "wecommsg", wecomMsg);
  esp_http_client_set_header(http_client, "picpath", urlPath);
  esp_err_t err = esp_http_client_perform(http_client);
  if (err == ESP_OK) {
    Serial.println(httpResponseString);
    StaticJsonDocument<200> doc;
    DeserializationError error = deserializeJson(doc, httpResponseString);
    if (error) {
      Serial.print(F("deserializeJson() failed: "));
      Serial.println(error.c_str());
    }
    String url = doc["url"];
    Serial.println(url);
  }
  esp_http_client_cleanup(http_client);
  esp_camera_fb_return(fb);
  return res;
}

void loop()
{
  if ((WiFi.status() != WL_CONNECTED) && (millis() - previousMillis >=interval)) {
    Serial.println("Reconnecting to WiFi...");
    WiFi.disconnect();
    WiFi.reconnect();
    previousMillis = millis();
  }

  current_millis = millis();
  if (current_millis - last_capture_millis > capture_interval) {
    last_capture_millis = millis();
    take_send_photo();
  }
}

三、微信小程序

编写微信小程序,可以参考巴法云提供的案例。制作自定义功能。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值