Código: Lectura de Sensores - AaroniSalinas/ProyectoFinal GitHub Wiki
Librerías
Se requieren ciertas librerías para el correcto funcionamiento del programa
import smbus
from time import sleep
import RPi.GPIO as GPIO
import subprocess
from smbus import SMBus
from board import SCL, SDA
import busio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
import time
from board import SCL, SDA
import busio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
Contadores a utilizar
plastico=0
latas=0
total=0
Inicializar pantalla OLED y lectura de sensores.
Código de inicialización pantalla OLED.
i2c = busio.I2C(SCL, SDA)
disp = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
#Limpia Pantalla
disp.fill(0)
disp.show()
#Imagen en blanco, modo para 1-bit de color
width = disp.width
height = disp.height
image = Image.new("1", (width, height))
draw = ImageDraw.Draw(image)
draw.rectangle((0, 0, width, height), outline=0, fill=0)
padding = -2
top = padding
bottom = height - padding
x = 0
font = ImageFont.load_default()
bus = SMBus(1)
Código del Sensor Ultrasónico
TRIG = 23 #Variable que contiene el GPIO al cual conectamos la señal TRIG del sensor
ECHO = 24 #Variable que contiene el GPIO al cual conectamos la señal ECHO del sensor
GPIO.setmode(GPIO.BCM) #Establecemos el modo según el cual nos refiriremos a los GPIO de nuestra RPi
GPIO.setup(TRIG, GPIO.OUT) #Configuramos el pin TRIG como una salida
GPIO.setup(ECHO, GPIO.IN) #Configuramos el pin ECHO como una salida
Sensor Inductivo
# Pin de entrada
GPIOpin = -1
pin = 17
# Inicialización del pin de entrada
def initialInductive(pin):
global GPIOpin
GPIOpin = pin
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIOpin,GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
print("Finished Initiation")
print(GPIOpin)
Servo-Motor
servoPIN = 27
GPIO.setmode(GPIO.BCM)
GPIO.setup(servoPIN, GPIO.OUT)
p = GPIO.PWM(servoPIN, 50) # GPIO 17 for PWM with 50Hz
p.start(5.8)
Acelerómetro
def MPU_Init():
#Escribe a registro Sample
bus.write_byte_data(Device_Address, SMPLRT_DIV, 7)
#Escribe a registro power-management
bus.write_byte_data(Device_Address, PWR_MGMT_1, 1)
#Escribe a registro CONFIG
bus.write_byte_data(Device_Address, CONFIG, 0)
#Escribe a registro de configuración de GYRO
bus.write_byte_data(Device_Address, GYRO_CONFIG, 24)
#Escribe al registro de interrupción
bus.write_byte_data(Device_Address, INT_ENABLE, 1)
#Iniciar Inductivo
initialInductive(pin)
def read_raw_data(addr):
#Acelerómetro y Giroscopio con valores de 16-bit
high = bus.read_byte_data(Device_Address, addr)
low = bus.read_byte_data(Device_Address, addr+1)
#Concatena el alto y bajo
value = ((high << 8) | low)
#Obtiene el valor con signo del acelerómetro
if(value > 32768):
value = value - 65536
return value
bus = smbus.SMBus(1)
Device_Address = 0x68 # MPU6050 dirección del dispositivo
MPU_Init()
Funciones de lectura de sensores
Ultrasónico
def Ultrasonico():
# Ponemos en bajo el pin TRIG y después esperamos 0.5 seg para que el transductor se estabilice
GPIO.output(TRIG, GPIO.LOW)
time.sleep(0.5)
#Ponemos en alto el pin TRIG esperamos 10 uS antes de ponerlo en bajo
GPIO.output(TRIG,GPIO.HIGH)
time.sleep(0.00001)
GPIO.output(TRIG,GPIO.LOW)
# En este momento el sensor envía 8 pulsos ultrasónicos de 40kHz y coloca su pin ECHO en alto
# Debemos detectar dicho evento para iniciar la medición del tiempo
while True:
pulso_inicio = time.time()
if GPIO.input(ECHO) == GPIO.HIGH:
break
# El pin ECHO se mantendrá en HIGH hasta recibir el eco rebotado por el obstáculo.
# En ese momento el sensor pondrá el pin ECHO en bajo.
# Procedemos a detectar dicho evento para terminar la medición del tiempo
while True:
pulso_fin = time.time()
if GPIO.input(ECHO) == GPIO.LOW:
break
# Tiempo medido en segundos
duracion = pulso_fin - pulso_inicio
#Obtenemos la distancia considerando que la señal recorre dos veces la distancia a medir y que la velocidad del sonido es 343m/s
distancia = (34300 * duracion) / 2
#Se imprime en consola el valor
print( "Distancia: %.2f cm" % distancia)
#Se muestra en OLED el valor leído
draw.rectangle((0, 0, width, height), outline=0, fill=0)
draw.text((x, top + 0), "Distancia: " ,font=font, fill=255)
draw.text((x, top + 8), "" + str(distancia), font = font, fill = 255)
time.sleep(1)
disp.image(image)
disp.show()
global total
#Suma de total de reciclados
if(distancia <15):
total=total+1;
return distancia
Sensor inductivo
def Inductivo():
induc=-1
global latas,plastico
if(GPIOpin != -1):
state2 = GPIO.input(GPIOpin)
if state2 == True :
if Ultrasonico() <15:
#No dectectado
p.ChangeDutyCycle(7)#10
time.sleep(0.02)
plastico=plastico+1
#Se muestra en consola
print("Botella")
induc=1
#Se muestra en pantalla OLED
draw.text((x, top + 16), "Botella " ,font=font, fill=255)
time.sleep(1)
disp.image(image)
disp.show()
p.stop()
else:
induc=-1
else:
if Ultrasonico() <15:
#Dectectado
p.ChangeDutyCycle(4.5)#2.5
time.sleep(0.02)
latas=latas+1
induc=0
#Se muestra en consola
print("Lata")
#Se muestra en pantalla OLED
draw.rectangle((0, 0, width, height), outline=0, fill=0)
draw.text((x, top + 16), "Lata " ,font=font, fill=255)
time.sleep(1)
disp.image(image)
disp.show()
p.stop()
else:
induc=-1
else:
print("Please Initial Input Ports")
return induc
Acelerómetro
def Acelerometro():
#Lee el valor del acelerómetro
acc_x = read_raw_data(ACCEL_XOUT_H)
acc_y = read_raw_data(ACCEL_YOUT_H)
acc_z = read_raw_data(ACCEL_ZOUT_H)
#Lee el valor del giroscopio
gyro_x = read_raw_data(GYRO_XOUT_H)
gyro_y = read_raw_data(GYRO_YOUT_H)
gyro_z = read_raw_data(GYRO_ZOUT_H)
#Transformación de valores
Gx = gyro_x/131.0
Gy = gyro_y/131.0
Gz = gyro_z/131.0
#Imprime en consola
print ( "\tGy=%.2f" %Gy, u'\u00b0')
#Imprime en OLED
draw.rectangle((0, 0, width, height), outline=0, fill=0)
draw.text((x, top + 20), "Gy " + str(Gy) ,font=font, fill=255)
time.sleep(1)
disp.image(image)
disp.show()
return Gy
Main
if __name__ == "__main__":
# Imprimimos resultadoen OLED y consola
#print( "Distancia: %.2f cm" % Ultrasonico())
draw.rectangle((0, 0, width, height), outline=0, fill=0)
draw.text((x, top + 0), "Distancia: " ,font=font, fill=255)
draw.text((x, top + 8), "" + str(Ultrasonico()), font = font, fill = 255)
time.sleep(1)
disp.image(image)
disp.show()
if Inductivo() == 1:
draw.text((x, top + 16), "Botella " ,font=font, fill=255)
time.sleep(1)
disp.image(image)
disp.show()
else:
draw.rectangle((0, 0, width, height), outline=0, fill=0)
draw.text((x, top + 16), "Lata " ,font=font, fill=255)
time.sleep(1)
disp.image(image)
disp.show()
#Display Acelerometro
draw.rectangle((0, 0, width, height), outline=0, fill=0)
draw.text((x, top + 20), "Gy " + str(Acelerometro()) ,font=font, fill=255)
time.sleep(1)
disp.image(image)
disp.show()