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