Tempgivare LM335 ger konstiga värden

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
MDGrein
Inlägg: 64
Blev medlem: 1 april 2007, 21:06:21
Skype: mdgrein
Ort: Skövde

Re: Tempgivare LM335 ger konstiga värden

Inlägg av MDGrein »

Sodjan:
Det var jag som var lite snabb och ryckte i fel kabel, dödade både reläet och dioden :)

danielr112:
Vi övervakar terrariet i nuläget med 1-wire kopplat till en pico-ITX men den rackarn hänger sig ju efter någon vecka. Att låta något sådant sköta styrning är inte ett alternativ så vi tänkte "ska det bli gjort får man göra det själv" :)

Har dock lokaliserat ett paket med kretsar som gör det "lätt" att kommunicera med 1-wire i Arduino plattformen

EDIT1:
Har detaljstuderat detta nu och det är verkligen dioden som sabbar temperaturmätningen även om reläet spelar in.

Mina mätningar och fynd:
Bara relä: 5volten ligger på 5.06 med odraget relä och på 5.03 med draget. Temperaturvärdet gick från 36.19 till 37.69.
Bara diod: 5volten ligger på 5.06 med släckt diod och på 5.01 med tänd. Temperaturvärdet gick från 42.17 till 46.16.

EDIT2:
Hade vänt på temperaturvärdena för diodens testomgång, nu är dom rätt
Senast redigerad av MDGrein 30 juni 2010, 19:36:16, redigerad totalt 1 gång.
danielr112
Inlägg: 8092
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

Re: Tempgivare LM335 ger konstiga värden

Inlägg av danielr112 »

Är ju jättelätt att läsa av en 1wire via en Uc. Och då får du korekta värden direkt fast de får man ju med denne med om man gjort rätt :)
Användarvisningsbild
MDGrein
Inlägg: 64
Blev medlem: 1 april 2007, 21:06:21
Skype: mdgrein
Ort: Skövde

Re: Tempgivare LM335 ger konstiga värden

Inlägg av MDGrein »

Rätt från början är för enkelt :)
Är det lika enkelt att läsa av ett 1-wire nätverk?

EDIT:
Det visar sig att Arduinon har en inbygg spänningsreferens på 1.1V.
http://www.arduino.cc/en/Reference/AnalogReference skrev: Configures the reference voltage used for analog input. The analogRead() function will return 1023 for an input equal to the reference voltage. The options are:

* DEFAULT: the default analog reference of 5 volts (on 5V Arduino boards) or 3.3 volts (on 3.3V Arduino boards)
* INTERNAL: an built-in reference, equal to 1.1 volts on the ATmega168 or ATmega328 and 2.56 volts on the ATmega8.
* EXTERNAL: the voltage applied to the AREF pin is used as the reference.
Hittade även lite kod som använder den för att mäta (gissar jag) spänningen på den interna 5V kretsen.

Nu ska ni se när jag blandar ihop allt och förmodligen sätter eld på något :)
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Tempgivare LM335 ger konstiga värden

Inlägg av sodjan »

> Har detaljstuderat detta nu och det är verkligen dioden som sabbar temperaturmätningen även om reläet spelar in.

Är det så jäkla svårt att tala om *hur* den där LED'en är inkopplad ??
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46921
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Tempgivare LM335 ger konstiga värden

Inlägg av TomasL »

Schemor är viktigt, rita ett och posta det.
Användarvisningsbild
MDGrein
Inlägg: 64
Blev medlem: 1 april 2007, 21:06:21
Skype: mdgrein
Ort: Skövde

Re: Tempgivare LM335 ger konstiga värden

Inlägg av MDGrein »

Lyckades efter många timmar programmatiskt korrigera temperaturgivaren med hjälp av Arduinons inbyggda 1.1V referens och nu ändrar sig inte värdet mer än någon tiondel precis när lasten ändras för att sedan korrigera sig automagiskt.
För att ytterligare öka exaktheten läser jag av 50gånger och tar ett genomsnitt av dessa.
Eftersom det dock är två analoga mätningar (1.1V referensen + givaren) / avläsning och AD-omvandlaren behöver "vila" i 10 millisekunder mellan varje får man nöja sig med att få en temperaturavläsning varje sekund.

Jag är rätt nöjd faktiskt :)

Eftersom projektet numera fungerar precis som det ska postar jag samtliga detaljer ifall det är någon som vill göra något liknande.

Schema
Bild

Bild

Kod

Kod: Markera allt

/*
  Analog input, analog output, serial output
 
 Reads an analog input pin, maps the result to a range from 0 to 255
 and uses the result to set the pulsewidth modulation (PWM) of an output pin.
 Also prints the results to the serial monitor.
 
 The circuit:
 * potentiometer connected to analog pin 0.
   Center pin of the potentiometer goes to the analog pin.
   side pins of the potentiometer go to +5V and ground
 * LED connected from digital pin 9 to ground
 
 created 29 Dec. 2008
 by Tom Igoe

 Fruktansvärt modifierad av Andreas Grehn
 
 */

// These constants won't change.  They're used to give names
// to the pins used:
const int analogInPin = 0;  // Analog input pin that the potentiometer is attached to
const int analogOutPin = 9; // Analog output pin that the LED is attached to

const int redPin = 10;
const int greenPin = 11;
const int relayPin = 4;
const int relayLed = 5;

const float toHot = 27.5;      //Starttemperatur för fläkten
const float coldEnuf = 27.3;      //När denna nås stänger fläkten av

int sensorValue = 0;        // value read from the sensor
int sensorSampleCount = 50;
float sensorSamplesTotal = 0;

float sensorMVolt = 0;
float temperatureC = 0;

float bitVoltValue = 0;

boolean relayStatus = 0;

int incomingByte = 0;	// for incoming serial data

float tempMax = 0;
float tempMin = 999;
long int fanStarts = 0;

boolean on = 1;

void setup() {
  // initialize serial communications at 9600 bps:
  //analogReference(INTERNAL);
  Serial.begin(9600); 
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);  
  pinMode(relayPin, OUTPUT); 
  pinMode(relayLed, OUTPUT); 
}

void loop() {
  if (on) {
    for (int i=0; i < sensorSampleCount; i++) {
      //dessa tre rader behövs för att få korrekta värden från den interna 1.1v referensen
      //Varför har jag ingen aning om
      //Stulna från http://code.google.com/p/tinkerit/wiki/SecretVoltmeter
      ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
      delay(2); // Wait for Vref to settle
      ADCSRA |= _BV(ADSC); // Convert

      bitVoltValue = 1100.0/analogRead(14);
      delay(10);
      /*
      Serial.print(" 1.1V = ");
      Serial.print(bitVoltValue, DEC);
      */
      sensorValue = analogRead(analogInPin);
      delay(10);
      sensorSamplesTotal += (sensorValue*bitVoltValue); 
      //Serial.print(sensorSamplesTotal, DEC);
      //Serial.print("<-total current->");
      //Serial.println(sensorValue);
    }
    sensorValue = sensorSamplesTotal/sensorSampleCount;
    sensorSamplesTotal = 0;
    
    //sensorMVolt = sensorValue*4.9814; 
    sensorMVolt = sensorValue; 
    temperatureC = (sensorMVolt/10.0) - 273.1;
    
    /*
    Serial.print(" Sensor Nu = " );                       
    Serial.print(sensorValue);     
    Serial.print(" MVolt = ");
    Serial.print(sensorMVolt);
    */
    
    if (temperatureC < tempMin) { tempMin = temperatureC; }
    if (temperatureC > tempMax) { tempMax = temperatureC; }

    Serial.print("Temp current:");
    Serial.print(temperatureC);
    Serial.print(" max:");
    Serial.print(tempMax);
    Serial.print(" min:");
    Serial.print(tempMin);
    Serial.print(". Fanstarts:");
    Serial.println(fanStarts);
    

  // wait 10 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading
    //delay(10);
    
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, HIGH);
    
    if (temperatureC >= toHot) {
      relayOn();
    }
    else if (temperatureC <= coldEnuf) {
      relayOff();
    }
  }
  else {
    analogWrite(analogOutPin, 0);  
    digitalWrite(greenPin, LOW);
    digitalWrite(redPin, HIGH);
    relayOff();
  }
  
  // send data only when you receive data:
  if (Serial.available() > 0) {
    // read the incoming byte:
    incomingByte = Serial.read();
      
    // say what you got:
    Serial.print("I received: ");
    Serial.println(incomingByte, DEC);
    if (incomingByte == 49) {
      //en etta "1"
      on = 1; 
      Serial.println("Turning on");
    }
    else if (incomingByte == 48) {
      //en tvåa "2"
      on = 0;
      Serial.println("Shutting down");
    }
    else if (incomingByte == 114) {
      //ett r "r"
      relaySwitch();
    }
  }
  
}

