Hur fås ett mätvärde stabilt från SMT160 i Arduino

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Drivmedel
Inlägg: 56
Blev medlem: 29 oktober 2011, 13:40:18
Ort: Lund Södra Sandby

Hur fås ett mätvärde stabilt från SMT160 i Arduino

Inlägg 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);
}
}
Senast redigerad av Drivmedel 18 februari 2016, 09:12:24, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino

Inlägg 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.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino

Inlägg av sodjan »

Först en detalj.. Använd gärna code-taggarna för programkod.

Kod: Markera allt

[code]
  kod
  kod
[/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.
Drivmedel
Inlägg: 56
Blev medlem: 29 oktober 2011, 13:40:18
Ort: Lund Södra Sandby

Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino

Inlägg 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.
Castor
Inlägg: 1989
Blev medlem: 24 mars 2012, 13:03:49

Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino

Inlägg 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.
zealotry
Inlägg: 918
Blev medlem: 9 oktober 2004, 22:28:40
Ort: Västerås

Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino

Inlägg 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.
Användarvisningsbild
Andax
Inlägg: 4373
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45291
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino

Inlägg 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.
Användarvisningsbild
Andax
Inlägg: 4373
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino

Inlägg 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.
Drivmedel
Inlägg: 56
Blev medlem: 29 oktober 2011, 13:40:18
Ort: Lund Södra Sandby

Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino

Inlägg 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
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino

Inlägg 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.
qx5
Inlägg: 1678
Blev medlem: 14 augusti 2014, 04:23:04

Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino

Inlägg 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..).
Castor
Inlägg: 1989
Blev medlem: 24 mars 2012, 13:03:49

Re: Hur fås ett mätvärde stabilt från SMT160 i Arduino

Inlägg 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
Skriv svar