สารบัญ:

ESP32 พร้อมเสาอากาศระยะไกลภายนอก: 10 ขั้นตอน
ESP32 พร้อมเสาอากาศระยะไกลภายนอก: 10 ขั้นตอน

วีดีโอ: ESP32 พร้อมเสาอากาศระยะไกลภายนอก: 10 ขั้นตอน

วีดีโอ: ESP32 พร้อมเสาอากาศระยะไกลภายนอก: 10 ขั้นตอน
วีดีโอ: วิธีแก้ไขสัญญาณทีวีไม่ดี แนะนำเสาอากาศทีวีดิจิตอล 30e รับสัญญาณได้ไกล 100 กิโลเมตร #ทีวี #เสาอากาศ 2024, กรกฎาคม
Anonim
Image
Image
การติดตั้ง AP ด้วย Wrover
การติดตั้ง AP ด้วย Wrover

หัวข้อของวันนี้เกี่ยวกับการทดสอบระยะทางด้วย ESP32 พร้อมเสาอากาศภายนอก ลองใช้สองโมดูลวันนี้: จาก Espressif และ TTGO จากนั้น มาตรวจสอบ RSSI ระหว่างเสาอากาศ ESP32 ทั้งสองนี้ สร้างกราฟจากประวัติ และเขียนบันทึกของค่าในไฟล์.csv

จากนั้นเราก็มี ESP32 Wrover เป็น AP และ ESP32 ของ TTGO เป็นสถานี ฉันใช้เสาอากาศที่เอามาจาก TP-Link ที่ใหญ่กว่าเล็กน้อยและเราเตอร์อีกตัวที่เรียกว่าเสาอากาศ 9dbm ฉันไม่ได้สังเกตเห็นความแตกต่างระหว่างคนทั้งสอง

สุดท้าย ไมโครคอนโทรลเลอร์สองตัวเชื่อมต่อผ่านซ็อกเก็ต และด้วยการส่งแพ็กเก็ตข้อมูลแต่ละครั้ง เราพิมพ์กราฟที่มีแถบแสดงอัตราส่วนของ dbm บนจอแสดงผล

ขั้นตอนที่ 1: ติดตั้ง AP ด้วย Wrover

ขั้นตอนที่ 2: การประกอบ STATION ด้วย TTGO

การประกอบสถานีกับ TTGO
การประกอบสถานีกับ TTGO

ขั้นตอนที่ 3: ผลลัพธ์

ผลลัพธ์
ผลลัพธ์
ผลลัพธ์
ผลลัพธ์
ผลลัพธ์
ผลลัพธ์

ระยะทางสูงสุดด้วยเสาอากาศภายนอก 2x: 315 เมตร

ระยะห่างสูงสุดกับเสาอากาศภายนอกและภายใน: 157 เมตร

ขั้นตอนที่ 4: เก็บถาวร LOG. CSV

เก็บถาวร LOG. CSV
เก็บถาวร LOG. CSV
เก็บถาวร LOG. CSV
เก็บถาวร LOG. CSV

ฉันบันทึกข้อมูลลงในการ์ด SD โดยมีข้อมูลเป็นมิลลิวินาที dbm และสตริงแพ็กเกจ

ขั้นตอนที่ 5: ไลบรารี Adafruit GFX

ห้องสมุด Adafruit GFX
ห้องสมุด Adafruit GFX

ใน Arduino IDE ให้ไปที่ Sketch-> Include Library-> Manage Libraries…

ติดตั้ง Adafruit GFX Library

ขั้นตอนที่ 6: ห้องสมุด Adafruit ST7735

ห้องสมุดอดาฟรุต ST7735
ห้องสมุดอดาฟรุต ST7735

ใน Arduino IDE ให้ไปที่ Sketch-> Include Library-> Manage Libraries…

ติดตั้ง Adafruit ST7735

ขั้นตอนที่ 7: การกำหนดค่าการ์ด

การกำหนดค่าการ์ด
การกำหนดค่าการ์ด
การกำหนดค่าการ์ด
การกำหนดค่าการ์ด

คอยติดตามความแตกต่าง:

ขั้นตอนที่ 8: AP.ino

เราได้รวมไลบรารีที่จำเป็นและกำหนดพารามิเตอร์บางอย่าง

