# A weather station program display the date, time, temperature and humidity on the OLED screen with Air Quality and eCO2 on ZIP LEDs (Red/Green) from PicoAirQuality import KitronikBME688, KitronikButton, KitronikDataLogger, \ KitronikOLED, KitronikRTC, KitronikZIPLEDs,\ KitronikBuzzer import time #from datetime import datetime logFileName = "atmosphere_log.txt" bme688 = KitronikBME688() oled = KitronikOLED() rtc = KitronikRTC() zipleds = KitronikZIPLEDs(3) # Python u arse hole sec = Integer() rtc.setDate(16, 7, 2022) rtc.setTime(12, 10, 0) bme688.setupGasSensor() bme688.calcBaselines() sec = 0 #f = open(logFileName, 'a') #f.write("# Data Logging: Date, Time, Temperature, Pressure, Humidity, AirQuality, CO2\n") beeper = KitronikBuzzer() buttons = KitronikButton() def ButtonB_r_IRQHandler(pin): global buttonB buttonB = 2*60 print("button B pressed", buttonB) def ButtonB_f_IRQHandler(pin): #now = time.now() global buttonB buttonB = 2*60 print("button B released", buttonB, pin.value(),time.ticks_ms()) if pin.value(): beeper.playTone(600) else: beeper.stopTone() # FALLING DOES NOT WORK AND IRQ_LOW_LEVEL not recognised buttons.buttonB.irq(trigger=machine.Pin.IRQ_FALLING|machine.Pin.IRQ_RISING, handler=ButtonB_f_IRQHandler) #buttons.buttonB.irq(trigger=machine.Pin.IRQ_RISING, handler=ButtonB_r_IRQHandler) while True: if sec == 0: f = open(logFileName, 'a+') f.write("# Data Logging: Date, Time, Temperature, Pressure, Humidity, AirQuality, CO2\n") f.write('# Restarted ' + str(rtc.readDateString()) + ' ' + str(rtc.readTimeString()) + '\n' ) time.sleep_ms(1000) bme688.measureData() oled.clear() #oled.drawRect(4, 5, 120, 35) oled.displayText(rtc.readDateString(), 1, 25) oled.displayText(rtc.readTimeString(), 2, 33) #oled.drawLine(0, 48, 127, 48) #oled.drawLine(0, 49, 127, 49) oled.displayText(str(bme688.readTemperature()) + " oC", 3, 0) oled.displayText(str(bme688.readHumidity()) + " %H", 3, 80) eCO2 = bme688.readeCO2() oled.displayText(str(eCO2) + " CO2 ppm", 4, 0) IAQ = bme688.getAirQualityScore() oled.displayText(str(IAQ) + " AQ ", 5, 0) mbar = bme688.readPressure()/100.0 oled.displayText(str(mbar) + " mB ", 5, 50) oled.show() if (IAQ < 100): zipleds.setLED(0, zipleds.GREEN) else: zipleds.setLED(0, zipleds.RED) if (eCO2 < 800): zipleds.setLED(2, zipleds.GREEN) else: zipleds.setLED(2, zipleds.RED) zipleds.setBrightness(10) # ffs all I want is an action every minute I hate python scope shit #now = rtc.readTimeString(); # log every minute, thats 1440 records a day sec = sec + 1 secmod = sec % 29 if (secmod) == 0: #log.setupDataFields("Date", "Time", "Temperature", "Pressure", "Humidity", "IAQ", "eCO2") log_string = (rtc.readDateString() + ',' + \ rtc.readTimeString() + ',' + \ str(bme688.readTemperature()) + ',' + \ str(bme688.readPressure()) + ',' + \ str(bme688.readHumidity())+ ',' + \ str(bme688.getAirQualityScore()) + ',' + \ str(bme688.readeCO2())) + '\n' #print (log_string) #print ("logging data\n") f.write(log_string) f.flush() zipleds.setLED(1, zipleds.RED) elif (secmod < 10): zipleds.setLED(1, zipleds.BLUE) elif (secmod > 10): s2 = secmod * 2 zip_col = (secmod, s2, s2) zipleds.setLED(1, zip_col) if ( (sec+1) % 2 ) == 0: zipleds.setLED(1, zipleds.BLACK) zipleds.show()