Home Forum Software How to upload to uRadmonitor from (Arduino) ESP32?

Viewing 15 posts - 1 through 15 (of 27 total)
  • Author
    Posts
  • #28837
    DonZalmrol
    Participant

    Hi all,

    I’m busy with trying to change the code from: https://github.com/radhoo/uradmonitor_kit1/blob/master/code/uRADMonitor.cpp for my Arduino ESP32, but this isn’t going smoothly.

    Does someone has a working example for uploading it from their Arduino to the uRadmonitor network?

    The values I can (currently) upload are:
    – moving average CPM for 2x SI-22G tubes
    – tube voltage
    – temperature
    – humidity

    Thanks!

    #28838
    Wolferl
    Moderator

    Hi Don,

    Can you be a bit more specific what you are trying to achieve and what exactly the problem is?
    What device ID are you using?

    Cheers,
    Wolferl

    #28841
    DonZalmrol
    Participant

    Strange, I’m trying to reply but looks like my other reply isn’t getting through…
    Could it be blocked as it contains URLs?

    #28843
    uRADMonitor
    Keymaster

    There are a few implementations using the code for upload. You need to do the HTTP call, having all those parameters added to the url. Can you post your work so far?

    #28844
    DonZalmrol
    Participant

    I use WifiServer instead of WebServer which means that the original code from the opensource version uploads it data to uRadmonitor on a different manner then what I’m currently using to do a HTTPS using the WifiServer options.

    Below is my current code which works for uploading it to another platform (Radmon) at this moment.
    Would love to also getting it to work to upload it uRadmonitor to provide the other sensors that I can monitor already through my build in webserver page.

    The json query will take a bit of work but I’m hoping I will be able to do that on my own. My main concern now is how to do the upload to uRadmonitor.

    Thx!

    #include <Arduino.h>
    #include <heltec.h>
    #include <WiFi.h>
    #include <movingAvg.h>
    #include <esp_task_wdt.h>
    #include <Preferences.h>
    #include <DHTesp.h>
    #include <ArduinoJson.h>
    
    Preferences preferences;
    DHTesp dht;
    
    #define WDT_TIMEOUT 15 //15 seconds WDT
    
    // Tube dead time in seconds
    // SI-22G = 0.000xxx seconds
    // SBM-20 = 0.000190 seconds
    #define tubeDeadTime 0.000190
    
    // define Radiation DETECTORS
    #define GEIGER_TUBE_SI22G 0x6
    
    const char *ssid = "YourSSIDNameHere";
    const char *password = "YourSSIDPaswordHere";
    const long timeoutTime = 5000;
    WiFiServer server(80);
    
    // be.pool.ntp.org
    
    unsigned long currentMillis = 0;
    unsigned long previousMillis_1 = 0, previousMillis_2 = 0, previousMillis_3 = 0, previousMillis_4 = 0;
    unsigned long ONE_WEEK = 7ul * 24ul * 60ul * 60ul * 1000ul;
    
    unsigned long cps_1 = 0, cps_2 = 0;
    unsigned long cpm_1 = 0, cpm_2 = 0;
    unsigned long actual_cps_1 = 0, actual_cps_2 = 0;
    unsigned long actual_cpm_1 = 0, actual_cpm_2 = 0;
    unsigned long totalCount_3 = 0;
    
    int sensorMovingAvg_3 = 0;
    int tenSecCount = 0;
    int increaseSecCount = 0;
    int retry = 0;
    
    unsigned long weekCPMCtr = 0, totCPMCtr = 0, prevcpm_1 = 0, prevcpm_2 = 0, prevACPM = 0, prevMACPM = 0;
    float currentTemp = 0.0, currentHumidity = 0.0;
    
    // Set sensor to 120 data points for moving average (2x 60 second data entry points)
    movingAvg sensor_3(120);
    
    boolean event1 = false, event2 = false;
    boolean uploadOk = false;
    boolean buttonShowLCD = false;
    
    // RADMON credentials
    const char *UserName = "username";
    const char *DataSendingPassWord = "password";
    
    void setup()
    {
      // True = Display, False = LoRa, True = Serial
      Heltec.begin(true, false, true);
      Heltec.display->flipScreenVertically();
      Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
      Heltec.display->setFont(ArialMT_Plain_10);
      Heltec.display->clear();
      Heltec.display->drawString(0, 0, "GM SI-22G");
      Heltec.display->drawString(0, 10, "Stationary Logger");
      Heltec.display->drawString(0, 20, "V5");
      Heltec.display->drawString(0, 40, "By Don Zalmrol");
      Heltec.display->display();
      delay(3000);
      Heltec.display->clear();
    
      // Connect to the WiFi
      WiFiSetup();
    
      delay(10);
    
      // Initialize variables
      cps_1 = 0, cps_2 = 0;
      cpm_1 = 0, cpm_2 = 0;
      actual_cps_1 = 0, actual_cps_2 = 0;
      sensorMovingAvg_3 = 0;
      tenSecCount = 0;
      increaseSecCount = 0;
    
      // Initialize sensor
      sensor_3.begin();
    
      // Initialize Arduino pins
      pinMode(0, INPUT_PULLUP);   // Set pin0 (GPIO0) input for button (PCB and external)
      pinMode(25, OUTPUT);        // Set pin25 (GPIO25) as output for LED upload = OK
      pinMode(34, INPUT_PULLUP);  // Set pin12 (GPIO12) input for capturing GM Tube events
      pinMode(35, INPUT_PULLUP);  // Set pin14 (GPIO14) input for capturing GM Tube events
      pinMode(21, OUTPUT);        // Set pin21 (GPIO21) as output for OLED
      pinMode(26, OUTPUT);        // Set pin04 (GPIO26) as output for LED
      
      // Allow external interrupts on INT0 and INT1
      attachInterrupt(digitalPinToInterrupt(34), tube_impulse1, FALLING); //define external interrupts
      attachInterrupt(digitalPinToInterrupt(35), tube_impulse2, FALLING); //define external interrupts
    
      // Set pin13 (GPIO13) as input for DHT sensor
      dht.setup(13, DHTesp::DHT11);
    
      Serial.println(F("--- Start program ---"));
      Serial.println(F("\n"));
      
      // Initialize UART on 115200 baud rate for ethernet shield
      Serial.begin(115200);
      delay(1000);
    
      // Initialize watchdog
      Serial.println(F("\n"));
      Serial.println(F("Initializing WatchDogTimer (WDT)."));
      Serial.println(F("\n"));
      esp_task_wdt_init(WDT_TIMEOUT, true); //enable panic so ESP32 restarts
      esp_task_wdt_add(NULL); //add current thread to WDT watch
    
      // Open Preferences with my-app namespace. Each application module, library, etc
      // has to use a namespace name to prevent key name collisions. We will open storage in
      // RW-mode (second parameter has to be false).
      // Note: Namespace name is limited to 15 chars.
      //preferences.begin("GM-SI-22G", false);
    
      // Remove all preferences under the opened namespace
      //preferences.clear();
    
      // Or remove the counter key only
      //preferences.remove("weekCPMCtr");
    
      // Close the Preferences
      //preferences.end();
    }
    
    void loop()
    {
      newclient();
    
      currentMillis = millis();
    
      // if button is pressed set LCD bool to true
      // turn on LCD
      if((digitalRead(0)== LOW) && (buttonShowLCD == false))
      {
        buttonShowLCD = true;
        Serial.println("button pushed = " + String(digitalRead(0)));
      }
    
      // turn off LCD
      if(buttonShowLCD == false)
      {
        Heltec.display->clear();
        Heltec.display->setContrast(0);
        Heltec.display->display();
      }
    
      if ((event1 == true) || (event2 == true))
      {
        // 1 blink for 50 ms
        blinkLed(1, 50);
        
        event1 = false, event2 = false;
      }
    
      // If reached 01 seconds
      if (currentMillis - previousMillis_1 > 1000)
      {
        previousMillis_1 = currentMillis;
        increaseSecCount++;
    
        // Recalute with tube dead time accounted for actual CPS
        actual_cps_1 = (cps_1 / (1- (cps_1 * tubeDeadTime)));
        actual_cps_2 = (cps_2 / (1- (cps_2 * tubeDeadTime)));
    
        actual_cpm_1 = (cpm_1 / (1- (cpm_1 * tubeDeadTime)));
        actual_cpm_2 = (cpm_2 / (1- (cpm_2 * tubeDeadTime)));
    
        // Add a new datapoint to the moving average array
        // Add both tubes sensors to the combination
        sensorMovingAvg_3 = sensor_3.reading(actual_cps_1);
        sensorMovingAvg_3 = sensor_3.reading(actual_cps_2);
    
        Serial.println(F("--- 01 sec ---"));
        Serial.println("| Tube 1 " + String(increaseSecCount) + " sec current count (cps_1) = " + String(actual_cps_1));
        Serial.println("| Tube 2 " + String(increaseSecCount) + " sec current count (cps_2) = " + String(actual_cps_2));
        Serial.println("| Tubes current total mavg " + String(increaseSecCount) + " sec current count = " + String(sensorMovingAvg_3));
        Serial.println(F("--- 01 sec ---"));
    
        // Print to LCD
        if(buttonShowLCD)
        {
          Heltec.display->clear();
          Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
          Heltec.display->drawString(0, 0, "Current sec. = " + String(increaseSecCount) + " of 60");
          Heltec.display->drawString(0, 10, "CPS 1 = " + String(actual_cps_1) + " | CPS 2 = " + String(actual_cps_2));
          Heltec.display->drawString(0, 20, "MA-CPS = " + String(sensorMovingAvg_3));
          Heltec.display->drawString(0, 30, "Current uSv = " + String(outputSieverts(sensorMovingAvg_3)));
          Heltec.display->drawString(0, 40, "Tubes voltage = " + String(displayTubeVoltage()) + " V");
          Heltec.display->drawString(0, 50, "Last Upload = " + String(uploadOk) + " | retry = " + String(retry));
          Heltec.display->display();
        }
      }
    
      // If reached 10 seconds
      if (currentMillis - previousMillis_2 > 10000)
      {
        previousMillis_2 = currentMillis;
        tenSecCount++;
    
        // Print out for closing the 01 sec group
        Serial.println(F("--- 01 sec ---"));
    
        // Print new line
        Serial.println(F("\n"));
    
        Serial.println(F("--- 10 sec ---"));
        Serial.println("| count " + String(tenSecCount) + " of 6 x 10 seconds");
        Serial.println("| Tubes voltage = " + String(displayTubeVoltage()) + " V");
        Serial.println("| Resetting WDT");
        Serial.println(F("--- 10 sec ---"));
    
        // Print new line
        Serial.println(F("\n"));
    
        // Reset WatchDogTimer
        esp_task_wdt_reset();
      }
    
      // If reached 60 seconds
      if (currentMillis - previousMillis_3 > 60000)
      {
        previousMillis_3 = currentMillis;
    
        totalCount_3 = sensor_3.getAvg();
    
        // Print new line
        Serial.println(F("\n"));
    
        Serial.println(F("--- 60 sec ---"));
        Serial.println("| Tube 1 current 60 sec total count = " + String(actual_cpm_1) + " cpm_1");
        Serial.println("| Tube 2 current 60 sec total counts = " + String(actual_cpm_2) + " cpm_2");
        Serial.println("| Total current 60 sec mavg count = " + String(totalCount_3) + " counts");
        Serial.println("| uSV = " + String(outputSieverts(totalCount_3)) + " uSV");
        Serial.println("| Temperature = " + String(dht.getTemperature()) + "°C");
        Serial.println("| Humidity = " + String(dht.getHumidity()) + "%");
        Serial.println(F("--- 60 sec ---"));
    
        // Print new line
        Serial.println(F("\n"));
    
        // Print to LCD
        if(buttonShowLCD)
        {
          Heltec.display->clear();
          Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
          Heltec.display->drawString(0, 0, "Current second = " + String(increaseSecCount));
          Heltec.display->drawString(0, 10, "CPS 1 = " + String(actual_cps_1) + " | CPS 2 = " + String(actual_cps_2));
          Heltec.display->drawString(0, 20, "MA-CPS total = " + String(totalCount_3));
          Heltec.display->drawString(0, 30, "Current uSv = " + String(outputSieverts(totalCount_3)));
          Heltec.display->drawString(0, 40, "Tubes voltage = " + String(displayTubeVoltage()) + " V");
          Heltec.display->drawString(0, 50, "Last upload = " + String(uploadOk) + " | retry = " + String(retry));
          Heltec.display->display();
        }
    
        Serial.println(F("\n"));
    
        // Store vars into Flash memory of ESP32
        // Minute CPM tube 1, Minute CPM tube 2, total count
        storeInFlash(actual_cpm_1, actual_cpm_2, totalCount_3);
    
        // Connect to RadMon.org
        connecToRadMonLogger();
        
        // Reset variables 
        cps_1 = 0, cps_2 = 0;
        cpm_1 = 0, cpm_2 = 0;
        actual_cps_1 = 0, actual_cps_2 = 0;
        actual_cpm_1 = 0, actual_cpm_2 = 0;
        totalCount_3 = 0;
        sensorMovingAvg_3 = 0;
        
        tenSecCount = 0;
        increaseSecCount = 0;
        
        sensor_3.reset();
        buttonShowLCD = false;
    
        // Print new line
        Serial.println(F("\n"));
      }
    
      // If one week uptime has been reached, reboot device for maintenance.
      if (currentMillis - previousMillis_4 >= ONE_WEEK)
      {
        previousMillis_4 = currentMillis;
        Serial.println(F("Weekly reboot"));
    
        // Clear from Flash Memory
        clearFromFlash();
        
        // Restart ESP32
        ESP.restart();
      }
    }
    
    //------------------------//
    //--- START functions ---//
    //----------------------//
    void WiFiSetup()
    {
      Serial.println(F("\n"));
      Serial.println("Connecting to = " + String(ssid));
      
      WiFi.begin(ssid, password);
      
      // Set up Wifi connection
      while (WiFi.status() != WL_CONNECTED)
      {
        delay(500);
        Serial.print(".");
      }
    
      if(WiFi.status() == WL_CONNECTED)
      {
        Serial.println(F("\n"));
        Serial.println(F("WiFi connected"));
        Serial.println("IP address = " +  String(WiFi.localIP().toString()));
        Serial.println("Gateway = " + String(WiFi.gatewayIP().toString()));
        Serial.println("SubnetMask = " + String(WiFi.subnetMask().toString()));
        Serial.println("DNS 1 = " + String(WiFi.dnsIP(0).toString()));
        Serial.println("DNS 2 = " + String(WiFi.dnsIP(1).toString()));
        Serial.println("MAC = " + String(WiFi.macAddress()));
        server.begin();
        Serial.println(F("HTTP server started"));
        Serial.println(F("\n"));
      }
    
      // Wifi is not connected
      else
      {
          Serial.println(F("WiFi NOT connected"));
          Serial.println(F("HTTP server NOT started"));
          Serial.println(F("\n"));
          WiFiSetup(); // Try again
      }
    }
    
    // Start webserver client
    void newclient()
    {
      WiFiClient client = server.available();   // listen for incoming clients
      
      // if you get a client connection
      if (client)
      {
        Serial.println(F("New remote client connection."));
        
        while (client.connected() && currentMillis - previousMillis_1 <= timeoutTime)
        {
          currentMillis = millis();
    
          String uploadOkStatus = "Failed";
          if(uploadOk == 1)
          {
            uploadOkStatus = "Succeeded";
          }
          else
          {
            uploadOkStatus = "Failed";
          }
    
          // Get vars from Flash memory of ESP32
          readFromFlash();
    
          String color = "#00FF00";
          if(outputSieverts(weekCPMCtr) <= 1000)
          {
            color = "#00FF00";
          }
          else if(outputSieverts(weekCPMCtr) >= 1001 & outputSieverts(weekCPMCtr) <= 3000)
          {
            color = "#FFFF00";
          }
          else
          {
            color = "#FF0000";
          }
    
          String ptr = "HTTP/1.1 200 OK;\n";
          ptr += "Content-type:text/html\n";
          ptr += "\n";
          ptr += "<!DOCTYPE html lang='en'>\n";
          ptr += "<html>\n";
          ptr += "<head>\n";
          ptr += "<title>GM SI-22G : Stationary Logger</title>\n";
          ptr += "<style>\n";
          ptr += "table { font-family: arial, sans-serif; border-collapse: collapse; width: 100%; }\n";
          ptr += "td, th { border: 1px solid #dddddd; text-align: left; padding: 8px; }\n";
          ptr += "tr:nth-child(even) { background-color: #dddddd; }\n";
          ptr += "</style>\n";
          ptr += "</head>\n"; 
          ptr += "<body>\n";
          
          ptr += "<center><h2>GM SI-22G : Stationary Logger</h2></center>\n";
    
          ptr += "<table>\n";
          ptr += "<caption>60 seconds results</caption>\n";
          ptr += "<tr>\n";
          ptr += "<th>Description</th>\n";
          ptr += "<th>Value</th>\n";
          ptr += "<th>Symbol</th>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Counts Per Second Tube 1</td>\n";
          ptr += "<td>" + String(actual_cps_1) + "</td>\n";
          ptr += "<td>CPS</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Counts Per Second Tube 2</td>\n";
          ptr += "<td>" + String(actual_cps_2) + "</td>\n";
          ptr += "<td>CPS</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Moving Average Counts Per Second Tubes 1+2</td>\n";
          ptr += "<td>" + String(sensorMovingAvg_3) + "</td>\n";
          ptr += "<td>maCPS</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>&micro;Sieverts</td>\n";
          ptr += "<td>" + String(outputSieverts(sensorMovingAvg_3)) + "</td>\n";
          ptr += "<td>&micro;SV ☢</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Tubes High Voltage</td>\n";
          ptr += "<td>" + String(displayTubeVoltage()) + "</td>\n";
          ptr += "<td>V</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Temperature</td>\n";
          ptr += "<td>" + String(dht.getTemperature()) + "</td>\n";
          ptr += "<td>℃</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Humidity</td>\n";
          ptr += "<td>" + String(dht.getHumidity()) + "</td>\n";
          ptr += "<td>%</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td colspan='3'><center>Current second <b>" + String(increaseSecCount) + "</b> of <b>60</b> results</center></td>\n";
          ptr += "</tr>\n";
          ptr += "</table>\n";
    
          ptr += "<br />&nbsp;\n";
    
          ptr += "<table>\n";
          ptr += "<caption>Previous minute results</caption>\n";
          ptr += "<tr>\n";
          ptr += "<th>Description</th>\n";
          ptr += "<th>Value</th>\n";
          ptr += "<th>Symbol</th>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Counts Per Minute Tube 1</td>\n";
          ptr += "<td>" + String(prevcpm_1) + "</td>\n";
          ptr += "<td>CPM</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Counts Per Minute Tube 2</td>\n";
          ptr += "<td>" + String(prevcpm_2) + "</td>\n";
          ptr += "<td>CPM</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Moving Average Counts Per Minute Tubes 1+2</td>\n";
          ptr += "<td>" + String(prevMACPM) + "</td>\n";
          ptr += "<td>maCPM</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>&micro;Sieverts</td>\n";
          ptr += "<td>" + String(outputSieverts(prevMACPM)) + "</td>\n";
          ptr += "<td>&micro;SV ☢</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Last upload</td>\n";
          ptr += "<td>" + String(uploadOkStatus) + "</td>\n";
          ptr += "<td>Succeeded or Failed</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Retry count</td>\n";
          ptr += "<td>" + String(retry) + "</td>\n";
          ptr += "<td>of 3</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td colspan='3'><center>Previous minute results</center></td>\n";
          ptr += "</tr>\n";
          ptr += "</table>\n";
    
          ptr += "<br />&nbsp;\n";
    
          ptr += "<table>\n";
          ptr += "<caption>Week results</caption>\n";
          ptr += "<tr>\n";
          ptr += "<th>Description</th>\n";
          ptr += "<th>Value</th>\n";
          ptr += "<th>Symbol</th>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Total Counts this week</td>\n";
          ptr += "<td>" + String(weekCPMCtr) + "</td>\n";
          ptr += "<td>CPM</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Total &micro;Sieverts max dosage this week</td>\n";
          ptr += "<td><progress value=" + String(outputSieverts(weekCPMCtr)) + " max='5000'>" + String(outputSieverts(weekCPMCtr)) + "</progress></td>\n";
          ptr += "<td>&micro;SV ☢</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td style='background-color:" + String(color) + "'>Total &micro;Sieverts max this week</td>\n";
          ptr += "<td style='background-color:" + String(color) + "'>" + String(outputSieverts(weekCPMCtr)) + "</td>\n";
          ptr += "<td style='background-color:" + String(color) + "'>Of max 5000 &micro;SV (5 mSV) ☢</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td colspan='3'><center><b>7 day results</b></center></td>\n";
          ptr += "</tr>\n";
          ptr += "</table>\n";
    
          ptr += "<br />&nbsp;\n";
    
          ptr += "<table>\n";
          ptr += "<caption>Total results since start of counting on 2021-05-01</caption>\n";
          ptr += "<tr>\n";
          ptr += "<th>Description</th>\n";
          ptr += "<th>Value</th>\n";
          ptr += "<th>Symbol</th>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Total Counts</td>\n";
          ptr += "<td>" + String(totCPMCtr) + "</td>\n";
          ptr += "<td>CPM</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td>Total &micro;Sieverts</td>\n";
          ptr += "<td>" + String(outputSieverts(totCPMCtr)) + "</td>\n";
          ptr += "<td>&micro;SV ☢</td>\n";
          ptr += "</tr>\n";
          ptr += "<tr>\n";
          ptr += "<td colspan='3'><center><b>Total counting results</b></center></td>\n";
          ptr += "</tr>\n";
          ptr += "</table>\n";
    
          ptr += "</body>\n";
          ptr += "</html>\n";
          ptr += "\n";
    
          // Print out pointer (ptr)
          client.print(ptr);
    
          // Flush connection
          client.flush(); 
    
          // break out of the while loop:
          break;
        }
        client.flush(); // Flush connection again
        client.stop(); // Stop client
        delay(5);// Give some time to stop
        Serial.println(F("Remote client disconnected."));
      }
    }
    
    // GM Tube fastpulse 01 counting
    void tube_impulse1()
    {
      cps_1++;
      cpm_1++;
      event1 = true;
    }
    
    // GM Tube fastpulse 02 counting
    void tube_impulse2()
    {
      cps_2++;
      cpm_2++;
      event2 = true;
    }
    
    // Convert cpm_1 to uSV
    float outputSieverts(float x) 
    {
      // 0.001714 value for SI-22G
      float y = x * 0.001714;
      return y;
    }
    
    // Measure Tube voltage through A0
    float displayTubeVoltage()
    {
      // read the input on analog pin 27:
      float adcInput = analogRead(27);
    
      // Convert the analog reading (12bit resolution which goes from 0 - 4095) to a voltage (0 - 3.3V):
      // actual lowVoltage = ( adcInput x 3.3V ) / 4095.0 Resolution
      float lowVoltage = ((adcInput * 3.3) / 4095.0);
    
      // Rule of 3 to calculate approx HV
      //float highVoltage = ((lowVoltage * 400) / 2);
      
      // ~190-195 conversion factor according to Alex - RH Electronics 2021-03-15
      // ~171 calculated on 2021-04-01 for Arduino
      // 123.15 calcultated on 2021-05-04 for ESP32
      float highVoltage = (lowVoltage * 123.15);
    
      // Print out voltage
      //Serial.println("| Tubes HV = " + String(highVoltage) + " Volts, A0 LV = " + String(lowVoltage));
    
      return highVoltage;
    }
    
    // Blink the LED (blinks, time)
    void blinkLed(int blinks, int time)
    {                        
        for (int i = 0; i < blinks; i++)
        {
          digitalWrite(26, HIGH);
          delay(time);
          digitalWrite(26, LOW);
          delay(time);
        }
    }
    
    // Blink the LED (blinks, time)
    void blinkLedUpload(int blinks, int time)
    {                        
        for (int i = 0; i < blinks; i++)
        {
          digitalWrite(25, HIGH);
          delay(time);
          digitalWrite(25, LOW);
          delay(time);
        }
    }
    
    // Read from Flash Memory
    void readFromFlash()
    {
      // Open namespace with RW-mode enabled (false)
      preferences.begin("GM-SI-22G", false);
    
      // Get the counter value, if the key does not exist, return a default value of 0
      // Note: Key name is limited to 15 chars.
      weekCPMCtr = preferences.getULong("weekCPMCtr", 0);
      totCPMCtr = preferences.getULong("totCPMCtr", 0);
      
      prevcpm_1 = preferences.getULong("prevcpm_1", 0);
      prevcpm_2 = preferences.getULong("prevcpm_2", 0);
      prevMACPM = preferences.getULong("prevMACPM", 0);
      
      // Close the Preferences
      preferences.end();
    }
    
    // Store into Flash Memory
    // void storeInFlash(unsigned long totalCountVar)
    void storeInFlash(unsigned long actual_cpm_1, unsigned long actual_cpm_2, unsigned long totalCount_3)
    {
      // Open namespace with RW-mode enabled (false)
      preferences.begin("GM-SI-22G", false);
    
      // Increment weekly counts and usv with 60 second and store data
      weekCPMCtr = preferences.getULong("weekCPMCtr", 0) + totalCount_3;
      preferences.putULong("weekCPMCtr", weekCPMCtr);
    
      // Increment total counts and usv with 60 second and store data
      totCPMCtr = preferences.getULong("totCPMCtr", 0) + totalCount_3;
      preferences.putULong("totCPMCtr", totCPMCtr);
    
      // Store the counters to the Preferences
      preferences.putULong("prevcpm_1", actual_cpm_1);
      preferences.putULong("prevcpm_2", actual_cpm_2);
      preferences.putULong("prevMACPM", totalCount_3);
    
      // Close the Preferences
      preferences.end();
    }
    
    // Clear from the Flash Memory
    void clearFromFlash()
    {
      // Open namespace with RW-mode enabled (false)
      preferences.begin("GM-SI-22G", false);
    
      // Remove all preferences under the opened namespace
      //preferences.clear();
    
      // Or remove the counter key only
      preferences.remove("weekCPMCtr");
    
      // Close the Preferences
      preferences.end();
    }
    
    // Upload totalCount_3 to the RadMon.org server
    void connecToRadMonLogger()
    {
      WiFiClient client;
    
      if(retry < 3)
      {
        //if (client.connect(radmonServerIP, radmonServerPort))
        if (client.connect("radmon.org", 80))
        {
          if(client.connected())
          {
            Serial.println(F("Connection to radmon monitoring platform succeeded!"));
    
            client.print(F("GET /radmon.php?function=submit&user="));
            client.print(UserName);
            client.print(F("&password="));
            client.print(DataSendingPassWord);
            client.print(F("&value="));
            client.print(totalCount_3);
            client.print(F("&unit=CPM"));
            client.println(F("HTTP/1.0"));
            client.println(F("HOST: radmon.org"));
            //client.println();
            client.println(F(""));
    
            Serial.println("Uploaded cpm = " + String(totalCount_3));
            
            uploadOk = true;
            retry = 0;
            // 5 blinks for 50 ms
            blinkLedUpload(5, 50);
            
            client.flush(); // Flush connection
            client.stop(); // Stop client
            delay(5);// Give some time to stop
            Serial.println(F("Connection to radmon monitoring platform Disconnected."));
          }
    
          else
          {
            // you didn't get a connection to the Radmon server:
            Serial.println(F("Connection to radmon monitoring platform failed!"));
    
            client.flush(); // Flush connection
            client.stop(); // Stop client
            delay(1);// Give some time to stop
            
            uploadOk = false;
            retry++;
          }
        }
        else
        {
          // you didn't get a connection to the Radmon server:
          Serial.println(F("Connection to radmon monitoring platform failed!"));
    
          client.flush(); // Flush connection
          client.stop(); // Stop client
          delay(1);// Give some time to stop
          
          uploadOk = false;
          retry++;
        }
      }
      else
      {
        Serial.println("Reboot");
        ESP.restart();
      }
    }
    
    // Upload totalCount_3 to the uradmonitor.com server
    void connecToURadMonLogger()
    {
      WiFiClient client;
    
      if(retry < 3)
      {
        if (client.connect("data.uradmonitor.com", 443))
        {
          if(client.connected())
          {
            Serial.println(F("Connection to urad monitoring platform succeeded!"));
    
            
    
            // Below does not work
            String ptr = "GET /data.uradmonitor.com/api/v1/upload/exp/01/";
            ptr += increaseSecCount;
            ptr += totalCount_3;
            ptr += GEIGER_TUBE_SI22G;
            ptr += "\n";
    
            // Print out pointer (ptr)
            client.print(ptr);
    
            Serial.println("Uploaded cpm  = " + String(totalCount_3));
            
            uploadOk = true;
            retry = 0;
            // 5 blinks for 50 ms
            blinkLedUpload(5, 50);
            
            client.flush(); // Flush connection
            client.stop(); // Stop client
            delay(5);// Give some time to stop
            Serial.println(F("Connection to urad monitoring platform Disconnected."));
          }
    
          else
          {
            // you didn't get a connection to the Radmon server:
            Serial.println(F("Connection to urad monitoring platform failed!"));
    
            client.flush(); // Flush connection
            client.stop(); // Stop client
            delay(1);// Give some time to stop
            
            uploadOk = false;
            retry++;
          }
        }
        else
        {
          // you didn't get a connection to the Radmon server:
          Serial.println(F("Connection to urad monitoring platform failed!"));
    
          client.flush(); // Flush connection
          client.stop(); // Stop client
          delay(1);// Give some time to stop
          
          uploadOk = false;
          retry++;
        }
      }
      else
      {
        Serial.println("Reboot");
        ESP.restart();
      }
    }
    
    #28845
    Wolferl
    Moderator

    Hi,

    It looks like you do not include the authentification bits when trying to upload the values.
    Have a look here:
    PDF Documentatioh for API call

    Cheers,
    Wolferl

    #28855
    DonZalmrol
    Participant

    Getting a step closer.

    I now have a correctly formed json to upload the following data:

    10:10:12.021 -> {
    10:10:12.021 ->   "id": "0",
    10:10:12.021 ->   "latitude": "50.989699",
    10:10:12.021 ->   "longitude": "3.503907",
    10:10:12.021 ->   "altitude": "12",
    10:10:12.021 ->   "city": "Deinze",
    10:10:12.021 ->   "country": "BE",
    10:10:12.021 ->   "detector": "SI22G",
    10:10:12.021 ->   "factor": "0.001714",
    10:10:12.068 ->   "timefirst": 1621411811,
    10:10:12.068 ->   "cpm": 86,
    10:10:12.068 ->   "temperature": 22,
    10:10:12.068 ->   "humidity": 49,
    10:10:12.068 ->   "voltage": 406.395
    10:10:12.068 -> }

    However I still see nothing in my dashboard. Believe the issue is still in my authentication.

    Current partial code for uradmon connection:

    // Upload json to the uradmonitor.com server
    void connecToURadMonLogger()
    {
      WiFiClient client;
    
      if(retry < 3)
      {
        if (client.connect("data.uradmonitor.com", 443))
        {
          if(client.connected())
          {
            Serial.println(F("Connection to urad monitoring platform succeeded!"));
            
            uploadJson["timefirst"] = timeClient.getEpochTime();
            uploadJson["cpm"] = totalCount_3;
            uploadJson["temperature"] = dht.getTemperature();
            uploadJson["humidity"] = dht.getHumidity();
            uploadJson["voltage"] = displayTubeVoltage();
    
            // Below does not work
            String ptr = "GET /data.uradmonitor.com/api/v1/upload/exp/01/";
            ptr += "X-User-id:%s\r\nX-User-hash:%s\r\nX-Device-id:%08lX\r\n";
            ptr += USER_ID;
            ptr += USER_KEY;
            ptr += "0";
    
            serializeJsonPretty(uploadJson, ptr);
            serializeJsonPretty(uploadJson, Serial);
    
            // Print out pointer (ptr)
            client.print(ptr);
    
            Serial.println(F("\n"));
            Serial.println("Uploaded cpm  = " + String(totalCount_3));
            
            uploadOk = true;
            retry = 0;
            // 5 blinks for 50 ms
            blinkLedUpload(5, 50);
            
            client.flush(); // Flush connection
            client.stop(); // Stop client
            delay(5);// Give some time to stop
            Serial.println(F("Connection to urad monitoring platform Disconnected."));
          }
    
          else
          {
            // you didn't get a connection to the Radmon server:
            Serial.println(F("Connection to urad monitoring platform failed!"));
    
            client.flush(); // Flush connection
            client.stop(); // Stop client
            delay(1);// Give some time to stop
            
            uploadOk = false;
            retry++;
          }
        }
        else
        {
          // you didn't get a connection to the Radmon server:
          Serial.println(F("Connection to urad monitoring platform failed!"));
    
          client.flush(); // Flush connection
          client.stop(); // Stop client
          delay(1);// Give some time to stop
          
          uploadOk = false;
          retry++;
        }
      }
      else
      {
        Serial.println("Rebooting due uradmonitoring failed connection");
        ESP.restart();
      }
    }

    The used user-id and key I get from my dashboard. For my device ID how can I generate (or request) the correct ID I could use?
    First time using json queries, so its pretty new to me 😉

    #28856
    DonZalmrol
    Participant

    minor update, the fully outprinted json is this:

    11:28:49.410 -> }GET /data.uradmonitor.com/api/v1/upload/exp/01/X-User-id:%s
    11:28:49.410 -> X-User-hash:%s
    11:28:49.410 -> X-Device-id:%08lX
    11:28:49.410 -> XXXYYYZZZ{
    11:28:49.458 ->   "id": "0",
    11:28:49.458 ->   "latitude": "50.989699",
    11:28:49.458 ->   "longitude": "3.503907",
    11:28:49.458 ->   "altitude": "12",
    11:28:49.458 ->   "city": "Deinze",
    11:28:49.458 ->   "country": "BE",
    11:28:49.458 ->   "detector": "SI22G",
    11:28:49.458 ->   "factor": "0.001714",
    11:28:49.458 ->   "timefirst": 1621416528,
    11:28:49.458 ->   "cpm": 72,
    11:28:49.458 ->   "temperature": 22.3,
    11:28:49.458 ->   "humidity": 48,
    11:28:49.458 ->   "voltage": 406.395
    11:28:49.458 -> }

    It looks like my user-id (XXX), user-key (YYY) and device-id (ZZZ) are printed directly under the correct fields.
    Probably has to do with this part of my code where it forces %s\r\n and %8081\r\n:

    // Place get and json in string pointer to upload to platform
     String ptr = "GET /data.uradmonitor.com/api/v1/upload/exp/01/";
     ptr += "X-User-id:<strong>%s\r\n</strong>X-User-hash:<strong>%s\r\n</strong>X-Device-id:<strong>%08lX\r\n</strong>";
     ptr += USER_ID;
     ptr += USER_KEY;
     ptr += "0"; // device ID
    
    #28857
    Wolferl
    Moderator

    Hi,

    I am by no means a JSON guy, but should that code:

      String ptr = "GET /data.uradmonitor.com/api/v1/upload/exp/01/";
            ptr += "X-User-id:%s\r\nX-User-hash:%s\r\nX-Device-id:%08lX\r\n";
            ptr += USER_ID;
            ptr += USER_KEY;
            ptr += "0";

    more read like this?

      String ptr = "GET /data.uradmonitor.com/api/v1/upload/exp/01/\r\n";
            ptr += "X-User-id:" USER_ID "\r\nX-User-Hash:" USER_KEY "\r\nX-Device-id:" DEVICE_ID "\r\n";

    See the CRLF at the GET address end, plus the values inserted at the correct places.
    Also you’ll probably need to supply a correct device id, 0 will not do. You’ll need something like 0x1300xxxx for a KIT1 compatible device.

    HTH,
    Wolferl

    #28860
    DonZalmrol
    Participant

    Looks like I was wrong the whole time with thinking the uploads needs to be in JSON…
    Reworking the whole thing to work with the EXP protocol.

    Current code:

    // Upload data to the uradmonitor.com server
    void connecToURadMonLogger()
    {
      WiFiClient client;
    
      if(retry < 3)
      {
        if (client.connect("data.uradmonitor.com", 80))
        {
          if(client.connected())
          {
            Serial.println(F("Connection to uradmonitoring platform succeeded!"));
    
            // Authentication
            client.print(F("X-User-id:"));
            client.print(USER_ID) + "\r\n";
            client.print(F("X-User-hash:"));
            client.print(USER_KEY) + "\r\n";
            client.print(F("X-Device-id:"));
            client.print(DEVICE_ID) + "\r\n";
    
            // Concat data for POST
            String ptr = "POST http_:_//data.uradmonitor.com/api/v1/upload/exp";  // Do a post call to the API
            ptr += "/01/";                            // compulsory: local time in seconds
            ptr += timeClient.getEpochTime();         // time epoch value
            ptr += "/02/";                            // 02 = optional: temperature in degrees celsius
            ptr += dht.getTemperature();              // temperature value
            ptr += "/04/";                            // 04 = optional: humidity as relative humidity in percentage %
            ptr += dht.getHumidity();                 // humidity value
            ptr += "/0B/";                            // 0B = optional: radiation measured on geiger tube in cpm
            ptr += totalCount_3;                      // a-cpm value
            ptr += "/0C/";                            // 0C = optional: high voltage geiger tube inverter voltage in volts
            ptr += displayTubeVoltage();              // tube voltage value
            ptr += "/10/0x6";                         // 10 = Tube ID | 0x6 = GEIGER_TUBE_SI22G
    
            // Print out pointer (ptr) to client
            client.print(ptr);
            client.println(F(""));
            
            // Test output
            Serial.println(ptr);
    
            Serial.println(F("\n"));
    
            uploadOk = true;
            retry = 0;
            // 5 blinks for 50 ms
            blinkLedUpload(5, 50);
            
            client.flush(); // Flush connection
            client.stop(); // Stop client
            delay(5);// Give some time to stop
            Serial.println(F("Connection to urad monitoring platform Disconnected."));
          }
    
          else
          {
            // you didn't get a connection to the Radmon server:
            Serial.println(F("Connection to urad monitoring platform failed!"));
    
            client.flush(); // Flush connection
            client.stop(); // Stop client
            delay(1);// Give some time to stop
            
            uploadOk = false;
            retry++;
          }
        }
        else
        {
          // you didn't get a connection to the Radmon server:
          Serial.println(F("Connection to urad monitoring platform failed!"));
    
          client.flush(); // Flush connection
          client.stop(); // Stop client
          delay(1);// Give some time to stop
          
          uploadOk = false;
          retry++;
        }
      }
      else
      {
        Serial.println("Rebooting due uradmonitoring failed connection");
        ESP.restart();
      }
    }

    Looks like I can now authenticate and received a device ID when querying with Postman. It states my device is online but my POSTs aren’t getting through…
    Example of the output of one of my POSTs:

    19:28:42.042 -> Connection to uradmonitoring platform succeeded!
    19:28:42.042 -> POST http_:_//data.uradmonitor.com/api/v1/upload/exp/01/1621445321/02/23.00/04/46.00/0B/78/0C/406.39/10/0x6
    19:28:42.091 ->
    19:28:42.091 ->
    19:28:42.549 -> Connection to uradmonitoring platform Disconnected.

    If you POST the result using Postman the values are actually pushed to my dashboard into my device… But not from my ESP32.

    One step forward, two steps back situation 😉

    PS: added _:_ to prevent URLs

    #28861
    DonZalmrol
    Participant

    trying numerous things, would it be possible to check the serverside if my data is coming through?
    Perhaps my post is not formed correctly 🙂

    #28862
    Wolferl
    Moderator

    Hi,

    Install Wireshark on a computer on the same network as your devices and see for yourself how your requests look like.

    Cheers,
    Wolferl

    #28863
    DonZalmrol
    Participant

    Getting a step further as the problem is currently situated in the X-headers.

    21:52:28.951 -> Connection to radmon monitoring platform Disconnected.
    21:52:28.951 -> Connection to uradmonitoring platform succeeded!
    21:52:28.951 -> /01/1621540348/02/21.90/04/47.00/0B/60/0C/406.39/10/0x6
    21:52:28.951 -> I am here now 01
    21:52:31.422 -> X-User-Id:XXXX
    21:52:31.422 -> 
    21:52:31.422 -> X-User-Hash:YYYY
    21:52:31.422 -> 
    21:52:31.422 -> <strong>X-Device-id:0x13000212</strong>
    21:52:31.422 -> 
    21:52:31.422 -> I am here now 02
    21:52:34.401 -> I am here now 03
    21:52:34.447 -> <strong>Status code: 200</strong>
    21:52:34.447 -> <strong>Response: {"error":"Invalid Device ID"}</strong>
    21:52:34.447 -> I am here now 04
    21:52:34.918 -> I am here now 05
    21:52:34.918 -> Connection to uradmonitoring platform Disconnected.
    

    Looks like the connection get established (HTTP code = 200), my X-headers are validated, yet I receive “invalid device ID” for my device.

    Tried “%08lX13000212″,”0x13000212” and “13000212”.

    My current code:

    
    // URadMonitoring credentials
    const char *USER_ID = "XXXX\r\n";
    const char *USER_KEY = "YYYY\r\n";
    const char *DEVICE_ID = "13000212\r\n";
    
    ... minimized code ...
    
    // Upload data to the uradmonitor.com server
    void connecToURadMonLogger()
    {
      WiFiClient wifi;
      HttpClient client = HttpClient(wifi, "data.uradmonitor.com", 80);
    
      Serial.println(F("Connection to uradmonitoring platform succeeded!"));
    
      // Get current time as UNIX time
      time_t epoch = pftime::time(nullptr);
    
      // Concat data for POST
      String ptr = "/01/";                      // compulsory: local time in seconds
      ptr += epoch;                             // time epoch value
      ptr += "/02/";                            // 02 = optional: temperature in degrees celsius
      ptr += dht.getTemperature();              // temperature value
      ptr += "/04/";                            // 04 = optional: humidity as relative humidity in percentage %
      ptr += dht.getHumidity();                 // humidity value
      ptr += "/0B/";                            // 0B = optional: radiation measured on geiger tube in cpm
      ptr += totalCount_3;                      // a-cpm value
      ptr += "/0C/";                            // 0C = optional: high voltage geiger tube inverter voltage in volts
      ptr += displayTubeVoltage();              // tube voltage value
      ptr += "/10/0x6";                         // 10 = Tube ID | 0x6 = GEIGER_TUBE_SI22G
      
      // Test output
      Serial.println(ptr);
    
      Serial.println(F("I am here now 01"));
    
      client.beginRequest();
      client.post("/api/v1/upload/exp");
      client.sendHeader("Content-Type", "application/x-www-form-urlencoded");
      client.sendHeader("Content-Length", ptr.length());
      client.sendHeader("X-User-Id:", String(USER_ID));
      client.sendHeader("X-User-Hash:", String(USER_KEY));
      client.sendHeader("X-Device-id:", String(DEVICE_ID));
      client.beginBody();
      client.print(ptr);
      client.endRequest();
    
      Serial.println("X-User-Id:" + String(USER_ID));
      Serial.println("X-User-Hash:" + String(USER_KEY));
      Serial.println("X-Device-id:" + String(DEVICE_ID));
    
      Serial.println(F("I am here now 02"));
    
      // read the status code and body of the response
      int statusCode = client.responseStatusCode();
      String response = client.responseBody();
    
      Serial.println(F("I am here now 03"));
    
      Serial.print("Status code: ");
      Serial.println(statusCode);
      Serial.print("Response: ");
      Serial.println(response);
    
      Serial.println(F("I am here now 04"));
    
      uploadOk = true;
      retry = 0;
      // 5 blinks for 50 ms
      blinkLedUpload(5, 50);
      
      //client.flush(); // Flush connection
      //client.stop(); // Stop client
      //delay(5);// Give some time to stop
    
      Serial.println(F("I am here now 05"));
      
      Serial.println(F("Connection to uradmonitoring platform Disconnected."));
    }

    Wireshark is not yet possible as my device is in a secured vlan.

    #28864
    DonZalmrol
    Participant

    PS: Also tried with and with CRLF (\r\n).

    #28865
    Wolferl
    Moderator

    Hi

    I think you’ll need to delete the “0x” in front of the device ID.
    The number itself needs to be in hexadecimal though.

    Cheers,
    Wolferl

Viewing 15 posts - 1 through 15 (of 27 total)
  • You must be logged in to reply to this topic.