from machine import Pin
from machine import FPIOA
import time, os, sys, gc
from media.sensor import * #导入sensor模块,使用摄像头相关接口
from media.display import * #导入display模块,使用display相关接口
from media.media import * #导入media模块,使用meida相关接口

#__________________________________________________________________
#感光元件设置
DISPLAY_WIDTH = 800
DISPLAY_HEIGHT = 480
sensor = Sensor() #构建摄像头对象
sensor.reset() #复位和初始化摄像头
sensor.set_framesize(width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT) #默认通道0
sensor.set_pixformat(Sensor.RGB565) #设置输出图像格式,默认通道0 RGB565
Display.init(Display.ST7701, to_ide=True) #同时使用3.5寸mipi屏和IDE缓冲区显示图像,800x480分辨率
MediaManager.init() #初始化media资源管理器
sensor.run() #启动sensor
clock = time.clock()

#__________________________________________________________________
#将GPIO21配置为普通GPIO模式
fpioa = FPIOA()
fpioa.set_function(21,FPIOA.GPIO21)
#__________________________________________________________________
# 定义按键控制类
class Key_Control():                                        # 定义按键控制类
    img_cnt = 0                                             # 照片计数值

# 实例化按键控制类 Key_Control() 为 key
key = Key_Control()

#__________________________________________________________________
#每次重新启动的时候读取data盘img文件夹的照片数量
picture_num_path='/data/img'  #存放照片在data盘里面 并提前img文件夹
image_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff'] #照片可能出现的类型
image_count = 0
for filename in os.listdir(picture_num_path):
    if any(filename.lower().endswith(ext) for ext in image_extensions):
        image_count += 1
print(f"文件夹中的照片文件个数: {image_count}")

#__________________________________________________________________
#读取data盘里面record.txt文件里面记录的照片数量 只有一句话picture:num(之前存放写入的数量)
with open('/data/record.txt', 'r') as f:
    content = f.read()
    number = content.split(':')[1]

#__________________________________________________________________
#比较你实际存放照片的数量和txt里面写入的数量 (有时候我们拍完后会直接把照片拿出来并删除 然后忘记修改txt里面的数量)
## 照片起始序号设置
if int(number)>int(image_count): #txt里面的数量大于实际照片数量
    key.img_cnt = int(image_count)
    with open('/data/record.txt', 'w') as f:
        f.write(f'picture:{key.img_cnt}')
else:
    key.img_cnt = int(number)

KEY=Pin(21,Pin.IN,Pin.PULL_UP) #构建KEY对象


def start():
    try:
        while True:
            os.exitpoint()
            clock.tick()
            img = sensor.snapshot() #拍摄一张图片
            if KEY.value() == 0:
                time.sleep_ms(10) #消除抖动                                      # 延时 10ms 消除按键抖动
                if KEY.value() == 0:                                   # 确认 按键0 按下
                    key.img_cnt = key.img_cnt + 1    # 计数值自增
                    if key.img_cnt < 10:
                        img.save("/data/img/000"+str(key.img_cnt)+".jpg")
                    elif key.img_cnt < 100:
                        sensor.snapshot().save("/data/img/00"+str(key.img_cnt)+".jpg",quality=95)
                    elif key.img_cnt < 1000:
                        sensor.snapshot().save("/data/img/0"+str(key.img_cnt)+".jpg",quality=95)
                    elif key.img_cnt < 10000:
                        sensor.snapshot().save("/data/img/"+str(key.img_cnt)+".jpg",quality=95)

                    with open('/data/record.txt', 'w') as f: #把拍照数量写入txt文件进去
                        f.write(f'picture:{key.img_cnt}')
                    while not KEY.value():   #这里可以设置长按标志位 用于扩展拍照功能 可在按下的时候设置按键标志位
                        pass
            img.draw_string_advanced(0, 0, 30, "img_cnt: "+str(key.img_cnt), color = (255, 0, 0))
            Display.show_image(img) #显示图片
#            Display.show_image(img, x=round((800-sensor.width())/2),y=round((480-sensor.height())/2))#显示图片,仅用于LCD居中方式显示
            print(clock.fps())
            gc.collect()
    except Exception as e:
        print(f"An error occurred during running: {e}")

    finally:
        os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
        sensor.stop()
        Display.deinit()
        MediaManager.deinit()
        gc.collect()

if __name__=="__main__":
    start()

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