Código - AaroniSalinas/RaspberryI2C GitHub Wiki

Se incluyen las librerías para la comunicación con la memoria 24LC256

from smbus import SMBus
import time

Así como las librerías para la comunicación con OLED

import subprocess 
from board import SCL, SDA
import busio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306

Configuración de la pantalla OLED

i2c = busio.I2C(SCL, SDA)
# Creacion de la oled y su pixeles
disp = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c) 
# limpieza del display.
disp.fill(0)
disp.show()
# Imagen en balnco para la imagen del oled
width = disp.width
height = disp.height
image = Image.new("1", (width, height))
draw = ImageDraw.Draw(image)
 
# Se utiliza para poder limpiar la oled y no sobreescribir
draw.rectangle((0, 0, width, height), outline=0, fill=0)
padding = -2
top = padding
bottom = height - padding
x = 0
font = ImageFont.load_default()

Variables necesarias

bus = SMBus(1)
address = 0x50
regmsbyte = 0
reglsbyte = 0
sumaPar = 0
restaNon = 0
multiplicaPrimo = 1
sumaCuadrados = 0

Funciones a utilizar en el programa

#Número es par
def par(num):
    if num % 2 == 0:
        return True
    else:
        return False

#Número es primo
def primo(num):
    for n in range(2, num):
        if num % n == 0:
            return False
    return True

#Número es multiplo de 3
def multiplo_3(num):
    if num % 3 == 0:
        return True
    else:
        return False

Creación de lista de números introducida por el usuario

lNum = list()
count = 1
for i in range(20):
    #Ingreso de datos a una lista
    print('Ingresa tu dato numero',i+1,': ')
    num = int(input(''))
    lNum.append(num)

Escritura de esta lista en la memoria 24LC256

lNum.insert(0, reglsbyte)
bus.write_i2c_block_data(address, regmsbyte, lNum)
time.sleep(2)

Para las localidades pares, se recorren una a una las localidades y si se encuentra en una localidad par, se extrae el número y se realiza una suma.

print('Pares')
addressT = address
bus.write_byte_data(addressT, regmsbyte, reglsbyte)
numString = ''
time.sleep(1)
for i in range(1,22):
    if i <21:
        #Leer localidades y extraerlas de memoria
        if (par(i)):
            numT = bus.read_byte(addressT)
            sumaPar = sumaPar + numT
            print('Numero', numT)
            numString = numString + str(numT)
        else:
            bus.read_byte(addressT)

Una vez leídas las 20 localidades, se imprime en pantalla OLED todos los números utilizados así como el resultado final.

    else:
        #Impresion en consola y en oled del resultado 
        print('Suma Par: ', sumaPar)
        lNum.insert(21,sumaPar)
        bus.write_i2c_block_data(address, regmsbyte, lNum)
        time.sleep(2)
        #Impresion de datos en oled
        draw.rectangle((0, 0, width, height), outline=0, fill=0)
        draw.text((x, top + 0), "Suma Par: " + str(sumaPar), font=font, fill=255) 
        draw.text((x, top + 10), "Numeros usados: ", font=font, fill = 255)
        draw.text((x, top + 20), "" + numString, font = font, fill = 255) 
        # Display image.
        disp.image(image)
        disp.show()
        time.sleep(5)
print(sumaPar)

El mismo proceso se repite para las localidades nones.

print('Nones')
addressT = address
bus.write_byte_data(addressT, regmsbyte, reglsbyte)
numString = ''
# Clear display.
disp.fill(0)
disp.show()
time.sleep(1)
for i in range(1,22):
    if i <21:
        if (not par(i)):
            #Leer localidades de la memoria y ver cuales son impares de los datos y su resta correspondiente
            numT = bus.read_byte(addressT)
            restaNon = restaNon - num
            print('Numero', numT)
            numString = numString + str(numT)
        else:
            bus.read_byte(addressT)
    else:
        #Impresion en consola y en oled del resultado 
        print('Resta Nones: ', restaNon)
        lNum.insert(22,restaNon)
        bus.write_i2c_block_data(address, regmsbyte, lNum)
        time.sleep(2)
        #Impresion de datos en la oled
        draw.rectangle((0, 0, width, height), outline=0, fill=0)
        draw.text((x, top + 0), "Resta Nones: " , font=font, fill=255) 
        draw.text((x, top + 8), "" + str(restaNon), font = font, fill = 255) 
        draw.text((x, top + 16), "Numeros usados: ", font=font, fill = 255)
        draw.text((x, top + 24), "" + numString, font = font, fill = 255) 
        # Display image.
        disp.image(image)
        disp.show()
        time.sleep(5)    
print(restaNon)

Las localidades primas

print('Primos')
addressT = address
bus.write_byte_data(addressT, regmsbyte, reglsbyte)
numString = ''
# Clear display.
disp.fill(0)
disp.show()
time.sleep(1)
for i in range(1,22):
    if i <21:
        if (primo(i)):
            #Leer localidades de memoria y decir cual es primo, para poder sacar la multiplicacion de todas
            numT = bus.read_byte(addressT)
            multiplicaPrimo = multiplicaPrimo * numT
            print('Numero', numT)
            numString = numString + str(numT)
        else:
            bus.read_byte(addressT)
    else:
        #Impresion en consola y en oled del resultado 
        print('Multiplo: ',multiplicaPrimo)
        lNum.insert(23,multiplicaPrimo)
        bus.write_i2c_block_data(address, regmsbyte, lNum)
        time.sleep(2)
        #La impresion de datos en la oled
        draw.rectangle((0, 0, width, height), outline=0, fill=0)
        draw.text((x, top + 0), "Multiplo: " + str(multiplicaPrimo), font=font, fill=255)
        draw.text((x, top + 10), "Numeros usados: ", font=font, fill = 255)
        draw.text((x, top + 20), "" + numString, font = font, fill = 255)   
        # Display image.
        disp.image(image)
        disp.show()
        time.sleep(5)
print(multiplicaPrimo)

Las localidades que son múltiplo de 3

print('Multiplos de 3')
addressT = address
bus.write_byte_data(addressT, regmsbyte, reglsbyte)
numString = ''
# Clear display.
disp.fill(0)
disp.show()
time.sleep(1)
for i in range(1,22):
    if i <21:
        if (multiplo_3(i)):
            #Lee las localidades de memoria, para ver cual es multiplo de 3 y saber la sumatoria de su cuadrado
            numT = bus.read_byte(addressT)
            sumaCuadrados = sumaCuadrados + (numT*numT)
            print('Numero', numT) 
            numString = numString + str(numT)               
        else:
            bus.read_byte(addressT)
    else:
        #Impresion en consola y en oled del resultado 
        print('Suma Cuadrados: ',sumaCuadrados)
        lNum.insert(24,sumaCuadrados)
        bus.write_i2c_block_data(address, regmsbyte, lNum)
        time.sleep(2)
        #Impresion de datos en la pantalla oled
        draw.rectangle((0, 0, width, height), outline=0, fill=0)
        draw.text((x, top + 0), "Suma Cudrados: " + str(sumaCuadrados), font=font, fill=255)  
        draw.text((x, top + 10), "Numeros usados: ", font=font, fill = 255)
        draw.text((x, top + 20), "" + numString, font = font, fill = 255)   
        # Display image.
        disp.image(image)
        disp.show()
        time.sleep(5)
print(sumaCuadrados)

Este parte del código puede estar comentada o no, nos imprime en consola (no en OLED) todas las localidades de la 1 - 25 y cuáles son los números guardados en cada una de estas localidades

addressT = address
bus.write_byte_data(addressT, regmsbyte, reglsbyte)
for i in range(1,25): 
    numT = bus.read_byte(addressT)
    print('Localidad', i, 'Numero', numT)

Una vez completas las operaciones anteriores, se pide al usuario 4 nuevos números para guardarlos en las localidades 21-24. Primero nos desplazamos a la localidad 1 y limpiamos la pantalla OLED

addressT = address
bus.write_byte_data(addressT, regmsbyte, reglsbyte)
numString = ''
# Clear display.
disp.fill(0)
disp.show()
time.sleep(1)

Después de esto, se desplaza a la localidad 21 y comienza a pedir los nuevos números.

for i in range(1,26):
    if i <22:
        bus.read_byte(addressT)
    elif i < 25:
        #Se ingresan los numeros en las localidades correspondientes y se suman con la localidad 21 
        print('Localidad', i, end=' ')
        numT = int(input('Ingresa el numero nuevo: '))   
        lNum[i-1] = numT
        numString = numString + str(numT)
        sumaPar = sumaPar + numT

Una vez guardados los nuevos números y sumarlos con la suma anterior de las localidades pares, se muestra en la pantalla OLED los números nuevos y el resultado final.

    else:
        #Impresion en consola y en oled del resultado 
        bus.write_i2c_block_data(address, regmsbyte, lNum)
        time.sleep(2)
        #Impresion de pantalla oled de los resultaos
        draw.rectangle((0, 0, width, height), outline=0, fill=0)
        draw.text((x, top + 0), "Añadiste numeros: " , font=font, fill=255) 
        draw.text((x, top + 8), "" + numString, font = font, fill = 255) 
        draw.text((x, top + 16), "Suma Nuevos", font = font, fill = 255)
        draw.text((x, top + 24), "" + str(sumaPar), font = font, fill = 255)
        time.sleep(5)
print(sumaPar)

El siguiente código es de control, en la consola se muestra las localidades de 1 - 24 y los números que están guardados en estas localidades

#Arreglo final de las localidades y datos        
addressT = address
bus.write_byte_data(addressT, regmsbyte, reglsbyte)
for i in range(1,25): 
    numT = bus.read_byte(addressT)
    print('Localidad', i, 'Numero', numT)

Imagen en pantalla OLED

disp.image(image)
disp.show()
time.sleep(2)