前言
这里就是介绍一下我使用ESP32-CAN的使用心得,并且附带使用流程,环境搭建以及代码供大家使用和查看,希望对大家有所帮助咯~~
一、环境配置
我们开发的每款芯片都离不开环境的配置,工欲善其事,必先利其器啦,这里我介绍使用两种方式去开发我们的ESP32系列
Arduino IDE
Arduino的环境我之前有提到和配置过,这里我就直接附上连接,安装教程配置即可
Arduino IDE 使用安装以及ESP32库的导入(离线)https://blog.csdn.net/herui_2/article/details/135296814?spm=1001.2014.3001.5501
PlatformIO IDE
PlatformIO IDE是使用到了 VScode 的插件功能,首先我们需要去下载 VScode的编译器,然后使用他的插件功能去下载
可以参考下面教程
VSCode 使用 Keil5 插件推荐 附带Keil5安装教程https://blog.csdn.net/herui_2/article/details/135296814?spm=1001.2014.3001.5501
如图,搜索 PlatformIO 点击VScode的插件部分即可
安装完成界面
二、资料获取
关注微信公众号--星之援工作室 发送关键字(ESP32-CAN)
➡️➡️
资料说明
Arduino和PlatformIO使用到的代码是一致的,只是打开的方式不同,命名及为项目
三、代码展示
接下来以Arduino为例演示,使用到了一些外部配置文件,都放到了我们的项目文件夹下了
选择开发芯片
编译通过
上传代码
首先需要进入下载模式
选择好连接的端口以后直接上传即可
本代码涵盖了视频流数据以及串口转发,可以直接与STM32进行通信
#include "esp_camera.h"
#include <WiFi.h>
// Select camera model
// #define CAMERA_MODEL_WROVER_KIT
// #define CAMERA_MODEL_ESP_EYE
// #define CAMERA_MODEL_M5STACK_PSRAM
// #define CAMERA_MODEL_M5STACK_WIDE
#define CAMERA_MODEL_AI_THINKER
#include "camera_pins.h"
const char *ssid = "WIFI_For";
const char *password = "12345678";
const IPAddress ip(192, 168, 4, 1);
const IPAddress gateway(192, 168, 4, 1);
const IPAddress subnet(255, 255, 255, 0);
void cameraBegin(); // 相机初始化
int startCameraServer(); // 启动相机服务
void setWifi();
WiFiServer server(8000); // 申明AP对象
void setup()
{
Serial.begin(115200);
Serial.setDebugOutput(true);
Serial.println("开机");
pinMode(4, OUTPUT);
digitalWrite(4, HIGH); // 闪光灯
cameraBegin();
setWifi(); // 设置wifi
int prot = startCameraServer(); // 开启相机服务并得到服务端口
IPAddress myAddress = WiFi.localIP();
Serial.println(myAddress);
Serial.print("请在浏览器中输入:");
Serial.print(WiFi.softAPIP());
delay(1000);
digitalWrite(4, LOW); // 闪光灯
}
void loop()
{
String msgs = "", onDeng = "";
WiFiClient client = server.available();
boolean receiveFlag = false; // 是否接到消息标志位
if (client)
{
while (client.connected())
{
while (Serial.available() > 0)
{
char c = Serial.read();
receiveFlag = true; // 接到来自小车的串口消息
msgs += c;
}
while (client.available() > 0)
{
char c = client.read();
Serial.write(c); // 向串口发送消息
onDeng += c;
}
if (onDeng == "DENG_ON")
{
digitalWrite(4, HIGH); // 闪光灯
}
else if (onDeng == "DENG_OFF")
{
digitalWrite(4, LOW); // 闪光灯
}
if (receiveFlag)
{
receiveFlag = false;
client.write(&msgs[0]); // 向客户端发送消息
msgs = "";
}
onDeng = "";
}
client.stop();
}
else
delay(500);
}
/**
* @brief 配置wifi
*/
void setWifi()
{
WiFi.mode(WIFI_AP); // 设置wifi模
WiFi.softAPConfig(ip, gateway, subnet); // 配置网络信息
WiFi.softAP(ssid, password); // 配置wifi名称及密码
Serial.println("开启网络....等待连接.....");
delay(500);
server.begin();
delay(500);
}
/**
* @brief 相机初始化
*
*/
void cameraBegin()
{
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;
}
#if defined(CAMERA_MODEL_ESP_EYE)
pinMode(13, INPUT_PULLUP);
pinMode(14, INPUT_PULLUP);
#endif
// 相机初始化
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK)
{
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
sensor_t *s = esp_camera_sensor_get();
// 最初的传感器垂直翻转,颜色有点饱和
if (s->id.PID == OV3660_PID)
{
s->set_vflip(s, 0); // 反转
s->set_brightness(s, 1); // 将暗处调高
s->set_saturation(s, -2); // 降低饱和度
}
// drop down frame size for higher initial frame rate
s->set_framesize(s, FRAMESIZE_QVGA);
#if defined(CAMERA_MODEL_M5STACK_WIDE)
s->set_vflip(s, 1);
s->set_hmirror(s, 1);
#endif
}
四、相关项目与资料
一篇文章足够你学习ESP32,提供史上最全的ESP32教程https://blog.csdn.net/XiaoXiaoPengBo/article/details/123952643?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170718720216800182123332%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170718720216800182123332&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~top_positive~default-2-123952643-null-null.nonecase&utm_term=ESP32&spm=1018.2226.3001.4450
物联网毕设 -- 图像小车(局域网+环境检测+GPS)https://blog.csdn.net/herui_2/article/details/135073514物联网毕设 -- 养殖场的智能环境监测(STM32+WiFi+局域图传)https://blog.csdn.net/herui_2/article/details/135671916?spm=1001.2014.3001.5501
联系方式 微信号:13648103287