Add Raspberry Pi Pico project

This commit is contained in:
2025-04-17 20:48:12 +02:00
parent 8b9661f149
commit 3a9413ebd6
6 changed files with 223 additions and 0 deletions

9
pico/README.md Normal file
View File

@@ -0,0 +1,9 @@
# Rate music for Raspberry Pi Pico
This is the MicroPython project to connect the Raspberry Pi Pico to the rate_music database via HTTP.
## Installation
1. Follow the [instructions](https://www.raspberrypi.com/documentation/microcontrollers/micropython.html) to install MicroPython on the Raspberry Pi Pico.
2. Install [rshell](https://github.com/dhylands/rshell).
3. Modify `SSID` and `Password` in the `main.py` file.
4. Copy the files `main.py, rate.py, wifi_client.py` to the Pi Pico.

12
pico/delete_folder.py Normal file
View File

@@ -0,0 +1,12 @@
import os
def delete_folder(path):
for file in os.listdir(path):
full_path = path + "/" + file
try:
os.remove(full_path) # Datei löschen
except OSError:
delete_folder(full_path) # Falls es ein Ordner ist, rekursiv löschen
os.rmdir(path) # Ordner selbst löschen
delete_folder("/mfrc522") # Beispiel: Löscht den gesamten MFRC522-Ordner

23
pico/main.py Normal file
View File

@@ -0,0 +1,23 @@
import wifi_client
import rate
# set SSID and PASSWORD variables to the configurations of the laptop access point
SSID = 'Oger-fi'
PASSWORD = 'Karlfreitag!'
SERVER_PORT = 3000
# connect to laptop hotspot
wifi_client.wifi_connect(SSID, PASSWORD)
wifi_client.search_server(100,200, SERVER_PORT)
wifi_client.send_request(42)
# define Pins 0-5 for rate buttons
rate_button_pins:list = [0, 1, 2, 3, 4, 5]
send_button_pin:int = 6
rate.start_rating(rate_button_pins, send_button_pin)

79
pico/rate.py Normal file
View File

@@ -0,0 +1,79 @@
from machine import Pin
import wifi_client
import time
RATE_VALUE = 0
BUTTON_SEND = None
RATE_BUTTONS = None
# initialize a specific Pin as Input with an pull-down resistor
def initialize_pin(pin_number:int):
button = Pin(pin_number, Pin.IN, Pin.PULL_DOWN)
return button
# activates send pin
def activate_sendPin() -> None:
BUTTON_SEND.irq(trigger=Pin.IRQ_RISING, handler=sendButton_pressed)
# deactivates send pin
def deactivate_sendPin() -> None:
BUTTON_SEND.irq(handler=None)
# rate button is pressed
def rate_button_pressed(pin:Pin) -> None:
global RATE_VALUE, RATE_BUTTONS, BUTTON_SEND
# get pin id
pin_id = str(pin).split('(')[1].split(',')[0]
pin_id = pin_id[len(pin_id)-1]
RATE_VALUE = pin_id
print(f"Song is rated with: {RATE_VALUE}")
# activate send pin, when rate pin was selected
activate_sendPin()
# Reset button ist pressed
def sendButton_pressed(pin) -> None:
global RATE_VALUE, BUTTON_SEND
# deactivate send pin to prevent multiple sends
deactivate_sendPin()
print('send button pressed')
# send a request to the access point with the selected rate value
wifi_client.send_request(RATE_VALUE)
# start the rating program
# initialize it with the pin list for the rate_buttoms and the pin for the send button
def start_rating(rate_button_pins:list, button_send_pin:int) -> None:
global RATE_BUTTONS, BUTTON_SEND
# create list for all rate buttons
RATE_BUTTONS = [None] * len(rate_button_pins)
# initialize all pins as buttons and add them to the rate_button list
for pin in rate_button_pins:
button = initialize_pin(pin)
button.irq(trigger=Pin.IRQ_RISING, handler=rate_button_pressed)
RATE_BUTTONS[pin] = button
# define pin 6 as send button
# not activate it, to not be able to send before a rate pin is selected
BUTTON_SEND = initialize_pin(button_send_pin)
print(RATE_BUTTONS)
print(BUTTON_SEND)
while True:
pass

16
pico/test_webserver.py Normal file
View File

@@ -0,0 +1,16 @@
from flask import Flask, request
app = Flask(__name__)
# Endpoint zum Empfangen der Zahl
@app.route('/send_number', methods=['GET'])
def receive_number():
rate_value = request.args.get('number') # Zahl aus der Anfrage holen
if rate_value:
print(f"Empfangene Zahl: {rate_value}")
return f"Recieved rate value {rate_value} !", 200
else:
return "Keine Zahl gesendet", 400
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8080) # Server auf allen IP-Adressen und Port 8080

84
pico/wifi_client.py Normal file
View File

@@ -0,0 +1,84 @@
import network
import urequests
import time
import usocket
import socket
import ssl
# global variable for the IP-Adress of the laptop hotspot
IP_ADRESS_SERVER:str = '192.168.0.100' #None
IP_ADRESS_ACCESSPOINT = None
SERVER_PORT:int = 3000 #None
# configures the raspberry pi as wifi-client and connects it to an access point
def wifi_connect(SSID:str, PASSWORD:str) -> None:
# configure raspberry pi as client
wifi = network.WLAN(network.STA_IF)
# activate client
wifi.active(True)
# connect to laptop hotspot
wifi.connect(SSID, PASSWORD)
# wait until it has connected
while not wifi.isconnected():
print("Connect to", SSID, "...")
time.sleep(1)
# connected to laptop hotspot
print("Connected to", SSID)
# geat and print IP-adress of raspberry
ip_adress_pico = wifi.ifconfig()[0]
print("IP-Adresse Pico:", ip_adress_pico)
# get ip-adress of access point and store it in the global variable
global IP_ADRESS_ACCESSPOINT
IP_ADRESS_ACCESSPOINT = wifi.ifconfig()[2]
print("IP-adress access point:", IP_ADRESS_ACCESSPOINT)
print()
# send a HTTP-request to the access point with the rate value
def send_request(rate_value:int) -> None:
# create HTTP-URL
URL = f"http://{IP_ADRESS_SERVER}:{str(SERVER_PORT)}/rating/{rate_value}"
print(URL)
# create request
response = urequests.get(URL)
# print HTTP-answer of the access point
print("Server response:")
print(response.text) # Die Antwort des Servers anzeigen
print()
response.close()
# test, if there can be a connection to the given ip adress and port
def ping_ip(ip:str, port:int) -> bool:
s = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
s.settimeout(1)
try:
s.connect((ip, port))
print(f"{ip} reachable")
s.close()
return True
except:
print(f"{ip} not reachable")
s.close()
return False
# search for the server in the lokal network
# in the ip range from lower_limit to upper_limit
def search_server(lower_limit:int, upper_limit:int, port:int) -> str:
global IP_ADRESS_SERVER
for i in range(lower_limit, upper_limit):
ip = IP_ADRESS_ACCESSPOINT[:-1] + str(i)
if ping_ip(ip, port):
print(f"Server found unter: {ip}:{port}")
IP_ADRESS_SERVER = ip
return ip