Cellular Data Setup
This page assumes you've set up and connected your CircuitPython board to a cellular data connection.
- If you have not connected to the internet using cellular data yet, please follow this guide and come back when you've successfully connected.
Connect FONA
Make sure you have attached a LiPoly battery, GSM antenna, GPS antenna to your FONA.
You must also have a SIM card inserted in the FONA to use the module with cellular data.
- If you haven't done this yet, navigate to this page and come back when you've set up the FONA.
Code Usage
Copy the following code to a file on your computer. Name the file code.py. With your operating system file explorer/finder, copy this file to the CIRCUITPY drive which appears when your microcontroller board is plugged in via USB.
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT import time from os import getenv import adafruit_connection_manager import adafruit_fona.adafruit_fona_network as network import adafruit_fona.adafruit_fona_socket as pool import board import busio import digitalio from adafruit_fona.adafruit_fona import FONA import adafruit_minimqtt.adafruit_minimqtt as MQTT # Get FONA details and Adafruit IO keys, ensure these are setup in settings.toml # (visit io.adafruit.com if you need to create an account, or if you need your Adafruit IO key.) apn = getenv("apn") apn_username = getenv("apn_username") apn_password = getenv("apn_password") aio_username = getenv("ADAFRUIT_AIO_USERNAME") aio_key = getenv("ADAFRUIT_AIO_KEY") ### Cellular ### # Create a serial connection for the FONA connection uart = busio.UART(board.TX, board.RX) rst = digitalio.DigitalInOut(board.D4) # Initialize FONA fona = FONA(uart, rst) ### Feeds ### # Setup a feed named 'photocell' for publishing to a feed photocell_feed = f"{aio_username}/feeds/photocell" # Setup a feed named 'onoff' for subscribing to changes onoff_feed = f"{aio_username}/feeds/onoff" ### Code ### # Define callback methods which are called when events occur def connected(client, userdata, flags, rc): # This function will be called when the client is connected # successfully to the broker. print(f"Connected to Adafruit IO! Listening for topic changes on {onoff_feed}") # Subscribe to all changes on the onoff_feed. client.subscribe(onoff_feed) def disconnected(client, userdata, rc): # This method is called when the client is disconnected print("Disconnected from Adafruit IO!") def message(client, topic, message): # This method is called when a topic the client is subscribed to # has a new message. print(f"New message on topic {topic}: {message}") # Initialize cellular data network network = network.CELLULAR(fona, (apn, apn_username, apn_password)) while not network.is_attached: print("Attaching to network...") time.sleep(0.5) print("Attached!") while not network.is_connected: print("Connecting to network...") network.connect() time.sleep(0.5) print("Network Connected!") ssl_context = adafruit_connection_manager.create_fake_ssl_context(pool, fona) # Set up a MiniMQTT Client # NOTE: We'll need to connect insecurely for ethernet configurations. mqtt_client = MQTT.MQTT( broker="io.adafruit.com", username=aio_username, password=aio_key, is_ssl=False, socket_pool=pool, ssl_context=ssl_context, ) # Setup the callback methods above mqtt_client.on_connect = connected mqtt_client.on_disconnect = disconnected mqtt_client.on_message = message # Connect the client to the MQTT broker. print("Connecting to Adafruit IO...") mqtt_client.connect() photocell_val = 0 while True: # Poll the message queue mqtt_client.loop() # Send a new message print(f"Sending photocell value: {photocell_val}...") mqtt_client.publish(photocell_feed, photocell_val) print("Sent!") photocell_val += 1 time.sleep(5)
Feed Publishing Example
Directly after saving the code.py file, open a serial monitor/REPL to see the output. It should look something like the following:
Auto-reload is on. Simply save files over USB to run them or enter REPL to disable. code.py output: Attaching to network... Attached to network! Connecting to network... Connected to network! Connecting to Adafruit IO... Connected to Adafruit IO! Listening for topic changes on brubell/feeds/onoff Sending photocell value: 0... Sent! Sending photocell value: 1... Sent! Sending photocell value: 2... Sent! Sending photocell value: 3... Sent!
Navigate to the dashboard you created earlier. You should see the photocell gauge increasing its value as your CircuitPython device publishes the increasing photocell value to Adafruit IO.
If you navigate to the page for the photocell feed, you'll see the values increasing there along with metadata about when the data was received by the Adafruit IO broker.
Feed Subscription Example
While we're publishing the increasing photocell value to Adafruit IO - our code also subscribes to changes on the onoff feed.
The example code.py subscribes to the onoff feed when the client successfully connects to Adafruit IO. You don't need to make any changes to your code!
With the code still running on your CircuitPython device - click the toggle switch to send a value to the onoff feed. You should see the value appear on your serial monitor/REPL.
If you really want to see the speed of MQTT - remove the one second delay in the while True
loop.
Change the following code (within while True
) from:
print('Sent!')
photocell_val += 1
time.sleep(1)
to
print('Sent!')
photocell_val += 1
time.sleep(0.5)
Be warned - if you do this you will not be able to run the code for very long. This is because Adafruit IO's MQTT server imposes a rate limit to prevent excessive load on the service.
The current Adafruit IO Data Rate is at most 1 request per second (or 60 requests within 60 seconds), without an Adafruit IO+ Boost applied to your account.
Going Further - the Adafruit IO CircuitPython Module
While you can use this code to communicate with Adafruit IO, the recommended method of using CircuitPython with Adafruit IO is with the Adafruit IO CircuitPython module.
This module has methods to simplify using the Adafruit IO MQTT API. It also includes helper features to make your experience using Adafruit IO better.
If you want to use Adafruit IO and CircuitPython, check out Adafruit IO CircuitPython and the code example for Ethernet on GitHub!
Page last edited January 22, 2025
Text editor powered by tinymce.