实战代码:esp32-cam按钮控制手机拍照V1.0

#include <WiFi.h>

#include <HTTPClient.h>

// WiFi设置

const char* ssid = "MIFI-020806-2.4G";

const char* password = "12345678";

// 静态IP配置

IPAddress staticIP(192, 168, 1, 32); // 设置为固定IP

IPAddress gateway(192, 168, 1, 1); // 网关地址(路由器地址)

IPAddress subnet(255, 255, 255, 0); // 子网掩码

IPAddress dns1(8, 8, 8, 8); // 主DNS

IPAddress dns2(114, 114, 114, 114); // 备用DNS

// 服务器设置

const char* serverHost = "192.168.1.4";

const int serverPort = 8081;

// 按钮设置

const int buttonPin = 13;

int buttonState = HIGH;

int lastButtonState = HIGH;

unsigned long lastDebounceTime = 0;

unsigned long debounceDelay = 50;

// WiFi设置

unsigned long previousWiFiCheck = 0;

const unsigned long WIFI_CHECK_INTERVAL = 30000; // WiFi检查间隔(30秒)

bool serverConnected = false;

// 检查服务器连接

bool checkServer() {

WiFiClient client;

client.setTimeout(5000); // 5秒超时

复制代码
Serial.print("检查服务器连接...");

if (client.connect(serverHost, serverPort)) {
    serverConnected = true;
    Serial.println("成功");
    client.stop();
    return true;
} else {
    serverConnected = false;
    Serial.println("失败");
    return false;
}

}

// WiFi连接函数

bool connectWiFi() {

Serial.println("尝试连接WiFi并设置静态IP...");

复制代码
// 断开之前的连接
WiFi.disconnect(true);
delay(500);

// 配置WiFi模式
WiFi.mode(WIFI_STA);
WiFi.setSleep(false);  // 禁用WiFi睡眠模式,提高响应速度

// 配置静态IP
if (!WiFi.config(staticIP, gateway, subnet, dns1, dns2)) {
    Serial.println("静态IP配置失败!");
    return false;
}

// 开始连接
WiFi.begin(ssid, password);

// 等待连接,最多尝试20次
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
    delay(500);
    Serial.print(".");
    attempts++;
}

if (WiFi.status() == WL_CONNECTED) {
    Serial.println("\nWiFi连接成功!");
    Serial.print("IP地址: ");
    Serial.println(WiFi.localIP());
    
    // 连接成功后检查服务器
    if (checkServer()) {
        return true;
    } else {
        Serial.println("WiFi已连接但服务器无响应");
        return false;
    }
} else {
    Serial.println("\nWiFi连接失败!");
    return false;
}

}

// 维持WiFi连接

void maintainWiFi() {

unsigned long currentMillis = millis();

复制代码
// 检查WiFi连接
if (currentMillis - previousWiFiCheck >= WIFI_CHECK_INTERVAL) {
    previousWiFiCheck = currentMillis;
    
    if (WiFi.status() != WL_CONNECTED) {
        Serial.println("WiFi连接断开,尝试重连");
        connectWiFi();
    } else {
        Serial.println("WiFi保持连接中");
        // 仅检查WiFi连接,不主动检查服务器
    }
}

}

void takeSnapshot() {

if (WiFi.status() != WL_CONNECTED) {

Serial.println("WiFi未连接,无法拍照");

return;

}

复制代码
// 仅在需要拍照时检查服务器连接
if (!checkServer()) {
    Serial.println("服务器无响应,无法拍照");
    return;
}

HTTPClient http;

Serial.println("开始拍照...");

// 构建URL
String url = "http://" + String(serverHost) + ":" + String(serverPort) + "/getsnapshot";
http.begin(url);

// 添加认证头
http.addHeader("Authorization", "Basic YWRtaW46YWRtaW4="); // admin:admin Base64编码
http.addHeader("Connection", "keep-alive");

// 发送GET请求
int httpCode = http.GET();

// 处理结果
if (httpCode > 0) {
    Serial.printf("HTTP响应代码: %d\n", httpCode);
    
    if (httpCode == HTTP_CODE_OK) {
        Serial.println("拍照成功");
    } else {
        Serial.printf("请求失败,错误代码: %d\n", httpCode);
    }
} else {
    Serial.printf("HTTP请求失败: %s\n", http.errorToString(httpCode).c_str());
}

http.end();

}

// 读取按钮状态,带消抖

bool checkButton() {

int reading = digitalRead(buttonPin);

bool buttonPressed = false;

复制代码
if (reading != lastButtonState) {
    lastDebounceTime = millis();
}

if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
        buttonState = reading;
        
        if (buttonState == LOW) {
            buttonPressed = true;
        }
    }
}

lastButtonState = reading;
return buttonPressed;

}

void setup() {

Serial.begin(115200);

delay(1000);

复制代码
// 初始化引脚
pinMode(buttonPin, INPUT_PULLUP);

Serial.println("ESP32-CAM启动");
Serial.println("静态IP设置为: 192.168.1.32");

// 初始化WiFi
connectWiFi();

}

void loop() {

// 仅维持WiFi连接,不进行保活

maintainWiFi();

复制代码
// 检测按钮
if (checkButton()) {
    Serial.println("按钮被按下,尝试拍照");
    takeSnapshot();
}

delay(10); // 短暂延时减少CPU负载

}

-----------------------代码说明

wifi使用 随身wifi

网关192.168.1.1

esp32-cam使用IP:192.168.1.32

按钮使用GPIO13和GND

相关推荐
老蒋新思维1 小时前
创客匠人峰会实录:创始人 IP 变现的 “人 + 智能体” 协同范式 —— 打破知识变现的能力边界
大数据·网络·人工智能·网络协议·tcp/ip·创始人ip·创客匠人
AI即插即用2 小时前
即插即用系列 | Attention GhostUNet++:基于多维注意力和 Ghost 模块的高效 CT 图像脂肪与肝脏分割网络
网络·图像处理·人工智能·深度学习·神经网络·计算机视觉·视觉检测
老蒋新思维3 小时前
创客匠人启示录:AI 时代知识变现的底层逻辑重构 —— 从峰会实践看创始人 IP 的破局之路
网络·人工智能·网络协议·tcp/ip·数据挖掘·创始人ip·创客匠人
码农爱学习4 小时前
使用wpa工具配网、udhcpc分配IP的过程分析
网络·网络协议·tcp/ip
北京盛世宏博4 小时前
边缘计算赋能!机房机柜微环境温湿度快速响应控制方案
运维·服务器·网络
老蒋新思维5 小时前
创客匠人深度洞察:创始人 IP 打造的非线性增长模型 —— 知识变现的下一个十年红利
大数据·网络·人工智能·tcp/ip·重构·数据挖掘·创客匠人
北京耐用通信5 小时前
协议转换的‘魔法转换器’!耐达讯自动化Ethernet/IP转Devicenet如何让工业机器人‘听懂’不同咒语?”
网络·人工智能·科技·网络协议·机器人·自动化·信息与通信
日更嵌入式的打工仔5 小时前
EtherCAT 主站2
网络·ethercat
飞Link5 小时前
【轻量拓展区】网络 QoS 与带宽、延迟、抖动:AI 推理的性能瓶颈
开发语言·网络·人工智能
真正的醒悟5 小时前
图解网络22
服务器·网络·php