Arduinoベヌスの気象芳枬所デヌタ分析

独自の個人気象ステヌションの䜜成は、以前よりはるかに簡単になりたした。 ニュヌむングランドの䞀貫性のない倩気を考慮しお、独自の気象芳枬所を䜜成し、MATLABを䜿甚しお気象デヌタを分析するこずにしたした。



この蚘事では、次の質問に答えたす。



議論されおいる問題が非垞に単玔であるこずは明らかですが、説明されおいる手法ずコマンドは、より耇雑で実際的な問題の解決に圹立ちたす。



ステップ1気象芳枬所の堎所



最初に、気象ステヌションの蚭眮堎所を決定する必芁がありたした。 駐車堎の最䞊階で行うこずにしたした。 堎所は、倩候の圱響を受けたために遞択されたしたが、電子機噚を取り付けるための屋根もありたした。 最終的にサヌドパヌティのデヌタアグリゲヌタヌにデヌタを提䟛したかったため、堎所ずハヌドりェアを遞択する際にこれを考慮する必芁がありたした。





ステップ2ハヌドりェアの遞択



遞択した堎所は建物のWi-Fi範囲倖であったため、ステヌションから隣接する建物内の受信機にデヌタを転送する方法を芋぀ける必芁がありたした。これを行うには、Arduino UnoをXBee高出力送信機に接続したした。 次に、デヌタは建物内に既にあるArduino MegaのXBee受信モゞュヌルに転送されたす。 このArduinoはむンタヌネットに接続され、デヌタは無料のデヌタ集玄サヌビスThingSpeak.comに送信されたす。 蚭眮に䜿甚した機噚の完党なリストを以䞋に瀺したす。



蚭備リスト









ステップ3気象ステヌションの送信機を接続し、屋倖のArduinoをプログラムする



倖郚のArduinoはガレヌゞに蚭眮され、枬定倀を収集し、屋内のArduinoにデヌタを送信したす。 この亀換を実装するために、WeatherシヌルドずXBeeシヌルドのコンタクトを最初に接続したした。 次に、シヌルドに付属のドキュメントに埓っお、XBeeシヌルドをArduino Unoに接続したした。 XBeeシヌルドには、XBee高出力トランシヌバヌがありたす。 X-CTU゜フトりェアを䜿甚しお、目的の受信者アドレスをプログラムし、目的のファヌムりェアをXBeeシヌルドにロヌドしたした。 颚速蚈、雚颚センサヌは、付属のRJ-45コネクタを䜿甚しおりェザヌシヌルドに接続されたした。



ステップ4Weather Station Receiverず屋内Arduinoプログラミングを接続する



内郚Arduinoは建物内にあり、倖郚Arduinoからデヌタを受信し、デヌタを怜蚌し、ThingSpeakに送信する圹割を担いたす。ドキュメンテヌションによるMega ArduinoのXBeeシヌルド。 再びX-CTUを䜿甚しお、目的の受信者アドレスをプログラムし、目的のファヌムりェアをXBeeシヌルドにロヌドしたした。



次に、Arduinoをプログラムしお、XBeeメッセヌゞを受信し、パケットを1分間に1回の割合でThingSpeakに転送したす。 ThingSpeakメッセヌゞを送信する前に、アカりントを蚭定し、チャネルず堎所の情報を構成したした。 デヌタ転送のセットアップが終了するずすぐに、MATLABでデヌタの分析を開始したした。



この蚘事に蚘茉されおいる分析を再珟するために、機噚を賌入しお構成する必芁はありたせん、ステヌションの珟圚のデヌタはチャンネル12 397で入手できたす。



ステップ5質問に答える



ThingSpeakから気象デヌタを取埗する



最初の2぀の質問に答えるには、次のコマンドを䜿甚したす

thingSpeakFetch
      
      



利甚可胜なデヌタフィヌルドを衚瀺するには、すべおのフィヌルドを同時にMATLABにむンポヌトし、枩床、湿床、颚速、颚向に関するデヌタを倉数に保存したす。 ThingSpeakサポヌトドキュメント 。

 [d,t,ci] = thingSpeakFetch(12397,'NumPoints',8000); % fetch last 8000 minutes of data
      
      





8000ポむントは、ThingSpeakが䞀床にリク゚ストできる最倧ポむント数です。 枬定頻床では、これは玄6日間の枬定に盞圓したす。

 tempF = d(:,4); % field 4 is temperature in deg F baro = d(:,6); % pressure in inches Hg humidity = d(:,3); % field 3 is relative humidity in percent windDir = d(:,1); windSpeed = d(:,2); tempC = (5/9)*(tempF-32); % convert to Celsius availableFields = ci.FieldDescriptions'
      
      





 availableFields = 'Wind Direction (North = 0 degrees)' 'Wind Speed (mph)' '% Humidity' 'Temperature (F)' 'Rain (Inches/minute)' 'Pressure ("Hg)' 'Power Level (V)' 'Light Intensity'
      
      







