Оглавление:

ESP32 с внешней антенной для дальней связи: 10 шагов
ESP32 с внешней антенной для дальней связи: 10 шагов

Видео: ESP32 с внешней антенной для дальней связи: 10 шагов

Видео: ESP32 с внешней антенной для дальней связи: 10 шагов
Видео: Радиомодули EBYTE E22 LoRa 433мГц, обзор и тест дальности 2024, Ноябрь
Anonim
Image
Image
Монтаж точки доступа с помощью Wrover
Монтаж точки доступа с помощью Wrover

Сегодняшняя тема касается теста на расстояние с ESP32 с внешней антенной. Воспользуемся сегодня двумя модулями: от Espressif и TTGO. Затем давайте проверим RSSI между этими двумя антеннами ESP32, сгенерируем график из истории и запишем журнал значений в файл.csv.

Затем у нас есть ESP32 Wrover в качестве AP и ESP32 TTGO в качестве станции. Я использовал антенну, которую взял от TP-Link немного большего размера, и другой маршрутизатор, известный как антенна 9 дБм. Я не заметил никакой разницы между ними.

Наконец, два микроконтроллера подключаются через сокет, и при каждой отправке пакетов данных мы печатаем на дисплее график с полосами, указывающими соотношение dbm.

Шаг 1. Установка точки доступа с помощью Wrover

Шаг 2: Сборка СТАНЦИИ с TTGO

Сборка СТАНЦИИ с ТТГО
Сборка СТАНЦИИ с ТТГО

Шаг 3: РЕЗУЛЬТАТ

РЕЗУЛЬТАТ
РЕЗУЛЬТАТ
РЕЗУЛЬТАТ
РЕЗУЛЬТАТ
РЕЗУЛЬТАТ
РЕЗУЛЬТАТ

Максимальное расстояние с 2х внешними антеннами: 315 метров

Максимальное расстояние с внешней и внутренней антенной: 157 метров

Шаг 4. Заархивируйте LOG. CSV

Архив LOG. CSV
Архив LOG. CSV
Архив LOG. CSV
Архив LOG. CSV

Я записал данные на SD-карту с данными в миллисекундах, дБм и строкой пакета.

Шаг 5: библиотека Adafruit GFX

Библиотека Adafruit GFX
Библиотека Adafruit GFX

В среде Arduino IDE перейдите в Sketch-> Include Library-> Manage Libraries…

Установить библиотеку Adafruit GFX

Шаг 6: библиотека Adafruit ST7735

Библиотека Adafruit ST7735
Библиотека Adafruit ST7735

В среде Arduino IDE перейдите в Sketch-> Include Library-> Manage Libraries…

Установите Adafruit ST7735

Шаг 7: Настройка карт

Настройка карт
Настройка карт
Настройка карт
Настройка карт

Следите за новостями:

Шаг 8: AP.ino

Мы включили необходимые библиотеки и определили некоторые параметры.

#include #include #include #include #include #include // Перезапустить запрос ESP. No Station deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" // Тайм-аут для определения времени ожидания #define TIMEOUT 2000 // Отображение и изменение параметров #define DISPLAY_WIDTH 160 #define DISPLAY_çEIGHT 128 // Config. cor, margem e tamanho do gráfico #define PLOT_COLOR ST77XX_GREEN #define PLOT_MARGIN 20 #define PLOT_SIZE (DISPLAY_HEIGHT - 2 * PLOT_MARGIN) // Arquivo de log no SD #define FILE_PvATH "/log.

Мы определяем контакты, среди других переменных

// Pinos отображает # define DISPLAY_DC 12 // A0 #define DISPLAY_CS 13 // CS #define DISPLAY_MOSI 14 // SDA #define DISPLAY_CLK 27 // SCK #define DISPLAY_RST 0 // Pino do SDCard. Os pinos mosi, miso e sck são os nativos (23, 19 и 18 соответственно) #define SDCARD_CS 15 // Пиксель графического изображения по горизонтали int currentX = PLOT_MARGIN; // Задайте ответ на экран дисплея Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um server (квалификационный порт может служить для того, чтобы клиент использовал порт обмена сообщениями) WiFiServer server (80); // Вариант для вооружения или клиента (без использования ESP32 и модной станции) conectado WiFiClient client; // String que Recebemos do cliente Строка получена; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Фаз или контроль над темпом (прерывание по темпу) hw_timer_t * timer = NULL; // Использование для защиты от ультиматумов std:: vector rssiHistory;

Настраивать

void setup () {Serial.begin (115200); setupDisplay (); // Инициализация SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Создание нового Wi-Fi, инициализация сервера и клиентского подключения setupWiFi (); server.begin (); waitForClient (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }

Настроить WiFi

// Точка доступа Cria и конфигурация IPvoid setupWiFi () {display.println ("Создание softAP" + String (SSID)); WiFi.disconnect (); WiFi.mode (WIFI_AP); WiFi.softAPConfig (IP-адрес (192, 168, 0, 1), IP-адрес (192, 168, 0, 1), IP-адрес (255, 255, 255, 0)); WiFi.softAP (SSID, ПАРОЛЬ); display.println («softAP» + строка (SSID) + «created!»); }

Дисплей настройки

// Начинаем отображение, выбираем ориентацию и ограничиваем телавид setupDisplay () {// Начинаем отображение display.initR (INITR_BLACKTAB); // Вращение или управление большинством display.setRotation (3); // Добавить изображение к экрану display.fillScreen (ST77XX_BLACK); }

waitForClient

void waitForClient () {display.println («Ожидание клиента»); // Обращение к клиенту с клиентом while (! (Client = server.available ())) {display.print ("."); задержка (500); } display.println («Клиент подключен»); // Максимальное время, когда клиент разрабатывает демонстрацию для респондента // Предложения, которые нужно выполнить, чтобы подключиться к клиенту.setTimeout (TIMEOUT); }

IRAM_ATTR resetModule и setupWatchdog

// função que o temporizador irá chamar, para reiciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // восстановление чипа} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // таймер, обратный вызов, прерывание вызова timerAttachInterrupt (timer, & resetModule, true); // таймер, темп (нас), повторение timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (таймер); // habilita a interrupção}

Петля

void loop () {timerWrite (таймер, 0); // сбросить временный таймер (питание сторожевого таймера) checkConnection (); // проверка возможности соединения с клиентом readFromClient (); // если клиенты делают клиент sendToClient (); // envia confirmmação para o cliente plot (); // история графического образа rssi log (); // Salva um log no cartão SD}

Проверьте подключение

void checkConnection () {// Если клиент не может подключиться к сети if (! client.connected ()) {// Устанавливать связь с клиентом display.fillScreen (ST77XX_BLACK); display.println («Клиент отключен»); waitForClient (); }}

readFromClient

void readFromClient () {// Используйте алгоритм клиента enviar или desconectar while (client.connected () &&! client.available ()) {delay (100); } // Если вы хотите узнать, как получить результат, это может быть алгоритм для получателя if (client.connected ()) {Received = client.readStringUntil ('\ n'); // Текстовое сообщение, полученное клиентом enviou. // Удаляем o / n do final rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Ограничить текст display.setCursor (0, 0); // Переместите курсор, чтобы перейти к тексту, чтобы перейти к отображению display.println ("RSSI:" + String (rssi)); // Большинство сообщений о RSSI no display display.println ("Получено:" + получено); // Большинство сообщений для клиентов // Se a quantidade de barras do gráfico passou do limit apagamos o registro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2 * PLOT_MARGIN) / 2) {rssiHistory.erase (rssiHistory.erase (rssiHistory.erase (rssiHistory.erase).начинать()); } // Окончательный вариант истории (последний раз) rssiHistory.push_back (rssi); }}

sendToClient

void sendToClient () {// Если клиент устанавливает соединение с сетью обмена сообщениями, OK if (client.connected ()) {String sent = Received + "OK"; client.println (отправка); }}

участок

void plot () {// Coloca no ponto inicial e limpamos o gráfico currentX = PLOT_MARGIN; display.fillRect (PLOT_MARGIN, 2 * PLOT_MARGIN, DISPLAY_WIDTH - 2 * PLOT_MARGIN, DISPLAY_HEIGHT - 2 * PLOT_MARGIN, ST77XX_BLACK); // Para cada valor do histórico fazemos o cálculo do tamanho da barra do gráfico, desenhamos e avançamos para o próximo for (int i = 0; i -120? Map (rssiHistory , -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine (currentX, DISPLAY_HEIGHT - значение, значение, PLOT_COLOR); currentX + = 2;}}

clearText и журнал

void clearText () {// Ограничить область сообщения или сообщения для клиента display.fillRect (0, 0, DISPLAY_WIDTH, 2 * PLOT_MARGIN, ST77XX_BLACK); } void log () {// Нет окончательного удаления File file = SD.open (FILE_PATH, FILE_APPEND); // Не удалось сохранить сообщение об ошибке if (! File) {Serial.println ("Не удалось открыть файл"); возвращение; } // Gravamos uma linha com o tempo desde o boot, orssi atual e a mensagem Recebida String data = String (millis ()) + ";"; + Строка (rssi) + ";" + получил; file.println (данные); file.close (); }

Шаг 9: Station.ino

Мы включили необходимые библиотеки и определили некоторые параметры.

#include #include #include #include #include #include // Nome da rede que nos conectaremos. Criado pelo AP #define SSID "RSSI_Test" #define PASSWORD "87654321" #define HOST "192.168.0.1" // IP, который не конфигурируется для AP #define PORT 80 // Порт для сервера. Qualquer porta válida contanto que seja igual nos dois arquivos // Tempo de timeout для рассмотрения conexão pedida #define TIMEOUT 2000 // Отображение и высота отображения #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Конфигурация решетки и границы, #define PLOT_COLOR ST77XX_GREEN #define PLOT_MARGIN 20 #define PLOT_SIZE (DISPLAY_HEIGHT - 2 * PLOT_MARGIN) // Arquivo de log no SD #define FILE_PATH "/log.csv"

Мы определяем настройки, которые связаны с дисплеем и SD-картой.

длинный счет = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI Calculado Строка получена; // Подтверждение значений AP nos envia // Pixel onde or gáfico começa horizontalmente int currentX = PLOT_MARGIN; // Использование для подключения к серверу WiFiClient socket; #define DISPLAY_DC 12 // A0 #define DISPLAY_CS 13 // CS #define DISPLAY_MOSI 14 // SDA #define DISPLAY_CLK 27 // SCK #define DISPLAY_RST 0 // Pino do SDCard. Os pinos mosi, miso e sck são os nativos (23, 19 e 18 respectivamente) #define SDCARD_CS 15 // Objeto Response Pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLAY_CLAY_CLAY_CL); hw_timer_t * timer = NULL; // faz o control do temporizador (interrupção por tempo) // Использование для защиты от ультимативных действий std:: vector rssiHistory;

Настраивать

void setup () {setupDisplay (); // Инициализация SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Не подключать точку доступа, чтобы удалить ESP32 и подключиться к серверу setupWiFi (); connectToServer (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }

setupDisplay

// Начинаем отображение, выбираем ориентацию и ограничиваем телавид setupDisplay () {// Начинаем отображение display.initR (INITR_BLACKTAB); // Вращение или управление большинством display.setRotation (1); // Сделать телеграмму display.fillScreen (ST77XX_BLACK); display.setTextColor (ST77XX_WHITE); }

настройкаWiFi

// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.begin (SSID, ПАРОЛЬ); display.println («Подключение к» + строка (SSID)); // Нет необходимости подключать Wi-Fi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print («Подключено к»); display.println (SSID); }

connectToServer

void connectToServer () {display.println ("Попытка подключения к сокету"); // Используйте сервер conexão com o while (! Socket.connect (HOST, PORT)) {display.print ("."); задержка (500); } display.println (); display.println («Подключено!»); // Максимальное время, когда клиент разрабатывает демонстрацию для респондента // аннулирует работу, которая соединяется с сокетом.setTimeout (TIMEOUT); }

IRAM_ATTR resetModule и setupWatchdog

// função que o temporizador irá chamar, para reiciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // восстановление чипа} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // таймер, обратный вызов, прерывание вызова timerAttachInterrupt (timer, & resetModule, true); // таймер, темп (нас), повторение timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (таймер); // habilita a interrupção}

петля

void loop () {timerWrite (таймер, 0); // сбросить временный таймер (питание сторожевого таймера) checkConnection (); // проверка возможности подключения к серверу checkRSSI (); // проверка или построение графика (); // основной графический файл rssi sendToServer (); // envia uma mensagem com um contador para o server readFromServer (); // Подтверждение выполнения журнала сервера (); // сохранить журнал без карты SD delay (1000); // espera um segundo}

Проверьте подключение

void checkConnection () {// Проверка соединения с AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println («WiFi отключен»); setupWiFi (); задержка (1000); } // проверка соединения с сокетом if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println («Сокет отключен»); connectToServer (); задержка (3000); display.fillScreen (ST77XX_BLACK); }}

checkRSSI

void checkRSSI () {// Проверка RSSI rssi = WiFi. RSSI (); // Ограничение текста и сообщения RSSI no display clearText (); display.setCursor (0, 0); display.print ("RSSI:" + строка (rssi)); // Задайте количественное значение для графического прохода, чтобы ограничить доступ к записи или зарегистрировать антиго if (rssiHistory.size () == (DISPLAY_WIDTH - 2 * PLOT_MARGIN) / 2) {rssiHistory.erase (rssiHistory.begin ()); } // Окончательный вариант истории (последний раз) rssiHistory.push_back (rssi); }

участок

void plot () {// Coloca no ponto inicial e limpamos o gráfico currentX = PLOT_MARGIN; display.fillRect (PLOT_MARGIN, 2 * PLOT_MARGIN, DISPLAY_WIDTH - 2 * PLOT_MARGIN, DISPLAY_HEIGHT - 2 * PLOT_MARGIN, ST77XX_BLACK); // Para cada valor do histórico fazemos o cálculo do tamanho da barra do gráfico, desenhamos e avançamos para o próximo for (int i = 0; i -120? Map (rssiHistory , -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine (currentX, DISPLAY_HEIGHT - значение, значение, PLOT_COLOR); currentX + = 2;}}

sendToServer

void sendToServer () {// Установить соединение с другим сервером if (socket.connected ()) {// Envia um hello com um contador, больше нет отображения и инкремента или contador String send = "Hello" + String (count); display.setCursor (0, 10); display.println ("Отправка:" + отправка); socket.println (отправка); socket.print (строка (rssi)); count ++; }}

readFromServer

void readFromServer () {// Используйте алгоритм или удаление сервера, а (socket.connected () &&! socket.available ()) {delay (100); } // Алгоритм набора для получателя if (socket.available ()) {// Выбрать название, удалить или / n сделать окончательный вывод, не получено отображение = socket.readStringUntil ('\ n'); Received.remove (Received.length () - 1); display.println ("Получено:" + получено); }}

clearText и журнал

void clearText () {// Ограничить область сообщения или сообщения для клиента display.fillRect (0, 0, DISPLAY_WIDTH, 2 * PLOT_MARGIN, ST77XX_BLACK); } void log () {// Без окончательного удаления File file = SD.open (FILE_PATH, FILE_APPEND); // Не удалось сохранить сообщение об ошибке if (! File) {Serial.println ("Не удалось открыть файл"); возвращение; } // Gravamos uma linha com o tempo desde o boot, orssi atual e a mensagem Recebida String data = String (millis ()) + ";"; + Строка (rssi) + ";" + получил; file.println (данные); file.close (); }

Шаг 10: файлы

Загрузите файлы:

PDF

Я НЕТ

Рекомендуемые: