Ausprobiert

Netzwerk-Scanner
mit Pico W



Bildbox 1 (klick hier)

Hardware / Software

- Raspberry Pi Pico W
- Pico-LCD-1.14 Display
- Micro USB Kabel
- Firmware CircuitPython
- Thonny IDE

Nach der Einrichtung des Pico W mit der Firmware CircuitPython und einem ersten Internet-Test zeige ich hier, wie Sie den Pico W mit dem Display LCD-1.14 von Waveshare als Netzwerkscanner verwenden können. Dazu brauchen Sie zur Initialisierung des Displays die Datei 'init_pico_lcd.py' und einige Bibliotheken für den 'lib-Ordner'. Diese liegen hier zum downloaden bereit. Laden Sie die zip-Datei herunter, entpacken sie und kopieren die Datei 'init_pico_lcd.py' ins Hauptverzeichnis sowie den Inhalt des 'lib-Ordners' in den 'lib_Ordner' des Pico W.

Los geht's

Übertragen Sie als erstes den unteren Code (Zeile 1 bis 35) in die Thonny IDE. Zunächst werden die Bibliotheken importiert, die interne LED ausgeschaltet, die Button (Joystick, Button A und Button B) und das Display definiert.

  
  

1  import os
2  import time, gc
3  import board
4  import ssl
5  import wifi, ssl, socketpool
6  import rtc
7  import socketpool
8  import microcontroller
9  import adafruit_requests
10 import displayio
11 import digitalio
12 import terminalio
13 from adafruit_display_text import label
14 from init_pico_lcd import WavesharePicoLCD114
15 from digitalio import DigitalInOut, Direction, Pull
16 from adafruit_ticks import ticks_ms
17
18 led = digitalio.DigitalInOut(board.LED)
19 led.direction = digitalio.Direction.OUTPUT
20
21 # Buton definieren
22 joystick = DigitalInOut(board.GP3)
23 joystick.direction = Direction.INPUT
24 joystick.pull = Pull.UP
25 key_a = DigitalInOut(board.GP15)
26 key_a.direction = Direction.INPUT
27 key_a.pull = Pull.UP
28 key_b = DigitalInOut(board.GP17)
29 key_b.direction = Direction.INPUT
30 key_b.pull = Pull.UP
31
32 # built-in display
33 lcd = WavesharePicoLCD114()
34 display = lcd.display
35
  

Als nächstes wird ein blaues Hintergrundbild erzeugt und ein Starttext als 'label' definiert, welches später durch 'update.label' immer wieder erneuert wird. In den Zeile 62 und 63 werden zwei Variable festgelegt. Mit der Variable ' ticks_ms() ' werden nach Abschluss des Scannvorgangs 20 Millisekunden gezählt, ehe der Bildschirm wieder in den Anfangsmodus springt. Die Variable 'stop' sorgt dafür, dass der Joystick nur reagiert, wenn sie den Wert Null hat.

  
  

36 # Make the display context
37 main_group = displayio.Group()
38 display.show(main_group)
39
40# make bitmap that spans entire display
41 background = displayio.Bitmap(display.width, display.height, 3)
42 mypal = displayio.Palette(1)
43 mypal[0] = 0x0000FF # set colors (black)
44 main_group.append(displayio.TileGrid(background, pixel_shader=mypal))
45 background.fill(0)  # change background to blue (mypal[2])
46
47 text = ("  Netzscan starten"  +
48            "\n  Joystick drücken" +
49            "\n\n  stop: A Button" +
50            "\n  neu:  B Button")
51 # create the label
52 updating_label = label.Label(
53     font=terminalio.FONT, text=text, scale=2, color=0xFFFFFF,
54     line_spacing=1
55     )
56 # set label position on the display
57 updating_label.anchor_point = (0, 0)
58 updating_label.anchored_position = (1, 10)
59 # add label to group that is showing on display
60 main_group.append(updating_label)
61
62 start = ticks_ms()
63 stop = 0
64
  

Es folgt die 'while' Schleife. In Zeile 66 startet beim Drücken des Joysticks der Scannvorgang. Folgende Variable werden bestimmt:

