Question

Je suis sur le projet 8 dans le livre de Mario Boehmer, commençant Android Adk avec Arduino. J'utilise une thermistance de 10 000 avec les valeurs suivantes, mais ma température indique 6531.0c, ce qui est évidemment incorrect.

long r0 = 10000;
long beta = 4050;

// temperature in kelvin at at 25 celsius
double t0 = 298.15;
// value of second resistor
long additional_resistor = 10000;
// input voltage
float v_in = 5.0;

Les lectures du moniteur série sont les suivantes:

currentThermistorResistance: 128378.38
currentTemperatureInDegrees: -22.16
convertedValue: -221
voltageMeasured: 0.36

Le code complet est comme suit:

#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>

#define COMMAND_TEMPERATURE 0x4
#define INPUT_PIN_0 0x0

// Size: 5mm
// Resistance: 10KΩ
// Temperature: -30°C to +125°C
// Tolerance: ±10%

//-----
//change those values according to your thermistor's datasheet
// original
// long r0 = 4700;
// long beta = 3980;

//new
long r0 = 10000;
long beta = 4050;
//-----

// temperature in kelvin at at 25 celsius
double t0 = 298.15;
// value of second resistor
long additional_resistor = 10000;
// input voltage
float v_in = 5.0;

double r_inf;
double currentThermistorResistance;

/*
AndroidAccessory(const char *manufacturer,
                 const char *model,
                 const char *description,
                 const char *version,
                 const char *uri,
                 const char *serial);
*/

AndroidAccessory acc("UW MHCID",
             "HCID TempSense",
             "A temperature sensing android application",
             "0.1",
             "https://github.com/pdugan20/hcid-temp-sense",
             "0000000012345678");

byte sntmsg[6];

void setup() {
  Serial.begin(19200);
  acc.powerOn();
  // changed from powerOn() to begin()
  // acc.begin();
  sntmsg[0] = COMMAND_TEMPERATURE;
  sntmsg[1] = INPUT_PIN_0;
  r_inf = r0 * (exp((-beta) / t0));
}

void loop() {
  if (acc.isConnected()) {
    int currentADCValue = analogRead(INPUT_PIN_0);

    float voltageMeasured = getCurrentVoltage(currentADCValue);
    double currentThermistorResistance = getCurrentThermistorResistance(voltageMeasured);
    double currentTemperatureInDegrees = getCurrentTemperatureInDegrees(currentThermistorResistance);

    // multiply the float value by 10 to retain one value behind the decimal point before converting
    // to an integer for better value transmission
    int convertedValue = currentTemperatureInDegrees * 10;

    sntmsg[2] = (byte) (convertedValue >> 24);  
    sntmsg[3] = (byte) (convertedValue >> 16);  
    sntmsg[4] = (byte) (convertedValue >> 8);  
    sntmsg[5] = (byte) convertedValue;
    acc.write(sntmsg, 6);
    delay(100);
  }
}

// "reverse ADC calculation"
float getCurrentVoltage(int currentADCValue) {
  return v_in * currentADCValue / 1024;
}

// rearranged voltage divider formula for thermistor resistance calculation
double getCurrentThermistorResistance(float voltageMeasured) {
  return ((v_in * additional_resistor) - (voltageMeasured * additional_resistor)) / voltageMeasured; 
}

//Steinhart-Hart B equation for temperature calculation
double getCurrentTemperatureInDegrees(double currentThermistorResistance) {
  return (beta / log(currentThermistorResistance / r_inf)) - 273.15; 
}

Quelqu'un a-t-il des idées? Mon code complet est ici: https://github.com/pdugean20/hcid-temp-sense

La thermistance en question est une 103 dans la fiche technique suivante: https://drive.google.com/file/d/0bwon70droimfz0frz2vssvhkq00/edit? USP= Partage

Était-ce utile?

La solution

Eh bien c'était idiot ... J'utilisais une résistance de 1k au lieu d'une résistance de 10k. Remplacé le matériel et fonctionne maintenant correctement. Merci à tous pour votre aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top