API Consumer Example¶
Query the Number Transmitter API over WiFi and display results via LED.
Overview¶
This example demonstrates how to consume REST APIs from MicroPython, query the Number Transmitter API, and visualize the data by blinking the LED.
Source Code¶
File: src/pico_scripts/05_api_consumer.py
Features¶
- WiFi connectivity
- HTTP GET requests to REST API
- JSON parsing
- LED visualization (blinks N times for number N)
- Error handling and retry logic
- Statistics tracking
Hardware Requirements¶
- Raspberry Pi Pico W (WiFi required)
- Onboard LED
- Running Number Transmitter API on local network
Prerequisites¶
- Number Transmitter API must be running
- Pico W and API server on same network
- Know the API server's IP address
Configuration¶
# WiFi Configuration
WIFI_SSID = "YOUR_WIFI_SSID"
WIFI_PASSWORD = "YOUR_WIFI_PASSWORD"
# API Configuration
API_BASE_URL = "http://192.168.1.100:5001" # Replace with your API server IP
API_ENDPOINT = "/api/number"
# Query interval
QUERY_INTERVAL = 2 # seconds
Code Explanation¶
Querying the API¶
import urequests
def query_api(url):
try:
response = urequests.get(url, timeout=5)
if response.status_code == 200:
data = response.json()
response.close()
return data
else:
print(f"API error: HTTP {response.status_code}")
return None
except Exception as error:
print(f"Request failed: {error}")
return None
Blinking to Represent Number¶
def blink_number(number, blink_speed=0.2):
# Blink LED N times where N is the number
for i in range(number):
led.on()
time.sleep(blink_speed)
led.off()
time.sleep(blink_speed)
Main Loop¶
def monitor_api(wlan, api_url, interval=2):
while True:
# Query API
data = query_api(api_url)
if data:
current_number = data.get('number')
print(f"Current number: {current_number}")
# Blink LED
blink_number(current_number)
time.sleep(interval)
Usage¶
Setup API Server¶
First, start the Number Transmitter API on your computer:
# On your computer
source .venv/bin/activate
python src/api/app.py
# Note the IP address shown in output
Configure Pico Script¶
- Edit WiFi credentials
- Set
API_BASE_URLto your computer's IP address:
Upload and Run¶
- Upload script to Pico
- Run in Thonny
- Watch console output and LED
Expected Output¶
Raspberry Pi Pico W - API Consumer
============================================================
Connected to: MyNetwork
Pico IP Address: 192.168.1.101
Testing API connection to http://192.168.1.100:5001/api/number...
API connection successful!
Current number from API: 5
Number Transmitter API Consumer
============================================================
API URL: http://192.168.1.100:5001/api/number
Query interval: 2 seconds
Press Ctrl+C to stop
Query #1...
--------------------------------------------------
Current Number: 5
Timestamp: 2025-01-15T10:30:45.123456
Total Cycles: 12345
Next change in: 0.87s
--------------------------------------------------
Blinking 5 times...
Query #2...
--------------------------------------------------
Current Number: 6
Timestamp: 2025-01-15T10:30:47.123456
Total Cycles: 12345
Next change in: 0.65s
--------------------------------------------------
Number changed: 5 -> 6
Blinking 6 times...
LED Behavior¶
- Quick blinks: Number from API (1-9 blinks)
- 3 rapid flashes: Error occurred
- Pauses between: Waiting for next query
API Response Structure¶
{
"number": 5,
"timestamp": "2025-01-15T10:30:45.123456",
"unix_timestamp": 1736935845.123456,
"next_change_in": 0.876,
"cycle_position": 5,
"total_cycles": 12345
}
Troubleshooting¶
Connection Refused¶
Solutions:
- Verify API server is running
- Check firewall allows port 5001
- Confirm IP address is correct
- Test with: curl http://YOUR_IP:5001/api/status
Network Issues¶
Solutions: - Ensure same network/subnet - Check WiFi credentials - Ping API server from another device - Verify 2.4 GHz WiFi enabled
Timeout Errors¶
Solutions: - Increase timeout value - Check network congestion - Move Pico closer to router - Reduce query interval
JSON Parsing Errors¶
Solutions: - Verify API is returning valid JSON - Test API in browser - Check API error messages - Update MicroPython firmware
Advanced Usage¶
Custom Error Handling¶
error_count = 0
max_errors = 5
if not data:
error_count += 1
if error_count >= max_errors:
print("Too many errors, reconnecting WiFi...")
wlan.disconnect()
connect_wifi(WIFI_SSID, WIFI_PASSWORD)
error_count = 0
Statistics Tracking¶
query_count = 0
success_count = 0
if data:
success_count += 1
success_rate = (success_count / query_count) * 100
print(f"Success rate: {success_rate:.1f}%")
Next Steps¶
- Access Point - Create your own web interface
- Web App API - API documentation
- Signal Monitor - Check WiFi quality
Reference¶
Full source: src/pico_scripts/05_api_consumer.py
API documentation: See API Reference