Передача данных с датчиков по WiFi с помощью Raspberry Pi Pico W

Учебник по Raspberry Pi Pico W потоковая передача данных датчиков

Хотелось ли вам когда-нибудь получить потоковую передачу данных с датчиков с помощью Raspberry Pi Pico W?

Одним из лучших вариантов использования Raspberry Pi Pico W является его способность обслуживать веб-страницы. Это означает, что с его помощью можно отслеживать данные датчиков с телефона при условии, что он находится в зоне действия WiFi. Этот проект обеспечит простую основу для мониторинга данных об ускорении, а также создаст цифровой кубик, который активируется при касании датчика ADXL343.

Raspberry Pi Pico W подключен к ADXL343

Видео

Необходимые детали

Что такое ADXL343?

ADXL343 компании Analog Devices является продолжением своего предшественника ADXL345.

Датчик может измерять по трем осям и имеет четыре настройки чувствительности: +-2g, +-4g, +-8g или +-16g. Более низкий диапазон дает большее разрешение для медленных движений, более высокий диапазон хорош для высокоскоростного отслеживания.

ADXL343 также имеет библиотеку CircuitPython, которую мы можем использовать в MicroPython, что значительно облегчает начало работы.

Для осуществления потоковой передачи данных с датчика на Pico W необходимо распаять разъемы на ADXL343 и Pico W.

Подключение ADXL343 к Pico W

К Raspberry Pi необходимо подключить четыре контакта.

Подключите VIN штырь к Выход 3,3 В на вашем Raspberry Pi Pico W;

Подключите GND к контакту заземления на вашем Pico W;

Подключите SDA контакт с GPIO0;

Подключите SCL контакт с GPIO1.

Прошивка прошивки MicroPython для Raspberry Pi Pico W

Во-первых, вам нужно прошить прошивку MicroPython на Pico W, если вы этого еще не сделали.

Вы можете скачать его здесь.

Затем нажмите и удерживайте кнопку BOOTSEL и подключите Pico к компьютеру. Должен появиться новый диск. Скопируйте загруженный файл .UF2 на этот диск.

Настройка Thonny для Raspberry Pi Pico W

Откройте программу Thonny. Если вы еще не скачали его, получите его здесь.

Установите интерпретатор на MicroPython (Raspberry Pi Pico) в левой нижней части окна Thonny IDE.

Копирование библиотек на Pico W

Загрузите библиотеки и файлы из нашего репозитория на Github.

Вы можете загрузить ZIP-файл, перейдя по этой ссылке и нажав на зеленую кнопку "Код" и нажмите кнопку Скачать ZIP.

После загрузки распакуйте его в удобное для вас место.

Затем в IDE Thonny нажмите на кнопку Вид > Файлы чтобы увидеть вашу файловую систему и файловую систему Pico W.

Перейдите к распакованным файлам и зайдите в папку MicroPython > II Pico W Сенсорный сервер. Скопируйте все на Pico W, щелкнув правой кнопкой мыши на каждом элементе и нажав "Upload to /".

Изменение кода

Для того чтобы заставить Raspberry Pi Pico подключиться к вашей сети WiFi, вам необходимо открыть secrets.py и изменить ssid и pw'значение. Введите SSID (имя) вашей сети в первое значение и пароль во второе. Сохраните файл.

Сайт index.html это веб-страница, которая будет обслуживаться. Строка "<p>X AccX | Y AccY | Z AccZ</p>" и <p>Результат DiceVal</p> будут заменены данными датчиков при запуске проекта.

Подключите Raspberry Pi Pico к WiFi

Сайт main.py это место, где происходит действие.

Эти строки подключают его к вашему WiFi. Не забудьте изменить строку в rp2.country если ваша страна не Германия (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)

Благодаря этим строкам кода встроенный светодиод будет мигать три раза, если соединение WiFi было успешным. Он также выведет сообщение и ваш IP-адрес, который можно просмотреть в Thonny. Этот IP-адрес пригодится для последующего доступа к серверу.

   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])

Если произошла ошибка, светодиод будет мигать в зависимости от значения кода ошибки.

Значения ошибок

  • 0 = Связь отключена
  • 1 = Соединение ссылок
  • 2 = Link NoIp
  • 3 = Подключение
  • -1 = Отказ связи
  • -2 = Связь NoNet
  • -3 = Link BadAuth

Подключите Pico W к ADXL343

Эта строка инициализирует объект I2C:

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

Затем эти две линии создают акселерометр и включают функцию обнаружения касаний (для чтения кубиков).

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

accelerometer.enable_tap_detection()

Время выполнения кода

Чтобы запустить код, нажмите кнопку Run в Thonny - это кнопка с иконкой воспроизведения в зеленой кнопке на верхней панели инструментов.

Затем подключитесь к IP-адресу вашего Raspberry Pi Pico W. Если у вас открыта оболочка Thonny, вы можете посмотреть его там. Или же вы можете войти в свой маршрутизатор и узнать IP-адрес Pico W.

Pico W запускает HTTP-сервер с сокетным соединением и прослушивает соединения, определенные здесь:

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

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

Когда вы подключитесь к IP-адресу вашего Pico W, он запустит этот код, который будет обновлять index.html с последними данными каждую секунду.

   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 заменяет значения текущими показаниями при подключении к серверу Pico W.

Как вы можете видеть, он заменяет AccX, AccY и AccZ данными с вашего датчика.

Если по датчику постучали, то он выведет случайное целое число от 1 до 6 в строку "DiceVal" на HTML-странице.

Что дальше?

В этом руководстве представлен один из простых способов передачи данных с датчиков на веб-страницу с помощью Raspberry Pi Pico W.

Фактически, это код, который можно использовать и для других датчиков.

Методология остается прежней. Вам нужно найти правильные библиотеки для ваших датчиков, затем изменить main.py и index.html так, чтобы они могли получать данные датчиков и передавать правильные значения на веб-страницу.

Существует множество других проектов, например, датчик температуры и влажности воздуха или проект по качеству воздуха с использованием DHT22 или BME688, или датчик яркости со световым резистором.

7 комментариев

  1. Ken Anderson Июль 15, 2022 в 7:24 дп

    Конечно, было бы неплохо использовать возможности HTML5, чтобы мы могли увидеть, как работает HTML5

  2. Terry Young Сентябрь 24, 2022 в 6:47 пп

    Могут ли данные просто передаваться в виде строки через порт TCP/UDP, а не в формате веб-страницы, чтобы их мог прочитать другой компьютер (для создания датчиков или чего-то подобного?).
    что-то вроде
    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 Январь 10, 2023 в 9:11 пп

    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?
    В данном примере это выглядит так, что Pico W может быть очень сильно изменен, если он будет отображаться на HTML. В моем случае это было так: 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.
    Как это можно сделать?

    Всего доброго и хорошего
    Инго

    • raspi berry Февраль 4, 2023 в 11:51 дп

      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?

      Если это коммерческий проект, мы можем стать активными консультантами-техниками 🙂 .

  4. Luis Январь 11, 2023 в 3:30 пп

    cómo puedo mandar esos dataos a thinspeak

  5. Eddi Baars Март 18, 2023 в 1:02 пп

    Добрый день, у меня такая проблема. 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 Июль 19, 2023 в 10:31 пп

    нет модуля с именем network, если добавить модуль netwrk из thonny, то он жалуется на отсутствие модуля с именем socket lol

Комментировать