Vamos a simular sensores analogicos usando un potenciomentro, el cual su variacion hara que realicemos una accion determinada.
Un sensor infrarrojo la señal que nos entrega es la relacion de que tanta luz incide en el fototransistor, la cual es emitida por un led infrarrojo. Es decir, si la luz que emite el led llega al fototransistor debemos realizar o no una accion.
Ejemplo de un circuito de sensor infrarro simple:
Ejemplo 1. Tenemos un sensor optico el cual queremos que nos indique la distancia de un objeto. Este sensor tiene las siguientes caracteristicas, en el rango de 0V a 5V es equivalente a una distancia de 0cm a 50cm. Madara la distancia a la terminal
from pyfirmata import Arduino, util
from time import sleep
# configuracion de la tarjeta
PORT = 'COM#'
board = Arduino(PORT)
print('Conexion lista')
util.Iterator(board).start()
# configuracion SENSOR
SENSOR_OPTICO_PIN = 0
current_sensor = board.get_pin(f'a:{str(SENSOR_OPTICO_PIN)}:i')
sleep(1)
while True:
value = current_sensor.read()
if value == None:
continue
distancia = value * 50
print(f'La distancia del objeto es: {distancia}cm')
sleep(0.5)
Ejemplo 2. Tenemos un sensor optico que nos da una lectura indicando la distancia a la que esta el objeto en una barra de leds. Entre mas lejo este el objeto menos leds se encienden y entra mas cerca, mas encenderan.
from pyfirmata import Arduino, util
from time import sleep
from math import ceil
# configuracion de la tarjeta
PORT = 'COM#'
board = Arduino(PORT)
print('Conexion lista')
util.Iterator(board).start()
# configuracion SENSOR
SENSOR_OPTICO_PIN = 0
current_sensor = board.get_pin(f'a:{str(SENSOR_OPTICO_PIN)}:i')
sleep(1)
# configuracio de la salidas a los leds
LEDS_PINES = [2,3,4,5,6,7,8,9]
while True:
value = current_sensor.read()
if value == None:
continue
distance = value * 50
distance = ceil(distance) # redondeo para evitar problemas en las comparaciones
print(f'La distancia del objeto es: {distance}cm')
if distance > 40:
for index,pin in enumerate(LEDS_PINES):
if index <= 0:
board.digital[pin].write(1)
else:
board.digital[pin].write(0)
elif distance <= 40 and distance > 30:
for index,pin in enumerate(LEDS_PINES):
if index <= 2:
board.digital[pin].write(1)
else:
board.digital[pin].write(0)
elif distance <= 30 and distance > 20:
for index,pin in enumerate(LEDS_PINES):
if index <= 4:
board.digital[pin].write(1)
else:
board.digital[pin].write(0)
elif distance <= 20 and distance > 10:
for index,pin in enumerate(LEDS_PINES):
if index <= 6:
board.digital[pin].write(1)
else:
board.digital[pin].write(0)
else:
for pin in LEDS_PINES:
board.digital[pin].write(1)
sleep(0.5)
Tenemos vario sensores de corrientes, aqui muestro el sensor de efecto Hall y una bobina. Como tal el sensor hall detecta campos magneticos, no corriente, pero como un efecto del paso de la corriente genera un campo magnetico por ello se utiliza. Al pasar una corriente se genera un campo magnetico y si se le acerca una bobina se genera el efecto de induccion, lo que causa que en dicha bobina se genere una corriente equivalente a la corriente que pasa en el primer conductor.
En ambos casos podemos determinar la cantidad de corriente que esta pasando en dicho conductor gracias a su campo magnetico.
Ejemplo 1. Necesitamos realizar un amperimetro, el sensor da un rango entre 0A hasta 1000mA. Se mandará el valor de corriente a la terminal
from pyfirmata import Arduino, util
from time import sleep
# configuracion de la tarjeta
PORT = 'COM#'
board = Arduino(PORT)
print('Conexion lista')
util.Iterator(board).start()
# configuracion SENSOR
SENSOR_CURRENT_PIN = 0
current_sensor = board.get_pin(f'a:{str(SENSOR_CURRENT_PIN)}:i')
sleep(1)
while True:
value = current_sensor.read()
if value == None:
continue
current_value = value * 1000.0
print(f'Value: {value}')
print(f'La corriente es {current_value}mA')
sleep(0.3)
Ejemplo 2: Fusible electronico. Se necesita construir un fusible electronico ocupando un sensor de corriente, accionando un relay para proteger el aparato electronico que este conectado.
from pyfirmata import Arduino, util
from time import sleep, time
def blink(board, pin, time):
'''
genera el blink en un led para indicar su estado
'''
board.digital[pin].write(1)
sleep(time)
board.digital[pin].write(0)
sleep(time)
# configuracion de la tarjeta
PORT = 'COM#'
board = Arduino(PORT)
print('Conexion lista')
util.Iterator(board).start()
# configurando salidas
LED_PIN = 4
RELAY_PIN = 2
led = board.get_pin(f'd:{str(LED_PIN)}:o')
relay = board.get_pin(f'd:{str(RELAY_PIN)}:o')
# configuracion SENSOR
SENSOR_CURRENT_PIN = 0
current_sensor = board.get_pin(f'a:{str(SENSOR_CURRENT_PIN)}:i')
sleep(1)
# defino varibles auxiliares
ON = 1
OFF = 0
while True:
# vamos a simular 3 niveles del sensor
# No hay carga conectada < 0.2
# normal 0.2 >= hasta 0.8
# overload (sobrecarga) >0.8
value = current_sensor.read()
if value == None:
continue
if value >= 0.8:
relay.write(OFF)
blink(board=board,pin=LED_PIN,time=0.2)
elif value < 0.8 and value >= 0.2:
relay.write(ON)
led.write(ON)
else:
relay.write(ON)
blink(board=board,pin=LED_PIN,time=0.5)
sleep(2)
Ejemplo 1: Vamos a realizar un termometro con el LM35. La temperatura se mandará a la terminal. Debe mandar la temperatura en grados Celcius y grados Farenheits
from pyfirmata import Arduino, util
from time import sleep
# configuracion de la tarjeta
PORT = 'COM#'
board = Arduino(PORT)
print('Conexion lista')
util.Iterator(board).start()
# configuracion SENSOR
SENSOR_CURRENT_PIN = 0
current_sensor = board.get_pin(f'a:{str(SENSOR_CURRENT_PIN)}:i')
sleep(1)
while True:
value = current_sensor.read()
if value == None:
continue
celsius = value * 500
farenheint = (celsius * 1.8) + 32
print(f'Value: {value}')
print(f'La temperatura Celsius {celsius}ºC')
print(f'La temperatura Farenheit {farenheint}ºF')
sleep(1)
Ejemplo 2. Vamos a variar la velocidad de un ventilador (motor DC) en funcion de la temperatura, simulando que debemos enfriar un tanque contenedor de un liquido. Cuando la temperatura sea menor a 50ºC, ventilador debe estar apagado, entre 50ºC y 100ºC debe trabajar a 1/3 de la potencia, cuando la temperatura este entre 100º y 150º, debe trabajar al 60% el ventilador, cuando supere la temperatura de 150ºC debe trabajar a su maxima potencia el ventilador. Cuando la temperatura este por encima de 150ºC debe parpadear rapido un led , cuando este por debajo solo queda encendido y cuando este apagado el ventilador el led parpadea lento.
from pyfirmata import Arduino, util
from time import sleep
import math
def blink(board, pin, time):
board.digital[pin].write(1)
sleep(time)
board.digital[pin].write(0)
sleep(time)
# configuracion de la tarjeta
PORT = 'COM#'
board = Arduino(PORT)
print('Conexion lista')
util.Iterator(board).start()
# configuro la salida del PWM para el ventilador
MOTOR_PIN = 3
motor = board.get_pin(f'd:{str(MOTOR_PIN)}:p')
# configuro salida del LED
LED_PIN = 8
led = board.get_pin(f'd:{str(LED_PIN)}:o')
# configuracion SENSOR
SENSOR_CURRENT_PIN = 0
current_sensor = board.get_pin(f'a:{str(SENSOR_CURRENT_PIN)}:i')
sleep(1)
while True:
value = current_sensor.read()
if value == None:
continue
celsius = value * 500
celsius = math.ceil(celsius) # hacemos un redondeo para evitar problemas en las comparaciones
if celsius <= 50:
blink(board=board, pin=LED_PIN,time=1)
motor.write(0.00)
elif celsius > 50 and celsius <= 100:
motor.write(0.33)
led.write(1)
elif celsius > 100 and celsius <= 150:
motor.write(0.6)
led.write(1)
elif celsius > 150:
motor.write(0.999)
blink(board=board,pin=LED_PIN,time=0.2)
print(f'temperatura {celsius}')
Ejemplo 1. Leer el valor del sensor y mandarlo a la terminal.
from pyfirmata import Arduino, util
from time import sleep
# configuracion de la tarjeta
PORT = '/tmp/ttyS1'
board = Arduino(PORT)
print('Conexion lista')
util.Iterator(board).start()
# configuracion SENSOR
SENSOR_LIGTH_PIN = 0
ligth_sensor = board.get_pin(f'a:{str(SENSOR_LIGTH_PIN)}:i')
sleep(1)
while True:
sensor_light = ligth_sensor.read()
if sensor_light == None:
continue
print(f'Sensor: {sensor_light}')
sleep(2)
Ejemplo 2: Bara de leds dependiendo la cantidad de luz. Entre mas cerca este el objeto mas leds encendemos, entre mas lejos este menos leds encendemos.
from pyfirmata import Arduino, util
from time import sleep
import math
from pyfirmata.pyfirmata import DIGITAL
# configuracion de la tarjeta
PORT = 'COM#'
board = Arduino(PORT)
print('Conexion lista')
util.Iterator(board).start()
# configuracion SENSOR
SENSOR_LIGTH_PIN = 0
ligth_sensor = board.get_pin(f'a:{str(SENSOR_LIGTH_PIN)}:i')
sleep(1)
LEDS_PIN = [2,3,4,5,6,7,8,9]
while True:
# Nota, esta trababajando al reves
lux = ligth_sensor.read()
if lux == None:
continue
if lux < 0.7:
for index, pin in enumerate(LEDS_PIN):
board.digital[pin].write(1)
elif lux >= 0.7 and lux < 0.8:
for index, pin in enumerate(LEDS_PIN):
if index <= 6:
board.digital[pin].write(1)
else:
board.digital[pin].write(0)
elif lux >= 0.8 and lux < 0.9:
for index, pin in enumerate(LEDS_PIN):
if index <= 3:
board.digital[pin].write(1)
else:
board.digital[pin].write(0)
else:
for index, pin in enumerate(LEDS_PIN):
if index <= 1:
board.digital[pin].write(1)
else:
board.digital[pin].write(0)
Ejemplo 3: En funcion de la luz que incide en el sensor, vamos a mover un servomotor que estaria abriendo las cortinas de la ventana con algun mecanismo. Menos luz abra las cortinas y entre mas luz cierre las cortinas
from pyfirmata import Arduino, util
from time import sleep
from pyfirmata.pyfirmata import DIGITAL
# configuracion de la tarjeta
PORT = 'COM#'
board = Arduino(PORT)
print('Conexion lista')
util.Iterator(board).start()
# configurar el servo
SERVO_PIN = 3
servo = board.get_pin(f'd:{str(SERVO_PIN)}:s')
# configuracion SENSOR
SENSOR_LIGTH_PIN = 0
ligth_sensor = board.get_pin(f'a:{str(SENSOR_LIGTH_PIN)}:i')
sleep(1)
while True:
# menos luz abre cortina (angulo mayor)
# mas luz cierra cortina (angulo menor)
# Nota esta trabajando al reves
lux = ligth_sensor.read()
if lux == None:
continue
if lux < 0.7:
servo.write(180)
elif lux >= 0.7 and lux < 0.8:
servo.write(100)
elif lux >= 0.8 and lux < 0.9:
servo.write(60)
else:
servo.write(0)
sleep(5)