Võlts dünaamiline hinnasilt: 6 sammu (koos piltidega)
Võlts dünaamiline hinnasilt: 6 sammu (koos piltidega)
Anonim
Image
Image
Ühendage ekraan
Ühendage ekraan

Amazoni hinnad muutuvad pidevalt. Kui jätate esemed ostukorvi kauemaks kui mõneks tunniks, saate tõenäoliselt märku minutikõikumiste kohta - 0,10 dollarit siin, 2,04 dollarit seal. Amazon ja selle kaupmehed kasutavad ilmselgelt mingisugust algoritmilist hinnakujundust, et viimase sendi turult välja suruda.

See on kõik, mida oodata (hiline kapitalism ja kõik muu). Aga mis juhtub, kui asjad lähevad viltu? 2011. aastal puhkes hinnasõda kahe konkureeriva algoritmi vahel. Tulemus: raamat majakärbeste elutsüklist (otsas, kuid mitte eriti haruldane) tõusis hüppeliselt 23,6 miljoni dollarini.

Amazoni hiljutine Whole Foods Market'i omandamine pani meid mõtlema: mis takistab dünaamilise hinnakujunduse sisenemist jaemüügi füüsilisse maailma? Mis siis, kui supermarketi hinnad oleksid sama paindlikud kui veebis?

Niisiis, selles juhendis loome dünaamilise hinnakuva koos Arduino ja väikese LCD -ekraaniga. Räägime lühidalt ka selle varjamisest ja poodi paigaldamisest.