#รวม #รวม #รวม #รวม #รวม #รวม // Rede que o ESP criará ไม่มีสถานีที่ใช้สร้าง #define SSID "RSSI_Test" #define PASSWORD "87654321" //Tempo de timeout paraพิจารณา a conexão pedida #define TIMEOUT 2000 //Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 //Configuraç 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.csv"

เรากำหนดพินท่ามกลางตัวแปรอื่น ๆ

// Pinos ทำ 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 ทำ 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 o cliente ใช้ mesma porta) เซิร์ฟเวอร์ WiFiServer (80); //Variável para armazenar o cliente (ไม่มีสถานี caso o ESP32 em modo) ไคลเอนต์ conectado WiFiClient; //String que recebemos ทำ cliente String ได้รับ; // RSSI enviado pelo ลูกค้าสำหรับ este ESP32 ยาว rssi = 0; //Faz o controle do temporizador (interrupção por tempo) hw_timer_t *ตัวจับเวลา = NULL; //Utilizado para guardar os ultimos std::vector rssiHistory;

ติดตั้ง

การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); setupDisplay(); // เริ่มต้นหรือ SD ถ้า (!SD.begin (SDCARD_CS)) { display.println ("Erro ao inicializar lib SD!"); } //Cria a rede WiFi, เริ่มต้นหรือเซิร์ฟเวอร์ e espera o cliente conectar setupWiFi (); เซิร์ฟเวอร์.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 e configura o IPvoid setupWiFi () { display.println ("กำลังสร้าง softAP" + String (SSID)); WiFi. ตัดการเชื่อมต่อ (); 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) + " สร้างแล้ว!"); }

ตั้งค่าจอแสดงผล

//Incializa o display, muda a orientação e limpa a telavoid setupDisplay () { //Incializa o แสดง display.initR (INITR_BLACKTAB); //Rotaciona หรือ conteúdo Mostrado display.setRotation(3); // Pinta a tela de preto display.fillScreen(ST77XX_BLACK); }

waitForClient

เป็นโมฆะ 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 Responseer //antes de dizermos que a conexão foi perdida client.setTimeout(TIMEOUT); //กำหนดระยะเวลา }

IRAM_ATTR รีเซ็ตโมดูลและตั้งค่าWatchdog

// função que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule(){ ets_printf("(watchdog) reiniciar\n"); esp_restart_noos(); // reinicia o ชิป } เป็นโมฆะ setupWatchdog () { timer = timerBegin (0, 80, จริง); //timerID 0, div 80 //timer, callback, interrupção de borda timerAttachInterrupt (ตัวจับเวลา, &resetModule, จริง); //ตัวจับเวลา, จังหวะ (เรา), repetição timerAlarmWrite (ตัวจับเวลา, 10000000, จริง); timerAlarmEnable (จับเวลา); //habilita a interrupção }

ห่วง

