How to edit SDISerial from AVR board (Arduino Uno) to SARM board (MKR 1010 WiFi)?

Hi all,

My current coding for the <SDISerial.h> is for Arduino Uno and I wish to change to Arduino MKR WiFi 1010 Arduino MKR WiFi 1010 Datasheet. How to change the code from Arduino Uno to Arduino MKR WiFi 1010.

/* code reads Decagon GS3 sensor output to the serial terminal.
WHITE wire: power supply/excitation, connected to 5v pin
RED wire: data line, connected to Arduino pin 2 (or another interrupt-capable pin)
bare wire: connected to GND
*/
 
#include <SDISerial.h>
 
 
#define INPUT_SIZE 30
#define NUMSAMPLES 5
#define INVERTED 1
#define DATA_PIN 4
 
int sensorDelay = 1000;
// bulk density used to calculate porewater conductivity (g/cm3)
float bulkDens = 0.4;  
// mineral density assumed to be 2.65 Mg/m3 (used 
// in porewater calculation from eq. 3 from GS-3 manual)
float theta = 1 - (bulkDens / 2.65); 
char* samples; 
 
 
SDISerial sdi_serial_connection(DATA_PIN, INVERTED);


void setup() {
  sdi_serial_connection.begin();
  Serial.begin(921600); 
  Serial.println("Start Initialized\n");
  delay(1000);
}
 
 
void loop() {
  
  uint8_t i;
  // arrays to hold reps
  float dielectric[NUMSAMPLES];
  float soilMoist[NUMSAMPLES];
  float degC[NUMSAMPLES];
  float bulkEC[NUMSAMPLES];
  float porewaterEC[NUMSAMPLES];
  float solutionEC[NUMSAMPLES];
   
  // mean values
  float dielMean        = 0.0;
  float soilMoistMean   = 0.0;
  float degCMean        = 0.0;
  float bulkECMean      = 0.0;
  float porewaterECMean = 0.0;
  float solutionECMean  = 0.0;
 
  // take repeated samples
  for (i = 0; i < NUMSAMPLES; i++) {
    //char* response = get_measurement(); // get measurement data
    samples = get_measurement();
    while (strlen(samples) < 5) {
      samples = get_measurement();  
    }
  
    // first term is the sensor address (irrelevant to me)
    char* term1 = strtok(samples, "+");
     
    // second term is the dielectric conductivity & soil moisture
    term1      = strtok(NULL, "+");
    dielectric[i] = atof(term1);
               
    term1 = strtok(NULL, "+");
    degC[i] = atof(term1);
    term1 = strtok(NULL, "+");
    bulkEC[i] = atof(term1);
    // see eqs. 1 + 2 from GS3 manual (dS/m)
    porewaterEC[i] = ((80.3 - 0.37 * (degC[i] - 20)) * bulkEC[i] / 1000) / (dielectric[i] - 6);
   
   if (bulkEC[i] < 5) {
     soilMoist[i]  = (5.89 * pow(10.0, -6.0) * pow(dielectric[i], 3.0)) - (7.62 * pow(10.0, -4.0) * 
     pow(dielectric[i], 2.0)) + (3.67 * pow(10.0, -2.0) * dielectric[i]) - (7.53 * pow(10.0, -2.0));
   } else {
   soilMoist[i]  =  0.118 * sqrt(dielectric[i]) -0.117;
   }  
    // calculate EC of solution removed from a saturated soil paste, 
    // according to Decagon GS3 manual
    // see page 8 of GS3 manual (eq. 4)
    solutionEC[i] =  (bulkEC[i] / 1000 * soilMoist[i]) / theta; 
 
    // sum with each iteration
    dielMean        += dielectric[i];
    soilMoistMean   += soilMoist[i];
    degCMean        += degC[i];
    bulkECMean      += bulkEC[i];
    porewaterECMean += porewaterEC[i];
    solutionECMean  += solutionEC[i];
  }
   
  // Average readings for each parameter
  dielMean        /= NUMSAMPLES;
  soilMoistMean   /= NUMSAMPLES;
  degCMean        /= NUMSAMPLES;
  bulkECMean      /= (NUMSAMPLES / 0.001);
  porewaterECMean /= NUMSAMPLES;
  solutionECMean  /= NUMSAMPLES;
 
//  Serial.print("dielectric: ");
//  Serial.println(dielMean, 3);
  Serial.print("VWC (m3/m3): ");
  Serial.println(soilMoistMean, 3);
  Serial.print("Degree (C): ");
  Serial.println(degCMean, 1);
  Serial.print("bulk EC (dS/m): ");
  Serial.println(bulkECMean, 3);
//  Serial.print("Solution EC (dS/m): ");
//  Serial.println(solutionECMean, 4);
//  Serial.print("porewater EC (dS/m): "); 
//  Serial.println(porewaterECMean, 4);
  delay(sensorDelay);
  Serial.println("\n");
}

char* get_measurement(){
        // function by Joran Beasley: https://github.com/joranbeasley/SDISerial/blob/master/examples/SDISerialExample/SDISerialExample.ino
    char* service_request = sdi_serial_connection.sdi_query("?M!", sensorDelay);
    //you can use the time returned above to wait for the service_request_complete
    char* service_request_complete = sdi_serial_connection.wait_for_response(sensorDelay);
    // 1 second potential wait, but response is returned as soon as it's available
    return sdi_serial_connection.sdi_query("?D0!", sensorDelay);
}
 

After trying to upload the code, I got error as shown below.

C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:126:2: error: #error This version of SoftwareSerial supports only 20, 16 and 8MHz processors
 #error This version of SoftwareSerial supports only 20, 16 and 8MHz processors
  ^~~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp: In member function 'bool SDISerial::listen()':
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:189:23: error: 'SREG' was not declared in this scope
     uint8_t oldSREG = SREG;
                       ^~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:189:23: note: suggested alternative: 'SING'
     uint8_t oldSREG = SREG;
                       ^~~~
                       SING
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:190:5: error: 'cli' was not declared in this scope
     cli();
     ^~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:190:5: note: suggested alternative: 'Gclk'
     cli();
     ^~~
     Gclk
In file included from C:\Users\matebook\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.8.13\cores\arduino/Arduino.h:51:0,
                 from C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:43:
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp: In member function 'void SDISerial::setTX(uint8_t)':
C:\Users\matebook\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.8.13\variants\mkrwifi1010/variant.h:49:35: error: invalid conversion from 'PortGroup*' to 'uint8_t {aka unsigned char}' [-fpermissive]
 #define digitalPinToPort(P)      (&(PORT->Group[g_APinDescription[P].ulPort]))
                                  ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:365:18: note: in expansion of macro 'digitalPinToPort'
   uint8_t port = digitalPinToPort(tx);
                  ^~~~~~~~~~~~~~~~
C:\Users\matebook\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.8.13\variants\mkrwifi1010/variant.h:52:41: error: base operand of '->' is not a pointer
 #define portOutputRegister(port) (&(port->OUT.reg))
                                         ^
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:366:27: note: in expansion of macro 'portOutputRegister'
   _transmitPortRegister = portOutputRegister(port);
                           ^~~~~~~~~~~~~~~~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp: In member function 'void SDISerial::sdi_cmd(const char*)':
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:376:20: error: 'SREG' was not declared in this scope
  uint8_t oldSREG = SREG;
                    ^~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:376:20: note: suggested alternative: 'SING'
  uint8_t oldSREG = SREG;
                    ^~~~
                    SING
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp: In member function 'char* SDISerial::service_request(const char*, const char*)':
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:410:70: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
  if (service_request_response == NULL || service_request_response == '\0')return NULL;
                                                                      ^~~~
In file included from C:\Users\matebook\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.8.13\cores\arduino/Arduino.h:51:0,
                 from C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:43:
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp: In member function 'void SDISerial::setRX(uint8_t)':
C:\Users\matebook\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.8.13\variants\mkrwifi1010/variant.h:49:35: error: invalid conversion from 'PortGroup*' to 'uint8_t {aka unsigned char}' [-fpermissive]
 #define digitalPinToPort(P)      (&(PORT->Group[g_APinDescription[P].ulPort]))
                                  ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:421:18: note: in expansion of macro 'digitalPinToPort'
   uint8_t port = digitalPinToPort(rx);
                  ^~~~~~~~~~~~~~~~
C:\Users\matebook\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.8.13\variants\mkrwifi1010/variant.h:53:41: error: base operand of '->' is not a pointer
 #define portInputRegister(port)  (&(port->IN.reg))
                                         ^
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:422:26: note: in expansion of macro 'portInputRegister'
   _receivePortRegister = portInputRegister(port);
                          ^~~~~~~~~~~~~~~~~
In file included from C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:42:0:
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp: In member function 'void SDISerial::begin()':
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:431:41: error: 'table' was not declared in this scope
    _rx_delay_centering = pgm_read_word(&table[0].rx_delay_centering);
                                         ^
C:\Users\matebook\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.8.13\cores\arduino/api/deprecated-avr-comp/avr/pgmspace.h:103:56: note: in definition of macro 'pgm_read_word'
 #define pgm_read_word(addr) (*(const unsigned short *)(addr))
                                                        ^~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:431:41: note: suggested alternative: 'tanl'
    _rx_delay_centering = pgm_read_word(&table[0].rx_delay_centering);
                                         ^
C:\Users\matebook\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.8.13\cores\arduino/api/deprecated-avr-comp/avr/pgmspace.h:103:56: note: in definition of macro 'pgm_read_word'
 #define pgm_read_word(addr) (*(const unsigned short *)(addr))
                                                        ^~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:441:6: error: 'digitalPinToPCICR' was not declared in this scope
  if (digitalPinToPCICR(_receivePin))
      ^~~~~~~~~~~~~~~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:441:6: note: suggested alternative: 'digitalPinToPort'
  if (digitalPinToPCICR(_receivePin))
      ^~~~~~~~~~~~~~~~~
      digitalPinToPort
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:443:43: error: 'digitalPinToPCICRbit' was not declared in this scope
    *digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin));
                                           ^~~~~~~~~~~~~~~~~~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:443:43: note: suggested alternative: 'digitalPinToPort'
    *digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin));
                                           ^~~~~~~~~~~~~~~~~~~~
                                           digitalPinToPort
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:443:39: error: '_BV' was not declared in this scope
    *digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin));
                                       ^~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:443:39: note: suggested alternative: '_B'
    *digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin));
                                       ^~~
                                       _B
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:444:5: error: 'digitalPinToPCMSK' was not declared in this scope
    *digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin));
     ^~~~~~~~~~~~~~~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:444:5: note: suggested alternative: 'digitalPinToPort'
    *digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin));
     ^~~~~~~~~~~~~~~~~
     digitalPinToPort
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:444:43: error: 'digitalPinToPCMSKbit' was not declared in this scope
    *digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin));
                                           ^~~~~~~~~~~~~~~~~~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:444:43: note: suggested alternative: 'digitalPinToPort'
    *digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin));
                                           ^~~~~~~~~~~~~~~~~~~~
                                           digitalPinToPort
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp: In member function 'void SDISerial::end()':
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:459:7: error: 'digitalPinToPCMSK' was not declared in this scope
   if (digitalPinToPCMSK(_receivePin))
       ^~~~~~~~~~~~~~~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:459:7: note: suggested alternative: 'digitalPinToPort'
   if (digitalPinToPCMSK(_receivePin))
       ^~~~~~~~~~~~~~~~~
       digitalPinToPort
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:460:45: error: 'digitalPinToPCMSKbit' was not declared in this scope
     *digitalPinToPCMSK(_receivePin) &= ~_BV(digitalPinToPCMSKbit(_receivePin));
                                             ^~~~~~~~~~~~~~~~~~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:460:45: note: suggested alternative: 'digitalPinToPort'
     *digitalPinToPCMSK(_receivePin) &= ~_BV(digitalPinToPCMSKbit(_receivePin));
                                             ^~~~~~~~~~~~~~~~~~~~
                                             digitalPinToPort
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:460:41: error: '_BV' was not declared in this scope
     *digitalPinToPCMSK(_receivePin) &= ~_BV(digitalPinToPCMSKbit(_receivePin));
                                         ^~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:460:41: note: suggested alternative: '_B'
     *digitalPinToPCMSK(_receivePin) &= ~_BV(digitalPinToPCMSKbit(_receivePin));
                                         ^~~
                                         _B
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp: In member function 'virtual size_t SDISerial::write(uint8_t)':
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:516:21: error: 'SREG' was not declared in this scope
   uint8_t oldSREG = SREG;
                     ^~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:516:21: note: suggested alternative: 'SING'
   uint8_t oldSREG = SREG;
                     ^~~~
                     SING
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:517:3: error: 'cli' was not declared in this scope
   cli();  // turn off interrupts for a clean txmit
   ^~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:517:3: note: suggested alternative: 'Gclk'
   cli();  // turn off interrupts for a clean txmit
   ^~~
   Gclk
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:521:26: error: 'XMIT_START_ADJUSTMENT' was not declared in this scope
   tunedDelay(_tx_delay + XMIT_START_ADJUSTMENT);
                          ^~~~~~~~~~~~~~~~~~~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp: In member function 'virtual void SDISerial::flush()':
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:571:21: error: 'SREG' was not declared in this scope
   uint8_t oldSREG = SREG;
                     ^~~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:571:21: note: suggested alternative: 'SING'
   uint8_t oldSREG = SREG;
                     ^~~~
                     SING
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:572:3: error: 'cli' was not declared in this scope
   cli();
   ^~~
C:\Users\matebook\Documents\Arduino\libraries\SDISerial-master\SDISerial.cpp:572:3: note: suggested alternative: 'Gclk'
   cli();
   ^~~
   Gclk
exit status 1
Error compiling for board Arduino MKR WiFi 1010.

How to change the code, so that it is possible to run in Arduino MKR WiFi 1010.
Thanks.
Regards,
Storm

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.