Sida 2 av 3

Re: Mäta thermoelement?

Postat: 4 juni 2011, 20:54:36
av JB
Glömde nämna att seriell kommunikation är ett måste, det var därför jag fastnade för Maxen, arduinons analoga ingångar är endast på 10 bitar och jag behöver minst 12 bitars upplösning.
Därför föll AD-kretsarna bort från början.

Re: Mäta thermoelement?

Postat: 4 juni 2011, 20:59:41
av Mindmapper
Kontakterna påverkar inte så mycket om man har det som kalla lödstället och kompenserar för temperaturen där.

Svårt att säga vad det beror på med bara en mätning. Det är lättare att dra slutsatser om man vet ett par mätpunkter. Offra isen till lördagsgroggen. Blanda till en isvattenlösning med is som smälter. Då ligger du runt 0 grader. Koka vatten i en annan kastrull, runt 100 grader. Ta upp värden och jämför med tabellen, titta också på att det stämmer mV/grader mellan 0 - 100.
Har du en bra referanstermometer kan du mäta och se vid andra grader.

Re: Mäta thermoelement?

Postat: 5 juni 2011, 15:24:53
av JB
Hmm får ingen ordning på det, postar koden här så kanske någon hacker kan hitta något fel.
Jag läser alltså av SO-pinnen på chipet och postar varje läsning på LCDn för att kunna se vad som händer och sedan läser jag in bitarna 4 till 15 som är temperaturavläsningen, detta delas sedan i 4 för att få fram rätt temperatur, 1023.75*C ger värdet 4096.
Databladet till chippet finns här: http://datasheets.maxim-ic.com/en/ds/MAX6675.pdf

// include the library code:
#include <SerialLCD.h>
#include <NewSoftSerial.h> //this is a must
#include <EEPROM.h>
// initialize the library
SerialLCD slcd(1,2);//this is a must, assign soft serial pins

// MAX6675 Pins
#define SCK 3
#define SO 4
#define CS1 5
//
int SOSTATE = 0;
int TEMP1 = 0;
int BITNR = 0;





//--------------------------------------------SETUP----------------------------------------------------

void setup() {
//MAX6675 Pins
pinMode(SCK, OUTPUT);
pinMode(SO, INPUT);
pinMode(CS1, OUTPUT);
digitalWrite (CS1, HIGH); //Avaktivera seriell kommunikation med chip
digitalWrite (SCK, LOW); //Klockutgång låg
slcd.begin();
// Print a message to the LCD.
slcd.print("TEMPAGG 0.1");
delay(1000);
Serial.begin(9600);
slcd.clear(); //Clear LCD

}

//----------------------------------------------LOOP---------------------------------------------------

void loop() {
slcd.setCursor(0, 0);
BITNR = 11 ;
digitalWrite (CS1, LOW); //Aktivera chip 1
for (int i=0; i <= 15; i++){ //Loopa 16ggr
delay(5);
digitalWrite (SCK, HIGH); //Klockutgång hög
delay(5);
SOSTATE = digitalRead(SO); //Läs av data
slcd.print(SOSTATE, DEC); //Visa data på LCD
digitalWrite (SCK, LOW); //Klockutgång låg
if (i > 3 && i < 16){ //Skriv bitar 4 till 15
bitWrite(TEMP1, BITNR, SOSTATE); //Skriv bitar och räkna ned BITNR
--BITNR;
}

digitalWrite (CS1, HIGH); //Avaktivera chip 1

slcd.setCursor(0, 1);
slcd.print(" ");
slcd.setCursor(0, 1);
TEMP1 = TEMP1 / 4; //Dela värde från chip med 4
delay(10);
slcd.print(TEMP1, DEC); //Skriv till LCDn
delay(200);

Re: Mäta thermoelement?

Postat: 5 juni 2011, 16:10:28
av GFEF
Swech
>Termoelement kan säkert tolkas på många olika sätt

http://sv.wikipedia.org/wiki/Termoelement

Ett termoelement lämnar en låg späning och
kan driva en känslig voltmeter direkt gradera i temperatur.
Men i mätning ingår temperaturen på voltmeters anslutningar

Övrig angivana mätaelemet är motstånds givare.
Kräver strömkälla MEN på verkas inte av tempraturen vid mätaren.

http://en.wikipedia.org/wiki/Resistance_thermometer

"They are slowly replacing the use of thermocouples in many industrial applications below 600 °C, due to higher accuracy and repeatability."

Re: Mäta thermoelement?

Postat: 5 juni 2011, 16:24:11
av janaf
Det är inte så att värdet från givaren är i Kelvin :humm:

//Ändrat: Nej det är inte kelvin.
Bits D14–D3 contain the converted temperature in the order of MSB to LSB.
Har lite svårt att tolka det där. Ligger dom i omvänd ordning eftersom det står från D14 till D3, alltså D3 är LSB? Eller hur ska man tolka det?

//Ändrat: läste lite till och ja, LSB kommer som tredje bit medan MSB är den 14:e

Re: Mäta thermoelement?

Postat: 5 juni 2011, 16:50:30
av JB
Ja omvänd ordning fattar jag det som, jag har hursomhelst testat att vända på det utan framgång.

Re: Mäta thermoelement?

Postat: 5 juni 2011, 19:17:44
av janaf
sedan läser jag in bitarna 4 till 15
Ska det inte vara 3-14?

//Ändrat, dvs i=2-13 ?

Re: Mäta thermoelement?

Postat: 5 juni 2011, 21:38:37
av Tripp
Testa att öka delay(200); till delay(600);

MAX6675 kräver ca 500mS.

Re: Mäta thermoelement?

Postat: 8 juni 2011, 21:13:03
av JB
janaf skrev:
sedan läser jag in bitarna 4 till 15
Ska det inte vara 3-14?

//Ändrat, dvs i=2-13 ?
Jo det verkar stämma, tack för det, jag tänkte nog på från andra hållet :)
Nu visar den mer rätt iaf, nu visar den runt 55*C här inne, kan tänka mig att det är runt 25 nånting.

600ms i delay gjorde ingen skillnad tyvärr.

Re: Mäta thermoelement?

Postat: 8 juni 2011, 21:18:46
av TomasL
Vilket värde HEX/BIN får du från kretsen (ta med alla 16 bitarna)

Re: Mäta thermoelement?

Postat: 8 juni 2011, 21:34:53
av JB
Tex 0000001110101000

Fattar inte att jag inte har kollat det innan, fjärde bakifrån och framåt blir 87, delat med 4 blir det 21.75*C vilket ju är mer rimligt med tanke på att jag inte har rätt givare.
Så det verkar som att jag får rätt information från kretsen, då gäller det bara att hitta var det blir fel i koden.
Det finns hopp igen :)
Nu hinner jag tyvärr inte med mer idag dock, får fila mer på det imorgon.

