Sida 1 av 1
Hur fås ett mätvärde stabilt från SMT160 i Arduino
Postat: 17 februari 2016, 17:12:33
av Drivmedel
Har inte mycket kunskap om Arduino programmering, men har programmerat i PLC, ASEMBLER och BASIC för länge sedan, så Arduino är nytt för mig, jag har alltså ingen direkt kunskap av högnivå språk.
Har börjat testa lite med en Arduino uno.
Hade ett chip SMT160 för temp mätning i mina gömmer, hitta ett program på nätet för att läsa av chipet.
Har hittat en del här och på nätet men hajar inte riktigt jag är nybörjare ju.
Här nedan är programsnutten som mäter och printar ut på displayen.
Mätvärdet fluktuerar så jag vill gör någon form av beräkning så det blir stabilare för att sätta ett gränsvärde på.
Så jag är tacksam om någon kan hjälpa mig på traven.
Kod: Markera allt
void loop()
{
now = micros();
if (now - lastOutput > 500000) {
hcf = highCount;
ssf = sampleSize;
temperature = ((hcf / ssf) -0.32)/0.0047;
Serial.print(highCount);
Serial.print(" / ");
Serial.print(sampleSize);
Serial.print(" temp: ");
Serial.println(temperature);
lastOutput = now;
sampleSize = 0;
highCount = 0;
lcd.setCursor(11,1);
lcd.print (temperature);
}
}
Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino
Postat: 17 februari 2016, 17:44:08
av Icecap
Slår värdet vilt eller mer sansat?
Om det är en mindre avvikelse brukar man antingen att spara de senaste mätningar (t.ex. 8 st) och göra ett medelvärde som sedan presenteras. Man kan även vikta värdet på ett vettigt sätt.
Själv använder jag ofta ett mjukvaru-lågpassfilter som kan ställas till att vara olika grader av trögt.
Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino
Postat: 17 februari 2016, 18:07:12
av sodjan
Först en detalj.. Använd gärna code-taggarna för programkod.
[/code]
Det skulle nog se ut så här:
Kod: Markera allt
void loop()
{
now = micros();
if (now - lastOutput > 500000) {
hcf = highCount;
ssf = sampleSize;
temperature = ((hcf / ssf) -0.32)/0.0047;
Serial.print(highCount);
Serial.print(" / ");
Serial.print(sampleSize);
Serial.print(" temp: ");
Serial.println(temperature);
lastOutput = now;
sampleSize = 0;
highCount = 0;
lcd.setCursor(11,1);
lcd.print (temperature);
}
}
Är det både hcf, ssf och temperature som varierar? Och hur mycket,
inom vilka gränser? Exempel!
Sen så blir jag inte helt klar över koden. Var kommer mätvärdet in
från sensorn? Vad ger avläsnigen egentligen för värden? Den verkar
ge en fyrkantssignal med variabel pullsbredd, så den måste läsas
av med något slags timer. D.v.s. att man får en viss variation redan
vid avläsningen ("sampling noise"). Sen så kan man kanske välja
metod för avläsningen så att man slipper beräkningar med t.ex.
division med 0.0047, det är inte speciellt effektivt. Eller en annan
metod för beräkningen med t.ex. uppslagning i tabeller.
Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino
Postat: 17 februari 2016, 20:51:26
av Drivmedel
SMT16030 är en givare som ger ut en frekvens mellan 1-4kHz. -68grd.C till +145grd.C
programmet funkar men temperaturen fluktuerar på mer än en grad.
Tänkte bara det måste gå och göra en enkel program "snutt" som fixar till medelvärdet.
Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino
Postat: 17 februari 2016, 21:07:57
av Castor
Om man söker på "smt16030 arduino" finns det ett antal sidor med bla olika program, förmodligen har någon haft samma problem som du och hittat en lösning.
Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino
Postat: 17 februari 2016, 21:30:11
av zealotry
"Dum" grej o googla fram svaret på. Jag fick känslan av att TS vill lära sig programmera lite mer. Flytande medelvärde över dom senaste x läsningarna är en jättebra liten övning.
För att räkna ut medlet behöver du spara ett antal mätningar, summera deras värden och sedan dividera summan med antalet mätvärden för att få medelvärdet. Går ju att göra på tusen sett rent praktiskt. Testa skriva lite kod så får du garanterat mer tips på vägen här sen.
Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino
Postat: 17 februari 2016, 22:04:55
av Andax
Nu var det många år sedan jag använde SMT160, och arduino var det också ett tag sedan, men här kommer lite tips.
SMT160 anger temperaturen som en pulskvot, dvs som andelen utgången är hög genom tiden den är hög+låg. Jag gissar att ditt program bara läser av ingången med jämna mellanrum och och räknar upp en räknare för varje gång den läser av (sample size), och räknar upp en annan räknare varje gång den var hög (high count). Det ger ganska stor variation om man inte räknar länge.
För bästa noggrannhet skulle jag nog mäta tiden för varje cykel mha en timer. Om jag googla rätt så finns det en timer1 som är 16-bitar som du skulle kunna ha som räknare.
Eftersom den lägsta frekvensen som SMT160 skickar ut är 1kHz så tar det max 1ms för en hel cykel. Man ställer in räknaren att räkna från 0-65535 på 1ms eller så nära det går (så länge det tar mer än 1ms).
Man programmerar sedan att räknaren ska låsa tiden vid en flank på ingången, och man aktiverar en interrupt som läser av och lagrar tiden. Genom att läsa av tiden när ingången går från låg till hög och från hög till låg så har man vad som behövs för att räkna pulskvoten mycket noggrant.
Eftersom man får nya mätvärden med 1-4kHz så kan man medelvärdesbilda många värden och få väldigt låg fluktuation.
Försök göra så mycket beräkningar med heltal och sedan bara använda flyttal på slutet när du behöver skriva ut en riktig temperatur.
Du skriver att du är nybörjare, och metoden ovan kan kännas lite för avancerad. Fråga bara på så guidar jag dig.
Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino
Postat: 17 februari 2016, 22:14:07
av TomasL
flyttal på slutet när du behöver skriva ut en riktig temperatur.
Rätt onödigt, använd heltal och temperaturen multiplecerad med 10 eller 100 så för du 0,1 eller 0,001 graders upplösning.
Dock gissar jag att onogranheten på givaren är rätt hög, så tiondelar ger tillräcklig upplösning.
När du sedan skriver ut, så formaterar du det hela och lägger till ett decimaltecken på rätt ställe. Kika på "printf" och relaterade funktioner.
Du kan ju också för övningen skull skriva en egen funktion som tar ditt heltal och formaterar det på rätt sätt.
Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino
Postat: 18 februari 2016, 00:08:33
av Andax
Flyttal är ju som sagt prestandakrävande. Kan vara flera tiopotenser långsammare än heltalsberäkningar. Men har man minne och använder det i icke tidskritiska delar så är det smidigt. Man kan ju senare optimera även de delarna när man behöver prestandan genom att skriva om algoritmerna mm.
Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino
Postat: 18 februari 2016, 09:30:23
av Drivmedel
Hur man räknar ut ett medelvärde eller liknande rent matematiskt klarar jag nog av, det är hur man skriver detta i Arduino på effektivt som jag inte klarar utan lite hjälp.
Tack på förhand
Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino
Postat: 18 februari 2016, 12:27:09
av Icecap
OK. Det är ju en ganska snabb uppdatering du har från sensorn men om jag förstår rätt tar du ett nytt mätvärde var 50 sek.
Och då är det ju enkelt.
Du måste deklarera en array som kan hålla de aktuella värden:
Kod: Markera allt
#define MEAN_PARTS 4
struct
{
unsigned short Index;
signed short Temperature;
struct
{
unsigned short HCF;
unsigned short SSF;
} Parts[MEAN_PARTS];
} Sample;
Du startar programmet med att nolla Sample.Index och för varje gång du gör en sample:
Kod: Markera allt
unsigned long hcf, ssf;
unsigned char Ctr;
Sample.Parts[Sample.Index].HCF = highCount;
Sample.Parts[Sample.Index].SSF = sampleSize;
if(++Sample.Index >= MEAN_PARTS) Sample.Index = 0; // Den ska räkna runt
hcf = 0;
ssr = 0;
for(Ctr = 0; Ctr < MEAN_PARTS; Ctr++)
{
hcf += Sample.Parts[Ctr].HCF;
ssr += Sample.Parts[Ctr].SSR;
}
Sample.Temperature = ((((hcf * 100) / ssf) - 32)*100)/47;
Detta borde ge en rimligt rätt mätning om jag inte tar helt fel.
Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino
Postat: 18 februari 2016, 12:56:34
av qx5
Eftersom frekvensen från mätaren kan gå uppåt till 3 kHz så misstänker iaf jag att det inte samplas snabbt nog. För att få t.ex 200 olika värden med den frekvensen krävs en samplingsfrekvens på iaf 600 kHz. Utan det får man förlita sig på
lagen om stora nummer och då kanske det tar längre att få värden med precision än för objektet att ändra temperatur. Hur synkront samplingen går tilll spelar också in. Dvs om det 2 µs att sampla den första I/O biten och 5 µs nästa så blir beräkningen på det rätt svajig.
Medelvärdesbildning kan man åstadkomma så här:
int WindowPos=0, i;
int AvgWindow[64];
AvgWindow[ (WindowPos++) & 63 ] = ValueNow;
AccValue=0;
for(i=0; i<64; i++)
AccValue += AvgWindow
;
MeanValue = AccValue / 64; /* Här uppkommer flyttal i och med divisionen så se upp. */
Precisionen hos denna sensor är max 0,5 °C har jag för mig (btw..).
Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino
Postat: 18 februari 2016, 13:38:17
av Castor
Läs Andax svar en bit upp, du behöver inte mäta varje period, tempen ändrar sig långsamt.
Starta timer på hög flank, spara timer vid låg flank, stoppa vid nästa höga, nu kan du göra beräkningen "i lugn och ro" och sedan göra om när du är klar. Det finns inget behov att mäta varje cykel. Om du inte använder timern till annat kan du ju så snart du räddat undan värdena initiera nästa mätcykel. Interrupt för lågläsning och autostart av timer på höggående för att inte behöva göra något innan mätvärdena är klara