วงเป็นโมฆะ () { timerWrite (ตัวจับเวลา, 0); //รีเซ็ต o temporizador (alimenta o watchdog) checkConnection (); //checa se possui conexão com o ลูกค้า readFromClient(); // ระบบปฏิบัติการ ทำ cliente sendToClient(); //envia Confirmação para o ลูกค้าพล็อต (); //mostra o gráfico de histórico de rssi บันทึก (); //salva um log no cartão SD }

ตรวจสอบการเชื่อมต่อ

เป็นโมฆะ 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

เป็นโมฆะ 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 ทำ cliente if (client.connected ()) { ได้รับ = client.readStringUntil ('\ n'); // Lê o texto que o ลูกค้า enviou ได้รับ.remove(received.length()-1); //เอาออก o \n ทำ rssi สุดท้าย = client.parseInt(); // Lê o rssi que o ลูกค้า enviou clearText(); //ลิมปาหรือ texto display.setCursor(0, 0); // เลื่อนเคอร์เซอร์ไปที่ texto para o começo do display 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 registro mais antigo if(rssiHistory.size() == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) { rssiHistory.erase(rssiHistory).เริ่ม()); } //Adiciona no final ทำ histórico (mais lateste) rssiHistory.push_back(rssi); } }

sendToClient

ถือเป็นโมฆะ sendToClient () { // Se o cliente estiver conectado enviamos de volta a mensagem com um OK if (client.connected ()) { การส่งสตริง = ได้รับ + " ตกลง"; client.println(กำลังส่ง); } }

พล็อต

พล็อตโมฆะ () {// 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 สำหรับ (int i = 0; i -120 ? map(rssiHistory, -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine(currentX, DISPLAY_HEIGHT - ค่า, ค่า, PLOT_COLOR); currentX += 2; } }

clearText และบันทึก

เป็นโมฆะ clearText(){ //Limpa a área com o texto da mensagem vinda do cliente display.fillRect(0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } บันทึกเป็นโมฆะ () { //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 ("ไม่สามารถเปิดไฟล์ได้"); กลับ; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = สตริง (มิลลิวินาที ()) + ";" + สตริง (rssi) + ";" + ได้รับ; file.println (ข้อมูล); ไฟล์.close(); }

ขั้นตอนที่ 9: Station.ino

เราได้รวมไลบรารีที่จำเป็นและกำหนดพารามิเตอร์บางอย่าง

#รวม #รวม #รวม #รวม #รวม #รวม //Nome da rede que nos conectaremos Criado pelo AP #define SSID "RSSI_Test" #define PASSWORD "87654321" #define HOST "192.168.0.1" //IP que foi configurado ไม่มีการตั้งค่าสำหรับ AP #define PORT 80 //Porta ทำเซิร์ฟเวอร์ Qualquer porta válida contanto que seja igual nos dois arquivos //Tempo de timeout paraพิจารณา a conexão pedida #define TIMEOUT 2000 //Largura e altura do display #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) // ไม่พบบันทึกใน SD #define FILE_PATH "/log.csv"

เรากำหนดการตั้งค่าที่เกี่ยวข้องกับการแสดงผลและการ์ด SD

นับยาว = 0; //Contador de mensagens enviadaslong rssi = 0; // RSSI calculado String ได้รับ; //Mensagem de Confirmação que o AP nos envia //Pixel onde o gráfico começa แนวนอน int ปัจจุบันX = PLOT_MARGIN; //Utilizado para conexão com o เซิร์ฟเวอร์ 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 ทำ SDCard ระบบปฏิบัติการ 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); hw_timer_t *ตัวจับเวลา = NULL; //faz o controle do temporizador (interrupção por tempo) //Utilizado para guardar os ultimos std::vector rssiHistory;

ติดตั้ง

การตั้งค่าเป็นโมฆะ () { setupDisplay (); // เริ่มต้นหรือ SD ถ้า (!SD.begin (SDCARD_CS)) { display.println ("Erro ao inicializar lib SD!"); } //Conecta ไม่มีจุดเชื่อมต่อ criado pelo outro ESP32 และเซิร์ฟเวอร์ conecta ao setupWiFi (); เชื่อมต่อไปยังเซิร์ฟเวอร์ (); //Espera 3 segundos, limpa a tela e inicializa o Watchdog delay(3000); display.fillScreen (ST77XX_BLACK); display.setCursor(0, 0); setupWatchdog(); }

setupDisplay

//Incializa o display, muda a orientação e limpa a telavoid setupDisplay () { //Incializa o แสดง display.initR (INITR_BLACKTAB); //Rotaciona หรือ conteúdo Mostrado display.setRotation(1); // Pinta a tela de branco display.fillScreen (ST77XX_BLACK); display.setTextColor(ST77XX_WHITE); }

setupWiFi

// Conecta ao AP เป็นโมฆะ setupWiFi () { WiFi.disconnect (); WiFi.mode(WIFI_STA); WiFi.begin(SSID, รหัสผ่าน); display.println("กำลังเชื่อมต่อกับ" + สตริง (SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status() != WL_CONNECTED) { ล่าช้า (500); display.print("."); } display.println(""); display.print("เชื่อมต่อกับ"); display.println (SSID); }

เชื่อมต่อไปยังเซิร์ฟเวอร์

เป็นโมฆะ connectToServer () { display.println ("กำลังพยายามเชื่อมต่อซ็อกเก็ต"); // Espera a conexão com o เซิร์ฟเวอร์ในขณะที่ (!socket.connect (HOST, PORT)) { display.print ("."); ล่าช้า (500); } display.println(); display.println("เชื่อมต่อแล้ว!"); //เพิ่มความเร็วให้กับผู้ใช้ก่อนการสาธิตสำหรับตัวช่วยตอบสนอง //การจำกัดเวลาในการใช้งาน socket.setTimeout(TIMEOUT); }

IRAM_ATTR รีเซ็ตโมดูลและตั้งค่าWatchdog

// função que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule(){ ets_printf("(watchdog) reiniciar\n"); esp_restart_noos(); // reinicia o ชิป } เป็นโมฆะ setupWatchdog () { timer = timerBegin (0, 80, จริง); //timerID 0, div 80 //timer, callback, interrupção de borda timerAttachInterrupt (ตัวจับเวลา, &resetModule, จริง); //ตัวจับเวลา, จังหวะ (เรา), repetição timerAlarmWrite (ตัวจับเวลา, 10000000, จริง); timerAlarmEnable (จับเวลา); //habilita a interrupção }

ห่วง

วงเป็นโมฆะ () { timerWrite (ตัวจับเวลา, 0); // reseta o temporizador (alimenta o watchdog) ตรวจสอบการเชื่อมต่อ (); //checa se possui conexão com หรือเซิร์ฟเวอร์ checkRSSI(); // การยืนยันหรือพล็อต rssi (); //mostra หรือ gráfico de histórico de rssi sendToServer(); //envia uma mensagem com um contador para o เซิร์ฟเวอร์ readFromServer (); //espera ยืนยันการทำบันทึกเซิร์ฟเวอร์ (); // salva um log ไม่มีความล่าช้าของ cartão SD (1000); //espera อืม เซกุนโด }

ตรวจสอบการเชื่อมต่อ

ถือเป็นโมฆะ checkConnection () { // Verifica a conexão com o AP if (WiFi.status () != WL_CONNECTED) { display.fillScreen (ST77XX_BLACK); display.setCursor(0, 0); display.println("ยกเลิกการเชื่อมต่อ WiFi"); ตั้งค่า WiFi(); ล่าช้า (1000); } // ยืนยันซ็อกเก็ตถ้า (!socket.connected ()) { display.fillScreen (ST77XX_BLACK); display.setCursor(0, 0); display.println("ซ็อกเก็ตถูกตัดการเชื่อมต่อ"); เชื่อมต่อไปยังเซิร์ฟเวอร์ (); ล่าช้า (3000); display.fillScreen (ST77XX_BLACK); } }

ตรวจสอบRSSI

ตรวจสอบเป็นโมฆะ RSSI () { // Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI ไม่แสดง clearText(); display.setCursor(0, 0); display.print("RSSI:" + สตริง (rssi)); //Se a quantidade de barras do gráfico passou do limite apagamos o registro mais antigo if(rssiHistory.size() == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) { rssiHistory.erase(rssiHistory.begin()); } //Adiciona no final ทำ histórico (mais lateste) rssiHistory.push_back(rssi); }

พล็อต

พล็อตโมฆะ () {// 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 สำหรับ (int i = 0; i -120 ? map(rssiHistory, -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine(currentX, DISPLAY_HEIGHT - ค่า, ค่า, PLOT_COLOR); currentX += 2; } }

sendToServer

เป็นโมฆะ sendToServer () { // Se estiver conectado com o เซิร์ฟเวอร์ if (socket.connected ()) { //Envia um สวัสดี com um contador, Mostra ไม่แสดง e เพิ่มหรือ contador การส่งสตริง = "สวัสดี" + สตริง (นับ); display.setCursor(0, 10); display.println("กำลังส่ง: " + กำลังส่ง); socket.println (กำลังส่ง); socket.print(สตริง(rssi)); นับ++; } }

readFromServer

เป็นโมฆะ readFromServer () { // Espera até o เซิร์ฟเวอร์ enviar algo ou desconectar ในขณะที่ (socket.connected () && !socket.available ()) { ล่าช้า (100); } //Se tem algo para receber if(socket.available()) { //Faz a leitura, remove o \n do final e mostra no displayจะได้รับ = socket.readStringUntil('\n'); ได้รับ.remove(received.length()-1); display.println("ได้รับ: " + ได้รับ); } }

clearText และบันทึก

ถือเป็นโมฆะ clearText(){ //Limpa a área com o texto da mensagem vinda do cliente display.fillRect(0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } บันทึกเป็นโมฆะ () { //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 ("ไม่สามารถเปิดไฟล์ได้"); กลับ; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = สตริง (มิลลิวินาที ()) + ";" + สตริง (rssi) + ";" + ได้รับ; file.println (ข้อมูล); ไฟล์.close(); }

ขั้นตอนที่ 10: ไฟล์

ดาวน์โหลดไฟล์:

ไฟล์ PDF

ฉันไม่

แนะนำ: