Obsah:

Falošná dynamická cenovka: 6 krokov (s obrázkami)
Falošná dynamická cenovka: 6 krokov (s obrázkami)

Video: Falošná dynamická cenovka: 6 krokov (s obrázkami)

Video: Falošná dynamická cenovka: 6 krokov (s obrázkami)
Video: Полный курс по Next js - Изучи Nextjs за 2 часа! | React SSR +таймкоды 2024, November
Anonim
Image
Image
Zapojte displej
Zapojte displej

Ceny Amazonu sa neustále menia. Ak necháte položky v nákupnom košíku dlhšie ako niekoľko hodín, pravdepodobne vás upozorní na nepatrné výkyvy - 0,10 dolára tu, 2,04 dolára tam. Amazon a jeho obchodníci očividne používajú nejakú formu algoritmických cien na vytlačenie posledného centu z trhu.

To sa dá čakať (neskorý kapitalizmus a všetko). Čo sa však stane, ak sa niečo pokazí? V roku 2011 vypukla cenová vojna medzi dvoma konkurenčnými algoritmami. Výsledok: kniha o životnom cykle muchy domácej (mimo tlač, ale nie obzvlášť vzácna) vyletela do výšky 23,6 milióna dolárov.

Nedávna akvizícia spoločnosti Whole Foods Market spoločnosťou Amazon nás prinútila zamyslieť sa: čo bráni dynamickému oceňovaniu vkročiť do fyzického sveta maloobchodu? Čo keby boli ceny v supermarkete rovnako flexibilné ako ceny online?

V tomto návode budeme teda stavať dynamický cenový displej s Arduinom a malým LCD. Stručne si povieme aj o maskovaní a inštalácii v obchode.

(A ak vás to zaujíma, tento doplnok pre prehliadač Chrome vám môže zobraziť históriu cien akejkoľvek položky na Amazone za posledných 120 dní.)

Potrebný materiál

Tu sme použili pri stavbe tohto projektu:

  • Arduino Uno R3
  • Štandardný LCD displej 16x2. Použili sme tento od Adafruit, ale pokiaľ je kompatibilný s knižnicou LiquidCrystal, mali by ste byť dobrí. Na zapojenie do Arduina budete potrebovať niekoľko vecí:

    • nejaké štartovacie káble
    • odpor 220 ohmov
    • potenciometer 10 k ohmov (slúži na ovládanie kontrastu displeja. Ak nájdete kontrast, ktorý sa vám páči, môžete nahradiť potenciometer pevným odporom.)
  • Trochu akrylu do krabice. Použili sme liaty matný čierny akryl, rezaný laserom a zostavený akrylovým rozpúšťadlovým lepidlom a horúcim lepidlom.
  • Magnety a/alebo policový háčik na pripevnenie škatule v obchode. Ak sa vydáte háčikom, mohli by ste ho zmerať a vytlačiť na 3D tlačiarni, alebo sa ho pokúsite nájsť online (možno Alibaba?), Alebo … ho získať iným, hanebnejším spôsobom. Byť v bezpečí.

Najprv spustíme displej!

Krok 1: Zapojte displej

Zapojte displej
Zapojte displej
Zapojte displej
Zapojte displej

Na zadnej strane tohto LCD je určite veľa kolíkov. Našťastie dokumentácia softvérovej knižnice, ktorú budeme používať, má dobrého sprievodcu zapojením. Skontrolovať to.

Stručne povedané, vaše zapojenie by malo skončiť takto:

  • Moc:

    • LCD GND (pin 1) → Arduino GND
    • LCD VDD (pin 2) → Arduino +5V
    • LCD RW (pin 5) → Arduino GND
  • Údaje:

    • LCD RS (pin 4) → digitálny pin Arduino 12
    • Zapnutie LCD (pin 6) → Digitálny pin Arduino 11
    • LCD D4 (kolík 11) → digitálny kolík 5
    • LCD D5 (kolík 12) → digitálny kolík 4
    • LCD D6 (kolík 13) → digitálny kolík 3
    • LCD D7 (kolík 14) → digitálny kolík 2
  • Kontrast displeja:

    • Pripojte nohy potenciometra 10k k Arduino +5V a GND
    • Výstup potenciometra → LCD VO (pin 3).
  • Podsvietenie:

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

Keď je všetko pripravené, nahrajte jeden z ukážkových projektov LiquidCrystal do Arduino IDE a zistite, či funguje! Nezabudnite znova skontrolovať inicializačný kód LCD vo vzorkách-čísla pinov musia byť správne, inak nič neuvidíte.

Príklad „Blink“má napríklad tento kód, ktorý je správny vzhľadom na vyššie uvedené nastavenie:

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

Tipy

  • Ušetrite si spájkovanie a investujte do niektorých krimpovacích koncoviek a konektorov záhlavia. Pri projektoch, ako je tento, kde budeme tlačiť elektroniku do malého puzdra, je schopnosť vyrobiť krátke prepojovacie káble neuveriteľne užitočná.
  • Podobne je zmršťovacia hadička skutočne užitočná na to, aby sa zaistilo, že sa nič neskráti, keď je všetko pritlačené k sebe.
  • Pretože do GND a +5V smeruje toľko vecí, rozhodli sme sa vytvoriť franken kábel (pozri fotografiu vyššie), aby bol čo najkompaktnejší. Ak by bol priestor menším problémom, jednoduchšou možnosťou by bola doska na chlieb alebo protoshield.
  • Niektoré potenciometre sú podivne tvarované. Ľavý zvod sa spravidla používa ako uzemnenie, pravý zvod ako výkon a stredný ako výstup. Ak má ten váš dva zvody vpredu a jeden vzadu, výstupom je ten na zadnej strane.

Gotchas

  • Ak na displeji nič nevidíte, skúste potenciometer otočiť úplne jedným smerom a potom druhým. Pri najnižšom kontraste je obsah LCD úplne neviditeľný.
  • Ak na LCD displeji vidíte skutočne podivné bláboly alebo iba jeden riadok namiesto dvoch, uistite sa, že sú všetky vaše pripojenia zaistené. Mali sme chybné spojenie so zemou a to spôsobilo najpodivnejšie problémy so zobrazením.
  • Inicializačný kód LCD (to, čo spustí funkcia lcd.init () vo funkcii setup ()), je dôležitý a chvíľu trvá. Ak je s vašim displejom niečo v poriadku a máte podozrenie na chybný drôt, nečakajte, že chvenie vecí začne náhle fungovať. Možno budete musieť resetovať Arduino, aby mal inicializačný kód šancu správne fungovať.
  • Uistite sa, že vaše káble sú dosť krátke, ale nie príliš krátke. Nie je nič horšie, ako keď sa musíte odhodlať, pretože vás od hlavičky delí niekoľko centimetrov.

Skvelé! Teraz to ukážeme na niekoľko fantastických vecí.

Krok 2: Kód: Základy

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

Najprv najskôr: nechajme na displeji v hornom riadku zobraziť „Aktuálnu cenu:“a v druhom náhodnú cenu v určitom rozsahu. Nech sa cena vždy obnoví. Je to celkom jednoduché, ale poukáže na základné používanie knižnice LiquidCrystal a niektoré jej zvláštnosti.

Najprv si stiahneme knižnicu a definujeme niektoré konštanty:

#zahrnúť

const uint8_t lcdWidth = 16;

const uint8_t lcdHeight = 2;

konšt. dlhá minCenaInCenty = 50;

konšt. dlhá maxPriceInCents = 1999;

konšt. bez znamienka dlhé minMillisBetweenPriceUpdates = 0,25 * 1000;

konšt. nepodpísané dlhé maxMillisBetweenPriceUpdates = 2 * 1 000

Skvelé! Toto sú parametre pre cenové rozpätie a frekvenciu jeho aktualizácie. Teraz urobme inštanciu triedy LCD poskytovanú knižnicou a inicializujme ju. Vytlačíme niečo cez sériovú konzolu, aby sme mali istotu, že veci fungujú, aj keď na LCD nič nevidíme. Urobíme to vo funkcii setup (), ktorá sa spustí raz po zavedení Arduina. Všimnite si však, že premennú lcd deklarujeme mimo setup (), pretože k nej chceme mať prístup v celom programe.

LiquidCrystal lcd (12, 11, 5, 4, 3, 2); void setup () {Serial.begin (9600); lcd.begin (lcdWidth, lcdHeight);

Serial.println ("LCD inicializované");

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

}

A pre mäso použijeme vstavanú funkciu random () a inicializátor String () na zostrojenie desatinnej ceny. random () generuje iba celé čísla, takže jeho výsledok vydelíme 100,0, aby sme získali hodnotu s pohyblivou rádovou čiarkou. Urobíme to v slučke (), takže sa to stáva tak často, ako je to možné, ale s náhodným oneskorením medzi konštantami, ktoré sme definovali skôr.

prázdna slučka ()

{dvojnásobná cena = náhodná (minPriceInCents, maxPriceInCents) / 100,0; Reťazec prettyPrice = "$" + Reťazec (cena, 2); lcd.setCursor (0, 1); lcd.print (prettyPrice); oneskorenie (náhodné (minMillisBetweenPriceUpdates, maxMillisBetweenPriceUpdates)); }

Jedna vec, ktorú je potrebné poznamenať, je výzva na lcd.setCursor (). Knižnica LiquidCrystal po tlači automaticky neposunie váš text na nasledujúci riadok, takže musíme (neviditeľný) kurzor manuálne presunúť do druhého riadka (tu 1-je založený na nule). Upozorňujeme, že sme nemuseli znova tlačiť „Aktuálna cena:“; LCD displej nie je vymazaný, pokiaľ tak neurobíte ručne, takže musíme aktualizovať iba dynamický text.

Skúste to a rýchlo uvidíte súvisiaci problém. Ak bola cena povedzme „14,99 dolára“a potom „7,22 dolára“, na displeji sa zobrazí „7,299 dolára“. Pamätajte si, že displej sa sám nevymaže, pokiaľ to nepoviete. Aj keď tlačíte na ten istý riadok, všetok text, ktorý je za tým, čo vytlačíte, zostane. Aby sme tento problém vyriešili, musíme vyplniť reťazec medzerami, aby sa prepísali všetky potenciálne odpadky. Najjednoduchší spôsob, ako to urobiť, je zapnúť niekoľko medzier v našej premennej prettyPrice:

Reťazec prettyPrice = "$" + Reťazec (cena, 2) + "";

Vďaka tejto zmene na mieste máme dôkaz koncepcie! Poďme to trocha povysávať.

Krok 3: Kód: vlastné znaky

Kód: vlastné znaky
Kód: vlastné znaky
Kód: vlastné znaky
Kód: vlastné znaky

Jednou z najlepších funkcií modulu LCD, ktorý používame, je možnosť vytvoriť až 8 vlastných znakov. To sa deje pomocou metódy createChar (). Táto metóda vyžaduje pole 8 x 5 bitov, ktoré opisuje, ktoré pixely displeja LCD sa majú zapnúť pre daný znak. Existuje niekoľko nástrojov online, ktoré vám pomôžu generovať tieto polia. Použil som tento.

Ak sa necítite obzvlášť dizajnérsky, odporúčam použiť filter Threshold vo Photoshope na premenu obrázku na čiernobiely a jeho konverziu na znaky. Nezabudnite, že máte maximálne 8 vlastných znakov alebo 64 x 5 pixelov.

Rozhodol som sa použiť 6 z týchto znakov pre logo šípky Amazonky a zvyšné 2 pre krajší symbol ochrannej známky. Ako používať API môžete sledovať v príklade CustomCharacter v IDE Arduino. Takto som sa rozhodol zoskupiť veci:

// Definujte údaje pre znaky ochrannej 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 firstTrademarkCharByte; // Bajt použitý na vytlačenie tohto znaku; priradené v initCustomChars ()

Potom som na vytvorenie znakov použil funkciu ako je táto, ktorá sa volá z setup ():

void initCustomChars () {

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

Potom je tlač vlastných znakov rovnako jednoduchá ako použitie príkazu lcd.write () s príslušnými bajtmi. Napísal som pomocnú funkciu na vytlačenie rozsahu bajtov a definoval som printTrademark (), pokiaľ ide o to:

neplatné writeRawByteRange (uint8_t riadok, uint8_t stĺpec, uint8_t počiatočná hodnota, size_t numBytes)

{for (uint8_t i = 0; i <numBytes; i ++) {lcd.setCursor (col+i, line); // treba použiť write (), nie print () - print zmení celočíselnú // hodnotu na reťazec a vytlačí * that * lcd.write (startValue + i); }} void printTrademark (uint8_t riadok, uint8_t stĺpec) {writeRawByteRange (line, col, firstTrademarkCharByte, trademarkCharCount); }

Logo Amazon arrow bolo spracované podobným spôsobom. Bližšie informácie nájdete v priloženom kóde.

Krok 4: Kód: Niceties

Aby som si to trocha uľahčil, pridal som do kódu pár drobností. To zahŕňa napríklad: funkciu na vymazanie konkrétneho riadka jeho prepísaním medzerami a funkciu na vycentrovanie daného reťazca na riadok.

Tiež som chcel, aby displej prechádzal tromi rôznymi fázami:

  1. „Dynamické ceny“s logom nižšie
  2. „od Amazonu“s logom nižšie
  3. zobrazenie náhodných cien

Na to som postavil jednoduchý systém, ktorý sleduje, ako dlho je daná fáza aktívna, a po určitom období prechádza na ďalšiu.

Všetky krvavé detaily nájdete v priloženom kóde!

Krok 5: Krabica

Box
Box

Aby sme teda nedostali výzvu od bombardovacej jednotky, urobme pre celú vec peknú škatuľu. Urobíme to pomocou laserom rezaného akrylu. Existuje mnoho online nástrojov na naštartovanie procesu vytvárania jednoduchých boxov. Odporúčam makercase.com, pretože vám umožňuje špecifikovať vnútorné rozmery a hrúbku materiálu.

Zmerali sme batériu Arduino, LCD a 9V a odhadli sme, že by sme ju zmestili do puzdra s rozmermi 4 palcov x 2,5 palcov x 2 palcov. Takže sme ich zapojili do skrinky výrobcu s hrúbkou 1/8 palca akryl. Výsledný PDF sme upravili tak, aby pridalo zaoblené okno pre LCD a slot v spodnej časti pre zobrazovaciu značku (viac o tom neskôr). Výsledný súbor je priložený ako PDF.

Na zostavenie štyroch strán škatule sme použili akrylové lepidlo (toxický druh metyletylketónu). Potom sme LCD panel pripevnili na prednú stranu horúcim lepidlom. Akonáhle sme mali všetko funkčné a zapadajúce, zalepili sme posledné dve strany škatule horúcim lepidlom, aby sme ju neskôr mohli ľahko rozobrať. Pretože sme nečakali, že sa zariadenie veľmi opotrebuje, ponechali sme Arduino a batériu nezabezpečené v spodnej časti puzdra.

Potenciálne vylepšenia

  • Zanedbali sme stavbu akýmkoľvek spôsobom na zapnutie alebo vypnutie zariadenia. Ha. Dobrý priestor by bol priestor na prepínač v spodnej alebo zadnej časti škatule.
  • Štrbina v spodnej časti na zavesenie štítku mohla byť bližšie k prednej časti škatule, aby sa zlepšila viditeľnosť.

Krok 6: Miešanie

Miešanie v
Miešanie v
Miešanie v
Miešanie v

A teraz tá ťažšia časť: vplížiť sa do obchodu.

Značka Whole Foods

Niektoré veci, ktoré sme sa naučili v oblasti reverzného inžinierstva značiek Whole Foods a Amazon:

  • Hlavný text je spravidla v Scala Sans
  • Text hlavičky je v niečom, čo sa veľmi podobá na Brighton - jedno z tých generických „teplých a priateľských“písem
  • Whole Foods Green je niečo blízko #223323
  • V miestnom obchode nájdete príklady grafických prvkov, ktoré sa opakujú: majú radi vroubkované okraje, slnečné lúče a jednoduché vektorové umenie.

Visiaca visačka

V spodnej časti akrylového puzdra sme vyrezali štrbinu, aby sme mohli na škatuľu pripevniť visiaci štítok s vysvetlením, čo sa deje. Príklad nájdete v priloženom PDF. Toto je určené na vystrihnutie a vloženie do otvoru; mal by sedieť a držať bez akéhokoľvek lepidla.

Police

Pokiaľ ide o skutočné pripevnenie škatule k poličke, Whole Foods používa celkom štandardné policové komponenty. Vykonali sme merania a v železiarstve sme našli kompatibilný háčik. Krabicu sme na háčik pripevnili horúcim lepidlom.

Ak nemôžete nájsť taký háčik, môžete skúsiť magnety - niektoré prilepte na zadnú stranu škatule a jednoducho ich zacvaknite na poličku.

Nasadiť

Umiestnite škatuľu na úroveň očí, aby upútala pozornosť okoloidúcich. Nenechajte sa chytiť! Veľa šťastia!

Odporúča: