Lažna dinamička cijena: 6 koraka (sa slikama)
Lažna dinamička cijena: 6 koraka (sa slikama)
Anonim
Image
Image
Ožičite zaslon
Ožičite zaslon

Cijene Amazona se stalno mijenjaju. Ostavite li artikle u košarici dulje od nekoliko sati, vjerojatno ćete biti upozoreni o malim promjenama - 0,10 USD ovdje, 2,04 USD tamo. Amazon i njegovi trgovci očito koriste neki oblik algoritamskih cijena kako bi istisnuli posljednju kunu s tržišta.

To je sve za očekivati (kasni kapitalizam i sve to). Ali što se događa ako stvari krenu naopako? Godine 2011. izbio je rat cijena između dva konkurentna algoritma. Rezultat: knjiga o životnom ciklusu muha (izašla iz tiska, ali nije osobito rijetka) naglo je skočila na cijenu od 23,6 milijuna dolara.

Amazonova nedavna akvizicija Whole Foods Market natjerala nas je da se zapitamo: što sprečava dinamičko određivanje cijena da zakorači u fizički svijet maloprodaje? Što ako bi cijene u supermarketu bile jednako fleksibilne kao i one na internetu?

Dakle, u ovom Instructableu ćemo izgraditi dinamički prikaz cijena s Arduinom i malim LCD -om. Također ćemo ukratko razgovarati o prikrivanju i instaliranju u trgovini.

(I ako vas zanima, ovaj dodatak za Chrome može vam pokazati povijest cijena bilo koje stavke na Amazonu u posljednjih 120 dana.)

Potreban materijal

Evo što smo koristili za izgradnju ovog projekta:

  • Arduino Uno R3
  • Standardni LCD zaslon veličine 16x2. Koristili smo ovaj iz Adafruit -a, ali sve dok je kompatibilan s bibliotekom LiquidCrystal, trebali biste biti dobri. Za povezivanje s Arduinom trebat će vam nekoliko stvari:

    • neki kratkospojni kablovi
    • otpornik od 220 ohma
    • potenciometar od 10 k ohma (Ovo služi za kontrolu kontrasta zaslona. Ako pronađete kontrast koji vam se sviđa, potenciometar možete zamijeniti fiksnim otpornikom.)
  • Malo akrila za kutiju. Koristili smo lijevani mat crni akril, laserski rezani i sastavljeni akrilnim otapalom-ljepilom i vrućim ljepilom.
  • Magneti i/ili kuka za police za pričvršćivanje kutije u trgovini. Ako krenete kukom, mogli biste je izmjeriti i ispisati 3d, ili pokušati pronaći on-line (Alibaba, možda?), Ili … nabaviti je na neki drugi, podniji način. Budi siguran.

Prvo, pokrenimo zaslon!

Korak 1: Povežite zaslon

Ožičite zaslon
Ožičite zaslon
Ožičite zaslon
Ožičite zaslon

Na stražnjoj strani LCD -a zasigurno ima puno iglica. Srećom, dokumentacija za biblioteku softvera koju ćemo koristiti ima dobar vodič za njeno povezivanje. Provjerite.

Ukratko, vaše bi ožičenje trebalo završiti ovako:

  • Vlast:

    • LCD GND (pin 1) → Arduino GND
    • LCD VDD (pin 2) → Arduino +5V
    • LCD RW (pin 5) → Arduino GND
  • Podaci o podacima:

    • LCD RS (pin 4) → Arduino digitalni pin 12
    • Omogućivanje LCD -a (pin 6) → Arduino digitalni pin 11
    • LCD D4 (pin 11) → digitalni pin 5
    • LCD D5 (pin 12) → digitalni pin 4
    • LCD D6 (pin 13) → digitalni pin 3
    • LCD D7 (pin 14) → digitalni pin 2
  • Kontrast zaslona:

    • Noge potenciometra 10k povežite s Arduinovim +5V i GND
    • Izlaz potenciometra → LCD VO (pin 3).
  • Pozadinsko osvjetljenje:

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

Kad je to sve postavljeno, učitajte jedan od primjera projekata LiquidCrystal u Arduino IDE i provjerite radi li! Ne zaboravite dvaput provjeriti inicijalizacijski kod LCD-a u uzorcima-brojevi pinova moraju biti točni ili nećete ništa vidjeti.

Na primjer, primjer "Treptanje" ima ovaj kôd, koji je točan s obzirom na gornje postavke:

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

Savjeti

  • Uštedite sebi lemljenje i uložite u neke spojene krajeve i priključke zaglavlja. Na projektima poput ovog gdje ćemo elektroniku ugurati u maleno kućište, mogućnost izrade kratkih kratkospojnih kabela nevjerojatno je korisna.
  • Slično tome, cijevi za hladnjak su zaista korisne kako bi se osiguralo da ništa ne dođe do kratkog spoja kad se sve pritisne samo na sebe.
  • Budući da postoji toliko mnogo stvari koje idu na GND i +5V, odlučili smo se za to da kabel s odlomljenim kabelom (vidi gornju fotografiju) bude što kompaktniji. Da je prostor manji problem, matična ploča ili proto štit bili bi lakša opcija.
  • Neki potenciometri imaju čudan oblik. Općenito, lijevi vodič koristi se kao uzemljenje, krajnji desni vodič kao snaga, a srednji kao izlaz. Ako vaš ima dva vodiča sprijeda i jedan straga, izlaz na poleđini je izlaz.

Razumijem

  • Ako ništa ne vidite na LCD -u, pokušajte okrenuti potenciometar do kraja u jednom, a zatim u drugom smjeru. U najnižem kontrastu, sadržaj LCD -a potpuno je nevidljiv.
  • Ako na LCD -u vidite stvarno čudno lupetanje ili samo jedan redak umjesto dva, provjerite jesu li sve veze sigurne. Imali smo neispravnu vezu s uzemljenjem i to je uzrokovalo najčudnije probleme s prikazom.
  • Inicijalizacijski kod LCD -a (ono što pokreće lcd.init () u funkciji setup ()) važan je i traje neko vrijeme. Ako nešto nije u redu s vašim zaslonom i sumnjate na neispravnu žicu, ne očekujte da će odjednom stvari propasti. Možda ćete morati resetirati Arduino kako bi inicijalizacijski kôd imao priliku pravilno raditi.
  • Provjerite jesu li vaše žice prilično kratke, ali ne prekratke. Ništa nije gore od ponovnog lemljenja jer ste udaljeni nekoliko centimetara od zaglavlja.

Sjajno! Ajmo sad prikazati neke fantastične stvari.

Korak 2: Kôd: Osnove

Šifra: Osnove
Šifra: Osnove
Šifra: Osnove
Šifra: Osnove

Prvo prvo: neka zaslon na vrhu prikazuje "Trenutna cijena:", a na drugom slučajnu cijenu u nekom rasponu. S vremena na vrijeme osvježimo cijenu. Ovo je prilično jednostavno, ali će istaknuti osnovnu uporabu biblioteke LiquidCrystal i neke njezine poteškoće.

Prvo, uvucimo biblioteku i definirajmo neke konstante:

#uključi

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

Sjajno! To su parametri za raspon cijena i koliko će se često osvježavati. Sada napravimo instancu LCD klase koju pruža knjižnica i inicijaliziramo je. Ispisat ćemo nešto preko serijske konzole, samo da bismo bili sigurni da stvari rade, čak i ako ništa ne vidimo na LCD -u. To ćemo učiniti u funkciji setup (), koja se pokreće jednom nakon pokretanja Arduina. Imajte na umu da deklariramo lcd varijablu izvan setup (), jer želimo pristup njoj tijekom cijelog programa.

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

Serial.println ("LCD inicijaliziran");

lcd.print ("Trenutna cijena:");

}

A za meso ćemo upotrijebiti ugrađenu funkciju random () i inicijalizator String () za konstruiranje decimalne cijene. random () generira samo cijele brojeve, pa ćemo njegov rezultat podijeliti sa 100,0 kako bismo dobili vrijednost s pomičnim zarezom. To ćemo učiniti u loop (), pa se to događa što je češće moguće, ali sa slučajnim kašnjenjem između konstanti koje smo ranije definirali.

