Базовая станция (упрощённая) ============================ «Базовая станция» — это пара скетчей, которая показывает работу радиоканала на максимально простом сценарии: - **Кубсат (Nano)** читает BME280 + CCS811 + MPU9250 и раз в секунду отправляет 25-байтный пакет по nRF24L01+; - **Наземная станция (ESP32)** ловит пакеты и поднимает свою WiFi-точку, к которой можно подключиться телефоном и смотреть телеметрию в браузере. Это «промежуточный шаг» между тестом радиоканала из :doc:`coding-radio` и полной миссией из :doc:`coding-full-mission`. Здесь: - **нет GPS, SD-карты, LED-ленты и зуммера** — ничто не отвлекает от радиоканала и сенсоров; - ESP32 поднимает **свою** WiFi-сеть (``tenderboy-base``) — не нужен существующий роутер или интернет, годится для класса/полевого выезда; - все данные доступны в виде JSON по простому API, удобно для скриптов на ноутбуке. Когда использовать этот сценарий -------------------------------- - Демонстрация на занятии/мероприятии, где нет известной WiFi-сети. - Отладка — проще, чем ``main_full``, потому что меньше движущихся частей. - Введение в идею «запросить данные у спутника по сети», прежде чем подключать GPS-логику. Параметры радио те же, что в :doc:`coding-radio` — канал ``76``, pipe ``TBOY1``, 250 kbps, AutoAck выкл. Размер пакета здесь — **25 байт** (``sizeof(Telemetry)``), не путать с тестовыми 8 байтами и ``main_full``-ными 32 байтами. Передатчик: Arduino Nano (на кубсате) ------------------------------------- .. literalinclude:: ../../../examples/cubesat_base_station/cubesat_nano_tx/cubesat_nano_tx.ino :language: cpp :caption: examples/cubesat_base_station/cubesat_nano_tx/cubesat_nano_tx.ino Что делает: - инициализирует BME280, CCS811, MPU9250 (с выставленным флагом ``flags`` в пакете — какие модули на самом деле ответили); - читает значения раз в секунду, отправляет 25-байтный ``Telemetry``-пакет; - в Serial Monitor **ничего не пишет** — пара написана так, что в отладке по проводу нет необходимости. Если модуль не отвечает, это видно по соответствующему биту ``flags`` на стороне ESP32. Поля пакета: .. list-table:: :header-rows: 1 :widths: 25 15 60 * - Поле - Размер - Содержимое * - ``ms`` - 4 Б - ``millis()`` Nano-передатчика * - ``temp_c10`` - 2 Б - температура × 10 (°C) * - ``press_hpa10`` - 2 Б - давление × 10 (гПа) * - ``hum_x2`` - 1 Б - влажность × 2 (%) * - ``eco2_ppm`` - 2 Б - расчётный CO₂ (ppm) * - ``tvoc_ppb`` - 2 Б - летучие органические (ppb) * - ``ax,ay,az`` - 6 Б - сырые значения акселерометра * - ``gx,gy,gz`` - 6 Б - сырые значения гироскопа * - ``flags`` - 1 Б - bit0=BME, bit1=CCS, bit2=MPU Приёмник: ESP32 + WiFi AP + Web ------------------------------- .. literalinclude:: ../../../examples/cubesat_base_station/base_station_esp32_web/base_station_esp32_web.ino :language: cpp :caption: examples/cubesat_base_station/base_station_esp32_web/base_station_esp32_web.ino Что делает: - поднимает WiFi-точку доступа ``tenderboy-base`` с паролем ``12345678``; - стартует HTTP-сервер на порту ``80``; - ловит пакеты с Nano и хранит последний; - отдаёт ``GET /api`` — JSON с последней телеметрией; - ``GET /`` — простая HTML-страница, которая раз в секунду опрашивает ``/api`` и обновляет вывод. Распиновка ESP32 — другая, чем у Nano: ``CE=GPIO2``, ``CSN=GPIO4``, VSPI ``18/19/23``. Это связано с разводкой ESP32 DevKit и конкретно для этого сценария — в кубсате-передатчике пины Nano-овые. Как запустить весь сценарий --------------------------- 1. Залейте ``cubesat_nano_tx.ino`` на Nano кубсата. В Serial Monitor (115200) — тишина (так и задумано), но Nano уже передаёт пакеты. 2. Залейте ``base_station_esp32_web.ino`` на отдельную плату ESP32 (Wemos / NodeMCU-ESP32 / DevKit C). В Serial Monitor (115200) ESP32 напишет:: AP IP: 192.168.4.1 nRF24 RX ready Web server ready 3. На телефоне/ноутбуке выберите WiFi-сеть ``tenderboy-base``, пароль ``12345678``. 4. В браузере откройте `http://192.168.4.1/ `_. 5. Через секунду в окне ``waiting...`` появится JSON примерно такой:: { "rx_count": 12, "last_rx_ms_ago": 480, "has_packet": true, "bme_ok": true, "ccs_ok": true, "mpu_ok": true, "temp_c": 23.4, "press_hpa": 1013.2, "hum_pct": 38.5, "eco2_ppm": 412, "tvoc_ppb": 8, "ax": -110, "ay": 80, "az": 16380, "gx": 12, "gy": -5, "gz": 3 } Что должны видеть студенты -------------------------- - ``rx_count`` растёт — пакеты приходят. - ``last_rx_ms_ago`` колеблется около ``1000 ± 200`` — стандартный ритм передачи. - ``bme_ok``/``ccs_ok``/``mpu_ok`` — ``true`` для всего, что реально ответило при инициализации. - При покачивании кубсата ``ax``/``ay``/``az`` заметно прыгают. Если ``has_packet=false`` и ``rx_count=0`` ------------------------------------------ - Nano не отправляет (см. :doc:`coding-radio` — диагностика TX); - сторона ESP32 не приняла: - неправильно подключён nRF к ESP32 (CE/CSN перепутаны); - Wi-Fi-точка ESP32 поднялась, но nRF не инициализировался — в Serial Monitor должно быть ``nRF24 begin FAILED``. Если JSON приходит, но все поля по нулям ---------------------------------------- - На стороне Nano не сработали инициализации сенсоров — флаги в пакете нулевые. Сначала прогоните :doc:`coding-i2c-check` и модульные тесты сенсоров.