İçindekiler:

ESP32 Harici Uzun Mesafe Antenli: 10 Adım
ESP32 Harici Uzun Mesafe Antenli: 10 Adım

Video: ESP32 Harici Uzun Mesafe Antenli: 10 Adım

Video: ESP32 Harici Uzun Mesafe Antenli: 10 Adım
Video: Lora modülü Mesafe Testi 5KM geçtik! 2024, Kasım
Anonim
Image
Image
AP'yi Wrover ile Monte Etme
AP'yi Wrover ile Monte Etme

Bugünün konusu, Harici Antenli bir ESP32 ile bir mesafe testi ile ilgilidir. Bugün iki modül kullanalım: Espressif ve TTGO'dan. Daha sonra bu iki ESP32 anteni arasındaki RSSI'yi kontrol edelim, geçmişten bir grafik oluşturalım ve bir.csv dosyasına değerlerin bir günlüğünü yazalım.

Daha sonra AP olarak ESP32 Wrover'a ve İstasyon olarak TTGO'nun ESP32'sine sahibiz. Biraz daha büyük bir TP-Link'ten aldığım bir anten ve 9dbm anten olarak bilinen başka bir yönlendirici kullandım. İkisi arasında bir fark göremedim.

Son olarak, iki mikrodenetleyici soket aracılığıyla bağlanır ve her veri paketi gönderiminde, bir ekrana dbm oranını gösteren çubuklarla bir grafik yazdırırız.

Adım 1: AP'yi Wrover ile Monte Etme

Adım 2: TTGO ile İSTASYON Montajı

TTGO ile İSTASYON Montajı
TTGO ile İSTASYON Montajı

3. Adım: SONUÇ

SONUÇ
SONUÇ
SONUÇ
SONUÇ
SONUÇ
SONUÇ

2x harici anten ile maksimum mesafe: 315 metre

Harici ve dahili anten ile maksimum mesafe: 157 metre

4. Adım: LOG. CSV'yi arşivleyin

Arşiv LOG. CSV
Arşiv LOG. CSV
Arşiv LOG. CSV
Arşiv LOG. CSV

Verileri milis, dbm ve paket dizisi olarak bir SD karta kaydettim.

Adım 5: Adafruit GFX Kitaplığı

Adafruit GFX Kitaplığı
Adafruit GFX Kitaplığı

Arduino IDE'de Sketch-> Include Library-> Manage Libraries… seçeneğine gidin.

Adafruit GFX Kütüphanesini Kurun

Adım 6: Adafruit ST7735 Kitaplığı

Adafruit ST7735 Kütüphane
Adafruit ST7735 Kütüphane

Arduino IDE'de Sketch-> Include Library-> Manage Libraries… seçeneğine gidin.

Adafruit ST7735'i yükleyin

7. Adım: Kartları Yapılandırma

Kartları Yapılandırma
Kartları Yapılandırma
Kartları Yapılandırma
Kartları Yapılandırma

Farklılıklar için takipte kalın:

Adım 8: AP.ino

Gerekli kütüphaneleri ekledik ve bazı parametreleri tanımladık.

#include #include #include #include #include #include // ESP sorgusunu yeniden düzenleyin. İstasyon deve seri yok #define SSID "RSSI_Test" #define PASSWORD "87654321" //Konex pedida dikkate alınarak tempo de zaman aşımı #define TIMEOUT 2000 // Display için geniş ekran #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 //Yapılandırmalar cor, margem ve 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"

Diğer değişkenlerin yanı sıra pinleri tanımlarız

//Pinolar gösterir#define DISPLAY_DC 12 //A0 #DISPLAY_CS 13 //CS #DISPLAY_MOSI 14 //SDA #DISPLAY_CLK 27 //SCK #DISPLAY_RST 0 //Pino SDCard do. Os pinos mosi, miso e sck são os nativos (23, 19 ve 18'e göre) #define SDCARD_CS 15 //Piksel ve grafik yatay geçiş int akımX = PLOT_MARGIN; //Yanıt verme pelo gösterimi Adafruit_ST7735 gösterimi = Adafruit_ST7735(DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); //Criamos um sunucusu (kaliteli bağlantı noktası hizmeti, istemciler için bir mesma bağlantı noktası kullanır) WiFiServer sunucusu(80); //Müşteri için değişken para armazenar (caso o ESP32 em modo istasyonu yok) conectado WiFiClient istemcisi; // String que recebemos do cliente String alındı; //RSSI enviado pelo cliente para este ESP32 uzun rssi = 0; // Tempoyu kontrol etme (tempoyu kesme) hw_timer_t *timer = NULL; //Utilizado para guardar os ultimos std::vector rssiHistory;

Kurmak

geçersiz kurulum(){ Serial.begin(115200); setupDisplay(); //Inicializa o SD if (!SD.begin(SDCARD_CS)) { display.println("Erro ao inicializar lib SD!"); } // WiFi erişimini yeniden başlatma, sunucu ve sunucu ayarları veya istemci bağlantı kurulumuWiFi(); server.begin(); waitForClient(); //Espera 3 segundos, limpa a tela e inicializa o Watchdog gecikmesi(3000); display.fillScreen(ST77XX_BLACK); display.setCursor(0, 0); setupWatchdog(); }

WiFi Kurulumu

//Cria um Erişim Noktası ve yapılandırma o IPvoid kurulumuWiFi() { display.println("softAP oluşturma " + String(SSID)); WiFi.disconnect(); WiFi.mode(WIFI_AP); WiFi.softAPConfig(IPAdresi(192, 168, 0, 1), IPAdresi(192, 168, 0, 1), IPAdresi(255, 255, 255, 0)); WiFi.softAP(SSID, ŞİFRE); display.println("softAP " + String(SSID) + " oluşturuldu!"); }

Kurulum Ekranı

//İncializa o display, muda a orientação e limpa a telavioid setupDisplay() { //Inicializa o display display.initR(INITR_BLACKTAB); //Rotacion veya conteúdo çoğu zaman display.setRotation(3); //Pinta bir tela de preto display.fillScreen(ST77XX_BLACK); }

bekleForClient

void waitForClient(){ display.println("Müşteri bekleniyor"); //Müşteri bağlantısı koruması while(!(client = server.available())) { display.print("."); gecikme(500); } display.println("İstemci bağlandı"); //Tempo maksimo que o istemci deve demorar para yanıtlayıcı //antes de dizermos que a conexão foi perdida client.setTimeout(TIMEOUT); }

IRAM_ATTR resetModule ve setupWatchdog

//ESP32void IRAM_ATTR resetModule(){ ets_printf("(watchdog) reiniciar\n"); esp_restart_noos(); //reinicia veya chip } void setupWatchdog() { timer = timerBegin(0, 80, true); //timerID 0, div 80 //zamanlayıcı, geri arama, kesintiye neden olur timerAttachInterrupt(timer, &resetModule, true); //zamanlayıcı, tempo (biz), tekrarlama timerAlarmWrite(timer, 10000000, true); timerAlarmEnable(zamanlayıcı); //habilita bir araya girme }

Döngü

void loop() { timerWrite(zamanlayıcı, 0); // zaman ayarını sıfırla (beslenme veya bekçi köpeği) checkConnection(); //müşterilerin satın alma işlemlerini kontrol edin readFromClient(); // istemciler sendToClient(); // müşteri planı için envia onaylayın(); // en çok grafik ve tarihin geçmişi günlüğü(); // salva um cartão SD'yi kaydet }

bağlantıyı kontrol et

void checkConnection(){ //Müşteriler için bağımsız bir bağlantı if(!client.connected()) { //Limpa a tela e espera pelo cliente display.fillScreen(ST77XX_BLACK); display.println("İstemci bağlantısı kesildi"); waitForClient(); } }

Müşteriden oku

void readFromClient(){ //Desconectar'dan bağımsız olarak müşteriyi kıskandırır while(client.connected() && !client.available()) { delay(100); } //Bunların tümünün bir sonucu olarak, şu koşullara tabidir: müşteri if(client.connected()) { alınan = client.readStringUntil('\n'); //Lê o texto que o cliente enviou alınan.remove(alınan.uzunluk()-1); //Kaldır o \n son rssi = client.parseInt(); //Lê veya rssi que o müşteri enviou clearText(); //Limpa veya texto display.setCursor(0, 0); // İmleci hareket ettir texto para o começo do display.println("RSSI: " + String(rssi)); //Mostra o RSSI görüntü yok display.println("Alınan: " + alınan); //Müşteriye ilişkin çoğu zaman // Bir niceliksel veri de barras'ı sınırla ya da sınırlandırmayı engelle if(rssiHistory.size() == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) { rssiHistory.erase(rssiHistory).başlamak()); } //Adiciona'nın son tarihi yok (son güncelleme) rssiHistory.push_back(rssi); } }

sendToClient

void sendToClient(){ //Müşteriler için enviamos de volta bir mensagem com um OK if(client.connected()) { String send = alınan + " OK"; client.println(gönderme); } }

komplo

void plot(){ //Coloca hiçbir ponto inisial e limpamos veya gráfico currentX = PLOT_MARGIN; display.fillRect(PLOT_MARGIN, 2*PLOT_MARGIN, DISPLAY_WIDTH - 2*PLOT_MARGIN, DISPLAY_HEIGHT - 2*PLOT_MARGIN, ST77XX_BLACK); //Tarih tarihi için geçerli olan değerler, 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 - değer, değer, PLOT_COLOR); currentX += 2; } }

clearText ve günlük

void clearText(){ //Müşteri ekranıyla ilgili metin ve metinleri kontrol edin.fillRect(0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } void log() { //Arquivo para escrevermos son silme yok Dosya dosyası = SD.open(FILE_PATH, FILE_APPEND); //Görünüşe göre kısalmış veya yanlış yazılmış if(!file) { Serial.println("Dosya açılamadı"); dönüş; } //Gravamos uma linha com o tempo desde o boot, or rssi atual e bir mensagem recebida String data = String(millis()) + ";" + Dize(rssi) + ";" + alınan; dosya.println(veri); dosya.kapat(); }

Adım 9: Station.ino

Gerekli kütüphaneleri ekledik ve bazı parametreleri tanımladık.

#include #include #include #include #include #include //Konuları yeniden adlandırın. Criado pelo AP #define SSID "RSSI_Test" #define PASSWORD "87654321" #define HOST "192.168.0.1" //IP que foi konfigurado AP yap #define PORT 80 //Porta do sever. Geçerlilik kurallarının geçerliliği için geçerli değildir // Temel koşullara bağlı olarak tempo ve zaman aşımı #define TIMEOUT 2000 // Display DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 //Konfigürasyonun tam olarak yapılandırılması #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"

Ekranı ve SD Kartı içeren ayarları tanımlarız.

uzun sayı = 0; //Contador de mensagens enviadaslong rssi = 0; //RSSI hesaplama Dize alındı; //Envia AP nos'larını onaylayın //Piksel onde veya gráfico começa horizontalmente int currentX = PLOT_MARGIN; //Sunucu WiFiClient soketinden yararlanın; #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 ve 18'e göre) #define SDCARD_CS 15 //Yanıtlara cevap ver Adafruit_ST7735 ekran = Adafruit_ST7735(DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK,); hw_timer_t *timer = NULL; //faz o kontrollü temporizador (tempoyu kesintiye uğrat) //Utilizado para guardar os ultimos std::vector rssiHistory;

Kurmak

geçersiz kurulum(){ setupDisplay(); //Inicializa o SD if (!SD.begin(SDCARD_CS)) { display.println("Erro ao inicializar lib SD!"); } //Conecta erişim noktası yok criado pelo outro ESP32 ve conecta ao sunucu kurulumuWiFi(); sunucuya bağlan(); //Espera 3 segundos, limpa a tela e inicializa o Watchdog gecikmesi(3000); display.fillScreen(ST77XX_BLACK); display.setCursor(0, 0); setupWatchdog(); }

kurulumEkran

//İncializa o display, muda a orientação e limpa a telavid setupDisplay() { //Inicializa o display display.initR(INITR_BLACKTAB); //Rotacion veya conteúdo çoğu zaman display.setRotation(1); //Pinta bir tela de branco display.fillScreen(ST77XX_BLACK); display.setTextColor(ST77XX_WHITE); }

kurulumWiFi

//Conecta ao AP void setupWiFi() { WiFi.disconnect(); WiFi.modu(WIFI_STA); WiFi.begin(SSID, ŞİFRE); display.println("Bağlanıyor " + String(SSID)); //WiFi'yi yeniden yapılandırırken (WiFi.status() != WL_CONNECTED) { gecikme(500); display.print("."); } display.println(""); display.print("Bağlandı"); display.println(SSID); }

sunucuya bağlan

void connectToServer(){ display.println("Soket bağlantısı deneniyor"); //Espera bir conexão com o server while(!socket.connect(HOST, PORT)) { display.print("."); gecikme(500); } display.println(); display.println("Bağlandı!"); //Tempo maksimo que o istemci deve demorar para yanıtlayıcı //antes de dizermos que a conexão foi perdida socket.setTimeout(TIMEOUT); }

IRAM_ATTR resetModule ve setupWatchdog

//ESP32void IRAM_ATTR resetModule(){ ets_printf("(watchdog) reiniciar\n"); esp_restart_noos(); //reinicia veya chip } void setupWatchdog() { timer = timerBegin(0, 80, true); //timerID 0, div 80 //zamanlayıcı, geri arama, kesintiye neden olur timerAttachInterrupt(timer, &resetModule, true); //zamanlayıcı, tempo (bize), tekrarlama timerAlarmWrite(timer, 10000000, true); timerAlarmEnable(zamanlayıcı); //habilita bir araya girme }

döngü

void loop() { timerWrite(zamanlayıcı, 0); // zaman ayarını sıfırla (beslenme veya bekçi köpeği) checkConnection(); //sunucu için kontrol possui conexão kontrolRSSI(); //verifica veya rssi grafiği(); //çoğunlukla grafik ve tarihçe de sendToServer(); //envia uma mensagem com um contador para o server readFromServer(); // sunucu log(); //Salva um log cartão SD gecikme yok(1000); //espera um segundo }

bağlantıyı kontrol et

void checkConnection(){ //Bir conexão com o AP'nin doğrulanması if(WiFi.status() != WL_CONNECTED) { display.fillScreen(ST77XX_BLACK); display.setCursor(0, 0); display.println("WiFi bağlantısı kesildi"); kurulumWiFi(); gecikme(1000); } // soketi doğrulayın if(!socket.connected()) { display.fillScreen(ST77XX_BLACK); display.setCursor(0, 0); display.println("Soket bağlantısı kesildi"); sunucuya bağlan(); gecikme(3000); display.fillScreen(ST77XX_BLACK); } }

kontrol RSSI

void checkRSSI(){ //Verifica o RSSI rssi = WiFi. RSSI(); //Limpa o texto e Mostra o RSSI no display clearText(); display.setCursor(0, 0); display.print("RSSI: " + String(rssi)); //Bir niceliksel olarak barras'ı sınırla ya da sınırlandırmayı engelle if(rssiHistory.size() == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) { rssiHistory.erase(rssiHistory.begin()); } //Adiciona'nın son tarihi yok (en son sürüm) rssiHistory.push_back(rssi); }

komplo

void plot(){ //Coloca hiçbir ponto inisial e limpamos veya gráfico currentX = PLOT_MARGIN; display.fillRect(PLOT_MARGIN, 2*PLOT_MARGIN, DISPLAY_WIDTH - 2*PLOT_MARGIN, DISPLAY_HEIGHT - 2*PLOT_MARGIN, ST77XX_BLACK); //Tarih tarihi için geçerli olan değerler, 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 - değer, değer, PLOT_COLOR); currentX += 2; } }

sendToServer

void sendToServer(){ //Conectado com o server if(socket.connected()) { //Envia um merhaba com um condor, çoğu görüntü yok ve conadorator String gönderme = "Merhaba " + String(count); display.setCursor(0, 10); display.println("Gönderiliyor: " + gönderiliyor); socket.println(gönderme); socket.print(String(rssi)); say++; } }

sunucudan oku

void readFromServer(){ //Sunucu için enviar enviar ve deconectar while(socket.connected() && !socket.available()) { delay(100); } //Se tem algo para receber if(socket.available()) { //Bir boş zaman, kaldır o \n son ve en fazla görüntü alınmadı = socket.readStringUntil('\n'); alınan.kaldır(alınan.uzunluk()-1); display.println("Alınan: " + alınan); } }

clearText ve günlük

void clearText(){ //Müşteri ekranıyla ilgili metin ve metinleri kontrol edin.fillRect(0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } void log() { //Arquivo para escrevermos son silme yok Dosya dosyası = SD.open(FILE_PATH, FILE_APPEND); //Görünüşe göre değişiklik gösteriyorsa, yanlış anlama if(!file) { Serial.println("Dosya açılamadı"); dönüş; } //Gravamos uma linha com o tempo desde o boot, or rssi atual e bir mensagem recebida String data = String(millis()) + ";" + Dize(rssi) + ";" + alınan; dosya.println(veri); dosya.kapat(); }

Adım 10: Dosyalar

Dosyaları indirin:

PDF

BEN HAYIR

Önerilen: