SalinitV2.ino 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <SPI.h>
  2. // ADC ADS8345 connections
  3. const int CS_PIN = 10; // Chip Select pin for ADS8345
  4. const int ADC_CHANNEL = 2; // Channel 2 for ADS8345
  5. // Calibration values
  6. const int numCalPoints = 5;
  7. float knownSalinities[numCalPoints] = {0.00, 10.00, 20.00, 30.00, 35.00}; // Known salinities in g/L
  8. float rawValues[numCalPoints]; // Raw ADC values for calibration points
  9. // Temperature compensation
  10. float temperature = 25.0; // Default temperature in Celsius
  11. // Function to read ADC value
  12. float readADC(int channel) {
  13. // Select ADC channel
  14. digitalWrite(CS_PIN, LOW);
  15. SPI.transfer(0x80 | (channel << 4));
  16. uint16_t result = SPI.transfer(0x00) << 8;
  17. result |= SPI.transfer(0x00);
  18. digitalWrite(CS_PIN, HIGH);
  19. return result * 5.0 / 65536.0; // Convert ADC value to voltage (assuming 5V reference)
  20. }
  21. // Function to calibrate the electrode
  22. void calibrateElectrode() {
  23. for (int i = 0; i < numCalPoints; i++) {
  24. Serial.print("Immerse the electrode in the solution with ");
  25. Serial.print(knownSalinities[i]);
  26. Serial.println(" g/L salinity.");
  27. delay(10000); // Wait for the user to immerse the electrode
  28. rawValues[i] = readADC(ADC_CHANNEL);
  29. Serial.print("Calibration value for ");
  30. Serial.print(knownSalinities[i]);
  31. Serial.print(" g/L: ");
  32. Serial.println(rawValues[i]);
  33. }
  34. }
  35. // Function to calculate salinity using linear interpolation
  36. float calculateSalinity(float rawValue, float temp) {
  37. // Find the two calibration points surrounding the raw value
  38. float salinity = 0.0;
  39. for (int i = 0; i < numCalPoints - 1; i++) {
  40. if (rawValue >= rawValues[i] && rawValue <= rawValues[i + 1]) {
  41. // Linear interpolation
  42. salinity = (rawValue - rawValues[i]) * (knownSalinities[i + 1] - knownSalinities[i]) / (rawValues[i + 1] - rawValues[i]) + knownSalinities[i];
  43. break;
  44. }
  45. }
  46. // Temperature compensation (using a simple linear model)
  47. float tempCoefficient = 0.02; // Change this coefficient based on your electrode's characteristics
  48. salinity *= 1.0 + tempCoefficient * (temp - 25.0);
  49. return salinity;
  50. }
  51. void setup() {
  52. Serial.begin(9600);
  53. SPI.begin();
  54. pinMode(CS_PIN, OUTPUT);
  55. digitalWrite(CS_PIN, HIGH);
  56. calibrateElectrode();
  57. }
  58. void loop() {
  59. float rawValue = readADC(ADC_CHANNEL);
  60. float salinity = calculateSalinity(rawValue, temperature);
  61. Serial.print("Raw ADC value: ");
  62. Serial.print(rawValue);
  63. Serial.print(", Salinity: ");
  64. Serial.print(salinity);
  65. Serial.println(" g/L");
  66. delay(1000); // Read every second
  67. }