void relayOn() {
  if (relayStatus == false) {
    fanStarts++;
    relayStatus = true;
    digitalWrite(relayPin, HIGH);
    digitalWrite(relayLed, HIGH);
    //Serial.println("Relay turned ON");
  }
}

void relayOff() {
  if (relayStatus == true) {
    relayStatus = false;
    digitalWrite(relayPin, LOW);
    digitalWrite(relayLed, LOW);
    //Serial.println("Relay turned OFF");
  }
}

void relaySwitch() {
  if (relayStatus) {
    relayOff();
  } else {
    relayOn();
  }
}
Stort tack till alla som hjälpt mig med mina bekymmer
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Tempgivare LM335 ger konstiga värden

Inlägg av sodjan »

OK, vi tar det en gång till...

Kan du beskriva exakt *HUR* den där "Relästatus LED" är inkopplad ?

Så som du har ritat det ser det ut att vara *utan* strömbegränsningsmotstånd,
vilket i och för sig skulle kunna förklara dina kraftiga dippar i matningsspänningen
och det skulle i så fall även stämma med mina misstankar. Du har ju ritat in
andra motstånd så man undrar ju...

Samma fråga gäller naturligstvis även för den röd/gröna lysdioden.

Notera att det alltså finns en jäkligt bra anledning till att jag ber dig beskriva hur
det är kopplat. Du har inte reagerat på att jag upprepade gånger har frågat om
just det !? :roll:

Med fel inkopplad lysdioder så är troligtsvis dina "många timmar" med den interna
1.1V referensen i stort sätt bortkastade.

> Eftersom det dock är två analoga mätningar (1.1V referensen + givaren) / avläsning

Blir det ?
Ersätter inte bara 1.1V referensen den vanliga ? Varför blir det dubbla läsningar ?
Borre
Inlägg: 4606
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: Tempgivare LM335 ger konstiga värden

Inlägg av Borre »

Det finns färdigt 1-wire kod för bland annat DS18x20 på arduino.cc.
Användarvisningsbild
MDGrein
Inlägg: 64
Blev medlem: 1 april 2007, 21:06:21
Skype: mdgrein
Ort: Skövde

Re: Tempgivare LM335 ger konstiga värden

Inlägg av MDGrein »

sodjan skrev:Så som du har ritat det ser det ut att vara *utan* strömbegränsningsmotstånd,
vilket i och för sig skulle kunna förklara dina kraftiga dippar i matningsspänningen
och det skulle i så fall även stämma med mina misstankar. Du har ju ritat in
andra motstånd så man undrar ju...
Behöver man ha sådana? :oops:, dioden ska ju ha 5Volt och det är ju (ungefär) vad som finns, trodde man bara hade motstånd för att minska ner spänningen, säg att man har 5V men dioden ska ha 3V.
sodjan skrev: Notera att det alltså finns en jäkligt bra anledning till att jag ber dig beskriva hur
det är kopplat. Du har inte reagerat på att jag upprepade gånger har frågat om
just det !? :roll:
Det är noterat
sodjan skrev: Ersätter inte bara 1.1V referensen den vanliga ? Varför blir det dubbla läsningar ?
Man kan använda 1.1V referensen som analog referens, men då blir det hiskeligt fel eftersom AD-omvandlaren då har 1023 bundet till 1.1V istället för 5V.

Det jag gör är att jag läser av 1.1referensen genom AD omvandlaren, brukar bli runt 240.
Sedan dividerar jag 1100 (1.1V) med det värdet för att få fram exakt hur många millivolt det går på ett "steg" (1100/240=4.583) 4,583 är även ganska exakt vad multimetern visar på 5V pinnen.
Då vet jag att varje "steg" är värt 4.583mV.
När jag sedan läser av tempsensorn tar jag dess värde multiplicerat med antalet millivolt/steg. Exempelvis 600 på sensorpinnen betyder 2749,8mV (600*4,583)
Enda som är kvar att göra då är att omvandla till Celsius ((2749,8/10)-273) 1,98Celsius.
Det blir rätt eftersom AD-omvandlaren får stå krav på standardinställningen råkar jag bara ha 4.5volt istället för 5 kompenseras det genom att värdet på stegen ändras.

Därför krävs det 2 läsningar / mätning
Senast redigerad av MDGrein 1 juli 2010, 18:04:29, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Tempgivare LM335 ger konstiga värden