(Ja kui olete huvitatud, võib see Chrome'i pistikprogramm näidata teile Amazonase mis tahes üksuse hinnaajalugu viimase 120 päeva jooksul.)

Vajalik materjal

Selle projekti koostamisel kasutasime järgmist.

  • Arduino Uno R3
  • Tavaline 16x2 LCD -ekraan. Me kasutasime seda Adafruitist, kuid seni, kuni see ühildub LiquidCrystali raamatukoguga, peaksite olema hea. Arduinoga ühendamiseks vajate mõnda asja:

    • mõned hüppajakaablid
    • 220 oomi takisti
    • 10k oomine potentsiomeeter (see on mõeldud ekraani kontrastsuse reguleerimiseks. Kui leiate kontrasti, mis teile meeldib, võite potentsiomeetri asendada fikseeritud takistiga.)
  • Karbi jaoks natuke akrüüli. Kasutasime valatud matt-musta akrüüli, laserlõigatud ja kokku pandud akrüüllahusti-liimi ja kuuma liimiga.
  • Magnetid ja/või riiulikonks poe kasti kinnitamiseks. Kui lähete konksu teed, saate seda mõõta ja 3D-printida või proovida seda Internetist leida (võib-olla Alibaba?) Või… omandada see mõnel muul, kurjemal viisil. Ole ohutu.

Esiteks paneme ekraani käima!

Samm: ühendage ekraan juhtmega

Juhtida ekraan
Juhtida ekraan
Ühendage ekraan
Ühendage ekraan

Selle LCD tagaküljel on kindlasti palju nööpnõelu. Õnneks on tarkvararaamatukogu dokumentatsioonis, mida kavatseme kasutada, hea juhend selle ühendamiseks. Vaata järgi.

Kokkuvõttes peaks teie juhtmestik lõppema järgmiselt:

  • Võimsus:

    • LCD GND (tihvt 1) → Arduino GND
    • LCD VDD (tihvt 2) → Arduino +5V
    • LCD RW (tihvt 5) → Arduino GND
  • Andmed:

    • LCD RS (tihvt 4) → Arduino digitaalne tihvt 12
    • LCD lubamine (tihvt 6) → Arduino digitaalne tihvt 11
    • LCD D4 (tihvt 11) → digitaalne tihvt 5
    • LCD D5 (tihvt 12) → digitaalne tihvt 4
    • LCD D6 (tihvt 13) → digitaalne tihvt 3
    • LCD D7 (tihvt 14) → digitaalne tihvt 2
  • Ekraani kontrastsus:

    • Ühendage 10k potentsiomeetri jalad Arduino +5V ja GND -ga
    • Potentsiomeetri väljund → LCD VO (tihvt 3).
  • Taustvalgustus:

    • LCD BL1 (tihvt 15) → 220 oomi takisti → Arduino +5V
    • LCD BL2 (tihvt 16) → Arduino GND

Kui kõik on valmis, laadige Arduino IDE -sse üks LiquidCrystali näidisprojekte ja vaadake, kas see töötab! Ärge unustage proovides uuesti kontrollida LCD-initsialiseerimiskoodi-pin-numbrid peavad olema õiged või te ei näe midagi.

Näiteks näites "Blink" on see kood, mis on ülaltoodud seadistust arvestades õige:

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

Näpunäiteid

  • Säästke jootmist ja investeerige mõnda pressimisotsasse ja päiseühendusse. Selliste projektide puhul, kus kavatseme elektroonika väikeseks korpuseks kokku suruda, on lühikeste hüppajakaablite valmistamine uskumatult kasulik.
  • Sarnaselt on kuumade kokkutõmbumisvoolikute torud tõesti kasulikud, et veenduda, et miski ei lähe lühikeseks, kui see kõik ise vastu surutakse.
  • Kuna GND-le ja +5 V-le läheb nii palju asju, otsustasime teha võimalikult kompaktse kaabli (vt ülaltoodud fotot). Kui ruum oleks vähem probleem, oleks leivalaud või protoshield olnud lihtsam valik.
  • Mõned potentsiomeetrid on kummalise kujuga. Üldiselt kasutatakse vasakpoolset juhet maandusena, parempoolsemat juhet toiteallikana ja keskmist väljundina. Kui teil on kaks juhtmest ees ja üks taga, on väljundiks üks tagaküljel.

Gotchas

  • Kui te ei näe oma vedelkristallekraanil midagi, proovige keerata potentsiomeeter ühes suunas, seejärel teises suunas. Madalaima kontrasti korral on vedelkristallekraani sisu täiesti nähtamatu.
  • Kui näete vedelkristallekraanil imelikku jama või ainult ühte rida kahe asemel, veenduge, et kõik ühendused oleksid turvalised. Meil oli vigane ühendus maaga ja see põhjustas kõige kummalisemaid ekraaniprobleeme.
  • LCD -initsialiseerimiskood (mis käivitatakse seadistuse () funktsioonis lcd.init ()) on oluline ja võtab aega. Kui teie ekraanil on midagi valesti ja kahtlustate vigase juhtme olemasolu, ärge oodake, et värisevad asjad äkki tööle hakkavad. Võimalik, et peate Arduino lähtestama, et lähtestamiskood saaks korralikult töötada.
  • Veenduge, et teie juhtmed on üsna lühikesed, kuid mitte liiga lühikesed. Pole midagi hullemat kui resideerida, sest olete mõne sentimeetri kaugusel päisest.

Suurepärane! Nüüd laseme sellel näidata mõnda uhket asja.

2. samm: kood: põhitõed

Kood: Põhitõed
Kood: Põhitõed
Kood: Põhitõed
Kood: Põhitõed

Esiteks: las ekraanil kuvatakse ülemisel real „Praegune hind:” ja teisel juhuslik hind mõnes vahemikus. Iga natukese aja tagant värskendame hinda. See on üsna lihtne, kuid toob esile LiquidCrystali raamatukogu põhikasutuse ja mõned selle veidrused.

Esiteks tõmbame raamatukogu sisse ja määratleme mõned konstandid:

#kaasake

const uint8_t lcdWidth = 16;

const uint8_t lcdHeight = 2;

const pikk minPriceInCents = 50;

const pikk maxPriceInCents = 1999;

const unsigned long minMillisBetweenPriceUpdates = 0,25 * 1000;

const unsigned long maxMillisBetweenPriceUpdates = 2 * 1000

Suurepärane! Need on hinnaklassi parameetrid ja selle värskendamise sagedus. Nüüd teeme raamatukogu pakutava LCD -klassi eksemplari ja lähtestame selle. Prindime midagi jadakonsooli kaudu välja, et olla kindel, et asjad töötavad, isegi kui me ei näe LCD -ekraanil midagi. Teeme seda funktsioonis setup (), mis töötab üks kord pärast Arduino käivitamist. Pange aga tähele, et deklareerime muutuja lcd väljaspool seadistust (), kuna soovime sellele juurdepääsu kogu programmi vältel.

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

Serial.println ("LCD initsialiseeritud");

lcd.print ("Praegune hind:");

}

