{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 4.1 Onboard LED and Temperature\n", "\n", "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/AccelerationConsortium/ac-microcourses/blob/main/docs/courses/hello-world/1.4.1-onboard-led-temp.ipynb)\n", "\n", "Ensure that you've followed the instructions in the [hardware/software communication notebook](./1.4-hardware-software-communication.ipynb) to set up your Pico W microcontroller. This notebook will allow you to interact with the microcontroller via the MQTT protocol. This assumes you are using the same HiveMQ microcredentials as in this notebook (`HIVEMQ_USERNAME`, `HIVEMQ_PASSWORD`, `HIVEMQ_HOST`).\n", "\n", "\n", "\n", "You will also need to check that the `COURSE_ID` here matches the `COURSE_ID` on the microcontroller. This is to ensure that the microcontroller is subscribed to the correct topic." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# only install paho-mqtt if we are running in colab\n", "# matplotlib only for visualization\n", "import sys\n", "IN_COLAB = 'google.colab' in sys.modules\n", "if IN_COLAB:\n", " %pip install paho-mqtt matplotlib" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "COURSE_ID = \"\" # UPDATE THIS TO YOUR ID\n", "\n", "command_topic = f\"{COURSE_ID}/onboard_led\"\n", "sensor_data_topic = f\"{COURSE_ID}/onboard_temp\"\n", "\n", "HIVEMQ_USERNAME = \"sgbaird\"\n", "HIVEMQ_PASSWORD = \"D.Pq5gYtejYbU#L\"\n", "HIVEMQ_HOST = \"248cc294c37642359297f75b7b023374.s2.eu.hivemq.cloud\"" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import paho.mqtt.client as mqtt\n", "import json\n", "from queue import Queue\n", "\n", "sensor_data_queue: \"Queue[dict]\" = Queue()\n", "\n", "def get_paho_client(sensor_data_topic, hostname, username, password=None, port=8883, tls=True):\n", "\n", " client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, protocol=mqtt.MQTTv5) # create new instance\n", "\n", " def on_message(client, userdata, msg):\n", " sensor_data_queue.put(json.loads(msg.payload))\n", "\n", " # The callback for when the client receives a CONNACK response from the server.\n", " def on_connect(client, userdata, flags, rc, properties=None):\n", " if rc != 0:\n", " print(\"Connected with result code \" + str(rc))\n", " # Subscribing in on_connect() means that if we lose the connection and\n", " # reconnect then subscriptions will be renewed.\n", " client.subscribe(sensor_data_topic, qos=1)\n", "\n", " client.on_connect = on_connect\n", " client.on_message = on_message\n", "\n", " # enable TLS for secure connection\n", " if tls:\n", " client.tls_set(tls_version=mqtt.ssl.PROTOCOL_TLS_CLIENT)\n", " # set username and password\n", " client.username_pw_set(username, password)\n", " # connect to HiveMQ Cloud on port 8883 (default for MQTT)\n", " client.connect(hostname, port)\n", " client.subscribe(sensor_data_topic, qos=1)\n", "\n", " return client\n", "\n", "\n", "def send_and_receive(client, command_topic, msg, queue_timeout=60):\n", " client.publish(command_topic, msg, qos=2)\n", "\n", " client.loop_start()\n", "\n", " while True:\n", " sensor_data = sensor_data_queue.get(True, queue_timeout)\n", " client.loop_stop()\n", " return sensor_data" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "client = get_paho_client(\n", " sensor_data_topic, HIVEMQ_HOST, HIVEMQ_USERNAME, password=HIVEMQ_PASSWORD\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, send a command to toggle the onboard LED on the Pico W and read the temperature from the onboard sensor using the `send_and_receive` function." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "onboard_temp = send_and_receive(\n", " client, command_topic, \"toggle\", queue_timeout=30\n", ")\n", "print(onboard_temp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, run the following cell, which puts a small delay between iterative calls to the `send_and_receive` function. The onboard LED will be toggled at each iteration, and temperatures will be stored in the `onboard_temps` list. A running plot of the temperature as a function of time will be displayed. Feel free to stop the cell at any time.\n", "\n", "Note that the time is elapsed time, which is calculated within the notebook rather than being sent by the microcontroller. Ideally, the microcontroller would record a full timestamp in UTC time and send that with the temperature data; however, to keep the hardware/software communication simpler (i.e., just a number corresponding to the temperature in degrees Celsius), sending timestamps is omitted from the example microcontroller code." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "from time import sleep, time\n", "from IPython.display import clear_output\n", "\n", "onboard_temps = []\n", "timestamps = []\n", "\n", "start_time = time() # Get the current time\n", "\n", "for _ in range(30):\n", " onboard_temp = send_and_receive(\n", " client, command_topic, \"toggle\", queue_timeout=60\n", " )\n", " onboard_temps.append(onboard_temp)\n", " elapsed_time = time() - start_time # Calculate the elapsed time\n", " timestamps.append(elapsed_time)\n", " print(onboard_temp)\n", " sleep(1.0)\n", "\n", " # Update the plot\n", " clear_output(wait=True) # Clear the current output\n", " plt.plot(timestamps, onboard_temps) # Plot the temperatures\n", " plt.show() # Show the plot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once you've successfully run this notebook, return to the [hardware/software communication notebook](./1.4-hardware-software-communication.ipynb)." ] } ], "metadata": { "kernelspec": { "display_name": "ac-microcourses", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.5" } }, "nbformat": 4, "nbformat_minor": 2 }