Arduino mit Liquid Crystal Display und TDS Sensor

Hallo,

bei dem TDS Sensor misst er in ppm. Fast alle funktionen funktionoierren über dem Display. Wenn ich den Sensor in normales Leitungswasser halte ist der ppm Wert 400 , bei Destilliertes Wasser ist er 0 ppm. Wenn ich den Adruino starte und den sensor in das normale Wasser halte zeigt er den richtigen wert an auf dem Display. Wenn ich es in das destillierte halte Zeigt er im Adruino Programm 0 ppm an , aber auf dem Display immer verschiedene Werte von 37 - 84. Hat jemand eine Idee welchen Code verwenden muss das er auf dem display auch das anzeigt wie im serial monitor am pc.

folgenden Code verwende ich:

LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2 rows
#define TdsSensorPin A0
#define VREF 5.0      // analog reference voltage(Volt) of the ADC
#define SCOUNT  35         // sum of sample point
int analogBuffer[SCOUNT];    // store the analog value in the array, read from ADC
int analogBufferTemp[SCOUNT];
int analogBufferIndex = 0,copyIndex = 0;
float averageVoltage = 0,tdsValue = 0,temperature = 25;

void setup()
{
    Serial.begin(115200);
    pinMode(TdsSensorPin, INPUT );
    lcd.init(); // initialize the lcd
  lcd.backlight();
}

void loop()
{
   static unsigned long analogSampleTimepoint = millis();
   if(millis()-analogSampleTimepoint > 40U)     //every 40 milliseconds,read the analog value from the ADC
   {
     analogSampleTimepoint = millis();
     analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin);    //read the analog value and store into the buffer
     analogBufferIndex++;
     if(analogBufferIndex == SCOUNT) 
         analogBufferIndex = 0;
   }   
   static unsigned long printTimepoint = millis();
   if(millis()-printTimepoint > 800U)
   {
      printTimepoint = millis();
      for(copyIndex=0;copyIndex<SCOUNT;copyIndex++)
        analogBufferTemp[copyIndex]= analogBuffer[copyIndex];
      averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF / 1024.0; // read the analog value more stable by the median filtering algorithm, and convert to voltage value
      float compensationCoefficient=1.0+0.02*(temperature-25.0);    //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0));
      float compensationVolatge=averageVoltage/compensationCoefficient;  //temperature compensation
      tdsValue=(128.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5; //convert voltage value to tds value
      //Serial.print("voltage:");
      //Serial.print(averageVoltage,2);
      //Serial.print("V   ");
      Serial.print("TDS Value:");
      Serial.print(tdsValue,0);
      Serial.println("ppm");
  

  lcd.setCursor(0, 0);
  lcd.print("TDS Value : "); 
  lcd.print(tdsValue,0);
  lcd.setCursor(3, 1);
  lcd.print("Techeonics"); 
   }
}
int getMedianNum(int bArray[], int iFilterLen) 
{
      int bTab[iFilterLen];
      for (byte i = 0; i<iFilterLen; i++)
      bTab[i] = bArray[i];
      int i, j, bTemp;
      for (j = 0; j < iFilterLen - 1; j++) 
      {
      for (i = 0; i < iFilterLen - j - 1; i++) 
          {
        if (bTab[i] > bTab[i + 1]) 
            {
        bTemp = bTab[i];
            bTab[i] = bTab[i + 1];
        bTab[i + 1] = bTemp;
         }
      }
      }
      if ((iFilterLen & 1) > 0)
    bTemp = bTab[(iFilterLen - 1) / 2];
      else
    bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
      return bTemp;
}
tippe oder füge den Code hier ein

Nimm das mall raus und Kopiere direkt hinter

return bTemp;

kann sein das der LCD ist zu langsam und macht dir die Probleme.
I²C ist ziemlich langsam.
Ich Schreibe auf allen Displays immer außerhalb irgend einer Funktion.

Was hinter return bTemp; steht, wird ignoriert.
Und ob Code in der Funktion loop() steht oder in einer Funktion, die von loop() nur indirekt aufgerufen wird, ist völlig wurscht. Kein Code steht außerhalb einer Funktion, in C++.

Aber kann sein, dass @fony nur missverständlich (für mich) schreibt.

Wo möglich, hinter return bTemp;ist ende der Loop.

Das habe nicht geschrieben! nur das persönlich habe schon gehabt, das durch unglückliches platzieren der LCD ausgabe hat es gewirkt als wehre ein delay() in die Funktion eingebaut

Dass du für mich sehr schwer verständlich schreibst, interessiert dich vielleicht.

Da kann ich zweimal nicht zustimmen.
Erstens ist I2C nicht prinzpiell langsam und zweitens wird nur alle 800ms auf das Display geschrieben:

Das Problem muss ein anderes sein (ich sehe es momentan noch nicht).

Das paßt nicht zusammen, da ein LCD mit zwei Zeilen nichts auf der vierten anzeigen kann.

Serieller Monitor:

08:24:47.901 -> TDS Value:2148ppm

image