#include // ADC ADS8345 connections const int CS_PIN = 10; // Chip Select pin for ADS8345 const int ADC_CHANNEL = 2; // Channel 2 for ADS8345 // Calibration values const int numCalPoints = 5; float knownSalinities[numCalPoints] = {0.00, 10.00, 20.00, 30.00, 35.00}; // Known salinities in g/L float rawValues[numCalPoints]; // Raw ADC values for calibration points // Temperature compensation float temperature = 25.0; // Default temperature in Celsius // Function to read ADC value float readADC(int channel) { // Select ADC channel digitalWrite(CS_PIN, LOW); SPI.transfer(0x80 | (channel << 4)); uint16_t result = SPI.transfer(0x00) << 8; result |= SPI.transfer(0x00); digitalWrite(CS_PIN, HIGH); return result * 5.0 / 65536.0; // Convert ADC value to voltage (assuming 5V reference) } // Function to calibrate the electrode void calibrateElectrode() { for (int i = 0; i < numCalPoints; i++) { Serial.print("Immerse the electrode in the solution with "); Serial.print(knownSalinities[i]); Serial.println(" g/L salinity."); delay(10000); // Wait for the user to immerse the electrode rawValues[i] = readADC(ADC_CHANNEL); Serial.print("Calibration value for "); Serial.print(knownSalinities[i]); Serial.print(" g/L: "); Serial.println(rawValues[i]); } } // Function to calculate salinity using linear interpolation float calculateSalinity(float rawValue, float temp) { // Find the two calibration points surrounding the raw value float salinity = 0.0; for (int i = 0; i < numCalPoints - 1; i++) { if (rawValue >= rawValues[i] && rawValue <= rawValues[i + 1]) { // Linear interpolation salinity = (rawValue - rawValues[i]) * (knownSalinities[i + 1] - knownSalinities[i]) / (rawValues[i + 1] - rawValues[i]) + knownSalinities[i]; break; } } // Temperature compensation (using a simple linear model) float tempCoefficient = 0.02; // Change this coefficient based on your electrode's characteristics salinity *= 1.0 + tempCoefficient * (temp - 25.0); return salinity; } void setup() { Serial.begin(9600); SPI.begin(); pinMode(CS_PIN, OUTPUT); digitalWrite(CS_PIN, HIGH); calibrateElectrode(); } void loop() { float rawValue = readADC(ADC_CHANNEL); float salinity = calculateSalinity(rawValue, temperature); Serial.print("Raw ADC value: "); Serial.print(rawValue); Serial.print(", Salinity: "); Serial.print(salinity); Serial.println(" g/L"); delay(1000); // Read every second }