void loop ()

{double price = random (minPriceInCents, maxPriceInCents) / 100,0; String prettyPrice = "$" + String (cijena, 2); lcd.setCursor (0, 1); lcd.print (prettyPrice); kašnjenje (slučajno (minMillisBetweenPriceUpdates, maxMillisBetweenPriceUpdates)); }

Jedna stvar koju treba primijetiti je poziv na lcd.setCursor (). Knjižnica LiquidCrystal ne ispisuje automatski vaš tekst u sljedeći redak nakon ispisa, pa moramo ručno premjestiti (nevidljivi) kursor u drugi redak (ovdje 1-temelji se na nuli). Također imajte na umu da nismo morali ponovno ispisivati "Trenutna cijena:"; LCD se ne briše ako to ne učinite ručno, pa moramo ažurirati samo dinamički tekst.

Pokušajte i brzo ćete vidjeti srodan problem. Ako je cijena bila, recimo, "14,99 USD", a zatim "7,22 USD", na zaslonu će se prikazati "7,229 USD". Upamtite, zaslon se ne briše sam ako mu to ne kažete. Čak i ako ispisujete na istom retku, svaki tekst iza onoga što ispišete ostat će. Da bismo riješili ovaj problem, moramo niz ubaciti razmacima kako bismo prepisali svako potencijalno smeće. Najjednostavniji način da to učinite je da samo utaknete nekoliko razmaka u našu varijablu prettyPrice:

String prettyPrice = "$" + String (cijena, 2) + "";

S tom promjenom na mjestu imamo dokaz koncepta! Hajde da to malo zaključimo.

Korak 3: Kôd: prilagođeni znakovi

Šifra: Prilagođeni znakovi
Šifra: Prilagođeni znakovi
Šifra: Prilagođeni znakovi
Šifra: Prilagođeni znakovi

Jedna od najljepših značajki LCD modula koju koristimo je mogućnost stvaranja do 8 prilagođenih znakova. To se radi pomoću metode createChar (). Ova metoda uzima niz od 8x5 bita koji opisuje koje piksele LCD -a treba uključiti za dati znak. Na mreži postoji nekoliko alata koji vam mogu pomoći u generiranju ovih polja. Ja sam koristio ovaj.

Ako se ne osjećate osobito dizajnerski, preporučujem korištenje filtra praga u Photoshopu za pretvaranje slike u crno-bijelo i pretvaranje u znakove. Upamtite da imate najviše 8 prilagođenih znakova ili 64x5 piksela.

Odlučio sam se za korištenje 6 od tih znakova za logotip strelice Amazon, a preostala 2 za ljepši simbol zaštitnog znaka. Možete slijediti primjer CustomCharactera u Arduino IDE -u kako biste koristili API. Ovako sam odlučio grupirati stvari:

// Definiranje podataka za znakove zaštitnog znaka

const size_t trademarkCharCount = 2; const uint8_t trademarkChars [zaštitni znakCharCount] [8] = {{B00111, B00010, B00010, B00000, B00000, B00000, B00000, B00000}, {B10100, B11100, B10100, B00000, B00000, B00 B00000}}; uint8_t prviTrademarkCharByte; // Bajt koji se koristi za ispis ovog znaka; dodijeljeno u initCustomChars ()

Zatim sam upotrijebio ovu funkciju, nazvanu iz setup (), za stvaranje znakova:

void initCustomChars () {

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

Nakon toga ispis prilagođenih znakova je jednostavan kao i upotreba lcd.write () s odgovarajućim bajtovima. Napisao sam pomoćnu funkciju za ispis raspona bajtova i definirao printTrademark () u smislu toga:

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

{for (uint8_t i = 0; i <numBytes; i ++) {lcd.setCursor (col+i, linija); // treba koristiti write (), a ne print () - print će pretvoriti cijelu // vrijednost u niz i ispisati * to * lcd.write (startValue + i); }} void printTrademark (uint8_t redak, uint8_t stupac) {writeRawByteRange (linija, col, prviTrademarkCharByte, trademarkCharCount); }

Na sličan način tretiran je i logotip strelice Amazon. Za sve pojedinosti pogledajte priloženi kôd.

Korak 4: Kôd: Finoće

Kako bih si malo olakšao stvari, kodu sam dodao nekoliko sitnica. To uključuje stvari kao što su: funkcija za brisanje određene linije prebrisanjem razmaka i funkcija za centriranje zadanog niza u retku.

Također sam želio da zaslon prolazi kroz tri različite faze:

  1. "Dinamičko određivanje cijena" s logom ispod
  2. "by Amazon" s logom ispod
  3. slučajni prikaz cijena

Za to sam izgradio jednostavan sustav koji prati koliko je dana faza aktivna, a nakon određenog razdoblja prelazi na sljedeću.

Za sve krvave detalje pogledajte priloženi kôd!

Korak 5: Kutija

Kutija
Kutija

Da nas ne bi pozvali odredi bombi, napravimo lijepu kutiju za cijelu stvar. To ćemo učiniti s laserski izrezanim akrilom. Postoji mnogo mrežnih alata za početak procesa izrade jednostavnih kutija. Preporučujem makercase.com jer vam omogućuje da odredite unutarnje dimenzije i računate debljinu materijala.

Izmjerili smo Arduino, LCD i 9V bateriju i procijenili da bismo je mogli uklopiti u kućište dimenzija 4 "x 2,5" x 2 ". Dakle, uključili smo ih u kućište za proizvod, debljine 1/8" akril. Dobiveni PDF smo izmijenili tako da smo dodali zaobljeni prozor za LCD i utor pri dnu za oznaku zaslona (o tome kasnije). Dobivena datoteka je priložena kao PDF.

Koristili smo akrilno ljepilo (vrsta otrovnog metil etil ketona) za sastavljanje četiri strane kutije. Zatim smo vrućim ljepilom pričvrstili LCD ploču na prednju stranu. Nakon što smo sve doradili i uklopili, zadnje dvije strane kutije zapečatili smo vrućim ljepilom kako bismo ih kasnije mogli lako rastaviti. Budući da nismo očekivali da će se uređaj previše istrošiti, ostavili smo Arduino i bateriju nezaštićene na dnu kućišta.

Potencijalna poboljšanja

  • Zanemarili smo izgradnju na bilo koji način za uključivanje ili isključivanje uređaja. Ha. Mjesto za prekidač na dnu ili stražnjoj strani kutije bila bi dobra ideja.
  • Utor duž dna za viseću oznaku mogao je biti bliže prednjoj strani kutije radi bolje vidljivosti.

Korak 6: Uklapanje

Blending In
Blending In
Blending In
Blending In

A sada, najteži dio: ušunjajte ga u trgovinu.

Brendiranje cijele hrane

Neke stvari smo naučili u obrnutom inženjeringu robne marke Whole Foods i Amazon:

  • Sadržaj je općenito u Scala Sans -u
  • Tekst zaglavlja je u nečemu što jako liči na Brighton - jedan od onih generičkih "toplih i prijateljskih" fontova
  • Whole Foods Green nešto je blizu #223323
  • Iskoristite svoju lokalnu trgovinu za primjere grafičkih elemenata koji se ponavljaju: obožavaju iscrtane ivice, sunčeve zrake i jednostavnu vektorsku umjetnost.

Viseća oznaka

Izrezali smo prorez na dnu akrilnog kućišta kako bismo mogli pričvrstiti viseću oznaku na kutiju, objašnjavajući što se događa. Za primjer pogledajte priloženi PDF. Ovo je dizajnirano za izrezivanje i umetanje u utor; trebao bi stati i držati se bez ikakvog ljepila.

Police

Što se tiče pričvršćivanja kutije na policu, Whole Foods koristi prilično standardne police. Napravili smo mjerenja i pronašli kompatibilnu udicu u željezariji. Vrućim ljepilom smo kutiju pričvrstili na kuku.

Ako ne možete pronaći takvu udicu, mogli biste isprobati magnete - zalijepite ih na stražnju stranu kutije i jednostavno je umetnite na policu.

Rasporedi

Postavite kutiju u visinu očiju kako biste privukli pažnju prolaznika. Nemojte biti uhvaćeni! Sretno!

Preporučeni: