# 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 array import array #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() # make this array size 20. A morse char of 5 dots|dashes # would take up 10 slots max. # class buttonEvent: mstimestamp = 0 pinstate = 0 def __init__(self, mststamp, pinst): buttonEvent.mstimestamp = mststamp buttonEvent.pinstate = pinst #def str(self): #return "mstimestamp:",str(mstimestamp), "pinst ",str(pinstate) mmaxindex = 20 mbuf = [] # array(buttonEvent) mindex = 0 # head new button events mindex_t = 0 # tail unprocessed button events mcount = 0 old_m_count = 0 last_pv = 0 #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, last_pv global mbuff, mindex, mcount, mmaxindex pv = pin.value() buttonB = 2*60 # maKES leds LIGHT IN AIRq print("button B IRQ", time.ticks_ms(), pv) if last_pv == 0 and pin.value() == 0: # get get spurious 0 level ints print("two zero ints low level in a row") # ignore else: bollocks=buttonEvent(time.ticks_ms(),pv) mbuf.insert(mindex,bollocks) print ("bollocks", str(bollocks.mstimestamp), str(bollocks.pinstate)) # arghhh why is it not storing thsi print ("mbuf inserting ",str( time.ticks_ms()), str(pv), "@", str(mindex)) b3 = mbuf[mindex] print ("did shit bag python actually put this in the list??", b3.pinstate, b3) # it would appear the shitbag python did store this mcount += 1 mindex += 1 mindex = mindex % mmaxindex if pv: beeper.playTone(600) else: beeper.stopTone() last_pv = pv # 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: #global old_m_count oled.clear() oled.displayText(rtc.readDateString(), 1, 25) oled.displayText(rtc.readTimeString(), 2, 33) oled.displayText(str(mcount), 4, 33) # process the list if (mcount - old_m_count) >= 2: print(" old_m_count != mcount >= 2") b1 = mbuf[(mindex_t+mmaxindex)%mmaxindex] b2 = mbuf[(mindex_t+1)%mmaxindex] # ok shitbag python why is the pinstate in that object now zero you turd #print("b1 index", str((mindex_t+mmaxindex)%mmaxindex), "b1 ps", str(b1.pinstate)) #print("b2 index", str((mindex_t+mmaxindex+1)%mmaxindex), "b2 ps ", str(b2.pinstate)) print("b1", b1, b1.pinstate) print("b2", b2, b2.pinstate) print(" b1 ps, b2 ps", b1.pinstate, b2.pinstate) if b1.pinstate == 1 and b2.pinstate == 0: print(" high to low pinstate valid press", b1.pinstate, b2.pinstate) # press and release found duration = b2.mstimestamp - b1.mstimestamp if duration < 300: oled.displayText('dit '+str(duration), 5, 33) else: oled.displayText('dah '+str(duration), 5, 33) mindex_t += 2; mindex_t = mindex_t % mmaxindex mcount -= 2 else: print(" undefined pinstate order", b1.pinstate, b2.pinstate) mindex_t += 1 # that one made no sense so move up mindex_t = mindex_t % mmaxindex mcount -= 1 oled.displayText('BAH ', 5, 33) old_m_count = mcount oled.show()