Përmbajtje:

Etiketa e çmimit të rremë dinamik: 6 hapa (me fotografi)
Etiketa e çmimit të rremë dinamik: 6 hapa (me fotografi)

Video: Etiketa e çmimit të rremë dinamik: 6 hapa (me fotografi)

Video: Etiketa e çmimit të rremë dinamik: 6 hapa (me fotografi)
Video: CS50 2013 - Week 9, continued 2024, Korrik
Anonim
Image
Image
Lidhni ekranin
Lidhni ekranin

Çmimet e Amazon ndryshojnë vazhdimisht. Nëse lini artikuj në karrocën tuaj të blerjes për më shumë se disa orë, ka të ngjarë të alarmoheni për luhatjet e minutave - 0.10 dollarë këtu, 2.04 dollarë atje. Amazon dhe tregtarët e tij padyshim që po përdorin një formë çmimi algoritmik për të nxjerrë qindarkën e fundit nga tregu.

Kjo është gjithçka që pritet (kapitalizmi i vonë dhe gjithçka tjetër). Por çfarë ndodh nëse gjërat shkojnë keq? Në vitin 2011, një luftë çmimesh shpërtheu midis dy algoritmeve konkurruese. Rezultati: një libër mbi ciklin jetësor të mizave të shtëpisë (jashtë printimit, por jo veçanërisht të rralla) u rrit në një çmim prej 23.6 milion dollarë.

Blerja e fundit e Amazon e Tregut të Ushqimeve të plota nga Amazon na bëri të pyesim: çfarë po ndalon çmimet dinamike të hyjnë në botën fizike të shitjes me pakicë? Po sikur çmimet në një supermarket të ishin po aq fleksibël sa ato online?

Pra, në këtë Instructable, ne do të ndërtojmë një ekran dinamik të çmimeve me një Arduino dhe një LCD të vogël. Ne gjithashtu do të flasim shkurtimisht për maskimin dhe instalimin e tij në një dyqan.

