News: ES33A08 ES33B08 ESP32 micropython code paste the code in Thonny (https://thonny.org/)


from machine import Pin, ADC


import time


 


# Define pins for the shift register 74HC595


CLOCK_595 = 27  # Clock pin for 74HC595


LATCH_595 = 14  # Latch pin for 74HC595


DATA_595 = 13   # Data pin for 74HC595


OE_595 = 4      # Output Enable for 74HC595, active low


 


# Define pins for the input shift register 74HC165


CLOCK_165 = 18  # Clock pin for 74HC165


LOAD_165 = 19   # Load pin for 74HC165


DATA_165 = 21   # Data pin for 74HC165


 


# Define pin for the PIR sensor


PIR_PIN = 5


 


# Initialize GPIO pins for 74HC595


clock_595 = Pin(CLOCK_595, Pin.OUT)


latch_595 = Pin(LATCH_595, Pin.OUT)


data_595 = Pin(DATA_595, Pin.OUT)


oe_595 = Pin(OE_595, Pin.OUT)


 


# Initialize GPIO pins for 74HC165


clock_165 = Pin(CLOCK_165, Pin.OUT)


load_165 = Pin(LOAD_165, Pin.OUT)


data_165 = Pin(DATA_165, Pin.IN)


 


# Initialize GPIO pin for PIR sensor


pir_sensor = Pin(PIR_PIN, Pin.IN)


 


# Initialize ADC for LM324DR (Analog signal processing)


analog_input = ADC(Pin(32))  # Use GPIO32 for analog input


 


# Ensure output is disabled during setup


oe_595.value(1)  # Disable output (active low)


 


# Number to display mapping for 7-segment (decimal representation)


number_mapping = {


    0: 252,  # 0b11111100, 0xFC, Configuration for '0'


    1: 96,   # 0b01100000, 0x60, Configuration for '1'


    2: 218,  # 0b11011010, 0xDA, Configuration for '2'


    3: 242,  # 0b11110010, 0xF2, Configuration for '3'


    4: 102,  # 0b01100110, 0x66, Configuration for '4'


    5: 182,  # 0b10110110, 0xB6, Configuration for '5'


    6: 190,  # 0b10111110, 0xBE, Configuration for '6'


    7: 224,  # 0b11100000, 0xE0, Configuration for '7'


    8: 254,  # 0b11111110, 0xFE, Configuration for '8'


    9: 246   # 0b11110110, 0xF6, Configuration for '9'


}


 


# Text to display mapping for 7-segment (common cathode configuration)


text_mapping = {


    'A': 238,  # 0b11101110, 0xEE, Configuration for 'A'


    'b': 62,   # 0b00111110, 0x3E, Configuration for 'b'


    'C': 156,  # 0b10011100, 0x9C, Configuration for 'C'


    'd': 122,  # 0b01111010, 0x7A, Configuration for 'd'


    'E': 158,  # 0b10011110, 0x9E, Configuration for 'E'


    'F': 142,  # 0b10001110, 0x8E, Configuration for 'F'


    'G': 188,  # 0b10111100, 0xBC, Configuration for 'G'


    'H': 110   # 0b01101110, 0x6E, Configuration for 'H'


}


 


# Digit activation (decimal representation, assuming common cathode for simplicity, modify if using common anode)


digit_activation = {


    1: 14, # 0b1110, 0xE, Activate the first digit (leftmost)


    2: 13, # 0b1101, 0xD, Activate the second digit


    3: 11, # 0b1011, 0xB, Activate the third digit


    4: 7   # 0b0111, 0x7, Activate the fourth digit (rightmost)


}


 


# Channel control bits (decimal representation)


channel_mapping = {


    1: 32768, # 0b1000000000000000, 0x8000


    2: 16384, # 0b0100000000000000, 0x4000


    3: 8192,  # 0b0010000000000000, 0x2000


    4: 4096,  # 0b0001000000000000, 0x1000


    5: 2048,  # 0b0000100000000000, 0x0800


    6: 1024,  # 0b0000010000000000, 0x0400


    7: 512,   # 0b0000001000000000, 0x0200


    8: 256    # 0b0000000100000000, 0x0100


}


 


# Input control bits for 74HC165 (D0 to D7, decimal representation)


input_mapping = {


    1: 1,  # 0b00000001, 0x01


    2: 2,  # 0b00000010, 0x02


    3: 4,  # 0b00000100, 0x04


    4: 8,  # 0b00001000, 0x08


    5: 16, # 0b00010000, 0x10


    6: 32, # 0b00100000, 0x20


    7: 64, # 0b01000000, 0x40


    8: 128 # 0b10000000, 0x80


}


 


# Voltage input bits (V1 to V4, decimal representation)


v_mapping = {


    1: ADC(Pin(32)),  # V1, GPIO32


    2: ADC(Pin(33)),  # V2, GPIO33


    3: ADC(Pin(34)),  # V3, GPIO34


    4: ADC(Pin(35))   # V4, GPIO35


}


 


# Current input bits (I1 to I4, decimal representation)


i_mapping = {


    1: ADC(Pin(36)),  # I1, GPIO36


    2: ADC(Pin(37)),  # I2, GPIO37


    3: ADC(Pin(38)),  # I3, GPIO38


    4: ADC(Pin(39))   # I4, GPIO39


}


 


# Function to write value to the shift register


def write_shift_register(value):


    latch_595.value(0)  # Prepare to latch data


    for i in range(32):  # Shift 32 bits of data


        data_595.value((value >> i) & 1)


        clock_595.value(1)


        time.sleep_us(10)


        clock_595.value(0)


    latch_595.value(1)  # Latch the data at the output of the shift registers


    oe_595.value(0)     # Enable output to take effect


 


# Function to read value from the input shift register


def read_shift_register():


    load_165.value(0)  # Load the parallel input to the shift register


    time.sleep_us(10)


    load_165.value(1)


    


    value = 0


    for i in range(8):  # Read 8 bits of data


        value |data_165.value() << (7 - i))


        clock_165.value(1)


        time.sleep_us(10)


        clock_165.value(0)


    


    return value


 


# Function to control CH1 based on IN1 and PIR sensor status


def control_ch1():


    input_status = read_shift_register()


    in1_status input_status >> 0) & 1  # Read the status of IN1


    pir_status = pir_sensor.value()  # Read the status of the PIR sensor


    


    if in1_status == 1 or pir_status == 1:  # If IN1 or PIR is high


        combined_value = channel_mapping[1]  # Activate CH1


    else:  # If both IN1 and PIR are low


        combined_value = 0  # Deactivate all channels


    


    write_shift_register(combined_value)


 


# Function to read analog inputs (V* and I*)


def read_analog_inputs():


    analog_values = {}


    for key, adc in v_mapping.items():


        analog_values[f"V{key}"] = adc.read()


    for key, adc in i_mapping.items():


        analog_values[f"I{key}"] = adc.read()


    return analog_values


 


# Function to indicate if something is connected to the inputs


def indicate_input_connections(input_status):


    for i in range(8):


        if (input_status >> i) & 1:


            print(f"IN{i+1} is connected")


 


# Main loop


while True:


    # Control CH1 based on IN1 and PIR sensor status


    control_ch1()


    


    # Read input status and indicate connections


    input_status = read_shift_register()


    indicate_input_connections(input_status)


    


    # Print digital values


    digital_values = {f"IN{i+1}": (input_status >> i) & 1 for i in range(8)}


    print("Digital values:", ", ".join([f"IN{i+1}: {val}" for i, val in enumerate(digital_values.values())]))


    


    # Read analog input (e.g., from LM324DR)


    analog_values = read_analog_inputs()


    print(f"Analog values: {analog_values}")


    


    # Cycle through numbers 0 to 9 and corresponding channels


    for channel in range(1, 9):


        # Calculate the channel bit pattern (OUT 16 to OUT 9 corresponds to channels 1 to 8)


        channel_bit_pattern = 1 << (16 - channel)


        


        # Get the number to display and calculate the combined value for the shift register


        number_to_display = channel % 10  # Display the same number as the channel


        combined_value number_mapping[number_to_display] << 24) | \


                         (digit_activation[1] << 20) | \


                         channel_bit_pattern


        


        # Write the combined value to the shift register


        write_shift_register(combined_value)


        


        # Print the current state for debugging


        print(f"Channel {channel} is active, displaying number {number_to_display}")


        


        # Wait before moving to the next number and channel


        time.sleep(1)


    


    # Additional delay before repeating the cycle, if needed


    time.sleep(1)


 

payment
Copyright © 2024 Eletechsup All Rights Reserved.