本案例使用Arduino环境进行开发。需要自行安装开发环境,配置ESP32编程环境。
可参考ESP32-CAM烧录测试视频 密码:897399
选择开发板:ESP32 Wrover Module,选择CH340对应下载端口
#include "esp_camera.h"
#include "FS.h"
#include
#include
#include "SD_MMC.h"
#include
#include
#include "string.h"const char* ntpServer = "cn.pool.ntp.org"; //pool.ntp.org为获取时间得接口,可以尝试更多得接口。比如微软的time.windows.com,美国国家标准与技术研究院的time.nist.gov
const long gmtOffset_sec = 8*60*60;//这里采用UTC计时,中国为东八区,就是 8*60*60
const int daylightOffset_sec = 0*60*60;
struct tm timeinfo; //创建一个结构体用于存储时间
char * path = "/2020_6_18_TIME_19_0_47.jpg";
char timr_str[40] = "test.jpg";//uart接收初始化
String inputString = "";
bool stringComplete = false;//************************************************************************************************************************************** wifi初始化//以下是WIFI的链接用户名和密码
#define ssid "*********"
#define password "***********" void connectToNetwork(){WiFi.begin(ssid,password);WiFi.setAutoReconnect(true);while (WiFi.status()!= WL_CONNECTED) {delay(1000);Serial.println("try to connecting ...");}Serial.println("Connectedto network");
}void wifi_connect(){connectToNetwork();//链接到wifiSerial.println(WiFi.macAddress()); //打印出mac地址Serial.println(WiFi.localIP()); //打印出本地ip地址Serial.println("wifi连接成功"); //打印出本地ip地址
}
//************************************************************************************************************************************** 摄像头初始化参数
static camera_config_t camera_config = {.pin_pwdn = 32,.pin_reset = -1,.pin_xclk = 0,.pin_sscb_sda = 26,.pin_sscb_scl = 27,.pin_d7 = 35,.pin_d6 = 34,.pin_d5 = 39,.pin_d4 = 36,.pin_d3 = 21,.pin_d2 = 19,.pin_d1 = 18,.pin_d0 = 5,.pin_vsync = 25,.pin_href = 23,.pin_pclk = 22,.xclk_freq_hz = 20000000,.ledc_timer = LEDC_TIMER_0,.ledc_channel = LEDC_CHANNEL_0,.pixel_format = PIXFORMAT_JPEG,.frame_size = FRAMESIZE_XGA, // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA 320×240| |640×480|800×600|1024×768|1400×1050|1600×1200.jpeg_quality = 12, //10-63 lower number means higher quality.fb_count = 1,
};esp_err_t camera_init() {//initialize the cameraesp_err_t err = esp_camera_init(&camera_config);if (err != ESP_OK) {Serial.print("Camera Init Failed");return err;}sensor_t * s = esp_camera_sensor_get();//initial sensors are flipped vertically and colors are a bit saturatedif (s->id.PID == OV2640_PID) {// s->set_vflip(s, 1);//flip it back// s->set_brightness(s, 1);//up the blightness just a bit// s->set_contrast(s, 1);}Serial.print("Camera Init OK");return ESP_OK;
}
//************************************************************************************************************************************** SD卡初始化参数
void sd_init()
{if(!SD_MMC.begin()){Serial.println("Card Mount Failed");return;}uint8_t cardType = SD_MMC.cardType();if(cardType == CARD_NONE){Serial.println("No SD card attached");return;}Serial.print("SD Card Type: ");if(cardType == CARD_MMC){Serial.println("MMC");} else if(cardType == CARD_SD){ Serial.println("SDSC"); }else if(cardType == CARD_SDHC){ Serial.println("SDHC"); } else { Serial.println("UNKNOWN"); }uint64_t cardSize = SD_MMC.cardSize() / (1024 * 1024); //获取SD卡大小,大小单位是MBSerial.printf("SD 卡容量大小: %lluMB\n", cardSize); }
//************************************************************************************************************************************** 获取当前时间作为返回的函数部分
void get_time_path() //获取目前时间返回字符串
{memset(timr_str, 0, sizeof(timr_str));configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);if(!getLocalTime(&timeinfo)){Serial.println("Failed to obtain time");sprintf(timr_str, "/TIME_get_failed.jpg");}else{//Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");Serial.print("现在时间是:");Serial.print("年份是:");Serial.println(timeinfo.tm_year + 1900);Serial.print("月份是:");Serial.println(timeinfo.tm_mon + 1);Serial.print("号数是:");Serial.println(timeinfo.tm_mday);Serial.print("小时数是:");Serial.println(timeinfo.tm_hour ); //中国区Serial.print("分钟数是:");Serial.println(timeinfo.tm_min);Serial.print("分钟数是:");Serial.println(timeinfo.tm_sec);sprintf(timr_str, "/%d_%d_%d_TIME_%d_%d_%d.jpg",timeinfo.tm_year+1900,timeinfo.tm_mon + 1,timeinfo.tm_mday,timeinfo.tm_hour,timeinfo.tm_min,timeinfo.tm_sec);}}
//************************************************************************************************************************************** 主函数部分
void setup() {Serial.begin(115200);wifi_connect();camera_init(); //摄像头初始化sd_init(); //SD卡初始化
}void loop() //接收uart传输过来的字符信息,如果inputString字符为123则进行拍照,时间作为文件名,将照片保存在SD中。
{if (Serial.available()) { // get the new byte:char inChar = (char)Serial.read();// add it to the inputString:if (inChar != '\n') {inputString += inChar;}// if the incoming character is a newline, set a flag// so the main loop can do something about it:if (inChar == '\n') {stringComplete = true;}if (stringComplete) {inputString=String(inputString);if (inputString == "123") //进行拍照{//拍照并且把图片保存到SD卡当中,而照片名字就保存为目前的时间Serial.println("即将进行拍照!!!");camera_fb_t * fb = esp_camera_fb_get();get_time_path();Serial.print("存入的图片名称为:");Serial.println(timr_str);path = timr_str; if(fb == NULL){Serial.println( "get picture failed"); //代表获取图片失败}else{ //char * path = time_str;fs::FS &fs = SD_MMC;Serial.printf("Writing file: %s\n", path);File file = fs.open(path, FILE_WRITE);if (!file) {Serial.println("文件创建失败");}else{file.write(fb->buf , fb->len); //payload , lengte vd payloadSerial.println("成功写入照片");}//return the frame buffer back to the driver for reuseesp_camera_fb_return(fb);} }inputString = "";stringComplete = false;}}
}
main.py
import utime as time
from driver import GPIO
from driver import UART#串口实例化
uart=UART()
uart.open("serial1")
writeBuf = bytearray('123\n')
readBuf = bytearray(4)
#按键功能初始化
key1=GPIO(10,10)
key1.open("KEY1")
#按键中断回调函数
def key1_callback(args):uart.write(writeBuf)print("Photo taken successfully !!!")key1.disableIrq()key1.clearIrq()def enable_key():#开启中断key1.enableIrq(key1_callback)if __name__ == '__main__':enable_key()print('Press key to start taking pictures')uart.write(writeBuf)while True:time.sleep(1)
board.json
{"name": "haas506","version": "2.0.0","io": { "KEY1": {"type": "GPIO","port": 44,"dir": "irq","pull": "pullup","intMode": "falling"},"serial1":{"type":"UART","port":0,"dataWidth":8,"baudRate":115200,"stopBits":1,"flowControl":"disable","parity":"none"}},"debugLevel": "ERROR","repl": "enable","replPort": 2
}
总的测试情况,按下HaaS506开发板key键后可以通过485串口读取到log
U盘中会增加当前时间的照片。
ESP32-CAM程序运行测试,打开串口监视器。
发送指令,打印相关log
上一篇:CAN接口电路设计
下一篇:Struts2之上传与下载