İçindekiler:
- Adım 1: AP'yi Wrover ile Monte Etme
- Adım 2: TTGO ile İSTASYON Montajı
- 3. Adım: SONUÇ
- 4. Adım: LOG.CSV'yi arşivleyin
- Adım 5: Adafruit GFX Kitaplığı
- Adım 6: Adafruit ST7735 Kitaplığı
- 7. Adım: Kartları Yapılandırma
- Adım 8: AP.ino
- Adım 9: Station.ino
- Adım 10: Dosyalar
Video: ESP32 Harici Uzun Mesafe Antenli: 10 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:19
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ı
3. Adım: 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
Verileri milis, dbm ve paket dizisi olarak bir SD karta kaydettim.
Adım 5: 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ığı
Arduino IDE'de Sketch-> Include Library-> Manage Libraries… seçeneğine gidin.
Adafruit ST7735'i yükleyin
7. Adım: 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:
BEN HAYIR
Önerilen:
HC-12 Uzun Menzilli Mesafe Hava İstasyonu ve DHT Sensörleri: 9 Adım
HC-12 Uzun Menzilli Mesafe Hava İstasyonu ve DHT Sensörleri: Bu derste iki dht sensörü, HC12 modülleri ve I2C LCD Ekran kullanarak uzak uzun mesafe meteoroloji istasyonu yapmayı öğreneceğiz.Videoyu İzle
DIY Uzun Mesafe En İyi Arkadaş Işıkları: 4 Adım (Resimlerle)
DIY Uzun Mesafe En İyi Arkadaş Işıkları: "En İyi Arkadaş" olarak bilinen uzun mesafeli senkronize ışıklar yaptım; lambalar. Bu sadece diğer lambanın mevcut rengiyle senkronize tutuldukları anlamına gelir. Yani bir lambayı yeşile çevirecek olursanız, kısa bir süre sonra diğer lamba yeşile dönecektir
Uzun Mesafe İletim Sistemi Devresi: 6 Adım
Uzun Mesafe İletim Sistemi Devresi: Bugün bu yazımızda temel bir Uzun Mesafe İletim Sistemi devresinin nasıl yapılacağından bahsedeceğiz. Bu satırlar boyunca, size devrenin kısa bir tasvirini vereyim. Genel olarak bu nasıl işler ve Ben size her şeyle nasıl konuşuyorum
Eski Harici CD/RW'den Harici HDD Oluşturun: 5 Adım
Eski Harici CD/RW'den Harici HDD Oluşturun: Eski bir harici cd/rw'nin oldukça basit bir şekilde daha kullanışlı bir harici sabit sürücüye dönüştürülmesi. Sarf malzemeleri1-harici cd/rw (tercihen daha kutulu tip)1-sabit sürücü (sürücü kasasının dahili konektörüyle eşleşmelidir, biçimlendirilmesi/sisteme eklenmesi gerekir)1-sm
Wifi Sinyal Süzgeci (WokFi) Uzun Mesafe: 3 Adım (Resimli)
Wifi Sinyal Süzgeci (WokFi) Uzun Mesafe: Bu talimatta, etli bir wifi genişleticiye ortak bir WiFi Thumbdrive yapıyorum!' Parabolik Asya pişirme (hamur) süzgeci bu proje için mükemmel bir aday. 20 erişim daha alabildim şehirdeki noktaları ve bir ağa bağlanın