| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #include <SPI.h>
- // 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
- }
|