<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Enviro Education Tools </title>
    <description>The latest articles on DEV Community by Enviro Education Tools  (@enviro_education_tools).</description>
    <link>https://dev.to/enviro_education_tools</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4154337%2Fa02bd2f1-9b9e-49da-abf3-e89f94f33176.png</url>
      <title>DEV Community: Enviro Education Tools </title>
      <link>https://dev.to/enviro_education_tools</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/enviro_education_tools"/>
    <language>en</language>
    <item>
      <title>Low-Cost Air Quality Monitor with Arduino and MQ135 for STEM Education</title>
      <dc:creator>Enviro Education Tools </dc:creator>
      <pubDate>Sun, 11 Oct 2026 08:22:53 +0000</pubDate>
      <link>https://dev.to/enviro_education_tools/low-cost-air-quality-monitor-with-arduino-and-mq135-for-stem-education-3h7p</link>
      <guid>https://dev.to/enviro_education_tools/low-cost-air-quality-monitor-with-arduino-and-mq135-for-stem-education-3h7p</guid>
      <description>&lt;p&gt;At &lt;strong&gt;Enviro Education Tools&lt;/strong&gt;, we document low-cost environmental monitoring tools for STEM education. &lt;/p&gt;

&lt;p&gt;This article describes a basic air quality monitor concept using Arduino and MQ135 for classroom understanding — presented as a &lt;strong&gt;qualitative educational experiment&lt;/strong&gt;, not a certified monitor.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the MQ135 can and cannot tell us
&lt;/h2&gt;

&lt;p&gt;The MQ135 is a broad metal-oxide sensor sensitive to NH3, NOx, alcohol, benzene, smoke, and CO2. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; The raw analog value is &lt;em&gt;not&lt;/em&gt; a calibrated PPM or Air Quality Index.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cross-sensitivity:&lt;/strong&gt; It responds to multiple gases at once. You cannot reliably isolate CO2 without laboratory calibration and compensation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environmental dependence:&lt;/strong&gt; Temperature and humidity affect sensor resistance. Readings shift without correction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qualitative use:&lt;/strong&gt; In STEM education, use it to discuss relative changes (e.g., window open vs closed) rather than absolute air-quality scores.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hardware concept
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Arduino Uno R3&lt;/li&gt;
&lt;li&gt;MQ135 module (AOUT to A0)&lt;/li&gt;
&lt;li&gt;Breadboard, jumper wires, USB cable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This article is a project guide and documentation — no hardware demonstration is claimed here.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring concept
&lt;/h2&gt;

&lt;p&gt;MQ135 VCC  -&amp;gt; Arduino 5V&lt;br&gt;
MQ135 GND  -&amp;gt; Arduino GND&lt;br&gt;&lt;br&gt;
MQ135 AOUT -&amp;gt; Arduino A0&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Ensure stable 5V supply — unstable USB hubs affect analog readings.&lt;/p&gt;
&lt;h2&gt;
  
  
  Sensor conditioning vs warm-up
&lt;/h2&gt;

&lt;p&gt;Per Winsen MQ135 datasheet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Initial conditioning:&lt;/strong&gt; When new, power the sensor for &lt;em&gt;over 48 hours&lt;/em&gt; in clean air for initial stabilization. This is a one-time burn-in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-heat before readings:&lt;/strong&gt; After initial conditioning, allow &lt;em&gt;20-30 minutes warm-up&lt;/em&gt; at each power-on before taking comparative readings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Full sketch (reproducible)
&lt;/h2&gt;

&lt;p&gt;This sketch is provided in the repository at &lt;code&gt;examples/arduino/air_quality_demo/air_quality_demo.ino&lt;/code&gt;. &lt;br&gt;
It logs raw ADC and estimated voltage. Voltage calculation assumes nominal 5.0V ADC reference.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;SENSOR_PIN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;A0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;ADC_REF&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MQ135 Concept - Raw reading and voltage"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Allow 20-30 min warm-up after initial 48h conditioning"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Raw, Voltage(V)"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sensorValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;analogRead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SENSOR_PIN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;voltage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sensorValue&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ADC_REF&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1023.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sensorValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;", "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;voltage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Expected serial output at 9600 baud:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="mf"&gt;245&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.197&lt;/span&gt;
&lt;span class="mf"&gt;247&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.207&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setup steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Wire as above, upload via Arduino IDE&lt;/li&gt;
&lt;li&gt;Open Serial Monitor at 9600 baud&lt;/li&gt;
&lt;li&gt;Allow 20-30 min warm-up after initial 48h conditioning&lt;/li&gt;
&lt;li&gt;Log relative changes for classroom discussion, not as official AQI

```
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Full project files:&lt;/em&gt; &lt;a href="https://gitlab.com/enviro-education-tools/enviro-education-tools" rel="noopener noreferrer"&gt;https://gitlab.com/enviro-education-tools/enviro-education-tools&lt;/a&gt; — see &lt;code&gt;examples/arduino/air_quality_demo/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Sensor type comparison:&lt;/em&gt; &lt;a href="https://enviroeducationtools.com/air-quality-atmospheric-testers/" rel="noopener noreferrer"&gt;Air Quality &amp;amp; Atmospheric Testers Overview&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;What do you think about using low-cost sensors for STEM? Drop a comment below 👇&lt;/em&gt;&lt;/p&gt;

</description>
      <category>arduino</category>
      <category>iot</category>
      <category>airquality</category>
      <category>environmentalmonitoring</category>
    </item>
  </channel>
</rss>
