Thursday, October 13, 2016

Moving Average Arduino

Ek werk op 'n mobiele robot beheer word via 'n wireless 2,4 GHz link. The ontvanger is verbind tot die Arduino Uno wat aan boord dien as die belangrikste kontroles. Die mees kritieke (en belangrikste) insette kanaal uit die ontvanger produseer 'n baie lawaaierige sein, wat lei tot baie klein veranderinge in die uitset van die aktueerders, selfs al is dit is nie nodig nie. Ek is op soek na biblioteke wat doeltreffende smoothing kan verrig. Is daar enige sein glad biblioteke beskikbaar vir die Arduino (VN) gevra 16 Februarie 14 aan 13:57 Ek dink ek sien 'n baie enkel-monster geraas spykers in jou raserige sein. Die mediaan filter doen beter om ontslae te raak van enkel-monster geraas spykers as enige lineêre filter. (Dit is beter as enige laaglaatfilter, bewegende gemiddelde, geweegde bewegende gemiddelde, ens in terme van sy reaksie tyd en sy vermoë om so 'n enkel-monster geraas piek uitskieters ignoreer). Daar is, in werklikheid, baie-sein glad biblioteke vir die Arduino, baie van wat insluit 'n mediaan filter. sein-glad biblioteke by arduino. cc:-sein glad biblioteke op GitHub: Sou so iets werk in jou robot (Die mediaan-van-3 verg baie min CPU krag, en dus vinnig): Jy kan dit filter digitaal met behulp van 'n lae slaag filter: verander die 0.99 tot die uitroei frekwensie verander (nader aan 1.0 is laer frekwensie). Die werklike uitdrukking vir daardie waarde is exp (-2pif / VS) waar f die afsnyfrekwensie jy wil en FS is die frekwensie van die data is getoets op. Nog 'n tipe van digitale filter is 'n gebeurtenis filter. Dit werk goed op data wat uitskieters bv het 9,9,8,10,9,25,9. 'N gebeurtenis filter gee die mees algemene waarde. Statisties is dit die modus. Statistiese gemiddeldes soos Mean, af ens kan bereken word met behulp van die Arduino Gemiddeld Biblioteek. 'N Voorbeeld uit die bladsy Arduino Biblioteek verwys na: Tans is ek besig om 'n grafiese LCD stelsel om temperature, vloei, spanning, krag en energie te vertoon in 'n hitte pomp stelsel. Die gebruik van 'n grafiese LCD beteken dat die helfte van my SRAM en 75 van my flits het tot gebruik deur 'n skerm buffer en snare. Ek is tans vertoon min / max / gemiddelde syfers vir energie Teen middernag toe die daaglikse figuur Resets, die stelsel tjeks indien die verbruik vir die dag is bo of onder die vorige minimum of maksimum, en stoor die waarde. Die gemiddelde word bereken deur die kumulatiewe energieverbruik deur die aantal dae. Ek wil graag die daaglikse gemiddelde van die afgelope week en maand (4 weke vir eenvoud) maw 'n rollende gemiddelde vertoon. Tans dit behels die handhawing van 'n verskeidenheid van waardes vir die laaste 28 dae en die berekening van 'n gemiddelde oor die hele reeks vir maandelikse en laaste 7 dae vir weeklikse. Aanvanklik was ek dit doen met behulp van 'n verskeidenheid van dryf (soos die energie in die vorm 12.12kWh), maar dit was die gebruik van 28 4 grepe 112 grepe (5.4 van SRAM). Ek dont gedagte dat slegs 'n enkele desimale punt van resolusie, so ek verander om die gebruik van uint16t en vermenigvuldig die figuur deur 100. Dit beteken dat 12,12 verteenwoordig as 1212, en ek deel met 100 vir uitstalling. Die grootte van die skikking is nou af na 56 grepe (baie beter). Daar is geen triviale manier om die figuur te verminder tot 'n uint8t dat ek kan sien. Ek kon die verlies van 'n desimale plek (12.1kWh in plaas van 12.12kWh) duld nie, maar verbruik is dikwels hoër as 25.5kWh (255 synde die hoogste waarde wat deur 'n 8-bis ongetekende heelgetal). Verbruik het nog nooit onder 10.0kWh of hoër 35.0kWh, so verstaanbaar ek kon aftrek 10 van die gestoor figure, maar ek weet dat een dag sal ons hierdie perke oorskry. Ek het toe kode vir 9-bietjie waardes pak in 'n skikking getoets. Dit gee 'n verskeidenheid van 0-51.2kWh en gebruik 32 grepe in totaal. Maar toegang tot 'n verskeidenheid soos hierdie is redelik stadig, veral as jy moet Itereer oor alle waardes tot 'n gemiddeld te bereken. So my vraag is - is daar 'n meer doeltreffende manier om die berekening van 'n bewegende gemiddelde met drie vensters - leeftyd, 28 dae en 7 dae Doeltreffendheid beteken kleiner in terme van SRAM gebruik, maar sonder die straf van groot kode. Kan ek verhoed dat die stoor alle waardes gevra 7 Maart 14 by 08:32 I39ve dink en jy is reg. Sodat tegnies maak my antwoord foutief is. I39m belê meer tyd en geduld met geweld daarin. Miskien iets uit die boks. I39ll jou laat weet as ek kom met iets. Ons doen so iets baie by my werkplek. Laat my vra rond. Jammer oor die verwarring. â € Aditya Somani 8 Maart 14 om 17:15 is daar 'n meer doeltreffende manier om die berekening van 'n bewegende gemiddelde met. 28 dae en 7 dae. hoef te 27 dae van die geskiedenis onthou. Jy kan kry naby genoeg stoor 11 waardes, eerder as 28 waardes, miskien iets soos: Met ander woorde, in plaas van die stoor elke detail van elke dag vir die afgelope 27 dae, (a) winkel 7 of so waardes van gedetailleerde daaglikse inligting vir die afgelope 7 of so dae, en ook (b) stoor 4 of so opgesom waardes van totale of gemiddelde inligting vir elk van die afgelope 4 of so weeks. This is 'n versameling van roetines vir die uitvoering van wiskundige analise van skikkings van getalle. Huidige funksie ondersteuning: Al die funksies is ten volle oorlaai op die volgende datatipes te ondersteun: Met die uitsondering van stddev () hulle almal dieselfde tipe data as die skikking. 'N verskeidenheid van int waardes terug 'n enkele Int. stddev () gee terug altyd 'n float. Al die funksies behalwe rollingAverage () neem twee argumente. Die eerste is die skikking te werk. Die tweede is die aantal inskrywings in die skikking. rollingAverage () neem 'n derde argument - die nuwe inskrywing te voeg tot die skikking. Rollende gemiddelde Formaat: gemiddelde rollingAverage (historyarray, slicecount, waarde) waarde toevoeg tot die skikking historyarray verskuiwing al die waardes af een plek. Die gemiddelde gemiddelde is dan teruggekeer. Beteken Formaat: gemiddelde gemiddelde (skikking, slicecount) Bereken die gemiddelde gemiddeld van die waardes in die rigting. slicecount is die aantal inskrywings in die skikking. Af Formaat: gemiddelde modus (skikking, slicecount) Vind die mees algemene getal in die reeks. Maksimum Formaat: Max maksimum (skikking, slicecount) Vind die grootste waarde in die skikking. Minimum formaat: min minimum (skikking, slicecount) Vind die kleinste waarde in die skikking. Standaardafwyking Formaat: afwyking stddev (skikking, slicecount) Die standaardafwyking is die vierkantswortel van die gemiddelde van die som van die kwadrate van die verskil tussen elke datapunt en die skikking beteken gemiddelde. Dit is die enigste funksie wat dieselfde tipe data nie terugkeer as die skikking. Die standaardafwyking is altyd teruggekeer as 'n float. Voorbeeld: ShareIntro Een van die belangrikste programme vir die Arduino raad is om te lees en aan te meld van sensor data. Byvoorbeeld een monitors druk elke sekonde van die dag. So hoog monster pryse genereer dikwels spykers in die grafieke een wil ook 'n gemiddeld van die metings het. As die afmetings is nie staties in die tyd wat ons dikwels nodig is 'n lopende gemiddelde. Dit is die gemiddeld van 'n sekere tydperk en baie waardevol wanneer jy tendens analise. Eenvoudigste vorm van 'n lopende gemiddelde kan gedoen word deur kode wat voortbou op die vorige hardloop gemiddelde: As 'n mens nie die geval is wil gebruik drywende punt wiskunde - want dit neem geheue en verminder spoed - 'n mens kan dieselfde heeltemal te doen in die heelgetal domein. Die afdeling deur 256 in die voorbeeld kode is 'n verskuiwing regs 8, wat is vinniger as sê afdeling deur bv 100. Dit is waar vir elke krag van 2 as deler en een net sorg die som van die weigths is gelyk aan die krag van 2. En natuurlik moet 'n mens versigtig wees daar geen intermediêre oorloop (oorweeg die gebruik van unsigned long) As jy moet neem 'n meer akkurate loop gemiddeld in concreto van die laaste 10 metings, 'n skikking (of gekoppel lys) om hulle te hou nodig. Dit verskeidenheid dien as 'n omsendbrief buffer en met elke nuwe meting die oudste een is verwyder. Die lopende gemiddeld word bereken as die som van al die elemente verdeel deur die aantal elemente in die skikking. Die kode vir die lopende gemiddeld sal so iets wees: nadeel van hierdie kode is dat die skikking te alle waardes hou nogal groot kan word. As jy 'n meting per sekonde en jy wil 'n lopende gemiddelde per minuut jy 'n verskeidenheid van 60 moet 'n gemiddelde per uur sou 'n verskeidenheid van 3600. Dit kon nie op hierdie manier op 'n Arduino gedoen want dit het net 2K RAM nodig. Maar met die bou van 'n 2 stadium gemiddelde dit kan baie goed benader word (disclaimer: nie vir alle metings). In psuedo kode: As 'n nuwe interne statiese skikking is wat nodig is vir elke runningAverage funksie, hierdie skree as 'n klas te implementeer. RunningAverage biblioteek Die runningAverage biblioteek maak 'n klas van die funksie hierbo sodat dit meer as een keer gebruik kan word in 'n skets. Dit ontkoppelt dié byvoeging () en die gemiddelde () funksie gee om 'n bietjie meer buigsaam bv wees 'n mens kan die gemiddelde verskeie kere bel sonder toevoeging van 'n ding. Let asseblief daarop dat elke geval van die klas voeg sy eie reeks om metings te hou, en dat dit bydra tot die geheue gebruik. Die koppelvlak van die klas is so klein as moontlik gehou word. Let wel: met weergawe 0.2 die name van die metodes is almal gemaak meer beskrywende. Gebruik 'n klein skets toon hoe dit gebruik kan word. 'N ewekansige kragopwekker gebruik word om 'n sensor naboots. In die opstel van () die Myra is skoongemaak sodat ons kan begin toevoeging van nuwe data. In lus () eers 'n ewekansige getal gegenereer en omgeskakel word na 'n float toe te voeg aan Myra. Toe die runningAverage gedruk om die reeksnommer poort. 'N Mens kan ook vertoon dit op 'n paar LCD of stuur oor Ethernet ens Wanneer 300 items bygevoeg Myra is skoongemaak weer begin. Aantekeninge by die biblioteek te gebruik, maak 'n gids in jou SKETCHBOOKPATHlibaries met die naam RunningAverage en sit die. H en Cpp daar. Opsioneel 'n voorbeelde subgids om die monster app te plaas. Geskiedenis 2011/01/30: aanvanklike weergawe 2011/02/28: Vaste ontbreek destructor in. H lêer 2011/02/28: verwyder verstek konstruktor 2012--. trimValue () Yuval Naveh bygevoeg trimValue (gevind op web) 2012/11/21: refactored 2012/12/30: gevoeg fillValue () refactored vir die publikasie van 2014/07/03: gevoeg geheue beskerming kode - as interne skikking nie kan toegeken word grootte word 0. Dit is om probleem hier beskryf los - forum. arduino. cc/indextopic50473.msg1790086msg1790086 - Todo toets op groot skaal. Sjabloon klas RunningAverage. H RunningAverage. cppRecently my buurman betaal my om 'n belangrike minder inskrywing stelsel te bou vir sy koshuiskamer. Ek het besluit om die ekonomiese roete gaan en gebruik 'n knoppie / potensiometer wat sit buite die deur en 'n Arduino aan die binnekant wat 'n servo gekoppel aan die slot beheer. Vir my kamer, ek het gedink dit sal interessant wees om 'n Ping))) ultrasoniese afstand sensor plaas gebruik van die potensiometer en verloor op die knoppie. Die Ping))) sensor gehou om lesings terwyl my hand beweeg. Ten einde hierdie het ek besluit gebruik 'n bewegende gemiddelde filter op te los, bereken dan die standaardafwyking van die waardes wat tans in die M. A. filter. Toe my hand is nog, sal die standaardafwyking baie klein geword. M. A.andS. D. (Pdf) - 8220storeValue (veranderlike) 8221 is hoe om data in te voer in die skikking, dan bel M. A. en S. D. Nie veel van 'n kring vereis Arduino039s reguleerder ook magte Ping))). Serwo het it039s eie 5V reguleerder. moet kapasitors pingDoorLocker (pdf) 8211 Soos jy kan sien, is hierdie program opgeblaas n little8230 Ek het probeer om die M. A. en S. D. maak - kode baie maklik om te volg. Sommige dinge kon gewees het gekombineer in die S. D. en variansie metode nie, maar om die beginner wat ek hierbo geskryf het, is waarskynlik makliker aangesien dit volg die vergelykings te verstaan. Soos vir die pingDoorLocker 8211 Ek gooi dit code saam baie vinnig. Opvolg notas: Dit was waarskynlik die ergste manier om dit te project8230 Ek het gedink van 'n paar maniere hoe om die program wat die kode pad af sou kap skryf nie, maar dit is 'n voorbeeld van die gebruik van M. A. en S. D. Baie sleg gebruik van 'n M. A. filter as jy my vra sy deure Unlocker. Sedert ek 'n paar uur in die bou van my neighbor8217s deur opener het sit, here8217s 'n beeld van dit Hy didn8217t nommers op die potensiometer inbel wil, so ek het die LED flits die getal wat tans ingevoer. Kode vir sy deur opener (pdf) 8211 los 'n kommentaar as jy wil skedule / code op vinnige aandeel sedert pdf oortjies verloor.


No comments:

Post a Comment