(Dhe, nëse jeni të interesuar, kjo shtojcë Chrome mund t'ju tregojë historinë e çmimeve të çdo artikulli në Amazon gjatë 120 ditëve të fundit.)

Materiali i nevojshëm

Ja çfarë kemi përdorur për të ndërtuar këtë projekt:

  • Një Arduino Uno R3
  • Një ekran standard LCD 16x2. Ne e përdorëm këtë nga Adafruit, por për sa kohë që është në përputhje me bibliotekën LiquidCrystal, duhet të jeni mirë. Ju do të keni nevojë për disa gjëra për ta lidhur atë me Arduino:

    • disa kabllo kërcyes
    • një rezistencë 220 ohm
    • një potenciometër 10k Ohm (Ky është për të kontrolluar kontrastin e ekranit. Nëse gjeni një kontrast që ju pëlqen, mund ta zëvendësoni potenciometrin me një rezistencë fikse.)
  • Pak akrilik për kutinë. Ne përdorëm një akrilik të zi mat të zi, të prerë me lazer dhe të montuar me ngjitës akrilik-ngjitës dhe ngjitës të nxehtë.
  • Magnetë dhe/ose një fiksues për të fiksuar kutinë në dyqan. Nëse shkoni në rrugën e fiksimit, mund të matni dhe printoni 3D, ose të përpiqeni të gjeni një në internet (ndoshta Alibaba?), Ose… ta blini atë në një mënyrë tjetër, më të poshtër. Jini të sigurt.

Së pari, le të fillojmë shfaqjen!

Hapi 1: Lidhni ekranin

Lidhni ekranin
Lidhni ekranin
Lidhni ekranin
Lidhni ekranin

Sigurisht që ka shumë kunja në pjesën e pasme të atij LCD. Për fat të mirë, dokumentacioni për bibliotekën e softuerit që do të përdorim ka një udhëzues të mirë për ta lidhur atë. Kontrolloje.

Si përmbledhje, instalimet tuaja elektrike duhet të përfundojnë kështu:

  • Fuqia:

    • LCD GND (pin 1) → Arduino GND
    • LCD VDD (pin 2) → Arduino +5V
    • LCD RW (pin 5) → Arduino GND
  • Gjërat e të dhënave:

    • LCD RS (kunja 4) pin Kodi dixhital Arduino 12
    • Aktivizo LCD (kunja 6) pin Kodi dixhital Arduino 11
    • LCD D4 (pin 11) pin pin dixhital 5
    • LCD D5 (pin 12) pin pin dixhital 4
    • LCD D6 (pin 13) pin pin dixhital 3
    • LCD D7 (pin 14) pin pin dixhital 2
  • Kontrasti i ekranit:

    • Lidhni këmbët e një potenciometri 10k në Arduino's +5V dhe GND
    • Dalja e potenciometrit → LCD VO (pin 3).
  • Drita e pasme:

    • LCD BL1 (pin 15) resist 220 rezistencë ohm → Arduino +5V
    • LCD BL2 (kunja 16) → Arduino GND

Kur të jetë gati, ngarkoni një nga projektet shembull LiquidCrystal në Arduino IDE dhe shihni nëse funksionon! Mos harroni të kontrolloni dy herë kodin e inicimit të LCD në mostrat-numrat e pin duhet të jenë të saktë ose nuk do të shihni asgjë.

Për shembull, shembulli "Blink" ka këtë kod, i cili është i saktë duke pasur parasysh konfigurimin e mësipërm:

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

Këshilla

  • Kurseni vetes disa saldime dhe investoni në disa skaje të ngushta dhe lidhëset e kokës. Në projekte si kjo ku ne do të mbushim pajisjet elektronike në një kuti të vogël, të jesh në gjendje të bësh kabllo me kërcim të shkurtër është jashtëzakonisht e dobishme.
  • Në mënyrë të ngjashme, tubat e zvogëlimit të nxehtësisë janë me të vërtetë të dobishëm për të siguruar që asgjë të mos dalë jashtë kur të gjitha shtyhen kundër vetes.
  • Meqenëse ka kaq shumë gjëra që shkojnë në GND dhe +5V, ne zgjodhëm të bëjmë një kabllo të hapur (shiko foton më lart) që të jetë sa më kompakt të jetë e mundur. Nëse hapësira do të ishte më pak çështje, një tabelë buke ose protoshield do të kishte qenë një opsion më i lehtë.
  • Disa potenciometra janë në formë të çuditshme. Në përgjithësi, plumbi i majtë përdoret si tokë, plumbi më i djathtë si fuqi, dhe ai i mesëm si dalje. Nëse e juaja ka dy priza në pjesën e përparme dhe një në anën e pasme, ajo në anën e pasme është dalja.

Gotchas

  • Nëse nuk shihni asgjë në LCD, provoni ta ktheni potenciometrin deri në një drejtim, pastaj në tjetrin. Në kontrastin e tij më të ulët, përmbajtja e LCD është plotësisht e padukshme.
  • Nëse shihni shqetësime vërtet të çuditshme në LCD, ose vetëm një rresht në vend të dy, sigurohuni që të gjitha lidhjet tuaja të jenë të sigurta. Ne kishim një lidhje të gabuar me tokën dhe po shkaktonte problemet më të çuditshme të ekranit.
  • Kodi i inicimit të LCD (çfarë drejtohet nga lcd.init () në funksionin e konfigurimit ()) është i rëndësishëm dhe kërkon pak kohë. Nëse diçka nuk është në rregull me ekranin tuaj dhe dyshoni për një tel të dëmtuar, mos prisni që gjërat e ngatërruara ta bëjnë atë papritmas të funksionojë. Ju mund të keni nevojë të rivendosni Arduino në mënyrë që kodi i inicimit të ketë një shans për të funksionuar siç duhet.
  • Sigurohuni që telat tuaj të jenë mjaft të shkurtër, por jo shumë të shkurtër. Asgjë nuk është më e keqe sesa të rilidheni sepse jeni disa centimetra larg nga një kokë.

Shkëlqyeshëm! Tani le ta bëjmë atë të tregojë disa gjëra të zbukuruara.

Hapi 2: Kodi: Bazat

Kodi: Bazat
Kodi: Bazat
Kodi: Bazat
Kodi: Bazat

Gjërat e para së pari: le të kemi shfaqjen e ekranit "Çmimi aktual:" në rreshtin e parë, dhe një çmim të rastësishëm në një gamë në të dytin. Herë pas here, le të rifreskojmë çmimin. Kjo është mjaft e thjeshtë, por do të nxjerrë në pah përdorimin bazë të bibliotekës LiquidCrystal dhe disa nga karakteristikat e saj.

Së pari, le të tërheqim bibliotekën dhe të përcaktojmë disa konstante:

#përfshi

const uint8_t lcdWidth = 16;

const uint8_t lcdHeight = 2;

konstant minPriceInCents = 50;

konstant i gjatë maxPriceInCents = 1999;

const i panënshkruar i gjatë minMillisBetweenPriceUdates = 0.25 * 1000;

const i panënshkruar i gjatë maxMillisBetweenPriceUdates = 2 * 1000

Shkëlqyeshëm! Këto janë parametrat për gamën e çmimeve dhe sa shpesh do të rifreskohet. Tani le të bëjmë një shembull të klasës LCD të siguruar nga biblioteka dhe ta inicojmë atë. Ne do të printojmë diçka mbi tastierën serike, vetëm për të pasur një siguri që gjërat po funksionojnë, edhe nëse nuk shohim asgjë në LCD. Ne do ta bëjmë atë në funksionin setup (), i cili funksionon një herë pas nisjes së Arduino. Vini re, megjithatë, që ne deklarojmë variablin LCD jashtë setup (), sepse duam qasje në të gjatë gjithë programit.

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

Serial.println ("LCD e inicializuar");

lcd.print ("Çmimi aktual:");

}

