ov2640_aio_saola.py
1 # SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries 2 # SPDX-FileCopyrightText: Copyright (c) 2021 Jeff Epler for Adafruit Industries 3 # 4 # SPDX-License-Identifier: Unlicense 5 6 """ 7 This exampl us for the Espressif Soala Wrover with an OV2640 Camera 8 9 This example requires that your WIFI and Adafruit IO credentials be configured 10 in CIRCUITPY/secrets.py, and that you have created a feed called "image" with 11 history disabled. 12 13 The maximum image size is 100kB after base64 encoding, or about 65kB before 14 base64 encoding. In practice, "SVGA" (800x600) images are typically around 15 40kB even though the "capture_buffer_size" (theoretical maximum size) is 16 (width*height/5) bytes or 96kB. 17 """ 18 19 import binascii 20 import ssl 21 import time 22 from secrets import secrets # pylint: disable=no-name-in-module 23 24 import board 25 import busio 26 import wifi 27 import socketpool 28 import adafruit_minimqtt.adafruit_minimqtt as MQTT 29 from adafruit_io.adafruit_io import IO_MQTT 30 import adafruit_ov2640 31 32 feed_name = "image-saola-ov2640" 33 34 print("Connecting to WIFI") 35 wifi.radio.connect(secrets["ssid"], secrets["password"]) 36 pool = socketpool.SocketPool(wifi.radio) 37 38 print("Connecting to Adafruit IO") 39 mqtt_client = MQTT.MQTT( 40 broker="io.adafruit.com", 41 username=secrets["aio_username"], 42 password=secrets["aio_key"], 43 socket_pool=pool, 44 ssl_context=ssl.create_default_context(), 45 ) 46 mqtt_client.connect() 47 io = IO_MQTT(mqtt_client) 48 49 bus = busio.I2C(scl=board.IO7, sda=board.IO8) 50 cam = adafruit_ov2640.OV2640( 51 bus, 52 data_pins=( 53 board.IO36, 54 board.IO37, 55 board.IO41, 56 board.IO42, 57 board.IO39, 58 board.IO40, 59 board.IO21, 60 board.IO38, 61 ), 62 clock=board.IO33, 63 vsync=board.IO2, 64 href=board.IO3, 65 mclk=board.IO1, 66 mclk_frequency=20_000_000, 67 size=adafruit_ov2640.OV2640_SIZE_QVGA, 68 ) 69 70 cam.flip_x = False 71 cam.flip_y = False 72 73 cam.size = adafruit_ov2640.OV2640_SIZE_SVGA 74 cam.colorspace = adafruit_ov2640.OV2640_COLOR_JPEG 75 jpeg_buffer = bytearray(cam.capture_buffer_size) 76 while True: 77 jpeg = cam.capture(jpeg_buffer) 78 print(f"Captured {len(jpeg)} bytes of jpeg data") 79 80 # b2a_base64() appends a trailing newline, which IO does not like 81 encoded_data = binascii.b2a_base64(jpeg).strip() 82 print(f"Expanded to {len(encoded_data)} for IO upload") 83 io.publish(feed_name, encoded_data) 84 print("Waiting 10s") 85 time.sleep(10)