{"id":1684,"date":"2026-09-11T21:35:34","date_gmt":"2026-09-11T21:35:34","guid":{"rendered":"https:\/\/pdp2011.sytse.net\/wordpress\/?p=1684"},"modified":"2026-09-11T21:39:30","modified_gmt":"2026-09-11T21:39:30","slug":"minc-vs-alpstuga","status":"publish","type":"post","link":"https:\/\/pdp2011.sytse.net\/wordpress\/minc-vs-alpstuga\/","title":{"rendered":"MINC vs Alpstuga"},"content":{"rendered":"\n<p>You will probably have heard about Alpstuga on the usual nerd channels. Yay, finally an affordable(*) air quality sensor that actually works! Rush over to Ikea to get one, pry it open, try to get the sensor out, take a hacksaw to the rear end only to find double sided sticky tape that actually sticks, hacksaw some more and finally the sensor is in your grubby hands, but the connector is nothing like those you have in your parts box and the wires are too thin to solder&#8230;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/pdp2011.sytse.net\/wordpress\/wp-content\/uploads\/2026\/09\/div2026q3-Z9A_9595.jpg\" alt=\"\" class=\"wp-image-1698\" srcset=\"https:\/\/pdp2011.sytse.net\/wordpress\/wp-content\/uploads\/2026\/09\/div2026q3-Z9A_9595.jpg 1024w, https:\/\/pdp2011.sytse.net\/wordpress\/wp-content\/uploads\/2026\/09\/div2026q3-Z9A_9595-300x200.jpg 300w, https:\/\/pdp2011.sytse.net\/wordpress\/wp-content\/uploads\/2026\/09\/div2026q3-Z9A_9595-768x512.jpg 768w, https:\/\/pdp2011.sytse.net\/wordpress\/wp-content\/uploads\/2026\/09\/div2026q3-Z9A_9595-600x400.jpg 600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>But no problem, there&#8217;s a way out &#8211; you can buy something called &#8216;SEN5X JUMPER 6-PIN JST GHR-06V-S CABLE SET&#8217; from the usual suspects &#8211; and when you order from them anyway, you might as well get your sensor there instead of taking a hacksaw to an innocent Alpstuga. It won&#8217;t be cheaper than IKEA, but you will get more choices than just SEN63C &#8211; there&#8217;s a whole family.<\/p>\n\n\n\n<p>Sensirion calls it a &#8216;sensor platform&#8217; &#8211; basically, it&#8217;s a standardised package with some sensors anwilld a microprocessor to normalise the interface to those sensors and help make sense of the data. All variants have humidity, temperature and particulate matter, and the fan that makes for a controlled airflow over those sensors. Beyond that, there&#8217;s CO2, VOC\/NOx, and formaldehyde (HCHO). In table form, something like this:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">sensor<\/th><th class=\"has-text-align-left\" data-align=\"left\">scale<\/th><th class=\"has-text-align-left\" data-align=\"left\">sen62<\/th><th class=\"has-text-align-left\" data-align=\"left\">sen63c<\/th><th class=\"has-text-align-left\" data-align=\"left\">sen65<\/th><th class=\"has-text-align-left\" data-align=\"left\">sen66<\/th><th class=\"has-text-align-left\" data-align=\"left\">sen68<\/th><th class=\"has-text-align-left\" data-align=\"left\">sen69c<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">pm1.0<\/td><td class=\"has-text-align-left\" data-align=\"left\">\/10<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">pm2.5<\/td><td class=\"has-text-align-left\" data-align=\"left\">\/10<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">pm4.0<\/td><td class=\"has-text-align-left\" data-align=\"left\">\/10<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">pm10.0<\/td><td class=\"has-text-align-left\" data-align=\"left\">\/10<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">hum<\/td><td class=\"has-text-align-left\" data-align=\"left\">\/100<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">temp<\/td><td class=\"has-text-align-left\" data-align=\"left\">\/200<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">voc<\/td><td class=\"has-text-align-left\" data-align=\"left\">\/10<\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">nox<\/td><td class=\"has-text-align-left\" data-align=\"left\">\/10<\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">hcho<\/td><td class=\"has-text-align-left\" data-align=\"left\">\/10<\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">co2<\/td><td class=\"has-text-align-left\" data-align=\"left\">\/1<\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><td class=\"has-text-align-left\" data-align=\"left\">x**<\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><td class=\"has-text-align-left\" data-align=\"left\">x<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>All very interesting for my MINC project to create the ultimate weather station. And yes, from the experiments I&#8217;ve done, the particulate matter data seems to be reliable and consistent &#8211; or in other words, if I run multiple units together, they give similar results, and I certainly see similar spikes on all units when my neighbours light up their barbecue. The same for temperature and humidity: where the previous generations of sensors lacked on repeatability and consistency, no such problems with the sen6x &#8211; the bar has clearly been raised.<\/p>\n\n\n\n<p>And maybe that bar has also been raised for CO2 measurements, but the jury is still out &#8211; one of my sensors showed an excursion into la-la-land, reporting over 200 ppm more than the sensor directly next to it for two days. It has meanwhile recovered though, and now again shows convincing numbers as do the others. Then the VOC and NOx measurements &#8211; those are not an absolute number but a relative index, relative to the previous X hours. Useful if the question on your mind is &#8216;should I open a window&#8217;, and that is of course what these sensors are intended for and why they are available at such affordable(*) rate &#8211; they are intended for household appliances, not for the lab. The HCHO measurement in SEN68 and SEN69C I cannot comment on &#8211; I dont have those.<\/p>\n\n\n\n<p>The driver I&#8217;ve added to the PDP2011 project should work with all current SEN6x (as above, it hasn&#8217;t been tested with SEN68 or SEN69C, or SEN62 for that matter). You will have to configure which type is connected on the driver instantiation, in the usual style for PDP2011, setting the signal have_sen6x to the right value: one of sen62, sen63c, sen65, sen66, sen68 or sen69c. And you&#8217;ll have to route the values from the sensor into the AD component. The driver itself has some interesting tricks in it: since the temperature and humidity scaling isn&#8217;t very useful, it implements dividers to scale these values back to \/10. Currently, the hardware divider &#8211; which is actually a multiplier &#8211; only works with unsigned numbers; that shouldn&#8217;t be an issue for the relative humidity numbers, but if your temperature goes below zero C things won&#8217;t work right. This feels like the right spot for a reminder that the sensor is meant for indoor use only. Still, I might fix the issue in a future version &#8211; I&#8217;ve half worked out how the multiplier-divide-by-ten for signed numbers should work already.<\/p>\n\n\n\n<p>Next thing to mention is how to make the sensor data available to MINC. The obvious way is to plug the measured values into the AD component &#8211; obvious because that&#8217;s how you would have connected such sensors back in the day, but also because the data kind of fits in the AD model. You&#8217;ll have to remember to read the data as integer values though, and convert by dividing by ten for display.<\/p>\n\n\n\n<p>Some code then? Here you go:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">10 DIM S%(10)<br>20 DISPLAY_CLEAR<br>30 REGION('upper',1)<br>40 REGION('lower',2)<br>50 WINDOW('exact',-512,0,0,500,1)<br>60 WINDOW('exact',-512,300,0,1200,2)<br>70 GRID()<br>80 GRID(,2)<br>90 AIN(,S%(),9,,40,9)<br>100 FOR I=0 TO 7<br>110 N=S%(I)\/10<br>120 IF I=6 THEN V=N<br>130 IF I&lt;&gt;6 THEN PRINT USING \"##=##.# \",I+40,N;<br>140 IF I=6 THEN PRINT USING \"##=#### \",I+40,N;<br>150 NEXT I<br>160 N=S%(8)<br>170 PRINT USING \"##=####\",48,N<br>180 DUAL_MOVE('distance',1,1,V,N)<br>190 PAUSE(30)<br>200 GO TO 90<\/pre>\n\n\n\n<p>Lines 20-80 set up a dual graph, with the top region set up for the VOC measurement, the bottom for CO2. The sensor in question is a SEN66 (hence the VOC measurement). Line 90 collects the measurements in an array of integers &#8211; 9 channels starting from channel 40. Then, lines 100 through 170 normalize the data; note that the VOC data is scaled by 10, but the CO2 data isn&#8217;t. Some formatting to dump out the data for easy viewing, and a dual_move graph from line 180.<\/p>\n\n\n\n<p>According to the datasheet, all SEN6x update every second &#8211; however, from what I&#8217;ve seen some of the sensors in the package update more frequently, so maybe we should read that as &#8216;at least&#8217;. For this type of graph updating once or twice a minute is enough though.<\/p>\n\n\n\n<p>How would such a graph look? <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/pdp2011.sytse.net\/wordpress\/wp-content\/uploads\/2026\/09\/div2026q3-Z9A_9559.jpg\" alt=\"\" class=\"wp-image-1696\" srcset=\"https:\/\/pdp2011.sytse.net\/wordpress\/wp-content\/uploads\/2026\/09\/div2026q3-Z9A_9559.jpg 1024w, https:\/\/pdp2011.sytse.net\/wordpress\/wp-content\/uploads\/2026\/09\/div2026q3-Z9A_9559-300x200.jpg 300w, https:\/\/pdp2011.sytse.net\/wordpress\/wp-content\/uploads\/2026\/09\/div2026q3-Z9A_9559-768x512.jpg 768w, https:\/\/pdp2011.sytse.net\/wordpress\/wp-content\/uploads\/2026\/09\/div2026q3-Z9A_9559-600x400.jpg 600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Like this, for instance. Note that this screenshot is from a slightly different BASIC program which also samples channels 32-39 which had another sensor on at the time.<\/p>\n\n\n\n<p>(***)<\/p>\n\n\n\n<p>(*) for specific values of &#8216;affordable&#8217;, obviously. <br>(**) the CO2 sensor in SEN66 is not the same as the one in SEN63C or SEN69C; it should be a bit more sensitive, a bit more accurate, and have a larger range. Not likely relevant for the intended use cases for this family of sensors though. <br>(***) I haven&#8217;t actually published the driver yet, it&#8217;ll be in the next release which should happen in the next few weeks.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>You will probably have heard about Alpstuga on the usual nerd channels. Yay, finally an affordable(*) air quality sensor that actually works! Rush over to Ikea to get one, pry it open, try to get the sensor out, take a hacksaw to the rear end only to find double sided sticky tape that actually sticks, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,4],"tags":[],"class_list":["post-1684","post","type-post","status-publish","format-standard","hentry","category-hardware","category-minc","missing-thumbnail"],"_links":{"self":[{"href":"https:\/\/pdp2011.sytse.net\/wordpress\/wp-json\/wp\/v2\/posts\/1684","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pdp2011.sytse.net\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pdp2011.sytse.net\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pdp2011.sytse.net\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pdp2011.sytse.net\/wordpress\/wp-json\/wp\/v2\/comments?post=1684"}],"version-history":[{"count":11,"href":"https:\/\/pdp2011.sytse.net\/wordpress\/wp-json\/wp\/v2\/posts\/1684\/revisions"}],"predecessor-version":[{"id":1699,"href":"https:\/\/pdp2011.sytse.net\/wordpress\/wp-json\/wp\/v2\/posts\/1684\/revisions\/1699"}],"wp:attachment":[{"href":"https:\/\/pdp2011.sytse.net\/wordpress\/wp-json\/wp\/v2\/media?parent=1684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pdp2011.sytse.net\/wordpress\/wp-json\/wp\/v2\/categories?post=1684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pdp2011.sytse.net\/wordpress\/wp-json\/wp\/v2\/tags?post=1684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}