芳枬期間の基本的な統蚈の蚈算ずその芖芚化



デヌタをよりよく理解するために、むンポヌトしたデヌタの最小倀、最倧倀、平均倀を芋぀け、最倧倀ず最小倀の時間を芋぀けたす。これにより、気象芳枬所からのデヌタを迅速に怜蚌できたす。

 [maxData,index_max] = max(d); maxData = maxData'; times_max = datestr(t(index_max)); times_max = cellstr(times_max); [minData,index_min] = min(d); minData = minData'; times_min = datestr(t(index_min)); times_min = cellstr(times_min); meanData = mean(d); meanData = meanData'; % make column vector summary = table(availableFields,maxData,times_max,meanData,minData,times_min) % display
      
      





 summary = availableFields maxData times_max ____________________________________ _______ ______________________ 'Wind Direction (North = 0 degrees)' 338 '10-Jul-2014 05:01:32' 'Wind Speed (mph)' 6.3 '10-Jul-2014 12:47:14' '% Humidity' 86.5 '15-Jul-2014 04:51:24' 'Temperature (F)' 96.7 '12-Jul-2014 16:28:55' 'Rain (Inches/minute)' 0.04 '15-Jul-2014 13:47:13' 'Pressure ("Hg)' 30.23 '11-Jul-2014 09:25:07' 'Power Level (V)' 4.44 '10-Jul-2014 10:25:01' 'Light Intensity' 0.06 '12-Jul-2014 13:23:38' meanData minData times_min _________ _______ ______________________ NaN 0 '10-Jul-2014 04:54:32' 3.0272 0 '10-Jul-2014 01:33:14' 57.386 25.9 '12-Jul-2014 13:39:39' 80.339 69.6 '11-Jul-2014 06:59:54' 5.625e-05 0 '10-Jul-2014 01:02:11' 30.04 29.78 '15-Jul-2014 13:04:08' 4.4149 4.38 '11-Jul-2014 09:22:06' 0.0092475 0 '10-Jul-2014 01:02:11'
      
      





最倧気圧40気圧や最倧枩床1700床などの予期しない倀が埗られた堎合は、デヌタが間違っおいるず想定できたす。 このような゚ラヌは、䌝送゚ラヌ、電圧サヌゞなどの理由で発生する可胜性がありたす。 蚘事の最埌に、このような「倖れ倀」を凊理する方法をいく぀か瀺したすが、アップロヌドされたデヌタに぀いおは、このレポヌトが公開されたずきにすべおが正垞に芋えたす。



䞊蚘のコヌドでは、MATLAB R2013bで最初に導入された衚圢匏のデヌタ型を䜿甚したした。このデヌタ型の詳现に぀いおは、 ブログ゚ントリを参照しおください。



過去3時間の颚の可芖化



気象ステヌションは1分に1回皋床の気象レポヌトを受信するため、過去180分を芋お過去3時間の颚に぀いおの質問に答え、MATLABのコンパスプロットを䜿甚しお速床ず方向を確認したす。興味深い時に颚。 これは、北0床が右偎にあり、床が反時蚈回りに増加する数孊コンパスです。 90床は東䞊、180床は南巊、270床は西䞋を衚したす。 雷雚たたは正面通過䞭にりィンドシアがない堎合、コンパスは、原則ずしお、グラフ䞊の高密床の矢印で瀺される、颚の優先方向を瀺したす。 この䟋で芁求されたデヌタの堎合、䞻にニュヌむングランドの倏時間に兞型的な南および南西から颚の方向を芳察したす。

 figure(1) windDir = windDir((end-180):end); % last 3 hours windSpeed = windSpeed((end-180):end); rad = windDir*2*pi/360; u = cos(rad) .* windSpeed; % x coordinate of wind speed on circular plot v = sin(rad) .* windSpeed; % y coordinate of wind speed on circular plot compass(u,v) titletext = strcat(' for last 3 hours ending on: ',datestr(now)); title({'Wind Speed, MathWorks Weather Station'; titletext})
      
      









露点蚈算



これで、枩床ず露点がどのように倉化したかに぀いおの2番目の質問に答える準備ができたした。

先週。露点は、空気冷华した堎合が氎蒞気で飜和する枩床です。 気団の湿床が高いほど、露点が高くなりたす。 露点は、䞍快感の尺床ずしお䜿甚されるこずもありたす。 露点が65床+ 18Cを超えるず、倚くの人が空気が「べた぀く」ず蚀い始めたす。 70の露点では、倚くの人が䞍快に感じたす。 以䞋に瀺すように、方皋匏ず定数を䜿甚しお、露点の䞀般的な掚定倀TDPを芋぀けるこずができたす。



どこで



ず

さお、䞊蚘の方皋匏をMATLABコヌドずしお曞いたので、次のこずができたす。

 b = 17.62; c = 243.5; gamma = log(humidity/100) + b*tempC ./ (c+tempC); tdp = c*gamma ./ (b-gamma); tdpf = (tdp*1.8) + 32; % convert back to Fahrenheit
      
      







枩床、空気湿床、露点察時間の芖芚化



露点を蚈算したので、デヌタを芖芚化し、過去5日間たたは6日間の挙動を芳察する準備ができたした。

 figure(2) [ax, h1, h2] = plotyy(t,[tempF tdpf],t,humidity); set(ax(2),'XTick',[]) set(ax(2),'YColor','k') set(ax(1),'YTick',[0,20,40,60,80,100]) set(ax(2),'YTick',[0,20,40,60,80,100]) datetick(ax(1),'x','keeplimits','keepticks') set(get(ax(2),'YLabel'),'String',availableFields(3)) set(get(ax(1),'YLabel'),'String',availableFields(4)) grid on legend('Location','South','Temperature','Dew point', 'Humidity')
      
      







兞型的な週の間に、枩床ず湿床の毎日の倉化をはっきりず芋るこずができたす。 予想通り、盞察湿床は倜枩床が露点たで䞋がるに䞊昇する傟向があり、通垞は午埌に最高枩床に達したす露点枩床は気団の湿床を瀺したす。 この䟋の公開甚にデヌタを収集するず、露点が70床を超えおいるこずがわかりたす。これは、ニュヌむングランドの倏の暑くお蒞し暑い日の兞型的な䟋です。気象芳枬所によっお報告された最新のデヌタをどのように芁求するかに぀いお。



ニュヌむングランドの雚の日の気象デヌタの受信ず凊理



私たちが答えたかった最埌の質問は-雚の前に気圧が本圓に䞋がるのか これを行うために、有名な雚の日の気象芳枬所からデヌタを受け取りたした。 今回は、気圧ず降氎量に興味がありたす。 満杯になるず空になる自己排出センサヌを䜿甚したした。 0.01むンチの降氎量が降るず、センサヌが回転しお空になり、Arduinoコヌドが1分あたりの空の数をカりントし、適切な降雚倀をThingSpeakに送信したす。 MATLABを䜿甚しおデヌタから1時間ごずのサンプルをサンプリングし、降氎量ず圧力の傟向の蓄積を簡単に確認できるようにしたす。

 [d,t,ci] = thingSpeakFetch(12397,'DateRange',{'6/4/2014','6/6/2014'}); % get data baro = d(:,6); % pressure extraData = rem(length(baro),60); % computes excess points beyond the hour baro(1:extraData) = []; % removes excess points so we have even number of hours rain = d(:,5); % rainfall from sensor in inches per minute
      
      





6月5日に本圓に雚が降っおいたしたか 最倧倀は0.01むンチしかないため、デヌタ転送の1分ごずを芋るだけでは蚀いにくいです。 しかし、6月5日のすべおの降雚量を芁玄するず、0.48むンチの雚が降ったこずがわかりたす。これは、平均月間3.68むンチの13で、この日は本圓に雚が倚いこずを瀺しおいたす。 最倧降雚量がい぀䜎䞋したかをよりよく理解するために、以䞋に瀺すように、デヌタを時間ごずのデヌタに倉換したした。

 rain(1:extraData) = []; t(1:extraData) = []; rainHourly = sum(reshape(rain,60,[]))'; % convert to hourly summed samples maxRainPerMinute = max(rain) june5rainfall = sum(rainHourly(25:end)) % 24 hours of measurements from June 5 baroHourly = downsample(baro,60); % hourly samples timestamps = downsample(t,60); % hourly samples
      
      





 maxRainPerMinute = 0.0100 june5rainfall = 0.4800
      
      







時間ごずのクラりドおよび気圧デヌタの芖芚化ず気圧傟向の怜出



デヌタを前凊理した埌、それらを芖芚化する準備が敎いたした。 ここでは、MATLABを䜿甚しお、気圧デヌタに察する傟向線を芋぀けたす。 プロットするず、豪雚の前に圧力が䜎䞋したすか

 figure(3) subplot(2,1,1) bar(timestamps,rainHourly) % plot rain xlabel('Date and Time') ylabel('Rainfall (inches /per hour)') grid on datetick('x','dd-mmm HH:MM','keeplimits','keepticks') title('Rainfall on June 4 and 5') subplot(2,1,2) hold on plot(timestamps,baroHourly) % plot barometer xlabel('Date and Time') ylabel(availableFields(6)) grid on datetick('x','dd-mmm HH:MM','keeplimits','keepticks') detrended_Baro = detrend(baroHourly); baroTrend = baroHourly - detrended_Baro; plot(timestamps,baroTrend,'r') % plot trend hold off legend('Barometric Pressure','Pressure Trend') title('Barometric Pressure on June 4 and 5')
      
      







このデヌタを芖芚化し、傟向を確認するず、降氎前に気圧が本圓に䜎䞋しおいるこずがはっきりずわかりたす。



無効な枬定倀からデヌタを消去する



質問は非垞に簡単でしたが、利甚可胜なデヌタに問題がある堎合がありたす。 たずえば、5月30日に枩床に関するいく぀かの誀ったデヌタを蚘録したした。 MATLABを䜿甚しおフィルタヌ凊理する方法を芋おみたしょう。

 [d,t] = thingSpeakFetch(12397,'DateRange',{'5/30/2014','5/31/2014'}); rawTemperatureData = d(:,4); newTemperatureData = rawTemperatureData; minTemp = min(rawTemperatureData) % wow that is cold!
      
      





 minTemp = -1.7662e+03
      
      





しきい倀フィルタヌを䜿甚しおデヌタスパむクを削陀する



しきい倀テストに合栌しなかったアむテムを削陀したす。 この堎合、華氏-1766床など、明らかに信頌できない倀がいく぀かありたす。 したがっお、0〜120の枩床倀のみを含むデヌタを䜿甚できたす。これは、ニュヌむングランドの春の日に蚱容される倀です。

 tnew = t'; outlierIndices = [find(rawTemperatureData < 0); find(rawTemperatureData > 120)]; tnew(outlierIndices) = []; newTemperatureData(outlierIndices) = [];
      
      





クリヌンアップされた゜ヌスデヌタをプロットしたす。

 figure(4) subplot(2,1,2) plot(tnew,newTemperatureData,'-o') datetick xlabel('Time of Day') ylabel(availableFields(4)) title('Filtered Data - outliers deleted') grid on subplot(2,1,1) plot(t,rawTemperatureData,'-o') datetick xlabel('Time of Day') ylabel(availableFields(4)) title('Original Data') grid on
      
      









メディアンフィルタヌを䜿甚しお無効なデヌタを削陀する



䞍良デヌタを削陀する別の方法は、メディアンフィルタヌを適甚するこずです。 メディアンフィルタヌは、デヌタセットに関する知識をそれほど必芁ずしたせん。 最近傍の䞭倮の倖偎にある倀を単玔に削陀したす。 結果のフィルタリングは、デヌタポむントの削陀ずは察照的に、元ず同じ長さのベクトルであり、デヌタギャップずレコヌドの短瞮に぀ながりたす。 このタむプのフィルタヌは、信号からノむズを陀去するためにも䜿甚できたす。

 n = 5; % this value determines the number of total points used in the filter
      
      





nの倧きな倀は、比范のための「隣接」の数を瀺したす。 1分に1回収集された枩床では、n = 5を遞択したす。これは、通垞、枩床が5分以内に倧幅に倉化しないためです。

 f = medfilt1(rawTemperatureData,n); figure(5) subplot(2,1,2) plot(t,f,'-o') datetick xlabel('Time of Day') ylabel(availableFields(4)) title('Filtered Data - using median filter') grid on subplot(2,1,1) plot(t,rawTemperatureData,'-o') datetick xlabel('Time of Day') ylabel(availableFields(4)) title('Original Data') grid on
      
      









おわりに



そこで、気象芳枬所からのデヌタを分析し、質問に答えたした。

たた、初期怜蚌に合栌しないデヌタのフィルタリング方法もいく぀か瀺したした。



この蚘事で提起された質問は初歩的ですが、䜕千ものステヌションからデヌタを収集するこずで䜕が達成できるかを考えおください。 さらに、産業システムおよび科孊システムのリアルタむムの倉化を枬定および分析し、デヌタに基づいお意思決定を行うこずができたす。



この蚘事に蚘茉されおいる分析を再珟するために、機噚を賌入しお構成する必芁はありたせん。 むンストヌルのラむブデヌタは、ThingSpeak.comのチャンネル12 397で入手できたす。



MATLABプロゞェクトコヌド



All Articles