【esp32-cam开发--WiFi篇】震惊!年轻人竟然没有用到esp32-cam的摄像头,而是用它干了这件事......

ESP32-Cam简介

ESP32-Cam是安信可公司(AI Think)推出的一款小巧便携的芯片,该芯片拥有ESP32家族标配的WiFi以外,还有优秀的图像处理能力,特别是神经卷积网络运算的优化,可以说是物联网时代小巧而又强大的产物之一。
但也有几个缺点,初学者必坑,不是,避坑:
1、接口少,小巧的芯片往往只需要很少的接口,而这款ESP32-Cam可以说是把小巧做到了极致,懂我意思吧,整个芯片16个PIN,留给用户的却又8个之多,可以说是非常凉心了;
2、容易发热。热到什么程度呢,冬天暖手都觉着烫(可以拿来给女朋友煮岩浆)。当然,运算量不大的时候,发热还不明显,但是当加入WiFi和摄像头模块以后,热量陡然上升,而且顺便也会拉低图像的传输帧率。此时只能缩小画面或者降低画质来保证流畅传输了。

四针0.96寸OLED屏幕简介

我用的是四针0.96寸OLED屏幕,蓝黑配色,慢慢的科技感。而且四针也把简介做到了极致。四针采用IIC总线,除去两个电源引脚,就是时钟线和数据线了。
0.96寸OLED屏幕内置SSD1306驱动,因此要在Arduino IDE中下载相关的库(还要匹配ESP32系列芯片哟~)

系统设计思路

一直想做一个桌面小时钟,也不知道哪里来的执念。
首先是网络时间的获取,方法有很多,只要找到NTP,然后通过WiFi读取到程序中就可以。这里我用的是(翻历史记录找不到了,我敲,各位自己琢磨吧)但是有一个mt的结构体,它里面的数据我放在代码最后面了,看到记得点赞查收,谢谢。
然后就是OLED的显示了。这里我用的是库里(这都被你发现了,我是库里球迷0^0)的函数。具体可以点击上面图中的“more info”去GitHub了解详情。(不会吧不会吧,不会都已经在做ESP32的项目了,还没注册GitHub吧,别说没有VPN,现在可以免翻墙登入的)

正片部分(空降代码区)


/*
2021.10.14  22:43
终于驱动起来OLED屏幕了
之前因为库没有找对
使用的都是只适合Arduino芯片的库
Arduino中由专门针对ESP32系列芯片驱动OLED的库

2021.10.16  17:19
完成连接WIFI,从网络获取时间,并显示在屏幕上
误差在毫秒级,肉眼无法察觉
接下来将进行UI界面的设计
*/

#include <Wire.h>
#include "SSD1306.h"
#include <WiFi.h>


#define unsigned int  uint        //定义数据类型
SSD1306 display(0x3c, 15, 14);    //设置OLED引脚
const char *ssid = "********";    //你的网络名称
const char *password = "********"; //你的网络密码

const char *ntpServer = "pool.ntp.org";  //世界时钟
const long gmtOffset_sec = 8 * 3600;
const int daylightOffset_sec = 0;
const int OLEDWID = 128;
const int OLEDLEN = 64;
const int HALF_WID = OLEDWID>>1;
const int HALF_LEN = OLEDLEN>>1;
struct tm timeinfo;


void setup() {
  Serial.begin(115200);         //设置串口通信频率
  //Serial.setDebugOutput(true);  //调试输出打开
  Serial.println();

  //OLD初始化设置
  display.init();                         //OLED显示初始化
  display.setFont(ArialMT_Plain_16);      //调整字体大小
  display.clear();
  //display.drawString(0,0,"Hello");
  
  //WiFi设置
  WiFi.begin(ssid,password);
  while(WiFi.status()!=WL_CONNECTED){
    delay(500);
    //Serial.print(".");
    display.setTextAlignment(TEXT_ALIGN_CENTER);   //锚点在字符中央
    display.drawString(HALF_WID,0,"Waiting...");
    } 
    display.display(); 
   //Serial.println("Wifi Connected!");
   display.clear();
   display.setTextAlignment(TEXT_ALIGN_CENTER);   //锚点在字符中央
   display.clear();
   display.drawString(HALF_WID,0,"WIFIConnected!");
   display.display();
   delay(1000);
     
   // 从网络时间服务器上获取并设置时间
   // 获取成功后芯片会使用RTC时钟保持时间的更新
   configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
   
}

void loop() {
  printData();
  delay(1000);
  //n++;
  //if(n==60) {configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);n=0;}  //每分钟进行时间校准
}

String TwoDigit_Str(int digit){
  if(digit<10)
  return "0"+String(digit);
  return String(digit);
  }

void printData(){
  if (!getLocalTime(&timeinfo))
    {
        display.clear();
        display.setTextAlignment(TEXT_ALIGN_CENTER);   //锚点在字符中央
        display.drawString(HALF_WID,0,"GettingTime...");
        display.display();
        return;
    }
  String Data = String(timeinfo.tm_year+1900) + "-" + String(timeinfo.tm_mon+1) + "-" + String(timeinfo.tm_mday);               //日期转换
  String timenow = TwoDigit_Str(timeinfo.tm_hour) + ":" + TwoDigit_Str(timeinfo.tm_min) + ":" + TwoDigit_Str(timeinfo.tm_sec);  //时间转换
  String WeekDay;
  switch(timeinfo.tm_wday){          //星期转换
    case 0: WeekDay = "Sun"; break;
    case 1: WeekDay = "Mon"; break;
    case 2: WeekDay = "Tue"; break;
    case 3: WeekDay = "Wed"; break;
    case 4: WeekDay = "Thr"; break;
    case 5: WeekDay = "Fri"; break;
    case 6: WeekDay = "Sta"; break;
    }
  
  display.clear();
  display.setTextAlignment(TEXT_ALIGN_CENTER);   //锚点在字符中央
  display.drawString(HALF_WID,HALF_LEN-8,timenow); // 当前时间输出
  display.drawString(HALF_WID,4,Data); // 当前日期输出
  display.drawString(HALF_WID,OLEDLEN-20,WeekDay);  //输出星期
  display.display();
  }



/*

struct tm {
int tm_sec; // 秒,取值0~59;
int tm_min; // 分,取值0~59;
int tm_hour; // 时,取值0~23;
int tm_mday; // 月中的日期,取值1~31;
int tm_mon; // 月,取值0~11;
int tm_year; // 年,其值等于实际年份减去1900;
int tm_wday; // 星期,取值0~6,0为周日,1为周一,依此类推;
int tm_yday; // 年中的日期,取值0~365,0代表1月1日,1代表1月2日,依此类推;
int tm_isdst; // 夏令时标识符,实行夏令时的时候,tm_isdst为正;不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负
};

*/

结束语(一点心得,欢迎交流病情)

其实今年6月份我就拿到了这个ESP32-Cam的板子了,但是由于是我真正接触的第一个集成板子,因此学习起来有些困难,而且还有些眼高手低,刚上来就想把人脸识别和深度学习做出来,痴心妄想了属于是~~
发这篇博客不只是分享一下心得,也算是用这块板子做的比较拿得出手的一个项目了,有不足的地方,也欢迎大家讨论交流…
本人西南交大大三狗一只,也欢迎大家评论区、私信多多与我互动,我叫马牛逼,我敢…(不是这样的,哈哈哈哈)

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要通过ESP32-CAM控制ESP8266,你需要先建立它们之间的WiFi连接,然后在ESP32-CAM上运行服务器程序,接收来自ESP8266的命令,并执行相应的操作。 以下是一个示例代码,展示如何通过ESP32-CAM控制ESP8266: ESP8266代码: ```c++ #include <ESP8266WiFi.h> #include <WiFiClient.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; IPAddress serverIP(192, 168, 1, 100); // ESP32-CAM的IP地址 WiFiClient client; void setup() { Serial.begin(115200); delay(1000); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { if (!client.connect(serverIP, 80)) { Serial.println("Connection failed"); delay(1000); return; } client.println("GET /?command=on HTTP/1.1"); client.println("Host: 192.168.1.100"); // ESP32-CAM的IP地址 client.println("Connection: close"); client.println(); while (client.connected()) { if (client.available()) { String line = client.readStringUntil('\n'); Serial.println(line); } } client.stop(); delay(1000); } ``` ESP32-CAM代码: ```c++ #include <WiFi.h> #include <WebServer.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; IPAddress localIP(192, 168, 1, 100); // ESP32-CAM的IP地址 WebServer server(80); void handleCommand() { String command = server.arg("command"); if (command == "on") { // 执行打开操作 Serial.println("Turning on..."); } else if (command == "off") { // 执行关闭操作 Serial.println("Turning off..."); } else { // 无效的命令 Serial.println("Invalid command"); } server.send(200, "text/plain", "OK"); } void setup() { Serial.begin(115200); delay(1000); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); server.on("/command", handleCommand); server.begin(); } void loop() { server.handleClient(); } ``` 在ESP8266的代码中,我们首先定义了ESP32-CAM的IP地址,并在loop()函数中,使用WiFiClient库连接到ESP32-CAM的IP地址,并向其发送一个HTTP GET请求,请求的URL中包含了一个命令参数command,值为on,表示打开操作。在ESP32-CAM的代码中,我们首先定义了一个WebServer对象,并在setup()函数中,注册了一个handleCommand()函数来处理来自ESP8266的命令。在handleCommand()函数中,我们根据命令参数的值来执行相应的操作,并返回一个OK响应。 你可以根据需要修改命令的参数和相应的操作,以实现ESP32-CAM对ESP8266的控制。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值