/* ---------------------------------------------------------------- Arduino NANO Power-Meter mit AD8307 Modul B. Hochstaetter / dl6nbs@t-online.de 18. Februar 2020 ---------------------------------------------------------------- Ein Arduino NANO in Verbindung mit einem AD8307 RF-Leistungsmesser- Modul "Logarithmischer Prüfdetektor 0.1 ~ 600MHz" (Ebay China ca. 8€) macht Messungen im Bereich von ca. -74 dBm bis +16 dBm möglich. Der Arduino-Sketch von Mike, G4WNC diente als Basis und wurde für meine Anforderungen ergänzt. Der Spannungsausgang des Moduls liegt an A0 des Arduino. Am OLED-Display wird die Ausgangsspannung des RF-Moduls angezeigt, die entsprechende Leistung und der zugehörige dBm-Wert. Zusätzlich bildet ein Bargraph den gesamten Messbereich ab. Zur guten Auflösung der Leistungsanzeige wird automatisch zwischen den Bereichen Watt, Milliwatt, Mikrowatt, Nanowatt und Picowatt umgeschaltet. Unterhalb des linearen Bereichs des RF-Moduls, bei ca. -74dBm, wird ein Vermerk CUT eingeblendet. Zur Messung von Leistungen > +16 dBm muss ein Dämpfungsglied vorgeschaltet werden. Über einen Taster kann der Wert des vorgeschalteten Dämpfungsgliedes -10dBm, -20dBm, -30dBm oder -40dBm eingeblendet werden. Im Programm wird dieser hochgerechnet und für die korrekte Anzeige mit einbezogen. Die Kalibrierung erfolgt über den Parameter "float uREF". Hierzu wird einmalig die genaue Spannung am 5V-Pin des Arduino gemessen und bei "float uREF" eingetragen. Steht eine kalibrierte dBm-Quelle zur Verfügung, kann über die beiden Parameter "gain" und "intercept" der Feinabgleich erfolgen. ---------------------------------------------------------------- */ /* Displayanschluss Arduino 5V -> VCC GND -> GND A4 -> SDA A5 -> SCL */ // ---------------------------------------------------------------- // <><><><><><><>><><><><> Benoetigte Libs <><><><><><><>><><><><> // ---------------------------------------------------------------- #include #include U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); /* reset=*/ u8g2_uint_t offset; u8g2_uint_t width; // ---------------------------------------------------------------- // <><><><><><><>><><><><> Definitionen <><><><><><><>><><><><> // ---------------------------------------------------------------- int Taster = 5; // Taster am Eingang D5 int graph = 0; // Anzeigebalken int uANA = 0; // Arduino ADC Rohwert float uADC = 0.000; // Arduino ADC Spannung float dBm = 0.000; // dBm-Rechner float pwr = 0.0000; // Power in Watt / mW / uW / nW / pW float gain = 39; // Steigung AD8307=39 (Default=40,Feinabgleich bei -70 dBm) float intercept = 80.0; // 0V intercept point (Default=80,Feinabgleich bei 0 dBm) float limit = -74; // Ende des präzisen Messbereiches float atten = 0; // Merker für externes Dämfungsglied float uREF = 4.90; // Einmalig gemessen am 5V-Pin des Arduino Nano char unit[] = "_W = "; // Merker Umschaltung der Einheiten char cut[] = "CUT"; // Limit Einblendung // ================== Definition Info-Anzeige void drawIntro(void) { u8g2.setFont(u8g2_font_7x13_mf); u8g2.setCursor(0, 10); u8g2.print("AD8307 Powermeter"); u8g2.setCursor(0, 25); u8g2.print(" by DL6NBS"); u8g2.setCursor(0, 43); u8g2.print(" -72dBm / +16dBm"); u8g2.setCursor(0, 62); u8g2.print("ext. Atten push >>"); } // ================== OLED Info-Anzeige void setup() { pinMode(Taster, INPUT_PULLUP); u8g2.begin(); u8g2.firstPage(); do { drawIntro(); } while ( u8g2.nextPage() ); delay (5000); } // ================== Definition Messdaten-Anzeige void drawMess(void) { u8g2.setFont(u8g_font_unifont); // Display Spannung u8g2.setCursor(0, 10); u8g2.print("Uin = "); u8g2.print(uADC); // Display Power u8g2.setCursor(0, 27); u8g2.print(unit); u8g2.print(pwr, 1); // Display dBm u8g2.setCursor(0, 44); u8g2.print("dBm = "); u8g2.print(dBm, 1); // Display Range u8g2.setCursor(0, 63); u8g2.print(cut); // Display Graph u8g2.drawBox(30, 55, graph, 5); // X-Start, Y-Start, X-Länge, Y-Höhe u8g2.setDrawColor(1); // Box Farbe } // ---------------------------------------------------------------- // <><><><><><><>><><> Hauptschleife Rechner <><><><><><><>><><><> // ---------------------------------------------------------------- void loop() { uANA = analogRead(0); // ADC lesen uADC = (uANA * uREF) / 1023; // ADC -> Spannung dBm = (gain * uADC) - intercept + atten; // Spannung -> dBm plus externe Dämpfung pwr = pow(10.0, (dBm - 30) / 10.0); // dBm -> Power graph = uADC * 40; // Skalierung Balken if (pwr >= 1) { // Watt Anzeige-Bereichsumschaltung unit[0] = ' '; } if (pwr < 1 and pwr > 10e-4) { pwr = pwr * 10e2; unit[0] = 'm'; // Milliwatt Einblendung } if (pwr <= 10e-3 and pwr > 10e-7) { pwr = pwr * 10e5; unit[0] = 'u'; // Mikrowatt Einblendung } if (pwr <= 10e-4 and pwr > 10e-10) { pwr = pwr * 10e8; unit[0] = 'n'; // Nanowatt Einblendung } if (pwr <= 10e-6) { pwr = pwr * 10e11; unit[0] = 'p'; // Picowatt Einblendung } // ================== Unteres Limit erreicht if (dBm < limit) { cut[0] = 'C'; // unteres Limit erreicht CUT einblenden cut[1] = 'U'; cut[2] = 'T'; } else if (atten == 0) { // valider Messbereich CUT ausblenden cut[0] = ' '; cut[1] = ' '; cut[2] = ' '; } // ================== Taster für externes Dämpfungsglied abfragen if (digitalRead(Taster) == 0) { atten = atten + 10; // im Zehnerschritt hochschalten if (atten > 40) { atten = 0; } if (atten == 10) { cut[0] = '-'; // Wert Dämpfungsglied einbenden cut[1] = '1'; cut[2] = '0'; } if (atten == 20) { cut[0] = '-'; cut[1] = '2'; cut[2] = '0'; } if (atten == 30) { cut[0] = '-'; cut[1] = '3'; cut[2] = '0'; } if (atten == 40) { cut[0] = '-'; cut[1] = '4'; cut[2] = '0'; } delay (1000); // Taster Umschaltung im Sekundentakt } // ================== OLED Messung-Anzeige u8g2.firstPage(); do { drawMess(); } while ( u8g2.nextPage() ); delay (100); // Anzeige Pause 100mS } // Ende Loop