from machine import Pin, ADC, I2C
from time import sleep_ms, ticks_ms, ticks_diff
from i2c_lcd import I2cLcd
import _thread

# Define pin connections
S0_PIN = 14  # Example pin for S0
S1_PIN = 27  # Example pin for S1
S2_PIN = 26  # Example pin for S2
S3_PIN = 25  # Example pin for S3
SIG_PIN = 33 # Example pin for SIG
en_pin = 12

# Initialize pins
s0 = Pin(S0_PIN, Pin.OUT)
s1 = Pin(S1_PIN, Pin.OUT)
s2 = Pin(S2_PIN, Pin.OUT)
s3 = Pin(S3_PIN, Pin.OUT)
adc = ADC(Pin(SIG_PIN))
en = Pin(en_pin, Pin.OUT)
sys_mode = Pin(32, Pin.IN, Pin.PULL_DOWN)

# LCD Pins
i2c_sda = 21
i2c_scl = 22
lcd_addr = 0x27
i2c = I2C(0, sda=Pin(i2c_sda), scl=Pin(i2c_scl), freq=400000)
lcd = I2cLcd(i2c, lcd_addr, 2, 16)

# Function to initialize the multiplexer pins
def startup():
    s0.value(0)
    s1.value(0)
    s2.value(0)
    s3.value(0)

# Function to read from a specific channel
def read_channel(channel):
    s0.value(channel & 0x01)
    s1.value(channel & 0x02)
    s2.value(channel & 0x04)
    s3.value(channel & 0x08)
    return adc.read()

def mux_read_loop(threshold):
    count = 0
    sampled_values = [[] for _ in range(16)]  # List to store sampled values for each channel
    while count < threshold:
        for channel in range(16):
            data = read_channel(channel)
            # Thresholding the data
            threshold_value = 1000  # Adjust the threshold as needed
            digital_data = 1 if data > threshold_value else 0
            sampled_values[channel].append(digital_data)
            sleep_ms(10)  # Adjust as needed
        # print(count)
        count += 1
    
    # Calculate average for each channel
    averaged_values = [int(sum(samples) / len(samples)) if samples else 0 for samples in sampled_values]
    print(averaged_values)

def button_thread():
    while True:
        if sys_mode.value() == 1:
            pressed_time = ticks_ms()
            lcd.clear()
            lcd.putstr("pressed")
            while sys_mode.value() == 1:  # Wait for button release
                sleep_ms(10)
            released_time = ticks_ms()
            time_pressed = ticks_diff(released_time, pressed_time)
            lcd.clear()
            lcd.putstr("{}s Pressed".format(time_pressed))
            lcd.clear()
            if 500 <= time_pressed <= 2000:
                # mode_change()
                pass
            elif 2001 <= time_pressed <= 4000:
                # reset()
                pass
        sleep_ms(10)

def loop():
    startup()
    sleep_ms(2)
    _thread.start_new_thread(button_thread, ())  # Start the button thread
    mux_read_loop(20)  # Change the threshold value as needed

# Run the main function
if __name__ == "__main__":
    while True:
        loop()

Loading
cd74hc4067