Potrzebuję przetłumaczyć kod Arduino do Bascom, a konkretnie chodzi mi o to, że posiadam moduł: DFRobot Gravity - analogowy czujnik TDS, czystości wody dla Arduino znalazłem kod dla Arduino, a dla Bascom niestety nic nie ma
Jak dobrze rozumiem to pierwszy kod jest kodem podstawowym, gdzie po prostu odczytuję moduł:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- /***************************************************
- 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 <jason.ling@dfrobot.com@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;
- }
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- /***************************************************
- DFRobot Gravity: Analog TDS Sensor/Meter
- <https://www.dfrobot.com/wiki/index.php/Gravity:_Analog_TDS_Sensor_/_Meter_For_Arduino_SKU:_SEN0244>
- ***************************************************
- This sample code shows how to read the tds value and calibrate it with the standard buffer solution.
- 707ppm(1413us/cm)@25^c standard buffer solution is recommended.
- Created 2018-1-3
- By Jason <jason.ling@dfrobot.com@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 with Arduino IDE 1.0.5 r2 and 1.8.2.
- 2. Calibration CMD:
- enter -> enter the calibration mode
- cal:tds value -> calibrate with the known tds value(25^c). e.g.cal:707
- exit -> save the parameters and exit the calibration mode
- ****************************************************/
- #include <EEPROM.h>
- #include "GravityTDS.h"
- #define TdsSensorPin A1
- GravityTDS gravityTds;
- float temperature = 25,tdsValue = 0;
- void setup()
- {
- Serial.begin(115200);
- gravityTds.setPin(TdsSensorPin);
- gravityTds.setAref(5.0); //reference voltage on ADC, default 5.0V on Arduino UNO
- gravityTds.setAdcRange(1024); //1024 for 10bit ADC;4096 for 12bit ADC
- gravityTds.begin(); //initialization
- }
- void loop()
- {
- //temperature = readTemperature(); //add your temperature sensor and read it
- gravityTds.setTemperature(temperature); // set the temperature and execute temperature compensation
- gravityTds.update(); //sample and calculate
- tdsValue = gravityTds.getTdsValue(); // then get the value
- Serial.print(tdsValue,0);
- Serial.println("ppm");
- delay(1000);
- }
*Wszytko robię na ATmega328P z wewnętrznym napięciem odniesienia 1.1V i do tego rezystorowy dzielnik napięcia 12k do VCC i 11k do GND (moduł daje sygnał analogowy 0-2.3V) Dodatkowo będzie czujnik temperatury DS18B20
PS
A może jeszcze inaczej zapytam... O co tu w ogóle chodzi, jak ja mam odczytany sygnał ADC przeliczyć (uwzględniając temperaturę) na EC/TDS?
W sumie jak będę znał jakimi wzorami się posłużyć to już reszta z górki