Falešná dynamická cenovka: 6 kroků (s obrázky)
Falešná dynamická cenovka: 6 kroků (s obrázky)
Anonim
Image
Image
Zapojte displej
Zapojte displej

Ceny Amazonu se neustále mění. Pokud necháte položky v nákupním košíku déle než několik hodin, pravděpodobně budete upozorněni na drobné výkyvy - 0,10 $ zde, 2,04 $ tam. Amazon a jeho obchodníci očividně používají nějakou formu algoritmických cen k vytlačení posledního haléře z trhu.

To je vše, co lze očekávat (pozdní kapitalismus a všechno to). Ale co se stane, když se něco pokazí? V roce 2011 vypukla cenová válka mezi dvěma konkurenčními algoritmy. Výsledek: kniha o životním cyklu mouchy domácí (vyprodaná, ale nijak zvlášť vzácná) vyletěla do výšky 23,6 milionu dolarů.

Nedávná akvizice společnosti Whole Foods Market od společnosti Amazon nás přiměla přemýšlet: co brání tomu, aby dynamické ceny vstupovaly do fyzického světa maloobchodu? Co kdyby ceny v supermarketu byly stejně flexibilní jako ceny online?

V tomto Instructable tedy budeme stavět dynamický cenový displej s Arduinem a malým LCD. Krátce si také povíme o maskování a instalaci v obchodě.

(A pokud vás to zajímá, tento plugin pro Chrome vám může ukázat historii cen jakékoli položky na Amazonu za posledních 120 dní.)

Potřebný materiál

Zde jsme použili při stavbě tohoto projektu:

  • Arduino Uno R3
  • Standardní LCD displej 16x2. Použili jsme ten od Adafruit, ale pokud je kompatibilní s knihovnou LiquidCrystal, měli byste být dobří. K připojení k Arduinu budete potřebovat několik věcí:

    • nějaké propojovací kabely
    • odpor 220 ohmů
    • potenciometr 10 k ohmů (Slouží k ovládání kontrastu displeje. Pokud najdete kontrast, který se vám líbí, můžete potenciometr nahradit pevným odporem.)
  • Trochu akrylu do krabice. Použili jsme litý matný černý akryl, řezaný laserem a sestavený akrylovým rozpouštědlovým lepidlem a horkým lepidlem.
  • Magnety a/nebo policový hák k připevnění krabice v obchodě. Pokud se vydáte hákovou cestou, můžete ji změřit a vytisknout 3d, nebo se pokusit ji najít online (třeba Alibaba?), Nebo … získat ji jiným, hanebnějším způsobem. Být v bezpečí.

Nejprve se podívejme na displej!

Krok 1: Zapojte displej

Zapojte displej
Zapojte displej
Zapojte displej
Zapojte displej

Na zadní straně LCD je určitě spousta kolíků. Naštěstí dokumentace k softwarové knihovně, kterou budeme používat, má dobrý průvodce, jak ji zapojit. Koukni na to.

V souhrnu by vaše zapojení mělo skončit takto:

  • Napájení:

    • LCD GND (pin 1) → Arduino GND
    • LCD VDD (pin 2) → Arduino +5V
    • LCD RW (pin 5) → Arduino GND
  • Datové položky:

    • LCD RS (pin 4) → digitální pin Arduino 12
    • Povolit LCD (pin 6) → Digitální pin Arduino 11
    • LCD D4 (pin 11) → digitální pin 5
    • LCD D5 (pin 12) → digitální pin 4
    • LCD D6 (pin 13) → digitální pin 3
    • LCD D7 (pin 14) → digitální pin 2
  • Kontrast displeje:

    • Připojte 10k nožičky potenciometru k Arduino +5V a GND
    • Výstup potenciometru → LCD VO (pin 3).
  • Podsvícení:

    • LCD BL1 (pin 15) → odpor 220 ohmů → Arduino +5V
    • LCD BL2 (pin 16) → Arduino GND

Když je vše hotovo, nahrajte jeden z ukázkových projektů LiquidCrystal do Arduino IDE a zjistěte, zda funguje! Nezapomeňte ve vzorcích dvakrát zkontrolovat inicializační kód LCD-čísla pinů musí být správná, jinak nic neuvidíte.

Příklad „Blink“má například tento kód, který je správný vzhledem k výše uvedenému nastavení:

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);

Tipy

  • Ušetřete si pájení a investujte do některých krimpovacích koncovek a konektorových konektorů. U projektů, jako je tento, kdy budeme elektroniku nacpat do malého pouzdra, je schopnost vyrobit krátké propojovací kabely neuvěřitelně užitečná.
  • Podobně je smršťovací hadička opravdu užitečná, aby se zajistilo, že se nic nezkratuje, když je vše přitlačeno k sobě.
  • Vzhledem k tomu, že na GND a +5V je tolik věcí, rozhodli jsme se vytvořit kabel franken (viz foto výše), aby byl co nejkompaktnější. Pokud by místo bylo méně problémem, byla by snadnější volbou prkénko nebo protoshield.
  • Některé potenciometry jsou podivně tvarované. Obecně se levý vodič používá jako uzemnění, pravý vodič jako výkon a prostřední jako výstup. Pokud má ten váš dva svody vpředu a jeden vzadu, výstupem je ten na zadní straně.

Gotchas

  • Pokud na LCD nic nevidíte, zkuste potenciometr otočit úplně jedním směrem, pak druhým. Při nejnižším kontrastu je obsah LCD zcela neviditelný.
  • Pokud na LCD displeji vidíte opravdu podivné bláboly nebo pouze jeden řádek místo dvou, ujistěte se, že jsou všechna vaše připojení zabezpečená. Měli jsme vadné připojení k zemi a to způsobilo nejpodivnější problémy se zobrazením.
  • Inicializační kód LCD (co spustí lcd.init () ve funkci setup ()) je důležitý a chvíli trvá. Pokud je s vaším displejem něco v nepořádku a máte podezření, že je vadný vodič, nečekejte, že by vám škubání věcí najednou fungovalo. Možná budete muset resetovat Arduino, aby měl inicializační kód šanci správně fungovat.
  • Ujistěte se, že vaše dráty jsou docela krátké, ale ne příliš krátké. Není nic horšího, než se odhodlat, protože jste pár centimetrů od hlavičky.

Skvělý! Nyní to ukažme na několika efektních věcech.

Krok 2: Kód: Základy

Kód: Základy
Kód: Základy
Kód: Základy
Kód: Základy

Nejdříve nejprve: nechme na displeji v horním řádku zobrazit „Aktuální cenu:“a ve druhém náhodnou cenu v určitém rozmezí. Nechte si tak často obnovit cenu. To je docela jednoduché, ale zdůrazní to základní použití knihovny LiquidCrystal a některé její zvláštnosti.

Nejprve si vezmeme knihovnu a definujeme některé konstanty:

#zahrnout

const uint8_t lcdWidth = 16;

const uint8_t lcdHeight = 2;

konst long minPriceInCents = 50;

konst long maxPriceInCents = 1999;

konst bez znaménka dlouhý minMillisBetweenPriceUpdates = 0,25 * 1000;

konst bez znaménka dlouhý maxMillisBetweenPriceUpdates = 2 * 1000

Skvělý! To jsou parametry pro cenové rozpětí a jak často se bude obnovovat. Nyní vytvoříme instanci třídy LCD poskytovanou knihovnou a inicializujeme ji. Vytiskneme něco přes sériovou konzoli, abychom měli jistotu, že věci fungují, i když na LCD nic nevidíme. Uděláme to ve funkci setup (), která se spustí jednou po spuštění Arduina. Pamatujte však, že deklarujeme proměnnou lcd mimo setup (), protože k ní chceme mít přístup v celém programu.

LiquidCrystal lcd (12, 11, 5, 4, 3, 2); neplatné nastavení () {Serial.begin (9600); lcd.begin (lcdWidth, lcdHeight);

Serial.println ("LCD inicializováno");

lcd.print („Aktuální cena:“);

}

A pro maso použijeme vestavěnou funkci random () a inicializátor String () ke konstrukci desítkové ceny. random () generuje pouze celá čísla, takže výsledek vydělíme 100,0, abychom získali hodnotu s plovoucí desetinnou čárkou. Uděláme to ve smyčce (), takže se to stane tak často, jak je to možné, ale s náhodným zpožděním mezi konstantami, které jsme definovali dříve.

prázdná smyčka ()

{dvojnásobná cena = náhodná (minPriceInCents, maxPriceInCents) / 100,0; Řetězec prettyPrice = "$" + Řetězec (cena, 2); lcd.setCursor (0, 1); lcd.print (prettyPrice); zpoždění (náhodné (minMillisBetweenPriceUpdates, maxMillisBetweenPriceUpdates)); }

Jedna věc, kterou je třeba poznamenat, je volání lcd.setCursor (). Knihovna LiquidCrystal po tisku automaticky neposune váš text na další řádek, takže musíme (neviditelný) kurzor ručně přesunout na druhý řádek (zde 1-je založen na nule). Všimněte si také, že jsme nemuseli znovu tisknout „Aktuální cena:“; LCD displej není vymazán, pokud tak neučiníte ručně, takže musíme aktualizovat pouze dynamický text.

Zkuste to a rychle uvidíte související problém. Pokud cena byla, řekněme, „14,99 USD“a poté „7,22 USD“, na displeji se zobrazí „7,229 USD“. Pamatujte, že displej se sám nevymaže, pokud mu to neřeknete. I když tisknete na stejný řádek, veškerý text, který je za tím, co tisknete, zůstane. Abychom tento problém vyřešili, musíme náš řetězec doplnit mezerami, abychom přepsali potenciální odpadky. Nejjednodušší způsob, jak to udělat, je připnout několik mezer k naší proměnné prettyPrice:

Řetězec prettyPrice = "$" + Řetězec (cena, 2) + "";

S touto změnou na místě máme důkaz koncepce! Pojďme to trochu povysávat.

Krok 3: Kód: vlastní znaky

Kód: Vlastní znaky
Kód: Vlastní znaky
Kód: Vlastní znaky
Kód: Vlastní znaky

Jednou z nejlepších funkcí modulu LCD, který používáme, je možnost vytvořit až 8 vlastních znaků. To se provádí pomocí metody createChar (). Tato metoda zabere pole 8x5 bitů, které popisuje, které pixely LCD se mají zapnout pro daný znak. Existuje několik nástrojů online, které pomáhají generovat tato pole. Použil jsem tento.

Pokud se necítíte nijak zvlášť designově, doporučuji použít filtr Threshold ve Photoshopu, aby se obrázek změnil na černobílý, a převést jej na postavy. Pamatujte, že máte maximálně 8 vlastních znaků nebo 64 x 5 pixelů.

Rozhodl jsem se použít 6 z těchto znaků pro logo šipky Amazonky a zbývající 2 pro hezčí symbol ochranné známky. Jak používat API můžete sledovat v příkladu CustomCharacter v IDE Arduino. Takto jsem se rozhodl seskupit věci:

// Definujte data pro znaky ochranné známky

const size_t trademarkCharCount = 2; const uint8_t trademarkChars [trademarkCharCount] [8] = {{B00111, B00010, B00010, B00000, B00000, B00000, B00000, B00000}, {B10100, B11100, B10100, B00000, B00000, B00000, B00000}}; uint8_t prvníTrademarkCharByte; // Bajt použitý k tisku tohoto znaku; přiřazeno v initCustomChars ()

Poté jsem k vytvoření znaků použil funkci jako je tato, volanou z setup ():

void initCustomChars () {

firstTrademarkCharByte = 0; for (size_t i = 0; i <trademarkCharCount; i ++) {lcd.createChar (logoCharCount+i, (uint8_t *) trademarkChars ); }}

Poté je tisk vlastních znaků stejně jednoduchý jako použití lcd.write () s příslušnými bajty. Napsal jsem pomocnou funkci pro tisk rozsahu bajtů a definoval printTrademark (), pokud jde o to:

void writeRawByteRange (řádek uint8_t, uint8_t col, uint8_t startValue, size_t numBytes)

{for (uint8_t i = 0; i <numBytes; i ++) {lcd.setCursor (col+i, line); // potřeba použít write (), ne print () - print změní celočíselnou // hodnotu na řetězec a vytiskne * that * lcd.write (startValue + i); }} void printTrademark (řádek uint8_t, uint8_t col) {writeRawByteRange (line, col, firstTrademarkCharByte, trademarkCharCount); }

Logo Amazon arrow bylo zpracováno podobným způsobem. Podrobnosti najdete v přiloženém kódu.

Krok 4: Kód: Niceties

Abych si to trochu ulehčil, přidal jsem do kódu pár drobností. To zahrnuje věci jako: funkce pro vymazání konkrétního řádku přepsáním mezerami a funkce pro vycentrování daného řetězce na řádek.

Také jsem chtěl, aby displej procházel třemi odlišnými fázemi:

  1. „Dynamické ceny“s logem níže
  2. „od Amazonu“s logem níže
  3. zobrazení náhodných cen

Za tímto účelem jsem vytvořil jednoduchý systém, který sleduje, jak dlouho je daná fáze aktivní, a po určité době přejde k další.

Všechny krvavé detaily najdete v přiloženém kódu!

Krok 5: Krabice

Krabice
Krabice

Abychom se nenechali vyzvat týmem bomb, udělejme pro celou věc pěknou krabici. Uděláme to laserem řezaným akrylem. Existuje spousta online nástrojů, které vám pomohou při vytváření jednoduchých políček. Doporučuji makercase.com, protože vám umožňuje specifikovat vnitřní rozměry a tloušťku materiálu.

Změřili jsme Arduino, LCD a 9V baterii a odhadli jsme, že se nám to vejde do pouzdra o rozměrech 4 "x 2,5" x 2 ". Takže jsme je zapojili do skříňky Maker s tloušťkou 1/8" akryl. Výsledný PDF jsme upravili tak, aby přidal zaoblené okno pro LCD a slot ve spodní části pro zobrazovací značku (více o tom později). Výsledný soubor je připojen jako PDF.

K sestavení čtyř stran krabice jsme použili akrylové lepidlo (toxický methylethylketonový druh). Poté jsme LCD panel připevnili na přední stranu horkým lepidlem. Jakmile jsme měli vše funkční a zapadající, uzavřeli jsme poslední dvě strany krabice horkým lepidlem, abychom jej mohli později snadno rozebrat. Protože jsme nečekali, že se zařízení bude hodně opotřebovávat, nechali jsme Arduino a baterii nezajištěné ve spodní části pouzdra.

Potenciální vylepšení

  • Opomněli jsme stavět jakýmkoli způsobem k zapnutí nebo vypnutí zařízení. Ha. Místo pro přepínač na spodní nebo zadní straně krabice by byl dobrý nápad.
  • Štěrbina ve spodní části pro visící visačku mohla být blíže k přední části krabice, kvůli lepší viditelnosti.

Krok 6: Míchání

Míchání
Míchání
Míchání
Míchání

A teď ta těžká část: vplížit se do obchodu.

Značky Whole Foods

Některé věci, které jsme se naučili v rámci reverzního inženýrství Whole Foods a značky Amazon:

  • Hlavní text je obecně v Scala Sans
  • Text záhlaví je v něčem, co hodně připomíná Brighton - jedno z obecných „teplých a přátelských“písem
  • Whole Foods Green je něco blízko #223323
  • V místním obchodě najdete příklady grafických prvků, které se opakují: mají rádi vroubkované okraje, sluneční paprsky a jednoduché vektorové umění.

Visící visačka

Ve spodní části akrylového pouzdra jsme vyřízli štěrbinu, abychom mohli na krabici připevnit visící visačku s vysvětlením, co se děje. Příklad naleznete v přiloženém PDF. Toto je určeno k vyříznutí a vložení do slotu; měl by sedět a držet bez lepidla.

Regály

Pokud jde o skutečné připevnění krabice k polici, Whole Foods používá docela standardní policové komponenty. Provedli jsme měření a našli jsme kompatibilní háček v železářství. Krabici jsme na háček připevnili horkým lepidlem.

Pokud takový háček nenajdete, můžete zkusit magnety - některé přilepit na zadní stranu krabice a jednoduše nacvaknout na poličku.

Nasadit

Umístěte krabici do úrovně očí, abyste upoutali pozornost kolemjdoucích. Nenechte se chytit! Hodně štěstí!

Doporučuje: