import machine import neopixel import camera import urequests import network import uasyncio as asyncio import json # Konfiguracja matrycy LED (16x16 WS2812B) LED_PIN = 4 # Pin podłączony do matrycy WIDTH = 16 HEIGHT = 16 NUM_PIXELS = WIDTH * HEIGHT np = neopixel.NeoPixel(machine.Pin(LED_PIN), NUM_PIXELS) # Konfiguracja Wi-Fi def connect_to_wifi(ssid, password): wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print("Connecting to WiFi...") wlan.connect(ssid, password) while not wlan.isconnected(): pass print("Connected! Network details:", wlan.ifconfig()) # Funkcja czyszczenia matrycy def clear_matrix(): for i in range(NUM_PIXELS): np[i] = (0, 0, 0) np.write() # Funkcja do rysowania smutnej buźki def display_sad_face(): clear_matrix() sad_face_pixels = [ (7, 3), (8, 3), # Górna część (5, 3), (6, 3), (9, 3), (10, 3), (4, 4), (11, 4), (3, 5), (12, 5), (3, 6), (12, 6), (3, 7), (12, 7), (3, 8), (12, 8), (3, 9), (12, 9), (3, 10), (12, 10), (4, 11), (11, 11), (5, 12), (6, 12), (9, 12), (10, 12), (7, 12), (8, 12), (6,6), (9,6), (5, 9), (6, 9),(7, 9), (8, 9), (9, 9), (10, 9), (5,10), (10,10) ] for x, y in sad_face_pixels: np[x + y * WIDTH] = (255, 0, 255) # Fioletowy np.write() # Funkcje wyświetlania wzorów na matrycy def display_triangle(): clear_matrix() base_y = HEIGHT - 1 # Dolny rząd matrycy (podstawa trójkąta) apex_y = 0 # Górny rząd matrycy (wierzchołek trójkąta) start_x = 0 # Początek zapalania pikseli w rzędzie end_x = WIDTH - 1 # Koniec zapalania pikseli w rzędzie for y in range(base_y, apex_y - 1, -1): # Iteracja od dołu matrycy do góry for x in range(start_x, end_x + 1): np[x + y * WIDTH] = (0, 255, 0) # Zielony start_x += 1 # Przesuń początek w prawo end_x -= 1 # Przesuń koniec w lewo np.write() # Wyślij dane do matrycy np.write() # Poprawione rysowanie koła def display_circle(): clear_matrix() # Zdefiniowane współrzędne pikseli, które tworzą okrąg circle_pixels = [ (7, 3), (8, 3), # Górna część (5, 3), (6, 3), (9, 3), (10, 3), (4, 4), (11, 4), (3, 5), (12, 5), (3, 6), (12, 6), (3, 7), (12, 7), (3, 8), (12, 8), (3, 9), (12, 9), (3, 10), (12, 10), (4, 11), (11, 11), (5, 12), (6, 12), (9, 12), (10, 12), (7, 12), (8, 12) # Dolna część ] # Zapalanie pikseli na podstawie zdefiniowanych współrzędnych for x, y in circle_pixels: np[x + y * WIDTH] = (0, 0, 255) # Niebieski np.write() # Funkcja do rysowania kwadratu def display_square(): clear_matrix() for x in range(4, 12): for y in range(4, 12): np[x + y * WIDTH] = (255, 0, 0) # Czerwony np.write() # Funkcja do rysowania prostokąta def display_rectangle(): clear_matrix() for x in range(3, 13): for y in range(5, 11): np[x + y * WIDTH] = (255, 255, 0) # Żółty np.write() # Funkcja do robienia zdjęcia def take_photo(): try: print('Taking photo...') camera.init(0, format=camera.JPEG) buffer = camera.capture() camera.deinit() return buffer except Exception as e: print(f"Error taking photo: {e}") camera.deinit() return None # Wysyłanie zdjęcia do serwera async def process_photo(): server_url = "http://192.168.242.207:5000/upload" # Zmień na adres swojego serwera Flask try: print("Processing photo...") photo = take_photo() if photo: headers = {'Content-Type': 'image/jpeg'} print("Sending photo to server...") response = urequests.post(server_url, data=photo, headers=headers) if response.status_code == 200: result = response.json() print(f"Server response: {result}") shape = result.get("shape", None) # Oczekujemy, że serwer zwraca pojedynczy kształt if shape: if shape == "Unknown": display_sad_face() # Rysowanie smutnej buźki else: draw_shape_on_matrix(shape) # Rysowanie kształtu na matrycy else: print("No shape detected.") display_sad_face() # Rysowanie smutnej buźki return shape else: print(f"Server error: {response.text}") return None else: print("No photo taken.") return None except Exception as e: print(f"Error sending photo: {e}") return None # Funkcja rysowania kształtu na matrycy def draw_shape_on_matrix(shape): print(f"Drawing shape: {shape}") if shape == "Square": display_square() elif shape == "Rectangle": display_rectangle() elif shape == "Triangle": display_triangle() elif shape == "Circle": display_circle() else: display_sad_face() # Rysowanie smutnej buźki w przypadku nierozpoznanego kształtu # Główna funkcja async def main(): # Przetwarzanie zdjęcia i wysyłanie go do serwera await process_photo() print("Photo processed. Program completed.") # Uruchamianie programu try: connect_to_wifi("Hot chicken spot", "1916winwin") # Zmień na swoje dane Wi-Fi asyncio.run(main()) except Exception as e: print(f"Critical error: {e}")