Dhe për mishin, ne do të përdorim funksionin e integruar rastësor () dhe inicializuesin String () për të ndërtuar një çmim dhjetor. random () gjeneron vetëm numra të plotë, kështu që ne do ta ndajmë rezultatin e tij me 100.0 për të marrë një vlerë të pikës lundruese. Ne do ta bëjmë këtë në lak (), kështu që ndodh sa më shpesh të jetë e mundur, por me një vonesë të rastësishme midis konstanteve të përcaktuara më herët.

lak void ()

{çmim i dyfishtë = rastësor (minPriceInCents, maxPriceInCents) / 100.0; String prettyPrice = "$" + String (çmimi, 2); lcd.setCursor (0, 1); lcd.print (prettyPrice); vonesë (e rastësishme (minMillisBetweenPriceUpdates, maxMillisBetweenPriceUpdates)); }

Një gjë që duhet vënë re është thirrja drejt lcd.setCursor (). Biblioteka LiquidCrystal nuk e çon automatikisht tekstin tuaj në rreshtin tjetër pas një printimi, kështu që ne duhet të lëvizim manualisht kursorin (të padukshëm) në rreshtin e dytë (këtu 1-është me bazë zero). Gjithashtu vini re se nuk na është dashur të shtypim përsëri "Çmimi aktual:" përsëri; LCD nuk pastrohet nëse nuk e bëni këtë me dorë, kështu që na mbetet vetëm të azhurnojmë tekstin dinamik.

Lëreni të funksionojë dhe shpejt do të shihni një problem të lidhur. Nëse çmimi ishte, të themi, "14.99 dollarë" dhe më pas "7.22 dollarë", ekrani do të tregojë "7.229 dollarë". Mbani mend, ekrani nuk fshihet vetvetiu nëse nuk ia tregoni. Edhe nëse printoni në të njëjtën linjë, çdo tekst që kalon atë që printoni do të mbetet. Për të rregulluar këtë problem, ne duhet të mbushim vargun tonë me hapësira për të mbishkruar çdo mbeturinë të mundshme. Mënyra më e lehtë për ta bërë këtë është thjesht të kapësh disa hapësira në variablin tonë prettyPrice:

String prettyPrice = "$" + String (çmimi, 2) + "";

Me atë ndryshim në vend, ne kemi një dëshmi të konceptit! Le ta marrim vesh pak.

Hapi 3: Kodi: Karakteret me porosi

Kodi: Karaktere me porosi
Kodi: Karaktere me porosi
Kodi: Karaktere me porosi
Kodi: Karaktere me porosi

Një nga karakteristikat më interesante të modulit LCD që ne përdorim është aftësia për të krijuar deri në 8 karaktere të personalizuara. Kjo bëhet përmes metodës createChar (). Kjo metodë merr një grup prej 8x5 bitësh që përshkruajnë cilat piksele të LCD -së të ndizen për karakterin e dhënë. Ka disa mjete në internet për të ndihmuar në gjenerimin e këtyre vargjeve. E perdora kete.

Nëse nuk ndiheni veçanërisht me dizajn, ju rekomandoj të përdorni filtrin Pragu në Photoshop për ta kthyer një imazh në bardh e zi, dhe ta shndërroni atë në karaktere. Mos harroni se keni një maksimum prej 8 karakteresh të personalizuar, ose 64x5 piksele.

Zgjodha përdorimin e 6 prej atyre karaktereve për logon e shigjetës Amazon, dhe 2 të tjerat për një simbol më të bukur të markës tregtare. Ju mund të ndiqni shembullin CustomCharacter në Arduino IDE për mënyrën e përdorimit të API. Kështu vendosa të grupoj gjërat:

// Përcaktoni të dhënat për personazhet e Markës Tregtare

const size_t marka tregtareCharCount = 2; const uint8_t marka tregtareChars [marka tregtareCharCount] [8] = {{B00111, B00010, B00010, B00000, B00000, B00000, B00000, B00000}, {B10100, B11100, B10100, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000 B00000}}; uint8_t së pariTrademarkCharByte; // Bajti i përdorur për të printuar këtë karakter; caktuar në initCustomChars ()

Pastaj kam përdorur një funksion si ky, i quajtur nga setup (), për të krijuar personazhet:

void initCustomChars () {

firstTrademarkCharByte = 0; për (size_t i = 0; i <marka tregtareCharCount; i ++) {lcd.createChar (logoCharCount+i, (uint8_t *) marka tregtareChars ); }}

Pas kësaj, shtypja e karaktereve të personalizuara është aq e thjeshtë sa përdorimi i lcd.write () me bajtët e duhur. Unë shkrova një funksion ndihmës për të printuar një sërë bajtësh, dhe përcaktova printTrademark () në lidhje me të:

void writeRawByteRange (uint8_t line, uint8_t col, uint8_t startValue, size_t numBytes)

