Él Frambuesa Pi Pico es la forma ideal de adentrarse en los microcontroladores. A partir de $ 4, el tablero es barato y fácil de usar. El bajo costo y la facilidad de uso significa que podemos incluirlos fácilmente en un proyecto sin temer lo peor para nuestra billetera.
En este instructivo, usaremos un Raspberry Pi Pico para capturar datos de temperatura en vivo usando un DS18B20. Este sensor viene en muchas formas, desde un chip de transistor desnudo hasta un cable resistente al agua. Usaremos la última versión, que puede sumergirse parcialmente en un líquido para controlar la temperatura. Nuestro proyecto tomará una lectura de temperatura y, mediante una prueba condicional en MicroPython, activará un LED para que parpadee si la temperatura desciende por debajo de los 20 grados centígrados.
Para este proyecto necesitarás
Construyendo el circuito
El circuito se compone de dos partes. El sensor de temperatura DS18B20 y el LED. Los dividiremos en dos secciones.
El DS18B20 tiene tres conexiones a Raspberry Pi Pico.
Frambuesa Pi Pico | Color del cable | DS18B20 |
---|---|---|
3V3 | Rojo | VDD |
GPIO26 | Amarillo | Datos |
TIERRA | Negro | TIERRA |
Las tres conexiones se realizan en la placa de prueba y los cables se utilizan para conectarse al Pico. Entre los pines de datos y 3V3 (amarillo y rojo), hay un 4.7K Ohm resistor que se usa para subir el pin de datos usando los 3.3V suministrados. Esto mantiene una conexión constante entre el pin de datos y Pico.
El LED tiene solo dos conexiones al Raspberry Pi Pico.
Frambuesa Pi Pico | Color del cable | CONDUJO |
---|---|---|
GPIO15 | Rojo | Ánodo (pata larga) |
TIERRA | Negro | Cátodo (pata corta) |
El LED tiene una resistencia de 330 ohmios en la pata del cátodo, en línea con GND. Esto reduce la cantidad de corriente que el LED puede consumir.
Escribir el código
1. Sigue esta guía para descargar e instalar la última versión de MicroPython para su modelo de Raspberry Pi Pico. Siga los pasos hasta e incluyendo la conexión de Raspberry Pi Pico a Thonny.
2. Cree un nuevo proyecto en blanco en Thonny.
3. Importe tres módulos de código escrito previamente. El primero es onewire, un módulo que permite que Pico se comunique con la interfaz de un solo cable del DS18B20. El siguiente es ds18x20, un módulo que interpreta los datos del sensor del DS18B20 y nos proporciona datos legibles por humanos. Por último, importamos el tiempo que se utiliza para marcar el ritmo de nuestro código de proyecto.
import onewire, ds18x20, time
4. Desde el módulo Máquina importe la clase Pin. Esto permitirá que nuestro código interactúe con los componentes conectados al GPIO.
from machine import Pin
5. Cree dos objetos, SensorPin y alerta. SensorPin es el pin GPIO que se usa para conectar el pin de datos del DS18B20 al Pico. Alert es el pin GPIO que se conecta al ánodo (pata larga) del LED.
SensorPin = Pin(26, Pin.IN)
alert = Pin(15, Pin.OUT)
6. Cree un objeto, sensor y utilícelo para decirle al módulo ds18x20 dónde encontrar nuestro sensor de temperatura DS18B20. Esta línea también utiliza el módulo onewire, ya que es el protocolo que utiliza el sensor para la conexión.
sensor = ds18x20.DS18X20(onewire.OneWire(SensorPin))
7. Cree un objeto, roms y use el objeto sensor para escanear la interfaz para encontrar nuestro sensor de temperatura DS18B20. Todos los dispositivos de un solo cable, como nuestro DS18B20, tienen un número de registro único almacenado en la ROM que debemos identificar antes de poder usarlos.
roms = sensor.scan()
8. Usa un ciclo while True para ejecutar las siguientes líneas de código en un bucle interminable.
while True:
9. Establezca la lectura de temperatura para usar Celsius. Tenga en cuenta que el código dentro del bucle while True está sangrado para mostrar que pertenece al bucle.
sensor.convert_temp()
10 Agregue una pausa de dos segundos al código. Esto le da al DS18B20 tiempo para asentarse antes de tomar una lectura.
time.sleep(2)
11 Use un bucle for para iterar a través de la lista de ROM devuelta. Como solo tenemos un DS18B20 en la interfaz de un cable, solo se almacenará una ROM en la lista que iteramos.
for rom in roms:
12 Cree un objeto, temperatura, y utilícelo para almacenar la salida de lectura del sensor DS18B20. La salida está envuelta en una función round() que redondeará los datos devueltos a 1 lugar decimal.
temperature = round(sensor.read_temp(rom),1)
13 Utilice una prueba condicional para comparar el valor almacenado en el objeto de temperatura con un valor codificado. En este ejemplo, si la temperatura es inferior o igual a 20 grados centígrados, la condición se evaluará como verdadera y se ejecutará la siguiente sección del código sangrado.
if temperature <= 20:
14 Imprime un mensaje a Python Shell que advierte al usuario que el temperamento está por debajo de los 20 C e incluye el valor de la temperatura en la oración.
print("Warning the temperature is",temperature,"C")
15. Utilice un bucle for para que el LED parpadee 10 veces, con un retraso de 0,5 segundos.
for i in range(10):
alert.toggle()
time.sleep(0.5)
dieciséis. Crear una condición else que se active si la temperatura es superior a 20 C. Esta condición imprimirá la temperatura actual antes de finalizar.
else:
print(temperature,"C")
17 Agregar una pausa de cinco segundos antes de finalizar el ciclo y volver al inicio del ciclo.
time.sleep(5)
18 Guarde el código en Raspberry Pi Pico como TemperatureMonitor.py.
19 Haga clic en el icono Ejecutar para iniciar el código. Después de una breve pausa, los detalles de la temperatura aparecerán en el shell de Python. Si la temperatura es inferior a 20 C, el LED parpadeará cinco veces para avisarnos.
Listado completo de códigos
import onewire, ds18x20, time
from machine import Pin
SensorPin = Pin(26, Pin.IN)
alert = Pin(15, Pin.OUT)
sensor = ds18x20.DS18X20(onewire.OneWire(SensorPin))
roms = sensor.scan()
print(roms)
while True:
sensor.convert_temp()
time.sleep(2)
for rom in roms:
temperature = round(sensor.read_temp(rom),1)
if temperature <= 20:
print("Warning the temperature is",temperature,"C")
for i in range(10):
alert.toggle()
time.sleep(0.5)
else:
print(temperature,"C")
time.sleep(5)