2022-07-16 19:01:18 +00:00
|
|
|
|
|
|
|
# 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
|
2022-07-16 20:55:29 +00:00
|
|
|
from array import array
|
2022-07-16 19:01:18 +00:00
|
|
|
#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()
|
2022-07-16 20:55:29 +00:00
|
|
|
|
|
|
|
# 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)
|
2022-07-16 19:01:18 +00:00
|
|
|
|
|
|
|
def ButtonB_f_IRQHandler(pin):
|
|
|
|
#now = time.now()
|
2022-07-16 20:55:29 +00:00
|
|
|
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:
|
2022-07-16 19:01:18 +00:00
|
|
|
beeper.playTone(600)
|
|
|
|
else:
|
|
|
|
beeper.stopTone()
|
2022-07-16 20:55:29 +00:00
|
|
|
last_pv = pv
|
2022-07-16 19:01:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
# 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:
|
2022-07-16 20:55:29 +00:00
|
|
|
#global old_m_count
|
2022-07-16 19:01:18 +00:00
|
|
|
oled.clear()
|
|
|
|
oled.displayText(rtc.readDateString(), 1, 25)
|
|
|
|
oled.displayText(rtc.readTimeString(), 2, 33)
|
2022-07-16 20:55:29 +00:00
|
|
|
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()
|