Съдържание:
- Стъпка 1: Монтиране на AP с Wrover
- Стъпка 2: Сглобяване на СТАНЦИЯ С TTGO
- Стъпка 3: РЕЗУЛТАТ
- Стъпка 4: Архивирайте LOG.CSV
- Стъпка 5: Библиотека Adafruit GFX
- Стъпка 6: Библиотека Adafruit ST7735
- Стъпка 7: Конфигуриране на картите
- Стъпка 8: AP.ino
- Стъпка 9: Station.ino
- Стъпка 10: Файлове
Видео: ESP32 с външна антена за дълги разстояния: 10 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:52
Днешната тема засяга дистанционен тест с ESP32 с външна антена. Нека днес използваме два модула: от Espressif и TTGO. Нека след това проверим RSSI между тези две антени ESP32, да генерираме графика от историята и да напишем дневник на стойностите във.csv файл.
След това имаме ESP32 Wrover като AP и ESP32 на TTGO като Station. Използвах антена, която взех от малко по-голям TP-Link и друг рутер, известен като 9dbm антена. Не забелязах никаква разлика между двете.
И накрая, двата микроконтролера се свързват чрез гнездо и при всяко изпращане на пакети данни отпечатваме на дисплея графика с лентите, които показват съотношението на dbm.
Стъпка 1: Монтиране на AP с Wrover
Стъпка 2: Сглобяване на СТАНЦИЯ С TTGO
Стъпка 3: РЕЗУЛТАТ
Максимално разстояние с 2x външни антени: 315 метра
Максимално разстояние с външна и вътрешна антена: 157 метра
Стъпка 4: Архивирайте LOG. CSV
Записах данните на SD карта с данни в милис, dbm и низ на пакета.
Стъпка 5: Библиотека Adafruit GFX
В IDE на Arduino отидете на Sketch-> Include Library-> Manage Libraries …
Инсталирайте библиотеката Adafruit GFX
Стъпка 6: Библиотека Adafruit ST7735
В IDE на Arduino отидете на Sketch-> Include Library-> Manage Libraries …
Инсталирайте Adafruit ST7735
Стъпка 7: Конфигуриране на картите
Очаквайте разлики:
Стъпка 8: AP.ino
Включихме необходимите библиотеки и дефинирахме някои параметри.
#include #include #include #include #include #include // Rede que o ESP criará. No Station deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" // Времето за изчакване за разглеждане на conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Конфигурация 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_PATH "/log."
Определяме щифтовете, наред с други променливи
// Pinos do display #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 съответно) #define SDCARD_CS 15 // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um сървър (qualquer porta válida обслужва contanto que или cliente използва mesma porta) WiFiServer сървър (80); // Variável para armazenar или cliente (няма caso o ESP32 em modo station) conectado WiFiClient клиент; // String que recebemos do cliente Получен низ; // RSSI eviado pelo cliente para este ESP32 long rssi = 0; // Faz o controle do temporizador (прекъсване на темпото) hw_timer_t *timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;
Настройвам
void setup () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria a rede WiFi, инициализация на сървъра и espera или клиентска връзка 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 um Access Point и конфигурация за IPvoid setupWiFi () {display.println ("Създаване на softAP" + низ (SSID)); WiFi.disconnect (); WiFi.mode (WIFI_AP); WiFi.softAPConfig (IPAddress (192, 168, 0, 1), IPAddress (192, 168, 0, 1), IPAddress (255, 255, 255, 0)); WiFi.softAP (SSID, ПАРОЛ); display.println ("softAP" + String (SSID) + "създаден!"); }
Дисплей за настройка
// Инсталиране на дисплея, ориентация и ограничаване на избягване на настройкаDisplay () {// Включване на дисплея display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (3); // Pinta a tela de preto display.fillScreen (ST77XX_BLACK); }
waitForClient
void waitForClient () {display.println ("Изчакване на клиент"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); забавяне (500); } display.println ("Клиентът е свързан"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que a conexão foi perdida client.setTimeout (TIMEOUT); }
IRAM_ATTR нулиране на модул и setupWatchdog
// função que o temporizador irá chamar, para reiniciar or ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // таймер, темпо (us), repetição timerAlarmWrite (таймер, 10000000, вярно); timerAlarmEnable (таймер); // habilita a interrupção}
Цикъл
void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o cliente readFromClient (); // lê os dados do cliente sendToClient (); // envia confirmmação para o cliente plot (); // mostra o gráfico de histórico de rssi log (); // salva um log no cartão SD}
checkConnection
void checkConnection () {// Se o cliente não estiver conectado if (! client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println ("Клиентът е изключен"); waitForClient (); }}
readFromClient
void readFromClient () {// Espera até o cliente enviar algo ou desconectar while (client.connected () &&! client.available ()) {delay (100); } // Se chegou aqui e ainda estiver conectado é porque possui algo para receber do cliente if (client.connected ()) {получен = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou received.remove (получен.length ()-1); // Премахване на o / n do final rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Преместване на курсора до текстово съобщение или до показване на display.println ("RSSI:" + String (rssi)); // Mostra o RSSI няма дисплей display.println ("Получено:" + получено); // Mostra a mensagem recebida do cliente // Se a quantidade de barras do gráfico passou do limite apagamos o registerro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory.begin ()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }}
sendToClient
void sendToClient () {// Виждате, че клиентите винаги се свързват с волтаж на обмен на съобщения OK OK, ако (client.connected ()) {Изпращане на низ = получено + "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 () {// Limpa a área com o texto за mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } void log () {// Abrimos o arquivo para escrevermos no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Failed to open file"); връщане; } // Gravamos uma linha com o tempo desde o boot, o rssi 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 que за конфигуриране без настройка за AP #define PORT 80 // Porta do sever. Qualquer porta válida contanto que seja igual nos dois arquivos // Tempo de timeout para Regardrar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de corho margem #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 калкулатор Низ получен; // Mensagem de confirmmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Използвайте para conexão com или сървър WiFiClient гнездо; #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 съответно) #define SDCARD_CS 15 // Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_CLK, hw_timer_t *timer = NULL; // faz o controle do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;
Настройвам
void setup () {setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta няма точка за достъп criado pelo outro ESP32 e conecta ao server setupWiFi (); connectToServer (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
setupDisplay
// Инсталиране на дисплея, ориентация и ограничаване на избягване на настройкаDisplay () {// Включване на дисплея display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (1); // Pinta a tela de branco display.fillScreen (ST77XX_BLACK); display.setTextColor (ST77XX_WHITE); }
setupWiFi
// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.begin (SSID, PASSWORD); display.println ("Свързване към" + низ (SSID)); // Enquanto não estiver conectado à rede WiFi докато (WiFi.status ()! = WL_CONNECTED) {забавяне (500); display.print ("."); } display.println (""); display.print ("Свързан с"); display.println (SSID); }
connectToServer
void connectToServer () {display.println ("Опитва се връзка с гнездо"); // Espera a conexão com o сървър while (! Socket.connect (HOST, PORT)) {display.print ("."); забавяне (500); } display.println (); display.println ("Свързан!"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que a conexão foi perdida socket.setTimeout (TIMEOUT); }
IRAM_ATTR нулиране на модул и setupWatchdog
// função que o temporizador irá chamar, para reiniciar or ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // таймер, темпо (us), repetição timerAlarmWrite (таймер, 10000000, вярно); timerAlarmEnable (таймер); // habilita a interrupção}
цикъл
void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o проверка на сървъраRSSI (); // verifica o rssi plot (); // mostra o gráfico de histórico de rssi sendToServer (); // envia uma mensagem com um contador за сървър readFromServer (); // espera a confirmmação do log log (); // salva um log no cartão SD забавяне (1000); // espera um segundo}
checkConnection
void checkConnection () {// Проверка на съвместна връзка с AP, ако (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("WiFi е изключен"); setupWiFi (); забавяне (1000); } // проверява conexão do socket 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 (); // Limpa o texto e mostra или RSSI без дисплей clearText (); display.setCursor (0, 0); display.print ("RSSI:" + String (rssi)); // Se quantidade de barras do gráfico passou do limite apagamos o registerro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory.begin ()); } // Adiciona no final do histórico (mais recente) 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, mostra no display e incrementa o contador String send = "Hello" + String (count); display.setCursor (0, 10); display.println ("Изпращане:" + изпращане); socket.println (изпращане); socket.print (String (rssi)); брой ++; }}
readFromServer
void readFromServer () {// Espera até на сървъра за алго или desconectar while (socket.connected () &&! socket.available ()) {delay (100); } // Se tem algo para Receber if (socket.available ()) {// Faz a leitura, remove o / n do final e mostra no display display = socket.readStringUntil ('\ n'); Получено.отстраняване (получено.дължина ()-1); display.println ("Получено:" + получено); }}
clearText и регистрация
void clearText () {// Limpa a área com o texto за mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } void log () {// Abrimos o arquivo para escrevermos no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Failed to open file"); връщане; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Низ (rssi) + ";" + получено; file.println (данни); file.close (); }
Стъпка 10: Файлове
Изтеглете файловете:
АЗ НЕ
Препоръчано:
Първи стъпки с безжични сензори за температура и вибрации на дълги разстояния: 7 стъпки
Първи стъпки с безжични сензори за температура и вибрации на дълги разстояния: Понякога вибрациите са причина за сериозни проблеми в много приложения. От валове и лагери на машината до работа на твърдия диск, вибрациите причиняват повреда на машината, ранна подмяна, ниска производителност и нанасят сериозен удар върху точността. Мониторинг
Най -добри светлини за приятели на дълги разстояния: 4 стъпки (със снимки)
Направи си сам светлини за най -добри приятели: Направих синхронизирани светлини за дълги разстояния, известни като " Най -добър приятел " лампи. Това просто означава, че те се поддържат в синхрон с текущия цвят на другата лампа. Така че, ако трябва да смените една лампа в зелено, малко след това другата лампа ще светне зелено
IoT- Ubidots- ESP32+Сензор за безжична връзка с дълги разстояния и вибрации и температура: 7 стъпки
IoT-Ubidots- ESP32+Сензор за безжична връзка с дълги разстояния и вибрации и температура: Вибрацията е наистина движение напред-назад-или трептене-на машини и компоненти в моторизирани джаджи. Вибрациите в промишлената система могат да бъдат симптом или мотив на караница или могат да бъдат свързани с ежедневна работа. Например, osci
Схема на система за предаване на дълги разстояния: 6 стъпки
Схема на система за пренос на дълги разстояния: Днес в тази статия ще говорим за това как да направите основна схема за система за пренос на дълги разстояния. В този смисъл, нека ви дам кратко описание на веригата. Как най -общо това функционира и как ви говоря с нещата
Node-RED с IoT датчик за вибрации за дълги разстояния и температура: 34 стъпки
Node-RED с IoT датчик за вибрации и температура на дълги разстояния: Представяме безжичния сензор за влажност на температурата на NCD на далечни разстояния, който може да се похвали с обхват до 28 мили, използвайки мрежова архитектура с безжична мрежа. Включването на температурния сензор за влажност на Honeywell HIH9130 предава високо точна температура и