// LM - November 2022 - Compiled for NodeMCU ESP-12F // Experiment in auto-ranging #include #include const boolean TEST_MODE = false; const boolean DBM_UNITS = true; // True to convert ultra low power to dBm /* #define WIFI_SSID "WiFi network name here" // Comment-out or remove if not implementing #define WIFI_PASS "WiFi password here" // UDP interface over WiFi */ // Application #define PB_1 D4 // Measurement pushbutton #define RELAY_1 D7 #define RELAY_2 D8 #define BAUD 115200 // USB Serial monitor (not software serial) #ifdef WIFI_SSID #include #include IPAddress targetIP = {192, 168, 1, 175}; // Match to listener #define targetPort 22200 // Ditto WiFiUDP Udp; // Instantiate const int UDP_BUFFER_DIM = 256; // Message buffers char udpTxBuffer[UDP_BUFFER_DIM]; #endif // OLED #define OLED_I2C_ADDRESS 0x3C #define DSPL_WIDTH 128 #define DSPL_HEIGHT 64 #define DSPL_RESET -1 // Instantiate display Adafruit_SSD1306 display(DSPL_WIDTH, DSPL_HEIGHT, &Wire, DSPL_RESET); const int MIN_AD = 12; // Readings at or below this A/D value may be noise const float SQRT2_DIV4 = 0.3535533905932737623; // For convenience // Ultra-Low interpolation array - A/D to RF millivolts P-P const int NON_LINEAR_REGION = 80; // Time constants const unsigned long JIFFY = 100; // Normally 100 milliseconds (may be modified for testing) const unsigned long HALFSEC = 500; const unsigned long ONESEC = 1000; const unsigned long TWOSEC = 2000; const unsigned long DISPLAY_TIMEOUT = 10000; byte relayStatus = 0; // 0=both off, 1=relay 1 on, 2=relay 2 on, 3=both on const int RANGE_CHANGE_THRESHOLD = 75; // When A/D < value switch to 10x const int AREADS_PER_MEASURE = 10; // Experimental unsigned long lastDisplayTime = 0; // Formatted display values String sRaw = ""; String sVpp = ""; String sVrms = ""; String sPower = ""; void setup() { Serial.begin(BAUD); pinMode(PB_1, INPUT); pinMode(RELAY_1, OUTPUT); pinMode(RELAY_2, OUTPUT); if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDRESS)) { Serial.println(F("OLED initialization failed")); while (true) ; // Do not proceed } Serial.println ("OLED initialized."); display.display(); // Adafruit logo delay(ONESEC); myClearDisplay(); displaySplash(); delay(TWOSEC); #ifdef WIFI_SSID Serial.println(); Serial.println("Attempting to initialize WiFi"); initWiFi(); // On failure, does not return Serial.println("WiFi connected!"); Serial.print("Local IP: "); Serial.println(WiFi.localIP()); delay(TWOSEC); #endif myClearDisplay(); Serial.println(); Serial.println("Startup complete!"); } void loop() { if (buttonPress()) { myClearDisplay(); if (TEST_MODE) { testAutorange(); } else // Measure voltage autoRange(); } if (millis() - lastDisplayTime > DISPLAY_TIMEOUT) { myClearDisplay(); lastDisplayTime = millis(); } } void relayOn(int k) { // k = relay number 1 or 2 if (k == 1) digitalWrite(RELAY_1, HIGH); else if (k == 2) digitalWrite(RELAY_2, HIGH); } void relayOff(int k) { // k = relay number 1 or 2 if (k == 1) digitalWrite(RELAY_1, LOW); else if (k == 2) digitalWrite(RELAY_2, LOW); } boolean buttonPress() { if (digitalRead(PB_1) == HIGH) return false; delay(JIFFY); while (digitalRead(PB_1) == LOW) ; // Debounce return true; } int avgAnalog(int n) { // Return average of n analogRead values // No validity checking (assumes n>0) unsigned int sum = 0; for (int i=0; i0) unsigned int sum = 0; for (int i=0; i