Lámpara ambiental inalámbrica para escritorio
Mantener un estado de ánimo saludable en un lugar de trabajo ocupado es muy importante, y las personas comunes suelen comprar una maceta de cactus para poner en su escritorio como decoración y para relajarse. Como ingenieros, también necesitamos objetos con la misma función, y lo más maravilloso sería hacer un pequeño bonsái luminoso por nosotros mismos. En este proyecto, haremos una lámpara ambiental inalámbrica para escritorio. Podemos enviar comandos inalámbricos para controlarla y hacer que se ilumine con diferentes colores para coincidir con nuestros diferentes estados de ánimo, ¡así que veamos cómo hacerlo!
Hardware
- Wio RP2040 mini Dev Board
- WS2812
- Cable de datos Type-C
- PC
- WiFi
Diagrama de conexiones
Software
1. Instalar Thonny
Fácil para empezar. Thonny viene con Python 3.7 incorporado, así que solo necesitas un instalador sencillo y estarás listo para aprender a programar. Primero, haz clic en Thonny.org para entrar a la página de descarga. En la esquina superior derecha de la página, selecciona el paquete de instalación de Thonny según tu sistema operativo para descargarlo. Haz doble clic en el paquete descargado para abrirlo e instala siguiendo los pasos.
Ya que tienes Thonny instalado, abre la aplicación. Deberías ver la interfaz principal de Thonny:
-
Barra de herramientas: herramientas básicas comunes, como nuevo, abrir, guardar, ejecutar el script actual, detener, etc.
-
Editor de código: área principal de Thonny, donde escribiremos el código Python/MicroPython.
-
Shell: Aquí podemos ejecutar comandos y los resultados se mostrarán inmediatamente. También se ven las salidas de nuestro código en la ventana Shell.
-
Intérprete: Aquí puedes seleccionar el tipo de intérprete para compilar el programa. Haz clic en Python 3.7.9, busca MicroPython (Raspberry pi Pico) en el menú emergente, y haz clic en OK para cambiar al intérprete de Pico. También puedes hacer clic en "Tools>>>Options>>>Interpreter" para seleccionar.
2. Conectar Wio RP2040 mini Dev Board
Usa el cable de datos para conectar la placa de desarrollo a la computadora, luego haz clic en el botón "Restart backend" en la barra de herramientas. Si Wio RP2040 se conecta correctamente a la computadora, verás la información de la versión de MicroPython y el nombre del dispositivo en el Shell.
3. Código
Para usar el LED RGB WS2812B en MicroPython necesitamos importar el archivo de biblioteca de este WS2812B a la memoria del Wio RP2040.
Esto se hace de la siguiente manera: Copia el siguiente código, pégalo en una nueva ventana del editor de Thonny, luego guárdalo en la placa de desarrollo y renómbralo a "ws2812.py"
import array, time
from machine import Pin
import rp2
# Configure the number of WS2812 LEDs.
# brightness = 0.2
@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT, autopull=True,pull_thresh=24)
def ws2812():
T1 = 2
T2 = 5
T3 = 3
wrap_target()
label("bitloop")
out(x, 1) .side(0) [T3 - 1]
jmp(not_x, "do_zero") .side(1) [T1 - 1]
jmp("bitloop") .side(1) [T2 - 1]
label("do_zero")
nop() .side(0) [T2 - 1]
wrap()
class WS2812():
def __init__(self, pin_num, led_count, brightness = 0.5):
self.Pin = Pin
self.led_count = led_count
self.brightness = brightness
self.sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(pin_num))
self.sm.active(1)
self.ar = array.array("I", [0 for _ in range(led_count)])
def pixels_show(self):
dimmer_ar = array.array("I", [0 for _ in range(self.led_count)])
for i,c in enumerate(self.ar):
r = int(((c >> 8) & 0xFF) * self.brightness)
g = int(((c >> 16) & 0xFF) * self.brightness)
b = int((c & 0xFF) * self.brightness)
dimmer_ar[i] = (g<<16) + (r<<8) + b
self.sm.put(dimmer_ar, 8)
time.sleep_ms(10)
def pixels_set(self, i, color):
self.ar[i] = (color[1]<<16) + (color[0]<<8) + color[2]
def pixels_fill(self, color):
for i in range(len(self.ar)):
self.pixels_set(i, color)
def color_chase(self,color, wait):
for i in range(self.led_count):
self.pixels_set(i, color)
time.sleep(wait)
self.pixels_show()
time.sleep(0.2)
def wheel(self, pos):
# Input a value 0 to 255 to get a color value.
# The colours are a transition r - g - b - back to r.
if pos < 0 or pos > 255:
return (0, 0, 0)
if pos < 85:
return (255 - pos * 3, pos * 3, 0)
if pos < 170:
pos -= 85
return (0, 255 - pos * 3, pos * 3)
pos -= 170
return (pos * 3, 0, 255 - pos * 3)
def rainbow_cycle(self, wait):
for j in range(255):
for i in range(self.led_count):
rc_index = (i * 256 // self.led_count) + j
self.pixels_set(i, self.wheel(rc_index & 255))
self.pixels_show()
time.sleep(wait)
después crea un nuevo programa para escribir el siguiente código:
import network
import mqtt
import utime
from machine import Pin, I2C, ADC, UART, SPI, PWM
from time import sleep
from ws2812 import WS2812
BLACK = (0, 0, 0)
RED = (255, 0, 0)
YELLOW = (255, 150, 0)
GREEN = (0, 255, 0)
CYAN = (0, 255, 255)
BLUE = (0, 0, 255)
PURPLE = (180, 0, 255)
WHITE = (255, 255, 255)
led = WS2812(13,10)#WS2812(pin_num,led_count)
N1 = network.WLAN_SPI(network.STA_IF)
N1.active(True)
N1.connect("CHCK","depot0510")
sleep(1)
SERVER = 'mqtt.p2hp.com'
CLIENT_ID = 'Wio RP2040_Dev_board'
TOPIC = 'RGB_LED'
def mqtt_callback(topic):
print('topic: {}'.format(topic[0]))
print('msg:{}'.format(topic[1]))
if(topic[1] == "RED"):
print('RED')
led.pixels_fill(RED)
led.pixels_show()
utime.sleep(0.2)
if(topic[1] == "GREEN"):
print('GREEN')
led.pixels_fill(GREEN)
led.pixels_show()
utime.sleep(0.2)
if(topic[1] == "YELLOW"):
print('YELLOW')
led.pixels_fill(YELLOW)
led.pixels_show()
utime.sleep(0.2)
if(topic[1] == "CYAN"):
print('CYAN')
led.pixels_fill(CYAN)
led.pixels_show()
utime.sleep(0.2)
if(topic[1] == "BLUE"):
print('BLUE')
led.pixels_fill(BLUE)
led.pixels_show()
utime.sleep(0.2)
if(topic[1] == "PURPLE"):
print('PURPLE')
led.pixels_fill(PURPLE)
led.pixels_show()
utime.sleep(0.2)
if(topic[1] == "WHITE"):
print('WHITE')
led.pixels_fill(WHITE)
led.pixels_show()
utime.sleep(0.2)
cl = mqtt.MQTTClient(CLIENT_ID, SERVER, mqtt_port = 1883)
cl.connect()
cl.publish(TOPIC,"start")
cl.subscribe(TOPIC)
cl.set_callback(mqtt_callback)
print('ok')
led.pixels_fill(RED)
led.pixels_show()
utime.sleep(0.2)
while True:
cl.wait_msg()
sleep(0.1)
Nota que en la línea 20 del programa debes cambiar por tu nombre y contraseña correctos de WiFi.
4. Configuración del cliente MQTT
MQTT es un protocolo de transporte de mensajes de publicación/suscripción cliente-servidor. El cliente puede funcionar como publicador, suscriptor o ambos.
El publicador puede crear un tema con mensajes adjuntos a dicho tema. Por ejemplo, puedo crear un nuevo tema "El clima de hoy" y el contenido del mensaje es "25 grados Celsius", y luego enviar el mensaje al servidor. Después de recibir el mensaje del tema, el publicador distribuye la información a cualquier cliente que se haya suscrito a ese tema. Es decir, el suscriptor recibirá el mensaje "25 grados Celsius" solo si se suscribe al tema "El clima de hoy". Si el suscriptor no se suscribe al tema "El clima de hoy", sin importar qué mensaje envíe el publicador, el suscriptor no recibirá el mensaje.
Descarga el software del servidor MQTTX e instálalo en la computadora, luego configura el servidor MQTT.
En este proyecto usaremos el servidor gratuito "mqtt.p2hp.com". Servidor en línea
- Dirección: mqtt.p2hp.com
- Puertos: 1883 (TCP), 8083 (WebSocket)
- Tipo: EMQ
- Compatible con MQTT V3.1.1/V5.0
Abre el software MQTTX para crear una nueva conexión, completa el nombre, servidor, puerto, tema, y luego haz clic en "Connect" para conectar al servidor.
Cuando la conexión sea exitosa, aparecerá una ventana emergente en la esquina superior derecha del software.
Luego configura el tema y el mensaje a continuación.
Cuando se reciben datos, el número de mensajes se muestra en la parte superior. Si no ves el mensaje, haz clic en el tema de suscripción.
Aquí se completa el despliegue del cliente MQTT. Luego, regresa al editor Thonny y ejecuta el código. Cuando aparezca "ok" y el WS2812B conectado se encienda en rojo, el programa habrá corrido exitosamente.
Apariencia
Para la parte exterior usamos tablero acrílico + tablero de madera, podrías necesitar una máquina de grabado láser o sierra.
Puedes usar mi diseño terminado para la base y el panel y cortarlo con un grabador láser.
Las siguientes partes se obtuvieron después.
Luego, une la parte de la base
Después pega el WS2812B en la parte
Depura el programa y observa si el hardware funciona correctamente
Si todo está listo, puedes usar pegamento termofusible para unir las placas restantes
Finalmente, enviamos diferentes comandos en MQTTX para cambiar su color inalámbricamente
Tema: RGB_LED
msg: RED,BLACK,YELLOW,GREEN,CYAN,BLUE,PURPLE,WHITE
Por supuesto, también puedes editar el código para probar diferentes efectos de iluminación. ¡Comparte tu trabajo conmigo!
Soporte Técnico y Discusión de Producto
Si tienes algún problema técnico, envía tu consulta a nuestro foro.
¡Gracias por elegir nuestros productos! Estamos aquí para brindarte soporte diverso y asegurar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para atender diferentes preferencias y necesidades.