{"id":1193,"date":"2017-01-11T20:00:49","date_gmt":"2017-01-11T19:00:49","guid":{"rendered":"http:\/\/morony.pl\/?p=1193"},"modified":"2017-01-11T21:08:12","modified_gmt":"2017-01-11T20:08:12","slug":"smogowy-armageddon","status":"publish","type":"post","link":"https:\/\/morony.pl\/?p=1193","title":{"rendered":"Smogowy armageddon"},"content":{"rendered":"<p>Przez ostatnie dni media zdominowa\u0142 temat tragicznej jako\u015bci powietrza w polskich miastach. Nie jest to problem wirtualny, bo wystarczy wyj\u015b\u0107 na dw\u00f3r by zobaczy\u0107 i poczu\u0107 marn\u0105 jako\u015b\u0107 powietrza. Do wytworzenia smogu potrzebujemy dw\u00f3ch czynnik\u00f3w. Pierwszy to produkcja szkodliwych py\u0142\u00f3w i zanieczyszcze\u0144, kt\u00f3ra zim\u0105 jest mocno nasilona ze wzgl\u0119du na sezon grzewczy, szczeg\u00f3lnie w indywidualnych instalacjach C.O. z piecem na paliwo sta\u0142o (drewno, w\u0119giel), cz\u0119sto opalanym odpadami. Elektrociep\u0142ownie, mimo, \u017ce opalane w\u0119glem wydalaj\u0105 proporcjonalnie mniej zanieczyszcze\u0144 na kW energii ze wzgl\u0119du na zastosowane w instalacji filtry. Drugim, niezb\u0119dnym do powstania smogu warunkiem jest wyst\u0105pienie warstwy inwersyjnej w atmosferze, kt\u00f3ra blokuje wymian\u0119 powierza przy ziemi, z tym powy\u017cej granicy inwersji. Je\u017celi wysoko\u015b\u0107 warstwy inwersyjnej wynosi 100-200 metr\u00f3w, to znajdujemy si\u0119 w zamkni\u0119tym &#8220;s\u0142oiku&#8221;, do kt\u00f3rego wydalamy ogromne ilo\u015bci zanieczyszcze\u0144. Tyle skr\u00f3conej teorii, przejd\u017amy do praktyki.  <\/p>\n<p>Wykorzystuj\u0105c bardzo du\u017ce st\u0119\u017cenie py\u0142\u00f3w w Warszawie postanowi\u0142em sprawdzi\u0107 jak problem wygl\u0105da z g\u00f3ry. Uda\u0142o mi si\u0119 wykona\u0107 dwa bardzo wymowne uj\u0119cia:<\/p>\n<p><center><\/p>\n<div style=\"overflow:auto;margin:0 auto;width:720px;\"><a href=\"http:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0033_sm.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"http:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0033_sm-1024x1024.jpg\" alt=\"\" style=\"width:340px;height:auto;margin:10px;float:left;\" class=\"alignnone size-large wp-image-1194\" srcset=\"https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0033_sm-1024x1024.jpg 1024w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0033_sm-150x150.jpg 150w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0033_sm-300x300.jpg 300w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0033_sm-768x768.jpg 768w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0033_sm.jpg 1600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><a href=\"http:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0071_sm.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"http:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0071_sm-1024x1024.jpg\" alt=\"\" style=\"width:340px;height:auto;margin:10px;float:left;\" class=\"alignnone size-large wp-image-1195\" srcset=\"https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0071_sm-1024x1024.jpg 1024w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0071_sm-150x150.jpg 150w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0071_sm-300x300.jpg 300w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0071_sm-768x768.jpg 768w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/DJI_0071_sm.jpg 1600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/div>\n<p><\/center><\/p>\n<p>Zdj\u0119cie po lewej przedstawia kominy elektrociep\u0142owni Siekierki i warszawskie drapacze chmur w tle. Zdj\u0119cie po prawej to widok na centrum Warszawy z okolicy mostu Gda\u0144skiego. Niestety zdj\u0119cia nie pokazuj\u0105 chmur a w\u0142a\u015bnie zanieczyszczenia, kt\u00f3rymi byli\u015bmy zmuszeni oddycha\u0107. <\/p>\n<p>R\u00f3wnolegle uruchomi\u0142em pomiar st\u0119\u017cenia py\u0142\u00f3w w powietrzu na zewn\u0105trz domu w Legionowie. Zakupi\u0142em <a href=\"https:\/\/botland.com.pl\/czujniki-gazu\/3943-laserowy-czujnik-pylu-stezenia-czastek-pm25.html\">laserowy czujnik<\/a> i po\u0142\u0105czy\u0142em go z RaspberryPi. Czujnik wisi sobie bezpo\u015brednio za oknem i komunikuje si\u0119 z je\u017cyn\u0105 przez interfejs szeregowy:<\/p>\n<p><center><a href=\"http:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/IMG_0919.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"http:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/IMG_0919-1024x1024.jpg\" alt=\"\" style=\"width:300px;height:auto;\" class=\"alignnone size-large wp-image-1204\" srcset=\"https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/IMG_0919-1024x1024.jpg 1024w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/IMG_0919-150x150.jpg 150w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/IMG_0919-300x300.jpg 300w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/IMG_0919-768x768.jpg 768w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/IMG_0919.jpg 1512w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/center><\/p>\n<p>Ka\u017cdy pomiar daje trzy wyniki odpowiadaj\u0105ce py\u0142om o r\u00f3\u017cnych frakcjach, w tym &#8220;najpopularniejszy&#8221; PM2.5. Program odbieraj\u0105cy pomiary napisany w Pythonie:<\/p>\n<p><center><\/p>\n<pre style=\"width:700px; overflow:auto; text-align:left;\"><code class=\"python\">import serial\r\nfrom time import gmtime, strftime\r\n\r\nport = serial.Serial(\"\/dev\/serial0\", baudrate=9600, timeout=1.5)\r\ndata = port.read(32);\r\n\r\nf = open(\"\/home\/pi\/\" + strftime(\"%Y-%m-%d\", gmtime()) + \".txt\", \"a\")\r\nif ord(data[0]) == 66 and ord(data[1])==77:\r\n\tsuma = 0\r\n\tfor a in range(30):\r\n\t\tsuma += ord(data[a])\r\n\r\n\tif suma == ord(data[30])*256+ord(data[31]):\r\n\t\t\r\n\t\tPM01 = str(ord(data[4])*256+ord(data[5]))\r\n\t\tPM25 = str(ord(data[6])*256+ord(data[7]))\r\n\t\tPM10 = str(ord(data[8])*256+ord(data[9]))\r\n\t\tstr = strftime(\"%Y-%m-%d %H:%M:%S\", gmtime()) + \"\\t\" + PM01 + \"\\t\" + PM25 + \"\\t\" + PM10;\r\n\t\tf.write(str + \"\\n\")\r\n\t\tprint(str)\r\n\t\r\n\t\r\nport.close()\r\nf.close()\r\n<\/code><\/pre>\n<p><\/center><\/p>\n<p>Powy\u017cszy kod uruchamiany jest co minut\u0119. Dane zapisywane s\u0105 w zwyk\u0142ym pliku tekstowym:<\/p>\n<p><center><\/p>\n<pre style=\"width:700px; overflow:auto; text-align:left;\"><code class=\"python\">2017-01-09 20:43:02\t185\t470\t729\r\n2017-01-09 20:44:02\t181\t440\t682\r\n2017-01-09 20:45:02\t175\t460\t701\r\n2017-01-09 20:46:02\t172\t445\t725\r\n2017-01-09 20:47:02\t175\t448\t680\r\n2017-01-09 20:48:02\t177\t449\t725\r\n2017-01-09 20:49:02\t170\t450\t754\r\n2017-01-09 20:50:02\t176\t458\t746\r\n2017-01-09 20:51:02\t165\t441\t733\r\n2017-01-09 20:52:02\t174\t434\t707\r\n2017-01-09 20:53:02\t170\t451\t715\r\n2017-01-09 20:54:02\t170\t436\t702\r\n<\/code><\/pre>\n<p><\/center><\/p>\n<p>Nast\u0119pnie raz na 15 minut uruchamiany jest kod rysuj\u0105cy wykres. Dla poprawy czytelno\u015bci rysowane s\u0105 \u015brednie krocz\u0105ce z pomiar\u00f3w, a nie same pomiary:<\/p>\n<p><center><\/p>\n<pre style=\"width:700px; height:500px; overflow:auto; text-align:left;\"><code class=\"python\">import numpy\r\nimport ftplib\r\nfrom ftplib import FTP\r\nimport sys\r\nfrom matplotlib.dates import strpdate2num\r\nfrom datetime import datetime, timedelta\r\nimport matplotlib\r\n\r\nmatplotlib.use('Agg')\r\nimport matplotlib.pyplot as plt\r\ndate = sys.argv[1];\r\nX = numpy.loadtxt('\/root\/AIR\/OLSZANKOWA50A\/'+date+'.txt', delimiter='\\t', dtype=object, converters={0: lambda x: datetime.strptime(x.decode(\"utf-8\"), \"%Y-%m-%d %H:%M:%S\"), 1: numpy.float, 2: numpy.float, 3: numpy.float})\r\n\r\nwindow = 900;\r\nstep = 60;\r\nts = min(X[:,0])\r\ntss = datetime(ts.year, ts.month, ts.day)\r\nt = tss;\r\nte = t + timedelta(days=1)\r\n\r\nT = []\r\nPM01 = []\r\nPM25 = []\r\nPM10 = []\r\nwhile t < te:\r\n\tt = t + timedelta(seconds=step)\r\n\tidx = numpy.logical_and(X[:,0] > (t - timedelta(seconds=window)), X[:,0] < (t + timedelta(seconds=window)))\r\n\t#print(t, sum(idx))\r\n\tT.append(t)\r\n\tif sum(idx) > 0:\r\n\t\tPM01.append(numpy.mean(X[idx,1]))\r\n\t\tPM25.append(numpy.mean(X[idx,2]))\r\n\t\tPM10.append(numpy.mean(X[idx,3]))\r\n\telse:\r\n\t\tPM01.append(numpy.nan)\r\n\t\tPM25.append(numpy.nan)\r\n\t\tPM10.append(numpy.nan)\r\n\r\n\r\nx = []\r\nlabel = []\r\nfor a in range(0,24,1):\r\n\tx.append(tss+timedelta(hours=a))\r\n\tif a%2 ==0:\r\n\t\tlabel.append((tss+timedelta(hours=a)).strftime('%H:%M:%S'))\r\n\telse:\r\n\t\tlabel.append('')\r\n\r\nplt.figure(figsize=(20, 10))\r\nplt.plot(T,PM01, 'b', lw=2, label='PM 1.00')\r\nplt.plot(T,PM25, 'r', lw=4, label='PM 2.50')\r\nplt.plot(T,PM10, 'g', lw=2, label='PM 10.0')\r\nplt.xlabel('Time [UTC]')\r\nplt.ylabel('ug\/m3')\r\nplt.legend(loc='upper left', shadow=True)\r\nplt.xlim([ts, te])\r\nplt.ylim([0, (numpy.ceil(max(PM10)\/50)+1)*50])\r\nplt.grid()\r\nplt.title(date)\r\nplt.xticks(x,label, rotation=0)\r\nplt.savefig('\/root\/AIR\/OLSZANKOWA50A\/'+date+'.png',dpi=300)\r\n\r\nFile2Send = '\/root\/AIR\/OLSZANKOWA50A\/'+date+'.png'\r\nOutput_Directory = \"\/public_html\/parking-legionowo.pl\/AIR\/\" \r\n\r\n\r\nftp = FTP('***************')\r\nftp.login('***************', '***************') \r\nfile = open(File2Send, \"rb\") \r\nftp.cwd(Output_Directory)\r\nftp.storbinary('STOR ' +date+'.png', file) \r\nprint(\"STORing File now...\")\r\nftp.quit() \r\nfile.close() \r\nprint(\"File transfered\")\r\n<\/code><\/pre>\n<p><\/center><\/p>\n<p>Po przygotowaniu wykresu jest on zapisywany do pliku png i wysy\u0142any na serwer, gdzie mo\u017cna na bie\u017c\u0105co podgl\u0105da\u0107 pomiary. <\/p>\n<p>Tak wygl\u0105da normalny dzie\u0144 &#8220;bez smogu&#8221; (te chwilowe wzrosty to prawdopodobnie momenty, gdy s\u0105siedzi dok\u0142adaj\u0105 w\u0119gla do starego pieca):<\/p>\n<p><a href=\"http:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/2016-12-26.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"512\" src=\"http:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/2016-12-26-1024x512.png\" alt=\"\" style=\"width:700px;height:auto;\" class=\"alignnone size-large wp-image-1201\" srcset=\"https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/2016-12-26-1024x512.png 1024w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/2016-12-26-300x150.png 300w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/2016-12-26-768x384.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>A tak wygl\u0105da dzie\u0144 &#8220;smogowy&#8221; (akurat wtedy robi\u0142em zdj\u0119cia pokazane na pocz\u0105tku):<br \/>\n<a href=\"http:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/2017-01-09.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"512\" src=\"http:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/2017-01-09-1024x512.png\" alt=\"\" style=\"width:700px;height:auto;\" class=\"alignnone size-large wp-image-1202\" srcset=\"https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/2017-01-09-1024x512.png 1024w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/2017-01-09-300x150.png 300w, https:\/\/morony.pl\/wp-content\/uploads\/2017\/01\/2017-01-09-768x384.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>Aktualne pomiary mo\u017cna zobaczy\u0107 na stronie <strong>sponsora<\/strong>: <a href=\"http:\/\/parking-legionowo.pl\/AIR\/\">http:\/\/parking-legionowo.pl\/AIR\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Przez ostatnie dni media zdominowa\u0142 temat tragicznej jako\u015bci powietrza w polskich miastach. Nie jest to problem wirtualny, bo wystarczy wyj\u015b\u0107 na dw\u00f3r by zobaczy\u0107 i poczu\u0107 marn\u0105 jako\u015b\u0107 powietrza. Do wytworzenia smogu potrzebujemy dw\u00f3ch czynnik\u00f3w. Pierwszy to produkcja szkodliwych py\u0142\u00f3w i zanieczyszcze\u0144, kt\u00f3ra zim\u0105 jest mocno nasilona ze wzgl\u0119du na sezon grzewczy, szczeg\u00f3lnie w indywidualnych [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts\/1193"}],"collection":[{"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1193"}],"version-history":[{"count":10,"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts\/1193\/revisions"}],"predecessor-version":[{"id":1209,"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts\/1193\/revisions\/1209"}],"wp:attachment":[{"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}