Sida 3 av 4
Re: Tempgivare LM335 ger konstiga värden
Postat: 30 juni 2010, 19:04:31
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
Re: Tempgivare LM335 ger konstiga värden
Postat: 30 juni 2010, 19:35:58
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

Re: Tempgivare LM335 ger konstiga värden
Postat: 30 juni 2010, 19:37:21
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

Re: Tempgivare LM335 ger konstiga värden
Postat: 1 juli 2010, 00:20:54
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 ??
Re: Tempgivare LM335 ger konstiga värden
Postat: 1 juli 2010, 00:27:06
av TomasL
Schemor är viktigt, rita ett och posta det.
Re: Tempgivare LM335 ger konstiga värden
Postat: 1 juli 2010, 16:34:03
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
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
Re: Tempgivare LM335 ger konstiga värden
Postat: 1 juli 2010, 17:21:38
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 !?
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 ?
Re: Tempgivare LM335 ger konstiga värden
Postat: 1 juli 2010, 17:26:35
av Borre
Det finns färdigt 1-wire kod för bland annat DS18x20 på arduino.cc.
Re: Tempgivare LM335 ger konstiga värden
Postat: 1 juli 2010, 17:55:50
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?

, 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 !?
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
Re: Tempgivare LM335 ger konstiga värden
Postat: 1 juli 2010, 17:59:58
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
Re: Tempgivare LM335 ger konstiga värden
Postat: 1 juli 2010, 18:29:46
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.
Re: Tempgivare LM335 ger konstiga värden
Postat: 1 juli 2010, 19:04:00
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".
Re: Tempgivare LM335 ger konstiga värden
Postat: 1 juli 2010, 21:08:01
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.
Re: Tempgivare LM335 ger konstiga värden
Postat: 1 juli 2010, 21:22:53
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...
Re: Tempgivare LM335 ger konstiga värden
Postat: 1 juli 2010, 21:32:38
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