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()