{"id":5751,"date":"2021-04-15T20:55:47","date_gmt":"2021-04-15T19:55:47","guid":{"rendered":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/?p=5751"},"modified":"2021-04-19T18:05:16","modified_gmt":"2021-04-19T17:05:16","slug":"co2-messung-mit-scd30-arduino-und-matlab","status":"publish","type":"post","link":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/2021\/04\/15\/co2-messung-mit-scd30-arduino-und-matlab\/","title":{"rendered":"CO2-Messung mit SCD30, Arduino und Matlab"},"content":{"rendered":"<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_5751\" class=\"pvc_stats all  \" data-element-id=\"5751\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p style=\"text-align: justify\"><a href=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112508-scaled.jpg\"><img fetchpriority=\"high\" decoding=\"async\" class=\"size-medium wp-image-5753 alignleft\" src=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112508-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" srcset=\"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112508-300x225.jpg 300w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112508-1024x768.jpg 1024w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112508-768x576.jpg 768w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112508-1536x1152.jpg 1536w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112508-2048x1536.jpg 2048w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a>Dieses Projekt &#8211; eigentlich Miniprojekt &#8211; k\u00f6nnte vielleicht auch f\u00fcr den einen oder anderen interessant sein. Es handelt sich um den mittlerweile bekannten und h\u00e4ufig verwendeten Kohlendioxid Sensor SCD30 (CO2-Sensor) des Herstellers Sensirion. Es gibt etliche Projekte die man dazu im Netz findet. Im Rahmen eines schnellen Testaufbaues habe ich versucht, die Daten des Sensors mithilfe eines Arduino Uno Boards auszulesen, um sie dann mit der Software Matlab in einem Plot darzustellen. Die Daten\u00fcbertragung erfolgt \u00fcber die Serielle Schnittstelle bzw. \u00fcber serielles Protokoll des USB-UART.<\/p>\n<p style=\"text-align: justify\">Um den SCD30 am Arduino anzuschlie\u00dfen, ben\u00f6tigt man die Spannungsversorgung und den I\u00b2C Datenbus &#8211; also in Summe gerade einmal vier Dr\u00e4hte. Damit ist die minimale Konfiguration erf\u00fcllt und die Daten k\u00f6nnen ausgelesen werden.<\/p>\n<p style=\"text-align: justify\"><a href=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112252-scaled.jpg\"><img decoding=\"async\" class=\"size-medium wp-image-5757 alignleft\" src=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112252-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" srcset=\"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112252-300x225.jpg 300w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112252-1024x768.jpg 1024w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112252-768x576.jpg 768w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112252-1536x1152.jpg 1536w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/IMG_20210412_112252-2048x1536.jpg 2048w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a>Der Sensor selbst arbeitet nach dem Prinzip der NDIR Technologie.&nbsp; (NDIR = non-dispersive-infrared). Das bedeutet, der Sensor ist also ein kleines Spektrometer. Hierbei wird das zu untersuchende Medium in eine Probenkammer geleitet. Die Probenkammer wird von einer Infrarotquelle durchleuchtet und das IR-Licht durchstrahlt das Medium und einen sehr schmalbandigen Wellenl\u00e4ngenfilter und trifft dann auf den IR-Detektor auf. Die Wellenl\u00e4nge des Filters ist dabei so ausgelegt, dass genau diejenigen Wellenl\u00e4ngen durchgelassen werden, die von den Molek\u00fclen des Mediums (Gases) absorbiert werden. Je nach Anzahl der Molek\u00fcle, oder Dichte des Gases, werden entsprechend weniger Lichtstrahlen vom Detektor erkannt.&nbsp; Eine zweite Messkammer, die mit einem Referenzgas gef\u00fcllt ist, dient dabei als Referenz. Ein Controller am Sensor wertet diese Informationen aus und gibt sie in Form von ppm \u00fcber die I\u00b2C (oder umschaltbar auch MOD-Bus) Schnittstelle weiter. Zus\u00e4tzlich befindet sich auch ein Temperatur und Luftfeuchtesensor am Board, deren Daten ebenso \u00fcber den Bus ausgelesen werden k\u00f6nnen. Die voreingestellte I\u00b2C Adresse des SCD30 ist 0x61. Die genauen Informationen zum Datenprotokoll sind in den <a href=\"https:\/\/www.sensirion.com\/fileadmin\/user_upload\/customers\/sensirion\/Dokumente\/9.5_CO2\/Sensirion_CO2_Sensors_SCD30_Interface_Description.pdf\">Dokumentationen<\/a> der Firma Sensirion zu finden.<a href=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/anschluss-rotated.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-6548 alignleft\" src=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/anschluss-282x300.jpg\" alt=\"\" width=\"282\" height=\"300\" srcset=\"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/anschluss-282x300.jpg 282w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/anschluss-rotated.jpg 382w\" sizes=\"(max-width: 282px) 100vw, 282px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Idealerweise gibt es, wie fast immer, schon eine fertige, studententaugliche Library f\u00fcr die diversen Microcontroller. So braucht man sich keine Gedanken mehr zu machen und kann die Daten des angeschlossenen Sensors direkt auslesen. Die Beispielprogramme findet man unter den Examples der Libraries.<\/p>\n<div id=\"attachment_6546\" style=\"width: 829px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/specs.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-6546\" class=\"wp-image-6546 size-full\" src=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/specs.jpg\" alt=\"\" width=\"819\" height=\"410\" srcset=\"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/specs.jpg 819w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/specs-300x150.jpg 300w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/specs-768x384.jpg 768w\" sizes=\"(max-width: 819px) 100vw, 819px\" \/><\/a><p id=\"caption-attachment-6546\" class=\"wp-caption-text\">electrical specifications<\/p><\/div>\n<p style=\"text-align: justify\">F\u00fcr die Versorgungsspannung des Sensors kann der Arduino mit 3.3V oder 5V dienen. Vorsicht ist jedoch geboten, wenn man den I\u00b2C Bus, verwendet: Hier ist der Input High-Level mit 1,75-3.0V festgelegt und der Output High Level mit max. 2.4V. An einem Arduino sind die Pegel aber 5V!! Also muss hier ein Levelshifter eingebaut werden &#8211; oder zumindest, f\u00fcr einen schnellen Test geeignete Widerst\u00e4nde.<\/p>\n<p style=\"text-align: justify\">Der hier angef\u00fchrte Programmcode stammt im Wesentlichen aus dem Beispiel der Library von Nathan Seidle von SparkFun Electronics:<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #f8f8f8;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<table>\n<tbody>\n<tr>\n<td>\n<pre style=\"margin: 0;line-height: 125%\"> 1\r\n 2\r\n 3\r\n 4\r\n 5\r\n 6\r\n 7\r\n 8\r\n 9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\r\n25\r\n26\r\n27\r\n28\r\n29\r\n30\r\n31\r\n32\r\n33\r\n34\r\n35\r\n36\r\n37\r\n38\r\n39\r\n40<\/pre>\n<\/td>\n<td>\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #408080;font-style: italic\">\/*<\/span>\r\n<span style=\"color: #408080;font-style: italic\">By: Nathan Seidle SparkFun Electronics  <\/span>\r\n<span style=\"color: #408080;font-style: italic\">Library: http:\/\/librarymanager\/All#SparkFun_SCD30  <\/span>\r\n<span style=\"color: #408080;font-style: italic\">*\/<\/span>\r\n\r\n<span style=\"color: #bc7a00\">#include &lt;Wire.h&gt;<\/span>\r\n<span style=\"color: #bc7a00\">#include \"SparkFun_SCD30_Arduino_Library.h\" <\/span>\r\nSCD30 airSensor;\r\n\r\n<span style=\"color: #b00040\">void<\/span> <span style=\"color: #0000ff\">setup<\/span>()  \r\n{\r\n  Wire.begin();\r\n  Serial.begin(<span style=\"color: #666666\">9600<\/span>);\r\n  <span style=\"color: #408080;font-style: italic\">\/\/Serial.println(\"SCD30 Example\");<\/span>\r\n  airSensor.begin(); <span style=\"color: #408080;font-style: italic\">\/\/This will cause readings to occur every two seconds<\/span>\r\n}\r\n\r\n<span style=\"color: #b00040\">void<\/span> <span style=\"color: #0000ff\">loop<\/span>()  \r\n{\r\n  <span style=\"color: #008000;font-weight: bold\">if<\/span> (airSensor.dataAvailable())\r\n  {\r\n   <span style=\"color: #408080;font-style: italic\">\/\/ Serial.print(\"co2(ppm):\");<\/span>\r\n   \r\n    Serial.print(airSensor.getCO2());\r\n\r\n    <span style=\"color: #408080;font-style: italic\">\/\/Serial.print(\" temp(C):\");<\/span>\r\n    Serial.print(<span style=\"color: #ba2121\">\",\"<\/span>);\r\n    Serial.print(airSensor.getTemperature(), <span style=\"color: #666666\">1<\/span>);\r\n\r\n   <span style=\"color: #408080;font-style: italic\">\/\/ Serial.print(\" humidity(%):\");<\/span>\r\n    Serial.print(<span style=\"color: #ba2121\">\",\"<\/span>);\r\n    Serial.print(airSensor.getHumidity(), <span style=\"color: #666666\">1<\/span>);\r\n\r\n    Serial.println();\r\n  }\r\n  <span style=\"color: #008000;font-weight: bold\">else<\/span>\r\n    <span style=\"color: #408080;font-style: italic\">\/\/Serial.println(\"No data\");<\/span>\r\n\r\n  delay(<span style=\"color: #666666\">500<\/span>);\r\n}\r\n<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify\">Mit diesen Codezeilen im Arduino Uno und der korrekten Verdrahtung (SDA -&gt; an Arduino A4 und SCL -&gt; an Arduino A5 \u00fcber einen geeigneten Pegelwandler) geht&#8217;s dann mit Matlab weiter. Der Arduino sollte jetzt in einem seriellen Terminal folgende Zeilen ausgeben: (Beispiel)<\/p>\n<p>473,28.5,12.9<br \/>\n473,28.5,13.0<br \/>\n470,28.5,13.1<br \/>\n469,28.5,12.9<br \/>\n466,28.5,12.9<br \/>\n465,28.5,12.7<br \/>\n465,28.5,12.5<br \/>\n463,28.6,12.6<br \/>\n461,28.6,12.5<br \/>\n463,28.5,12.4 &#8230; und so weiter<\/p>\n<p style=\"text-align: justify\">Diese gilt es nun in Matlab einzulesen und \u00fcber einen definierbaren Zeitraum aufzuzeichnen und gleichzeitig in einem Plot darzustellen. Das Matlabskript hier macht es m\u00f6glich&#8230; (pn falls es jemand ben\u00f6tigt)<\/p>\n<p style=\"text-align: justify\"><a href=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/matlabscreen.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-6553 size-full\" src=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/matlabscreen.jpg\" alt=\"\" width=\"862\" height=\"601\" srcset=\"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/matlabscreen.jpg 862w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/matlabscreen-300x209.jpg 300w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/matlabscreen-768x535.jpg 768w\" sizes=\"(max-width: 862px) 100vw, 862px\" \/><\/a>Als Ergebnis erh\u00e4lt man dann einen Plot, der den CO2 Verlauf im Raum (in dem Fall am Schreibtisch meines B\u00fcros) darstellt.<\/p>\n<p><a href=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/co2verlauf.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5755 size-large\" src=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/co2verlauf-1024x514.jpg\" alt=\"\" width=\"474\" height=\"238\" srcset=\"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/co2verlauf-1024x514.jpg 1024w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/co2verlauf-300x150.jpg 300w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/co2verlauf-768x385.jpg 768w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/co2verlauf-1536x770.jpg 1536w, https:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2021\/04\/co2verlauf.jpg 1920w\" sizes=\"(max-width: 474px) 100vw, 474px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_5751\" class=\"pvc_stats all  \" data-element-id=\"5751\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p>Dieses Projekt &#8211; eigentlich Miniprojekt &#8211; k\u00f6nnte vielleicht auch f\u00fcr den einen oder anderen interessant sein. Es handelt sich um den mittlerweile bekannten und h\u00e4ufig verwendeten Kohlendioxid Sensor SCD30 (CO2-Sensor) des Herstellers Sensirion. Es gibt etliche Projekte die man dazu im Netz findet. Im Rahmen eines schnellen Testaufbaues habe ich versucht, die Daten des Sensors&hellip; <br \/> <a class=\"read-more\" href=\"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/2021\/04\/15\/co2-messung-mit-scd30-arduino-und-matlab\/\">Weiterlesen<\/a><\/p>\n","protected":false},"author":86,"featured_media":5753,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"ngg_post_thumbnail":0,"footnotes":""},"categories":[1187],"tags":[431,1982,1551,1981,1052,977,1549,1980,1550],"class_list":["post-5751","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","tag-arduino-matlab","tag-arduino-und-co2","tag-co2-mit-matab","tag-co2-sensor","tag-ic","tag-rs232","tag-scd30","tag-sensirion","tag-sensor"],"a3_pvc":{"activated":true,"total_views":1229,"today_views":0},"_links":{"self":[{"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/posts\/5751","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/users\/86"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/comments?post=5751"}],"version-history":[{"count":0,"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/posts\/5751\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/media\/5753"}],"wp:attachment":[{"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/media?parent=5751"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/categories?post=5751"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/tags?post=5751"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}