Liha puhul kasutame kümnendhinna koostamiseks sisseehitatud juhuslikku () funktsiooni ja String () initsialiseerijat. random () genereerib ainult täisarvu, seega jagame selle tulemuse 100,0-ga, et saada ujukoma väärtus. Teeme seda silmusena (), nii et see juhtub nii sageli kui võimalik, kuid juhusliku viivitusega varem määratletud konstantide vahel.

tühine tsükkel ()

{topelthind = juhuslik (minPriceInCents, maxPriceInCents) / 100,0; String pärisHind = "$" + String (hind, 2); lcd.setCursor (0, 1); lcd.print (päris hind); delay (juhuslik (minMillisBetweenPriceUpdates, maxMillisBetweenPriceUpdates)); }

Üks asi, mida tuleb märkida, on kõne lcd.setCursor (). LiquidCrystali raamatukogu ei edasta teie teksti pärast printimist automaatselt järgmisele reale, seega peame (nähtamatu) kursori käsitsi teisele reale viima (siin 1-see on nullpõhine). Samuti pange tähele, et me ei pidanud uuesti trükkima "Praegune hind:"; vedelkristallekraan ei tühjene, kui te seda käsitsi ei tee, seega peame värskendama ainult dünaamilist teksti.

Tehke seda ja näete kiiresti seotud probleemi. Kui hind oli näiteks "14,99 dollarit" ja seejärel "7,22 dollarit", kuvatakse ekraanil "7,229 dollarit". Pidage meeles, et ekraan ei puhastu ise, kui te seda ei ütle. Isegi kui prindite samale reale, jääb trükitud tekstist möödunud tekst alles. Selle probleemi lahendamiseks peame võimaliku prügi ülekirjutamiseks nööri tühikutega täitma. Lihtsaim viis seda teha on kasutada mõnda tühikut meie muutuja prettyPrice abil:

String pärisHind = "$" + String (hind, 2) + "";

Selle muudatusega oleme saanud kontseptsiooni tõestuse! Naeratagem seda natuke.

3. samm: kood: kohandatud märgid

Kood: kohandatud tegelased
Kood: kohandatud tegelased
Kood: kohandatud tegelased
Kood: kohandatud tegelased

Üks meie kasutatava LCD -mooduli lahedamaid omadusi on võimalus luua kuni 8 kohandatud märki. Seda tehakse meetodi createChar () abil. See meetod võtab 8x5 bitist massiivi, mis kirjeldab, milliseid LCD piksleid antud märgi jaoks sisse lülitada. Veebis on mõned tööriistad, mis aitavad neid massiive luua. Ma kasutasin seda.

Kui te ei tunne end eriti disainerlikult, soovitan Photoshopis kasutada lävefiltrit, et muuta pilt mustvalgeks ja teisendada see tegelasteks. Pidage meeles, et teil on maksimaalselt 8 kohandatud tähemärki ehk 64x5 pikslit.

Otsustasin kasutada Amazonase noolelogo jaoks neid tähemärke 6 ja ülejäänud 2 ilusama kaubamärgi sümboli jaoks. API kasutamise kohta saate Arduino IDE -s järgida CustomCharacteri näidet. Nii otsustasin asju rühmitada:

// Määratlege kaubamärgi märkide andmed

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; // Selle märgi printimisel kasutatud bait; määratud initCustomChars ()

Seejärel kasutasin tähemärkide loomiseks sellist funktsiooni, mille nimi on setup ():

