esferatec
Published © GPL3+

CO₂ Ampel Stick – Gadget for Monitoring Indoor Air Quality

The CO₂ Ampel Stick is a compact desktop monitor to continuously measures CO₂ concentration, temperature and humidity.

BeginnerShowcase (no instructions)2 hours43
CO₂ Ampel Stick – Gadget for Monitoring Indoor Air Quality

Things used in this project

Story

Read more

Schematics

setup block

loop block

concentration function

temperature function

humidity function

battery function

Code

co2-ampel-stick.py

MicroPython
import os, sys, io
import M5
from M5 import *
from unit import CO2Unit
import m5utils
import time
from hardware import Pin
from hardware import I2C



TITLE = None
STATUS = None
BATTERY = None
CONCENTRATION_VALUE = None
TEMPERATURE_VALUE = None
HUMIDITY_VALUE = None
HUMIDITY_BAR = None
TEMPERATURE_BAR = None
CONCENTRATION_BAR = None
TEMPERATURE_TEXT = None
CONCENTRATION_TEXT = None
HUMIDITY_TEXT = None
i2c0 = None
co2_0 = None


concentration_value = None
humidity_value = None
temperature_value = None
concentration_bar = None
humidity_bar = None
temperature_bar = None
power_mode = None
screen_brightness = None

# get and show concentration as value and bar
def Show_Concentration_Value_and_Bar():
  global concentration_value, humidity_value, temperature_value, concentration_bar, humidity_bar, temperature_bar, power_mode, screen_brightness, TITLE, STATUS, BATTERY, CONCENTRATION_VALUE, TEMPERATURE_VALUE, HUMIDITY_VALUE, HUMIDITY_BAR, TEMPERATURE_BAR, CONCENTRATION_BAR, TEMPERATURE_TEXT, CONCENTRATION_TEXT, HUMIDITY_TEXT, i2c0, co2_0
  concentration_value = int(co2_0.co2)
  concentration_bar = int(m5utils.remap(concentration_value, 300, 2100, 0, 135))
  CONCENTRATION_VALUE.setText(str(concentration_value))
  CONCENTRATION_BAR.setSize(w=concentration_bar, h=20)
  if concentration_value < 800:
    CONCENTRATION_BAR.setColor(color=0x33cc00, fill_c=0x33cc00)
  if concentration_value >= 800 and concentration_value < 1000:
    CONCENTRATION_BAR.setColor(color=0x66ff99, fill_c=0x66ff99)
  if concentration_value >= 1000 and concentration_value < 1400:
    CONCENTRATION_BAR.setColor(color=0xffff00, fill_c=0xffff00)
  if concentration_value >= 1400:
    CONCENTRATION_BAR.setColor(color=0xff0000, fill_c=0xff0000)

# get and show humidity as value and bar
def Show_Humidity_Value_and_Bar():
  global concentration_value, humidity_value, temperature_value, concentration_bar, humidity_bar, temperature_bar, power_mode, screen_brightness, TITLE, STATUS, BATTERY, CONCENTRATION_VALUE, TEMPERATURE_VALUE, HUMIDITY_VALUE, HUMIDITY_BAR, TEMPERATURE_BAR, CONCENTRATION_BAR, TEMPERATURE_TEXT, CONCENTRATION_TEXT, HUMIDITY_TEXT, i2c0, co2_0
  humidity_value = int(co2_0.humidity)
  humidity_bar = int(m5utils.remap(humidity_value, 0, 100, 0, 135))
  HUMIDITY_VALUE.setText(str(humidity_value))
  HUMIDITY_BAR.setSize(w=humidity_bar, h=20)

# get and show temperature as value and bar
def Show_Temperature_Value_and_Bar():
  global concentration_value, humidity_value, temperature_value, concentration_bar, humidity_bar, temperature_bar, power_mode, screen_brightness, TITLE, STATUS, BATTERY, CONCENTRATION_VALUE, TEMPERATURE_VALUE, HUMIDITY_VALUE, HUMIDITY_BAR, TEMPERATURE_BAR, CONCENTRATION_BAR, TEMPERATURE_TEXT, CONCENTRATION_TEXT, HUMIDITY_TEXT, i2c0, co2_0
  temperature_value = int(co2_0.temperature)
  temperature_bar = int(m5utils.remap(temperature_value, 0, 100, 0, 135))
  TEMPERATURE_VALUE.setText(str(temperature_value))
  TEMPERATURE_BAR.setSize(w=temperature_bar, h=20)

