Skocz do zawartości

DFRobot Gravity - analogowy czujnik TDS, czystości wody dla Arduino


Pomocna odpowiedź

Napisano

Sprawa taka . w sklepie Botland zamówiłem sobie dwa takie moduły.

https://botland.com.pl/pl/seria-gravity/10830-dfrobot-gravity-analogowy-czujnik-tds-czystosci-wody-dla-arduino.html

Jeśli chodzi o sklep to wszystko w najlepszym porządku. Jest jednak maleńki problem. Podają tam link do strony producenta a tenże producent podaje kod który się nie kompiluje.

Lekko mnie to skonsternowało dlatego zwracam się o pomoc w znalezieniu odpowiedzi na pytanie - co jest z tym kodem nie tak.

Tu link do kodu:

https://wiki.dfrobot.com/Gravity__Analog_TDS_Sensor___Meter_For_Arduino_SKU__SEN0244

/***************************************************
 DFRobot Gravity: Analog TDS Sensor / Meter For Arduino
 <https://www.dfrobot.com/wiki/index.php/Gravity:_Analog_TDS_Sensor_/_Meter_For_Arduino_SKU:_SEN0244>

 Created 2017-8-22
 By Jason <[email protected]@dfrobot.com>

 GNU Lesser General Public License.
 See <http://www.gnu.org/licenses/> for details.
 All above must be included in any redistribution

 /***********Notice and Trouble shooting***************
 1. This code is tested on Arduino Uno and Leonardo with Arduino IDE 1.0.5 r2 and 1.8.2.
 2. More details, please click this link: <https://www.dfrobot.com/wiki/index.php/Gravity:_Analog_TDS_Sensor_/_Meter_For_Arduino_SKU:_SEN0244>
 ****************************************************/

#define TdsSensorPin A1
#define VREF 5.0      // analog reference voltage(Volt) of the ADC
#define SCOUNT  30           // 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);
}

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=(133.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");
   }
}
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;
}

 

to ten pierwszy.

 

Cytat


C:\Users\marek\OneDrive\Dokumenty\Arduino\TDS\TDS.ino: In function 'int getMedianNum(int*, int)':

TDS:70:32: error: expected ']' before numeric constant

         if (bTab > bTab[i++ 1])

                                ^

TDS:70:32: error: expected ')' before numeric constant

TDS:70:33: error: expected primary-expression before ']' token

         if (bTab > bTab[i++ 1])

                                 ^

TDS:72:24: error: expected '}' at end of input

         bTemp = bTab;

                        ^

TDS:72:24: error: expected '}' at end of input

TDS:72:24: error: expected '}' at end of input

exit status 1
expected ']' before numeric constant

 

To są błędy składni C, bo jak gdzieś jest i++ to już jest wiadomo, że i+1  i extra jedynki się nie pisze bo to jak napisać w parametrach 1 i 1, np, 3+1 1. 

 

  • Lubię! 2

Coś z publikacją tego kodu mogło pójść nie tak, trudno się spodziewać, by adres mailowy wyglądał tak: "By Jason <[email protected]@dfrobot.com>".

Tam jest do ściągnięcia biblioteka, w niej nie ma takich kwiatków, choć czy działa to trudno powiedzieć. Po prostu trzeba usiąść do tego pliku i pobawić się w Kopciuszka, sprawdzając jaki to ma sens co tu jest pokazane.

Powinno być i+1 (przecież to zwykły bubblesort do policzenia mediany i nie ma co się bawić w groch i popiół).

Co do różnych publikowanych programów - te kody przechodzą przez fafnaście różnych chytrych rączek oraz jeszcze chytrzejszych programów formatujących tekst i czasem nie zawsze wychodzi to, programista miał na myśli.

A poza tym zdarzało mi się znaleźć potężne babole np. w programach publikowanych przez Googla jako oficjalne biblioteki do ichniejszego API (szczytowym ich osiągnięciem by kod, który się wykładał jeśli chciałeś zrobić upload filmu na youtuba powyżej 1 MB).

  • Lubię! 2

Mnie się wydaje, że kiedyś tam było i+1 i ktoś zaczął przerabiać na poprawne ideologicznie i++ i mu się odechciało w trakcie sprawdzić jaki był globalny efekt podmiany jednego ciągu znaków na inny. No i tam był mak w popiele, groch to inna bajka...

(edytowany)
18 godzin temu, kaczakat napisał:

No i tam był mak w popiele, groch to inna bajka...

Nie znasz się na bajkach 😛

Cytat

...muszę wciąż jak kocmołuch
wybierać groch z popiołu.
Smutny jest los Kopciuszka!

Jan Brzechwa, Kopciuszek

Edytowano przez ethanak

No to z Brzechwy niezły ignorant - plagiator,  bo to była bajka braci Grimm z makiem i popiołem. Z grochem byłoby 5 minut roboty - sito, płukanie i impreza, czyli tak jak teraz CTR+F i zamień. Ale rymu by nie było.  

Jakich braci Grimm... dwa wieki Ci uciekły. To oni byli znanymi plagiatorami m. in. Charlesa Perraulta (XVII wiek). Bajka w różnych wersjach znana jest od baaardzo dawna, zarówno Perrault, jak i Brzechwa czy bracia Grimm stworzyli jedynie adaptacje literackie i trudno tu mówić o jakimkolwiek "oryginale".

BTW. z makiem i popiołem też by szybko poszło - trochę chemii i po robocie 🙂

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...