- net: der SSID Name des Netzwerks
- rssi: die Signalstärke
- channel: der Kanal auf dem das Netz sendet
- key: die Verschlüsselungsart des Netzes

Eine Besonderheit ist der Fall str(network.authmode) == "[wifi.AuthMode.OPEN]" . Dabei handelt es sich nämlich um ein offenes WLAN-Netz. Die anderen Verschlüsselungsarten werden in den Zeilen 76 bis 81 bestimmt und in den String 'key' übernommen. Die Zeilen 82 bis 86 realisieren das bereits erwähnte 'updating_label.text', um die Anzeige zu aktualisieren.

  
  

65  while True:
66      if not joystick.value and stop == 0:
67          i = 0
68          for network in wifi.radio.start_scanning_networks():
69              key = ""
70              i += 1
71              net = str(network.ssid)
72              rssi = str((-1)*network.rssi)
73              channel = str(network.channel)
74              if str(network.authmode) == "[wifi.AuthMode.OPEN]":
75                  key = "offenes Netz"
76              if "WPA," in str(network.authmode):
77                  key += "WPA, "
78              if "WPA2," in str(network.authmode):
79                  key += "WPA2, "
80              if "PSK" in str(network.authmode):
81                  key += "PSK, "
82              updating_label.text = ("   Netzwerk " + str(i) + "   " +
83                                     "\n " + net +
84                                     "\n Signalst.: " + rssi + "   " +
85                                     "\n Kanal    : " + channel + "   " +
86                                     "\n " + key + "     ")
87              time.sleep(1)
88              if not key_a.value:
89                  stop = 1
90                  wifi.radio.stop_scanning_networks()
91                  break
92              time.sleep(1)
93          wifi.radio.stop_scanning_networks()
94          start = ticks_ms()
95          if stop == 0:
96              time.sleep(8)
97              updating_label.text = ("    Scanvorgang" +
98                                     "\n   abgeschlossen" +
99                                     "\n               " +
100                                    "\n     " + str(i) + " Netze" +
101                                    "\n     gefunden")
102     if not key_b.value:
103         stop = 0
104         updating_label.text = ("   Netzwerkscan " +
105                                    "\n     starten:"  +
106                                    "\n\n     Joystick" +
107                                    "\n      drücken")
108     if (ticks_ms() - start)/ 1000 > 20:
109         stop = 0
110         updating_label.text = ("   Netzwerkscan " +
111                                    "\n     starten:"  +
112                                   "\n\n     Joystick" +
113                                   "\n      drücken")
  

Wenn der 'Button A' nicht gedrückt wurde, erfolgt am Ende des Scannvorgangs (Zeilen 95 bis 101) die Zusammenfassung. Wurde vorher der 'Button A' gedrückt, so wird der Scannvorgang unterbrochen. Mit dem 'Button B' wird das Programm zum Anfangszustand zurückgesetzt (Zeilen 102 bis 107). Wird gar kein Button gedrückt, so erfolgt die Rücksetzung (Zeilen 108 bis 113) nach den 20 Millisekunden aus dem 'ticks_ms()'. Das hat den Vorteil, dass im Unterschied zu 'time.sleep(20)' der Pico weiterhin auf einen Tastendruck reagiert und nicht in der 'Ruheschleife' ist. Diese Methode sollte immer angewandt werden, wenn während einer bestimmten Zeit auch noch andere Vorgänge laufen und nicht 'eingefroren' werden sollen. So, damit ist das Programm komplett und Sie können ein wenig 'spielen' Weitere verwandte Projekte:

  • Pico W RTC Uhr mit Pico-LCD-1.14 Display
  • Pico Diashow mit LCD-1.14 Display
  • USB-Mouse-Jiggler mit Pico-LCD-1.14 Display
  • Pico W als Uhr mit Neopixelring

  • Viel Spass und Erfolg beim Ausprobieren. Wenn Ihnen diese Anleitung gefallen hat, tragen Sie hier bitte einen Kommentar ein.



    Zurück