Re: Mäta thermoelement?

Postat: 8 juni 2011, 22:45:37
av TomasL
hm

Kod: Markera allt

TEMP1 = TEMP1 / 4; //Dela värde från chip med 4
delay(10);
slcd.print(TEMP1, DEC); //Skriv till LCDn
TEMP1 / 4;
är inte TEMP1>>2 lättare, och enklare
slcd.print(TEMP1, DEC); Vad gör detta?

Re: Mäta thermoelement?

Postat: 9 juni 2011, 21:28:44
av JB
Jo det kanske det är :)
slcd.print skriver det jag vill på lcd displayen.

Nu har jag hittat ett fel till, en byte är ju bara 8, jag tänkte att det kunde vara 16 så endast 8 av bitarna kom med innan.
Nu har jag fått in dem i två bytes och ska "bara" lägga ihop dem och ta bort bitarna som inte ska vara med.

Så här ser det ut nu:

// include the library code:
#include <SerialLCD.h>
#include <NewSoftSerial.h> //this is a must
#include <EEPROM.h>
// initialize the library
SerialLCD slcd(1,2);//this is a must, assign soft serial pins

// MAX6675 Pins
#define SCK 3
#define SO 4
#define CS1 5
//
int SOSTATE = 0;
int TEMP1 = 0;
int BITNR = 0;
int BITNR2 = 0;
byte HBYTE = 0;
byte LBYTE = 0;

//--------------------------------------------SETUP----------------------------------------------------

void setup() {
//MAX6675 Pins
pinMode(SCK, OUTPUT);
pinMode(SO, INPUT);
pinMode(CS1, OUTPUT);
digitalWrite (CS1, HIGH); //Avaktivera seriell kommunikation med chip
digitalWrite (SCK, LOW); //Klockutgång låg
slcd.begin();
// Print a message to the LCD.
slcd.print("TEMPAGG 0.1");
delay(1000);
Serial.begin(9600);
slcd.clear(); //Clear LCD

}

//----------------------------------------------LOOP---------------------------------------------------

void loop() {
slcd.setCursor(0, 0);
BITNR = 0 ;
BITNR2 = 0 ;
digitalWrite (CS1, LOW); //Aktivera chip 1
for (int i=0; i <= 15; i++){ //Loopa 16ggr
delay(5);
digitalWrite (SCK, HIGH); //Klockutgång hög
delay(5);
SOSTATE = digitalRead(SO); //Läs av data
slcd.print(SOSTATE, DEC); //Visa data på LCD

digitalWrite (SCK, LOW); //Klockutgång låg

if (i < 8) //Om Y är mindre än 8 skriv till HBYTE
{ bitWrite(HBYTE, BITNR, SOSTATE);
++BITNR; }
else
{
bitWrite(LBYTE, BITNR2, SOSTATE); //Om större, skriv till LBYTE
++BITNR2;
}





}

digitalWrite (CS1, HIGH); //Avaktivera chip 1

slcd.setCursor(0, 1);
slcd.print(" ");
slcd.setCursor(0, 1);
//TEMP1 = TEMP1 / 4;
delay(10);
slcd.print(HBYTE, DEC); //visa decimalt på lcdn för att se om bytarna har rätt värden
slcd.setCursor(7, 1);
slcd.print(LBYTE, DEC);
delay(5000);

Re: Mäta thermoelement?

Postat: 9 juni 2011, 21:35:14
av TomasL
slcd.print skriver det jag vill på lcd displayen.
, visst det förstår jag, men du har ett argument "DEC" exakt vad gör det?

Re: Mäta thermoelement?

Postat: 10 juni 2011, 14:19:21
av Borre
lcd.print(data, BASE)

Parameters

lcd: a variable of type LiquidCrystal

data: the data to print (char, byte, int, long, or string)

BASE (optional): the base in which to print numbers: BIN for binary (base 2), DEC for decimal (base 10), OCT for octal (base 8), HEX for hexadecimal (base 16).