import time, os, sys
from media.sensor import *
from media.display import *
from media.media import *
from machine import Pin

# 初始化退出点检测
os.exitpoint(os.EXITPOINT_ENABLE)

# 创建照片保存目录(如果不存在)
photo_dir = "/data/LIXING/"
if not os.path.exists(photo_dir):
    os.makedirs(photo_dir)

# 配置按键输入 (下拉模式,按下时变为高电平)
usr = Pin(53, Pin.IN, Pin.PULL_DOWN)  

try:
    # 初始化摄像头传感器
    sensor = Sensor() 
    sensor.reset() 
    
    # 主显示通道配置 (800x480 YUV420SP)
    sensor.set_framesize(width=800, height=480)
    sensor.set_pixformat(Sensor.YUV420SP)
    
    # 绑定显示层
    bind_info = sensor.bind_info()
    Display.bind_layer(**bind_info, layer=Display.LAYER_VIDEO1)

    # 拍摄通道配置 (320x320 RGB565)
    sensor.set_framesize(Sensor.B320X320, chn=CAM_CHN_ID_1) 
    sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_1) 

    # 初始化3.1寸屏幕
    Display.init(Display.ST7701)
    MediaManager.init()
    sensor.run() 
    
    print("系统启动完成,等待按键拍照...")
    
    # 防止按键抖动
    last_press_time = 0
    debounce_delay = 500  # 500ms防抖延时
    
    while True:
        os.exitpoint()  # 检查退出信号
        
        current_time = time.ticks_ms()
        
        # 检测按键按下(高电平)
        if usr.value() == 1:
            # 防抖处理:确保两次拍照间隔大于debounce_delay
            if time.ticks_diff(current_time, last_press_time) > debounce_delay:
                last_press_time = current_time
                
                try:
                    # 从通道1获取RGB565图像
                    img = sensor.snapshot(chn=CAM_CHN_ID_1)
                    
                    # 生成唯一文件名(基于时间戳)
                    timestamp = time.localtime()
                    filename = f"/data/LIXING/photo_{timestamp[0]}{timestamp[1]:02d}{timestamp[2]:02d}_{timestamp[3]}{timestamp[4]}{timestamp[5]:02d}.jpg"
                    
                    # 保存图像
                    img.save(filename)
                    print(f"照片已保存: {filename}")
                    
                    # 显示成功提示
                    Display.draw_string(100, 100, "拍照成功!", color=(255, 0, 0), scale=3)
                    time.sleep_ms(1000)  # 显示1秒
                    
                except Exception as e:
                    print(f"拍照失败: {e}")
                    # 显示错误提示
                    Display.draw_string(100, 100, "拍照失败!", color=(255, 0, 0), scale=3)
                    time.sleep_ms(1000)
        
        time.sleep_ms(10)  # 降低CPU占用
        
except KeyboardInterrupt:
    print("用户中断程序")
except Exception as e:
    print(f"系统异常: {e}")
finally:
    # 清理资源
    if 'sensor' in locals():
        sensor.stop()
    Display.deinit()
    MediaManager.deinit()
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
    time.sleep_ms(100)
    print("系统已关闭")

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