Tabla de contenido:
- Paso 1: Conecte la pantalla
- Paso 2: Código: Conceptos básicos
- Paso 3: Código: Caracteres personalizados
- Paso 4: Código: sutilezas
- Paso 5: la caja
- Paso 6: mezclarse
Video: Etiqueta de precio dinámica falsa: 6 pasos (con imágenes)
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:43
Los precios de Amazon cambian constantemente. Si deja artículos en su carrito de compras por más de unas pocas horas, es probable que reciba una alerta sobre fluctuaciones mínimas: $ 0.10 aquí, $ 2.04 allá. Amazon y sus comerciantes obviamente están utilizando alguna forma de precios algorítmicos para exprimir hasta el último centavo del mercado.
Eso es todo lo que se puede esperar (capitalismo tardío y todo eso). Pero, ¿qué pasa si las cosas salen mal? En 2011, estalló una guerra de precios entre dos algoritmos competidores. El resultado: un libro sobre el ciclo de vida de las moscas domésticas (agotado, pero no particularmente raro) se disparó a un precio de 23,6 millones de dólares.
La reciente adquisición de Whole Foods Market por parte de Amazon nos hizo preguntarnos: ¿qué impide que los precios dinámicos ingresen al mundo físico del comercio minorista? ¿Y si los precios de un supermercado fueran tan flexibles como los de Internet?
Entonces, en este Instructable, crearemos una pantalla de precios dinámica con un Arduino y una pequeña pantalla LCD. También hablaremos brevemente sobre cómo disfrazarlo e instalarlo en una tienda.
(Y, si está interesado, este complemento de Chrome puede mostrarle el historial de precios de cualquier artículo en Amazon durante los últimos 120 días).
Material necesario
Esto es lo que usamos para construir este proyecto:
- Un Arduino Uno R3
-
Una pantalla LCD estándar de 16x2. Usamos este de Adafruit, pero siempre que sea compatible con la biblioteca LiquidCrystal, debería ser bueno. Necesitará algunas cosas para conectarlo al Arduino:
- algunos cables de puente
- una resistencia de 220 ohmios
- un potenciómetro de 10k ohmios (esto es para controlar el contraste de la pantalla. Si encuentra un contraste que le guste, puede reemplazar el potenciómetro con una resistencia fija).
- Un poco de acrílico para la caja. Usamos un acrílico negro mate fundido, cortado con láser y ensamblado con adhesivo solvente acrílico y pegamento caliente.
- Imanes y / o gancho de estantería para sujetar la caja en tienda. Si sigue la ruta del gancho, podría medir e imprimir uno en 3D, o intentar encontrar uno en línea (¿Alibaba, tal vez?), O … adquirirlo de alguna otra manera más nefasta. Estar a salvo.
Primero, ¡pongamos en marcha la pantalla!
Paso 1: Conecte la pantalla
Seguro que hay muchos pines en la parte posterior de esa pantalla LCD. Afortunadamente, la documentación de la biblioteca de software que vamos a utilizar tiene una buena guía para conectarla. Echale un vistazo.
En resumen, su cableado debería terminar así:
-
Poder:
- LCD GND (pin 1) → Arduino GND
- LCD VDD (pin 2) → Arduino + 5V
- LCD RW (pin 5) → Arduino GND
-
Cosas de datos:
- LCD RS (pin 4) → Pin digital Arduino 12
- Activar LCD (pin 6) → Pin digital Arduino 11
- LCD D4 (pin 11) → pin digital 5
- LCD D5 (pin 12) → pin digital 4
- LCD D6 (pin 13) → pin digital 3
- LCD D7 (pin 14) → pin digital 2
-
Contraste de pantalla:
- Conecte las patas de un potenciómetro de 10k a + 5V y GND de Arduino
- Salida del potenciómetro → LCD VO (pin 3).
-
Iluminar desde el fondo:
- LCD BL1 (pin 15) → Resistencia de 220 ohmios → Arduino + 5V
- LCD BL2 (pin 16) → Arduino GND
Cuando todo esté listo, cargue uno de los proyectos LiquidCrystal de ejemplo en el IDE de Arduino y vea si funciona. Recuerde verificar dos veces el código de inicialización de la pantalla LCD en las muestras: los números de los pines deben ser correctos o no verá nada.
Por ejemplo, el ejemplo "Blink" tiene este código, que es correcto dada la configuración anterior:
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Consejos
- Ahórrese un poco de soldadura e invierta en algunos extremos engarzados y conectores de cabezal. En proyectos como este, en los que vamos a meter la electrónica en una caja pequeña, poder hacer cables de puente cortos es increíblemente útil.
- Del mismo modo, los tubos termorretráctiles son realmente útiles para asegurarse de que nada se salga cuando está todo presionado contra sí mismo.
- Dado que hay tantas cosas que van a GND y + 5V, optamos por hacer un cable franken (ver la foto de arriba) para que sea lo más compacto posible. Si el espacio fuera un problema menor, una placa de pruebas o un protoshield habría sido una opción más fácil.
- Algunos potenciómetros tienen una forma extraña. Generalmente, el cable izquierdo se usa como tierra, el cable más a la derecha como potencia y el del medio como salida. Si el suyo tiene dos cables en la parte delantera y uno en la parte posterior, el de la parte posterior es la salida.
Gotchas
- Si no ve nada en su pantalla LCD, intente girar el potenciómetro completamente en una dirección y luego en la otra. En su contraste más bajo, el contenido de la pantalla LCD es completamente invisible.
- Si ve un galimatías realmente extraño en la pantalla LCD, o solo una línea en lugar de dos, asegúrese de que todas sus conexiones sean seguras. Tuvimos una conexión defectuosa a tierra y estaba causando los problemas de visualización más extraños.
- El código de inicialización de la pantalla LCD (lo que ejecuta lcd.init () en la función setup ()) es importante y lleva un tiempo. Si algo está mal con su pantalla y sospecha que hay un cable defectuoso, no espere que las cosas moviéndose repentinamente lo hagan funcionar. Es posible que deba restablecer el Arduino para que el código de inicialización tenga la oportunidad de ejecutarse correctamente.
- Asegúrese de que sus cables sean bastante cortos, pero no demasiado cortos. No hay nada peor que tener que resolver porque estás a unos centímetros de un cabezal.
¡Excelente! Ahora hagamos que muestre algunas cosas elegantes.
Paso 2: Código: Conceptos básicos
Lo primero es lo primero: hagamos que la pantalla muestre "Precio actual:" en la línea superior y un precio aleatorio en algún rango en la segunda. De vez en cuando, hagamos que se actualice el precio. Esto es bastante simple, pero destacará el uso básico de la biblioteca LiquidCrystal y algunas de sus peculiaridades.
Primero, ingresemos a la biblioteca y definamos algunas constantes:
#incluir
const uint8_t lcdWidth = 16;
const uint8_t lcdHeight = 2;
const long minPriceInCents = 50;
const long maxPriceInCents = 1999;
const unsigned long minMillisBetweenPriceUpdates = 0.25 * 1000;
const unsigned long maxMillisBetweenPriceUpdates = 2 * 1000
¡Excelente! Esos son los parámetros para el rango de precios y la frecuencia con la que se actualizará. Ahora creemos una instancia de la clase LCD proporcionada por la biblioteca e inicialicémosla. Imprimiremos algo en la consola en serie, solo para tener la seguridad de que todo está funcionando, incluso si no vemos nada en la pantalla LCD. Lo haremos en la función setup (), que se ejecuta una vez después de que Arduino arranca. Sin embargo, tenga en cuenta que declaramos la variable lcd fuera de setup (), porque queremos acceder a ella en todo el programa.
LiquidCrystal lcd (12, 11, 5, 4, 3, 2); configuración vacía () {Serial.begin (9600); lcd.begin (lcdWidth, lcdHeight);
Serial.println ("LCD inicializado");
lcd.print ("Precio actual:");
}
Y para la carne, usaremos la función incorporada random () y el inicializador String () para construir un precio decimal. random () solo genera enteros, por lo que dividiremos su resultado por 100.0 para obtener un valor de punto flotante. Haremos esto en loop (), por lo que sucede con la mayor frecuencia posible, pero con un retraso aleatorio entre las constantes que definimos anteriormente.
bucle vacío ()
{precio doble = aleatorio (minPriceInCents, maxPriceInCents) / 100.0; String prettyPrice = "$" + String (precio, 2); lcd.setCursor (0, 1); lcd.print (prettyPrice); retraso (aleatorio (minMillisBetweenPriceUpdates, maxMillisBetweenPriceUpdates)); }
Una cosa a tener en cuenta es la llamada a lcd.setCursor (). La biblioteca LiquidCrystal no avanza automáticamente su texto a la siguiente línea después de una impresión, por lo que debemos mover manualmente el cursor (invisible) a la segunda línea (aquí 1, es de base cero). También tenga en cuenta que no tuvimos que imprimir "Precio actual:" de nuevo; la pantalla LCD no se borra a menos que lo haga manualmente, por lo que solo tenemos que actualizar el texto dinámico.
Pruébelo y verá rápidamente un problema relacionado. Si el precio fue, digamos, "$ 14,99" y luego "$ 7,22", la pantalla mostrará "$ 7,229". Recuerde, la pantalla no se borra sola a menos que usted se lo indique. Incluso si imprime en la misma línea, se mantendrá el texto más allá de lo que imprime. Para solucionar este problema, tenemos que rellenar nuestra cadena con espacios para sobrescribir cualquier basura potencial. La forma más fácil de hacer esto es simplemente agregar algunos espacios a nuestra variable prettyPrice:
String prettyPrice = "$" + String (precio, 2) + "";
Con ese cambio implementado, ¡tenemos una prueba de concepto! Vamos a engordarlo un poco.
Paso 3: Código: Caracteres personalizados
Una de las características más interesantes del módulo LCD que estamos usando es la capacidad de crear hasta 8 caracteres personalizados. Esto se hace mediante el método createChar (). Este método toma una matriz de 8x5 bits que describen qué píxeles de la pantalla LCD se deben encender para el carácter dado. Hay algunas herramientas en línea para ayudar a generar estos arreglos. Usé este.
Si no se siente particularmente diseñadora, le recomiendo usar el filtro Umbral en Photoshop para convertir una imagen en blanco y negro y convertirla en caracteres. Recuerde que tiene un máximo de 8 caracteres personalizados o 64 x 5 píxeles.
Opté por usar 6 de esos caracteres para el logotipo de la flecha de Amazon y los 2 restantes para un símbolo de marca más agradable. Puede seguir el ejemplo de CustomCharacter en el IDE de Arduino para saber cómo usar la API. Así es como decidí agrupar las cosas:
// Definir los datos de los caracteres de la marca comercial
const tamaño_t marca registradaCharCount = 2; const uint8_t marca registradaChars [marca registradaCharCount] [8] = {{B00111, B00010, B00010, B00000, B00000, B00000, B00000, B00000}, {B10100, B11100, B10100, B00000, B00000, B00000, B00000}}; uint8_t firstTrademarkCharByte; // El byte usado para imprimir este carácter; asignado en initCustomChars ()
Luego utilicé una función como esta, llamada desde setup (), para crear los caracteres:
void initCustomChars () {
firstTrademarkCharByte = 0; para (size_t i = 0; i <marcaCharCount; i ++) {lcd.createChar (logoCharCount + i, (uint8_t *) marca registradaChars ); }}
Después de eso, imprimir los caracteres personalizados es tan simple como usar lcd.write () con los bytes apropiados. Escribí una función auxiliar para imprimir un rango de bytes y definí printTrademark () en términos de ella:
void writeRawByteRange (uint8_t línea, uint8_t col, uint8_t startValue, size_t numBytes)
{for (uint8_t i = 0; i <numBytes; i ++) {lcd.setCursor (col + i, línea); // Necesito usar write (), no print () - print convertirá el valor entero // en una cadena e imprimirá * ese * lcd.write (startValue + i); }} void printTrademark (línea uint8_t, columna uint8_t) {writeRawByteRange (línea, columna, firstTrademarkCharByte, marcaCharCount); }
El logotipo de la flecha de Amazon se trató de manera similar. Consulte el código adjunto para obtener todos los detalles.
Paso 4: Código: sutilezas
Para hacerme las cosas un poco más fáciles, agregué algunas sutilezas al código. Esto incluye cosas como: una función para borrar una línea específica sobrescribiéndola con espacios y una función para centrar una cadena determinada en una línea.
También quería que la pantalla pasara por tres fases distintas:
- "Precios dinámicos" con el logotipo a continuación
- "por Amazon" con el logo debajo
- visualización de precio aleatorio
Para eso, construí un sistema simple que realiza un seguimiento de cuánto tiempo ha estado activa una fase determinada y, después de un período determinado, pasa a la siguiente.
¡Vea el código adjunto para todos los detalles sangrientos!
Paso 5: la caja
Ahora, para que no nos llamen al escuadrón de bombas, hagamos una bonita caja para todo. Haremos esto con acrílico cortado con láser. Hay muchas herramientas en línea para iniciar el proceso de creación de cajas simples. Recomiendo makercase.com, ya que te permite especificar las dimensiones internas y tiene en cuenta el grosor del material.
Medimos el Arduino, la pantalla LCD y la batería de 9 V, y estimamos que podríamos colocarlo en un estuche de 4 "x 2.5" x 2 ". Entonces, los conectamos en makercase, con un grosor de 1/8" acrílico. Modificamos el PDF resultante para agregar una ventana redondeada para la pantalla LCD y una ranura en la parte inferior para una etiqueta de visualización (más sobre esto más adelante). El archivo resultante se adjunta como PDF.
Usamos adhesivo acrílico (del tipo tóxico de metiletilcetona) para ensamblar los cuatro lados de la caja. Luego, unimos el panel LCD al frente con pegamento caliente. Una vez que tuvimos todo funcionando y encajando, sellamos los dos últimos lados de la caja con pegamento caliente, para poder desarmarla fácilmente más tarde. Como no esperábamos que el dispositivo sufriera mucho desgaste, dejamos el Arduino y la batería sin asegurar en la parte inferior de la carcasa.
Mejoras potenciales
- Olvidamos construir de alguna manera para encender o apagar el dispositivo. Decir ah. Hubiera sido una buena idea tener espacio para un interruptor en la parte inferior o trasera de la caja.
- La ranura en la parte inferior para la etiqueta colgante podría haber estado más cerca del frente de la caja, para mejorar la visibilidad.
Paso 6: mezclarse
Y ahora, la parte difícil: colarse en una tienda.
Marca de Whole Foods
Algunas cosas que aprendimos en la ingeniería inversa de la marca Whole Foods y Amazon:
- El texto del cuerpo generalmente está en Scala Sans
- El texto del encabezado se parece mucho a Brighton: una de esas fuentes genéricas "cálidas y amigables".
- Whole Foods Green es algo cercano a # 223323
- Busque en su tienda local ejemplos de elementos gráficos que se repiten: les gustan los bordes festoneados, los rayos de sol y el arte vectorial simple.
La etiqueta colgante
Cortamos una hendidura en la parte inferior de la caja de acrílico para que podamos colocar una etiqueta colgante en la caja, explicando lo que está pasando. Consulte el PDF adjunto para ver un ejemplo. Está diseñado para cortarse e insertarse en la ranura; debe encajar y sostenerse sin ningún adhesivo.
Estantería
En cuanto a colocar la caja en un estante, Whole Foods utiliza componentes de estantería bastante estándar. Tomamos medidas y encontramos un gancho compatible en una ferretería. Pegamos la caja al gancho con pegamento caliente.
Si no puede encontrar un gancho de este tipo, puede probar con imanes: pegue algunos en la parte posterior de la caja y simplemente encájelo en un estante.
¡Desplegar
Coloque la caja a la altura de los ojos para atraer la atención de los transeúntes. ¡No te dejes atrapar! ¡La mejor de las suertes!
Recomendado:
Smokin '- Máquina de humo con control remoto a bajo precio: 5 pasos (con imágenes)
Smokin '- Máquina de humo con control remoto a bajo precio: Este es un breve instructivo sobre cómo hacer una pequeña máquina de humo relativamente pequeña, controlable a distancia, barata y divertida, que se puede usar para bromear con amigos, hacer trucos de magia, probar flujos de aire o lo que sea. descargo de responsabilidad: esta compilación contiene
Instalación De La Carte TagTagTag Pour Nabaztag: etiqueta / Instalación de la placa TagTagTag en su Nabaztag: etiqueta: 23 pasos
Instalación De La Carte TagTagTag Pour Nabaztag: tag / Instalación de la placa TagTagTag en su Nabaztag: tag: (ver más abajo la versión en inglés) La carte TagTagTag a été créée en 2018 lors de Maker Faire Paris pour faire renaitre les Nabaztag et les Nabaztag: tag . Elle a fait l'objet ensuite d'un financement participatif sur Ulule en juin 2019, si vous souhaitez
Vivre Avec Nabaztag: Etiqueta: Etiqueta: 14 Pasos
Vivre Avec Nabaztag: Etiqueta: Etiqueta: Voilà! Vous avez démonté votre Nabaztag (ou Nabaztag: Tag), débranché, rebranché, vissé, copié le logiciel, paramétré le wifi? Très bien.Dans ce tutoriel on va décrire la vie une fois que Nabaztag est branché. C'est parti
Cartel publicitario portátil a bajo precio en solo 10 pasos !!: 13 pasos (con imágenes)
Letrero de publicidad portátil a bajo precio en solo 10 pasos !!: Haga su propio letrero de publicidad portátil y barato. Con este letrero, puede mostrar su mensaje o logotipo en cualquier lugar a cualquier persona en la ciudad. Este instructable es una respuesta a / mejora / cambio de: https://www.instructables.com/id/Low-Cost-Illuminated
Etiqueta láser Arduino - Etiqueta Duino: 11 pasos (con imágenes)
Etiqueta láser de Arduino - Etiqueta de Duino: Etiqueta de Duino - Introducción general La etiqueta de Duino es un sistema de etiqueta de láser basado en el arduino. Finalmente, un sistema de etiquetas láser que puede modificarse y piratearse hasta que tenga el sistema de etiquetas láser perfecto para artillería de oficina, guerras de bosques y suburbios