Inlägg av sodjan »

Gör din hemläxa kring lysdioder. Du har fullständigt tokfel i det mesta.
Inte konstigt att du fick problem. Det finns en del på wikin:
http://elektronikforumet.com/wiki/index ... le=Lysdiod
Användarvisningsbild
MDGrein
Inlägg: 64
Blev medlem: 1 april 2007, 21:06:21
Skype: mdgrein
Ort: Skövde

Re: Tempgivare LM335 ger konstiga värden

Inlägg av MDGrein »

sodjan skrev:Du har fullständigt tokfel i det mesta.
Uppenbarligen, visst vet jag att min elektonikkunskap är begränsad men jisses...

Har monterat dit motstånd nu, 5volten rör sig bara med några hundradelar när lasten ändras. Från 5.12 med diod och relä av till 5.07 med diod och relä igång.
Den rör sig dock så mitt programmatiska kompenserande behövs fortfarande för att få så stabila värden det går :)

EDIT
Kör jag Arduinon med extern strömkälla (inte via USB) står 5volten helt still på 5.01.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Tempgivare LM335 ger konstiga värden

Inlägg av sodjan »

Vad har du för motstånd och vilken ström har du räknat med ?
De flesta lysdioder klarar i och för sig upp till 20 mA men de flesta
moderna lysdioder behöver bara någon eller ett par mA för att fungera
som idikatorer, d.v.s då man bara ska "se" dom och de inte ska
"lysa upp".
Användarvisningsbild
MDGrein
Inlägg: 64
Blev medlem: 1 april 2007, 21:06:21
Skype: mdgrein
Ort: Skövde

Re: Tempgivare LM335 ger konstiga värden

Inlägg av MDGrein »

Räknade ganska exakt som exemplet i wikin förutom att jag har grön diod som google meddelade mig har ett framspänningsfall på 2.1V, vidare antod jag att den ville ha 15mA, har ingen aning om vad den ska ha dock.

Jag räknade exakt såhär: 5V-2.1V=2.9V 2.9/0,015=193.333....Ohm

Kopplade dubbla 100Ohm på alla "3" dioderna (relästatus + den tvåfärgade). 5volten håller sig nu som sagt stabilare när den är matad via USB och tillräckligt stabil för att multimetern inte ska ge utslag när jag matar den externt.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Tempgivare LM335 ger konstiga värden

Inlägg av sodjan »

Ska ha och ska ha... :-) Hela det sättet att tänka är lite galet.
En lysdiod "ska" inte "ha" något speciell ström alls. Det finns en ström som är
maxvärdet (normalt 20-30 mA) men det finns ingen undre gräns !

I just detta fall så räcker du ju att du kan *se* att lysdioden ändra läge (släckt/tänd).
Alltså använder man så stort motstånd som möjlig som fortfarande ger en acceptabel indikering.
All ström utöver det är bara bortkastad. Det finns ingen anledning att "bränna av" ström om
det inte behövs. 15 mA är ganska mycket för en lysdiod som bara ska "synas", i alla fall om vi talar
om inomhusbruk. De flesta moderna standardlysdioder syns helt OK med 1-2 mA (inomhus).
Är det utomhus i dagsljus kan det vara en annan sak...

15 mA är även lite onödigt mycket för en vanlig I/O-pinne på en PIC/AVR mikrokontroller.

När jag "labbar" på en labbplatta så brukar jag runtinmässigt sätta dit 1 Kohm per LED.
Mest för att jag brukar ha många 1Kohm motstånd, men det fungerar även normalt helt OK.

Och (för att ansluta tillbaka till vad tråden handlar om) ju lägre ström genom lysdioderna
ju mindre störningar uppstår ! Alltså, så låg ström som möjligt (så att man fortfarande ser
lysdioden bekvämt) är också "rätt" ström...
Användarvisningsbild
MDGrein
Inlägg: 64
Blev medlem: 1 april 2007, 21:06:21
Skype: mdgrein
Ort: Skövde

Re: Tempgivare LM335 ger konstiga värden

Inlägg av MDGrein »

Ah, det är så det hänger ihop.

Får ta och skaffa mig fler motstånd med andra ord, för tillfället har jag bara 100,320 och några få 460 Ohm.
Om jag inte ska använda en drös 5k pots istället :)

Som du förstått för lääääängesen är jag rätt grön på detta så komponentlagret är inte direkt imponerande
Skriv svar