# Describe this function...
def Show_Battery_Voltage_and_Capacity():
  global concentration_value, humidity_value, temperature_value, concentration_bar, humidity_bar, temperature_bar, power_mode, screen_brightness, TITLE, STATUS, BATTERY, CONCENTRATION_VALUE, TEMPERATURE_VALUE, HUMIDITY_VALUE, HUMIDITY_BAR, TEMPERATURE_BAR, CONCENTRATION_BAR, TEMPERATURE_TEXT, CONCENTRATION_TEXT, HUMIDITY_TEXT, i2c0, co2_0
  STATUS.setText(str((str((Power.getBatteryVoltage())) + str('mV'))))
  BATTERY.setText(str((str((Power.getBatteryLevel())) + str('%'))))


def setup():
  global TITLE, STATUS, BATTERY, CONCENTRATION_VALUE, TEMPERATURE_VALUE, HUMIDITY_VALUE, HUMIDITY_BAR, TEMPERATURE_BAR, CONCENTRATION_BAR, TEMPERATURE_TEXT, CONCENTRATION_TEXT, HUMIDITY_TEXT, i2c0, co2_0, concentration_value, humidity_value, temperature_value, concentration_bar, humidity_bar, temperature_bar, power_mode, screen_brightness

  M5.begin()
  Widgets.setRotation(0)
  Widgets.fillScreen(0x000000)
  TITLE = Widgets.Title("CO2 Ampel", 13, 0xffffff, 0x000000, Widgets.FONTS.Montserrat18)
  STATUS = Widgets.Label("0000mV", 78, 220, 1.0, 0xffffff, 0x000000, Widgets.FONTS.Montserrat12)
  BATTERY = Widgets.Label("000%", 5, 220, 1.0, 0xffffff, 0x000000, Widgets.FONTS.Montserrat12)
  CONCENTRATION_VALUE = Widgets.Label("0", 30, 35, 1.0, 0xffffff, 0x000000, Widgets.FONTS.Montserrat18)
  TEMPERATURE_VALUE = Widgets.Label("0", 30, 95, 1.0, 0xffffff, 0x000000, Widgets.FONTS.Montserrat18)
  HUMIDITY_VALUE = Widgets.Label("0", 30, 155, 1.0, 0xffffff, 0x000000, Widgets.FONTS.Montserrat18)
  HUMIDITY_BAR = Widgets.Rectangle(0, 180, 135, 20, 0x0025ff, 0x0025ff)
  TEMPERATURE_BAR = Widgets.Rectangle(0, 120, 135, 20, 0xf705ec, 0xf705ec)
  CONCENTRATION_BAR = Widgets.Rectangle(0, 60, 135, 20, 0xffffff, 0xffffff)
  TEMPERATURE_TEXT = Widgets.Label("T:", 5, 95, 1.0, 0xffffff, 0x000000, Widgets.FONTS.Montserrat18)
  CONCENTRATION_TEXT = Widgets.Label("C:", 5, 35, 1.0, 0xffffff, 0x000000, Widgets.FONTS.Montserrat18)
  HUMIDITY_TEXT = Widgets.Label("H:", 5, 155, 1.0, 0xffffff, 0x000000, Widgets.FONTS.Montserrat18)

  power_mode = False
  screen_brightness = 10
  Widgets.setBrightness(screen_brightness)
  i2c0 = I2C(0, scl=Pin(33), sda=Pin(32), freq=100000)
  co2_0 = CO2Unit(i2c0)
  co2_0.set_stop_periodic_measurement()
  co2_0.set_factory_reset()
  co2_0.set_start_periodic_measurement()
  while not (co2_0.is_data_ready()):
    time.sleep_ms(100)
  Show_Concentration_Value_and_Bar()
  Show_Temperature_Value_and_Bar()
  Show_Humidity_Value_and_Bar()
  Show_Battery_Voltage_and_Capacity()


def loop():
  global TITLE, STATUS, BATTERY, CONCENTRATION_VALUE, TEMPERATURE_VALUE, HUMIDITY_VALUE, HUMIDITY_BAR, TEMPERATURE_BAR, CONCENTRATION_BAR, TEMPERATURE_TEXT, CONCENTRATION_TEXT, HUMIDITY_TEXT, i2c0, co2_0, concentration_value, humidity_value, temperature_value, concentration_bar, humidity_bar, temperature_bar, power_mode, screen_brightness
  M5.update()
  if co2_0.is_data_ready():
    Show_Concentration_Value_and_Bar()
    Show_Temperature_Value_and_Bar()
    Show_Humidity_Value_and_Bar()
  Show_Battery_Voltage_and_Capacity()
  time.sleep(15)


if __name__ == '__main__':
  try:
    setup()
    while True:
      loop()
  except (Exception, KeyboardInterrupt) as e:
    try:
      from utility import print_error_msg
      print_error_msg(e)
    except ImportError:
      print("please update to latest firmware")

Credits

esferatec
2 projects • 0 followers

Comments