{për (uint8_t i = 0; i <numBytes; i ++) {lcd.setCursor (col+i, line); // duhet përdorur shkrim (), jo print () - print do të kthejë vlerën e plotë // në një varg dhe do të printojë * që * lcd.write (startValue + i); }} void printTrademark (uint8_t line, uint8_t col) {writeRawByteRange (line, col, firstTrademarkCharByte, marka tregtareCharCount); }

Logoja e shigjetës Amazon u trajtua në një mënyrë të ngjashme. Shikoni kodin e bashkangjitur për detaje të plota.

Hapi 4: Kodi: Niciesies

Për t'i bërë gjërat pak më të lehta për veten time, shtova disa nuanca në kod. Kjo përfshin gjëra të tilla si: një funksion për pastrimin e një linje të caktuar duke e mbishkruar atë me hapësira, dhe një funksion për përqendrimin e një vargu të caktuar në një linjë.

Unë gjithashtu doja që ekrani të kalonte nëpër tre faza të dallueshme:

  1. "Çmimet Dinamike" me logon më poshtë
  2. "nga Amazon" me logon më poshtë
  3. shfaqja e çmimeve të rastësishme

Për këtë, unë ndërtova një sistem të thjeshtë që mban shënim se sa kohë ka qenë aktive një fazë e caktuar, dhe pas një periudhe të caktuar, kalon në atë tjetër.

Shikoni kodin e bashkangjitur për të gjitha detajet e vështira!

Hapi 5: Kutia

Kutia
Kutia

Tani, në mënyrë që të mos na thërrasë skuadra e bombave, le të bëjmë një kuti të bukur për gjithçka. Ne do ta bëjmë këtë me akrilik të prerë me lazer. Ka shumë mjete në internet për të filluar procesin e bërjes së kutive të thjeshta. Unë rekomandoj makercase.com, pasi ju lejon të specifikoni dimensionet e brendshme dhe llogarit trashësinë e materialit.

Ne matëm baterinë Arduino, LCD dhe 9V, dhe vlerësuam se do të ishim në gjendje ta vendosnim atë në një kuti që ishte 4 "x 2.5" x 2 ". Pra, i futëm ato në kutinë e madhe, me një trashësi 1/8" akrilik Ne modifikuam PDF -në që rezulton për të shtuar një dritare të rrumbullakosur për LCD dhe një çarë përgjatë pjesës së poshtme për një etiketë të ekranit (më shumë për atë më vonë). Skedari që rezulton është i bashkangjitur si PDF.

Ne përdorëm ngjitës akrilik (lloji toksik metil etil keton) për të mbledhur katër anët e kutisë. Pastaj e lidhëm panelin LCD në pjesën e përparme me zam të nxehtë. Pasi kishim gjithçka duke punuar dhe montuar, mbyllëm dy anët e fundit të kutisë me zam të nxehtë, në mënyrë që ta ndanim lehtë më vonë. Meqenëse nuk prisnim që pajisja të merrte shumë lodhje, ne lamë Arduino dhe baterinë të pasigurt në pjesën e poshtme të kutisë.

Përmirësimet e mundshme

  • Ne kemi lënë pas dore të ndërtojmë në asnjë mënyrë për të ndezur ose fikur pajisjen. Ha Vendi për një ndërprerës në pjesën e poshtme ose të pasme të kutisë do të ishte një ide e mirë.
  • Vendi përgjatë pjesës së poshtme për etiketën e varur mund të ketë qenë më afër pjesës së përparme të kutisë, për përmirësimin e dukshmërisë.

Hapi 6: Përzierja

Përzierja në
Përzierja në
Përzierja në
Përzierja në

Dhe tani, pjesa e vështirë: futeni atë në një dyqan.

Markimi i Whole Foods

Disa gjëra që mësuam në inxhinierinë e kundërt Whole Foods dhe markën Amazon:

  • Teksti i përgjithshëm është në përgjithësi në Scala Sans
  • Teksti i kokës është në diçka që duket shumë si Brighton - një nga ato shkronja të përgjithshme "të ngrohta dhe miqësore"
  • Whole Foods Green është diçka afër #223323
  • Shfletoni dyqanin tuaj lokal për shembuj të elementeve grafikë që përsëriten: ata janë të dhënë pas kufijve të djegur, rrezeve të diellit dhe artit të thjeshtë vektorial.

Etiketa e varur

Ne kemi prerë një çarje në pjesën e poshtme të kutisë akrilike në mënyrë që të mund të bashkojmë një etiketë të varur në kuti, duke shpjeguar se çfarë po ndodh. Shihni PDF -në e bashkangjitur për një shembull. Kjo është projektuar për t'u prerë dhe futur në çarë; duhet të përshtatet dhe të mbahet pa asnjë ngjitës.

Rafte

Sa i përket ngjitjes së kutisë në një raft, Whole Foods përdor përbërës mjaft standardë të rafteve. Ne morëm matje dhe gjetëm një goditje të pajtueshme në një dyqan harduerësh. Ne e vendosëm kutinë në grep me zam të nxehtë.

Nëse nuk mund të gjeni një grep të tillë, mund të provoni magnet - ngjitini disa në pjesën e prapme të kutisë dhe thjesht kapeni në një raft.

Vendosni

Vendoseni kutinë në nivelin e syve për të tërhequr vëmendjen e kalimtarëve. Mos u kapni! Fat i mirë!

Recommended: