Przesyłanie danych z czujników przez Wi-Fi za pomocą Raspberry Pi Pico W

Raspberry Pi Pico W tutorial strumień danych z czujników

Czy kiedykolwiek chciałeś przesyłać strumieniowo dane z czujników za pomocą Raspberry Pi Pico W?

Jednym z najlepszych zastosowań Raspberry Pi Pico W jest jego zdolność do obsługi stron internetowych. Oznacza to, że można go używać do monitorowania danych z czujników w telefonie, o ile znajduje się on w zasięgu WiFi. Ten projekt zapewni prostą podstawę do monitorowania danych przyspieszenia, a także utworzy cyfrową kostkę, która jest aktywowana po dotknięciu czujnika ADXL343.

Raspberry Pi Pico W podłączone do ADXL343

Wideo

Potrzebne części

Czym jest ADXL343?

ADXL343 firmy Analog Devices jest następcą swojego poprzednika, ADXL345.

Czujnik może mierzyć trzy osie pomiarowe i ma cztery ustawienia czułości,+-2g, +-4g, +-8g lub +-16g. Niższy zakres daje większą rozdzielczość dla powolnych ruchów, wyższy zakres jest dobry do śledzenia dużych prędkości.

ADXL343 posiada również bibliotekę CircuitPython, którą możemy wykorzystać w MicroPythonie, co znacznie ułatwia rozpoczęcie pracy.

Aby przesyłać strumieniowo dane z czujnika za pomocą Pico W, konieczne będzie przylutowanie nagłówków do ADXL343 oraz Pico W.

Podłączenie układu ADXL343 do układu Pico W

Istnieją cztery piny, które należy podłączyć do Raspberry Pi.

Podłączyć VIN pinezka do Wyjście 3,3V na swoim Raspberry Pi Pico W;

Podłączyć GND do styku z masą w Pico W;

Podłączyć SDA wtyk do GPIO0;

Podłączyć SCL wtyk do GPIO1.

Flashowanie firmware MicroPython dla Raspberry Pi Pico W

Po pierwsze, trzeba będzie flashować firmware MicroPython na Pico W, jeśli jeszcze tego nie zrobiłeś.

Można go pobrać tutaj.

Następnie naciśnij i przytrzymaj przycisk BOOTSEL i podłącz swoje Pico do komputera. Powinieneś zobaczyć nowy napęd. Skopiuj pobrany plik .UF2 na ten dysk.

Konfiguracja Thonny dla Raspberry Pi Pico W

Otwórz Thonny. Jeśli jeszcze go nie pobrałeś, zdobądź go tutaj.

Ustawić interpreter na MicroPython (Raspberry Pi Pico) w lewej dolnej części okna Thonny IDE.

Kopiowanie bibliotek na Pico W

Pobierz biblioteki i pliki tutaj z naszego repo Github.

Możesz pobrać plik ZIP, wchodząc na ten link i klikając zielony "Kod" i klikając Pobierz ZIP.

Po pobraniu rozpakuj go gdzieś, gdzie będziesz pamiętał.

Następnie, w IDE Thonny, kliknij na Widok > Pliki aby zobaczyć swój system plików i system plików Pico W.

Przejdź do rozpakowanych plików i wejdź do folderu MicroPython > II Pico W Sensor Server. Skopiuj wszystko na swoje Pico W, klikając prawym przyciskiem myszy na każdym elemencie i klikając "Upload to /"

Modyfikacja kodu

Aby Raspberry Pi Pico połączyło się z Twoją siecią WiFi, musisz otworzyć sekrety.py i zmodyfikować ssid oraz pwwartość. W pierwszym polu wpisz SSID (nazwę) swojej sieci, a w drugim hasło. Zapisz plik.

Strona index.html to strona internetowa, która zostanie zaserwowana. Linia "<p>X AccX | Y AccY | Z AccZ</p>" oraz <p>Rezultat DiceVal</p> zostanie zastąpiony danymi z czujników podczas uruchamiania projektu.

Podłącz Raspberry Pi Pico do WiFi

Strona main.py to miejsce, gdzie dzieje się akcja.

Te linie łączą go z twoim WiFi. Nie zapomnij zmienić ciągu w rp2.kraj jeśli Twoim krajem nie są Niemcy (DE).


# Set country to avoid possible errors
rp2.country('DE')

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
# If you need to disable powersaving mode
# wlan.config(pm = 0xa11140)

# See the MAC address in the wireless chip OTP
mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()
print('mac = ' + mac)

# Other things to query
# print(wlan.config('channel'))
# print(wlan.config('essid'))
# print(wlan.config('txpower'))

# Load login data from different file for safety reasons
ssid = secrets['ssid']
pw = secrets['pw']

wlan.connect(ssid, pw)

Dzięki tym linijkom kodu dioda LED na płycie będzie migać trzy razy, jeśli połączenie WiFi się powiedzie. Wydrukuje również wiadomość i adres IP, który można zobaczyć w Thonny. Ten adres IP jest przydatny, aby później uzyskać dostęp do serwera.

   led = machine.Pin('LED', machine.Pin.OUT)
    for i in range(wlan.status()):
        led.on()
        time.sleep(0.2)
        led.off()
        time.sleep(0.2)
    print('Connected')
    status = wlan.ifconfig()
    print('ip = ' + status[0])

Jeśli wystąpi błąd, dioda LED będzie migać w zależności od wartości kodu błędu.

Znaczenia błędów

  • 0 = Link Down
  • 1 = połączenie
  • 2 = Link NoIp
  • 3 = Połączenie w górę
  • -1 = Link Fail
  • -2 = połączenie NoNet
  • -3 = Link BadAuth

Podłącz Pico W do ADXL343

Ta linia inicjalizuje obiekt I2C:

# Initialize I2C
# busio.I2C(SCL, SDA)
i2c = busio.I2C(board.GP1, board.GP0)

Następnie te dwie linie tworzą akcelerometr i umożliwiają wykrywanie stuknięć (do odczytu kostek).

# Create Accelerometer object
accelerometer = adafruit_adxl34x.ADXL343(i2c)

accelerometer.enable_tap_detection()

Czas na uruchomienie kodu

Aby uruchomić kod, należy w Thonny nacisnąć przycisk Run, czyli przycisk z ikoną gry w zielonym przycisku na górnym pasku narzędzi.

Następnie połącz się z adresem IP swojego Raspberry Pi Pico W. Jeśli masz otwartą powłokę Thonny, możesz ją tam podejrzeć. Albo inaczej, możesz zalogować się do swojego routera i dowiedzieć się, jaki jest adres IP Pico W.

Pico W uruchamia serwer HTTP z połączeniem gniazdowym i nasłuchuje połączeń, zdefiniowanych tutaj:

addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)

Kiedy połączysz się z adresem IP swojego Pico W, uruchomi on ten kod, który co sekundę odświeży index.html z najnowszymi danymi.

   cl, addr = s.accept()
        print('Client connected from', addr)
        cl_file = cl.makefile('rwb', 0)
        while True:
            line = cl_file.readline()
            if not line or line == b'\r\n':
                break
            
        response = get_html('index.html')
        data = accelerometer.acceleration
        tapped = accelerometer.events['tap']
        response = response.replace('AccX', str(data[0]))
        response = response.replace('AccY', str(data[1]))
        response = response.replace('AccZ', str(data[2]))
        if tapped:
            dice_val = str(random.randint(1,6))
        response = response.replace('DiceVal', dice_val)
        
        cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
        cl.send(response)
        cl.close()

main.py zastępuje wartości aktualnym odczytem, gdy połączysz się z serwerem Pico W.

Jak widać, zastępuje on AccX, AccY i AccZ danymi z twojego czujnika.

Jeśli czujnik zostanie dotknięty, to na stronie HTML zostanie wypisana losowa liczba całkowita od 1 do 6 do łańcucha "DiceVal".

Co dalej?

Ten samouczek przedstawia jeden z prostych sposobów przesyłania danych z czujników na stronę internetową za pomocą Raspberry Pi Pico W.

W rzeczywistości jest to kod, który możesz wykorzystać również dla innych czujników.

Metodologia pozostaje taka sama. Musisz znaleźć odpowiednie biblioteki dla swoich czujników, a następnie zmodyfikować main.py i index.html, aby mogły one uzyskać dane z czujników i wypchnąć odpowiednie wartości na stronę internetową.

Istnieje wiele innych projektów, w które można się zaangażować, takich jak czujnik temperatury i wilgotności lub projekt jakości powietrza z DHT22 lub DHT22. BME688lub czujnik jasności z rezystorem światła.

Komentarzy: 7

  1. Ken Anderson lipiec 15, 2022 o 7:24 am

    Z pewnością byłoby miło użyć funkcji HTML5, abyśmy mogli zobaczyć jak HTML5 jest zrobiony

  2. Terry Young wrzesień 24, 2022 o 6:47 pm

    Czy dane mogłyby być po prostu wysyłane strumieniowo jako może ciąg na porcie przez TCP/UDP, a nie w formacie strony internetowej, tak aby mogły być odczytane przez inny komputer (aby zrobić mierniki czy coś?).
    coś w rodzaju
    192.168.1.24:9060
    AccX, 7.923, AccY, 1.093, AccZ, -5.452
    AccX, 6.423, AccY, 1.241, AccZ, -8.769

  3. Ingo styczeń 10, 2023 o 9:11 pm

    Mal angenommen man hätte einen Pico W, der in einer Dauerschleife läuft und Messwerte erfasst; wie können diese Messwerte von einem anderen Pico W über WLAN abgefragt werden?
    In deinem Beispielcode ist es so, das der Pico W etwas macht, wenn er über HTML angesprochen wird. In meinem Fall bräuchte ich sowas wie eine
    "getvaluefromotherpico(192.178.2.44, variablename)" - sprich er soll immer in seiner Schleife laufen und die per WLAN angefragten Anfragen nebenher bedienen, z.B. per Interrupt.
    Wie wäre sowas möglich?

    Besten Dank und Gruß
    Ingo

    • raspi berry luty 4, 2023 o 11:51 am

      Der andere Pico könnte in einer Schleife laufen, und die Werte per REST API vom ersten Pico abfragen?
      Ich verstehe die Problemstellung sonst vielleicht nicht ganz?

      Jeśli jest to projekt kommerzalny, to możemy się zająć konsultingowo-technicznie 🙂

  4. Luis styczeń 11, 2023 o 3:30 pm

    jak przekazać te dane do thinspeaka?

  5. Eddi Baars marzec 18, 2023 o 1:02 pm

    guten Tag, ich habe dasselbe Problem. Mit curl oder wget funktioniert es nicht. Ich möchte die Messwerte vom Pico auf meinem Raspi4 speichern und später grafisch darstellen und statistisch auswerten. ???

  6. andrew lipiec 19, 2023 o 10:31 pm

    brak modułu o nazwie network, jeśli dodamy moduł netwrk z thonny, narzeka on na brak modułu o nazwie socket lol

Pozostaw komentarz