diff --git a/main.py b/main.py index 9033738..2592ee8 100644 --- a/main.py +++ b/main.py @@ -4,7 +4,7 @@ from PicoAirQuality import KitronikBME688, KitronikButton, KitronikDataLogger, KitronikOLED, KitronikRTC, KitronikZIPLEDs,\ KitronikBuzzer import time - +from array import array #from datetime import datetime logFileName = "atmosphere_log.txt" @@ -26,21 +26,57 @@ sec = 0 beeper = KitronikBuzzer() buttons = KitronikButton() - -def ButtonB_r_IRQHandler(pin): - global buttonB - buttonB = 2*60 - print("button B pressed", buttonB) + +# 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 - buttonB = 2*60 - print("button B released", buttonB, pin.value(),time.ticks_ms()) - if pin.value(): + 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 @@ -48,68 +84,38 @@ buttons.buttonB.irq(trigger=machine.Pin.IRQ_FALLING|machine.Pin.IRQ_RISING, hand #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() + #global old_m_count 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() \ No newline at end of file + 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() \ No newline at end of file