void initCustomChars () {

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

Pärast seda on kohandatud märkide printimine sama lihtne kui lcd.write () kasutamine sobivate baitidega. Kirjutasin abifunktsiooni baitide vahemiku printimiseks ja määratlesin selle järgi printTrademark ():

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

{for (uint8_t i = 0; i <numBytes; i ++) {lcd.setCursor (col+i, line); // vaja kasutada kirjet (), mitte printida () - print muudab täisarvu // väärtuse stringiks ja prindib *, et * lcd.write (startValue + i); }} tühine printTrademark (uint8_t rida, uint8_t col) {writeRawByteRange (rida, kol, esimeneTrademarkCharByte, kaubamärkCharCount); }

Amazonase noole logoga suhtuti sarnaselt. Lisateavet leiate lisatud koodist.

Samm 4: Kood: kenad

Asja enda jaoks natuke lihtsamaks muutmiseks lisasin koodile mõned nüansid. See hõlmab selliseid asju nagu: funktsioon konkreetse rea kustutamiseks, kirjutades selle tühikutega üle, ja funktsioon antud stringi tsentreerimiseks reale.

Samuti tahtsin, et ekraan läbiks kolm erinevat faasi:

  1. "Dünaamiline hinnakujundus" all oleva logoga
  2. "Amazon" all oleva logoga
  3. juhuslik hinna kuvamine

Selleks ehitasin üles lihtsa süsteemi, mis jälgib, kui kaua antud faas on olnud aktiivne, ja liigub teatud aja möödudes järgmise juurde.

Vaadake lisatud koodi kõigi veriste üksikasjade kohta!

5. samm: kast

Kast
Kast

Nüüd, et me pommirühma ei kutsuks, teeme kogu asja jaoks kena kasti. Me teeme seda laserlõigatud akrüüliga. Lihtsate kastide valmistamise protsessi alustamiseks on palju veebitööriistu. Soovitan makercase.com -i, kuna see võimaldab teil määrata sisemõõdud ja arvestada materjali paksusega.

Mõõtsime Arduino, LCD ja 9V aku ning hindasime, et suudame selle mahutada 4 x 2,5 "x 2" korpusega. Niisiis, ühendasime need 1/8 tolli paksusega makrosse. akrüül. Muutsime saadud PDF -faili, et lisada LCD -le ümardatud aken ja ekraani allosas olev pesa (rohkem sellest hiljem). Saadud fail lisatakse PDF -failina.

Karbi nelja külje kokkupanemiseks kasutasime akrüülliimi (mürgine metüületüülketoon). Seejärel kinnitasime LCD -paneeli kuuma liimiga esiküljele. Kui kõik oli töökorras ja sobis, sulgesime karbi kaks viimast külge kuuma liimiga, et saaksime selle hiljem hõlpsalt lahti võtta. Kuna me ei oodanud, et seade saab palju kulumist, jätsime Arduino ja aku korpuse põhjale turvamata.

Võimalikud täiustused

  • Seadme sisse- või väljalülitamiseks jätsime ehitamise mis tahes viisil tähelepanuta. Ha. Hea võimalus oleks olnud ruumi lüliti jaoks kasti põhjas või tagaküljel.
  • Rippuva sildi põhjas olev pilu oleks võinud nähtavuse parandamiseks asuda karbi esiosale lähemal.

6. samm: sisse segamine

Segamine
Segamine
Segamine
Segamine

Ja nüüd, raske osa: hiilida see poodi.

Whole Foodsi kaubamärk

Mõned asjad, mida õppisime Whole Foodsi ja Amazoni kaubamärgi pöördtehnoloogias:

  • Põhitekst on üldiselt Scala Sans
  • Päise tekst näeb välja nagu Brighton - üks neist üldistest "soojad ja sõbralikud" fondid
  • Whole Foods Green on midagi lähedast numbrile #223323
  • Kasutage kohalikku poodi, et leida näiteid graafilistest elementidest, mis korduvad: neile meeldivad kammitud äärised, päikesepursked ja lihtne vektorkunst.

Rippuv silt

Lõikasime akrüülkarbi põhja pilu, et saaksime karbile kinnitada rippuva sildi, mis selgitab, mis toimub. Näiteid leiate lisatud PDF -failist. See on ette nähtud väljalõikamiseks ja pesasse sisestamiseks; see peaks sobima ja hoidma ilma liimita.

Riiulid

Mis puudutab kasti riiulile kinnitamist, siis kasutab Whole Foods päris tavalisi riiulikomponente. Tegime mõõtmised ja leidsime ehituspoest ühilduva konksu. Kinnitasime karbi konksu külge kuuma liimiga.

Kui te sellist konksu ei leia, võite proovida magneteid - liimige mõned karbi tagaküljele ja klõpsake lihtsalt riiulile.

Juuruta

Asetage kast silmade kõrgusele, et meelitada möödujate tähelepanu. Ärge jääge vahele! Palju edu!

Soovitan: