Innehållsförteckning:
2025 Författare: John Day | [email protected]. Senast ändrad: 2025-01-23 15:11
Amazons priser ändras ständigt. Om du lämnar varor i din kundvagn längre än några timmar får du troligtvis varning om små fluktuationer - $ 0,10 här, $ 2,04 där. Amazon och dess handlare använder uppenbarligen någon form av algoritmisk prissättning för att pressa ut den sista slanten från marknaden.
Det är allt som kan förväntas (sen kapitalism och allt det där). Men vad händer om det går snett? 2011 utbröt ett priskrig mellan två konkurrerande algoritmer. Resultatet: en bok om husflugornas livscykel (i slutändan, men inte särskilt sällsynt) sköt i höjden till ett pris av 23,6 miljoner dollar.
Amazons senaste förvärv av Whole Foods Market fick oss att undra: vad hindrar dynamiska priser från att kliva in i den fysiska detaljhandelsvärlden? Vad händer om priserna i en stormarknad var lika flexibla som på nätet?
Så i den här instruktionsboken bygger vi en dynamisk prisvisning med en Arduino och en liten LCD -skärm. Vi kommer också att kort prata om att dölja och installera det i en butik.
(Och om du är intresserad kan detta Chrome -plugin visa dig prishistoriken för alla objekt på Amazon under de senaste 120 dagarna.)
Material som behövs
Här är vad vi använde för att bygga detta projekt:
- En Arduino Uno R3
-
En vanlig 16x2 LCD -skärm. Vi använde den här från Adafruit, men så länge den är kompatibel med LiquidCrystal -biblioteket borde du vara bra. Du behöver några saker för att ansluta den till Arduino:
- några bygelkablar
- ett 220 ohm motstånd
- en 10k ohm potentiometer (Detta är för att styra skärmens kontrast. Om du hittar en kontrast du gillar kan du byta ut potentiometern mot ett fast motstånd.)
- Lite akryl till lådan. Vi använde en gjuten matt svart akryl, laserskuren och monterad med lösningsmedelslim och hett lim.
- Magneter och/eller en hyllkrok för att fästa lådan i butiken. Om du går krokvägen kan du mäta och 3d-skriva ut en, eller försöka hitta en online (Alibaba kanske?), Eller … skaffa den på något annat, mer elakt sätt. Var försiktig.
Först, låt oss få igång skärmen!
Steg 1: Anslut skärmen
Det finns säkert många stift på baksidan av LCD -skärmen. Lyckligtvis har dokumentationen för det programbibliotek vi ska använda en bra guide för att koppla upp det. Kolla in det.
Sammanfattningsvis bör din ledning sluta så här:
-
Kraft:
- LCD GND (stift 1) → Arduino GND
- LCD VDD (stift 2) → Arduino +5V
- LCD RW (stift 5) → Arduino GND
-
Data grejer:
- LCD RS (stift 4) → Arduino digital stift 12
- LCD Aktivera (stift 6) → Arduino digital stift 11
- LCD D4 (stift 11) → digital stift 5
- LCD D5 (stift 12) → digital stift 4
- LCD D6 (stift 13) → digital stift 3
- LCD D7 (stift 14) → digital stift 2
-
Displaykontrast:
- Anslut en 10k potentiometers ben till Arduinos +5V och GND
- Potentiometers utgång → LCD VO (stift 3).
-
Bakgrundsbelysning:
- LCD BL1 (stift 15) → 220 ohm motstånd → Arduino +5V
- LCD BL2 (stift 16) → Arduino GND
När det är klart, ladda upp ett av exemplen LiquidCrystal -projekt i Arduino IDE och se om det fungerar! Kom ihåg att dubbelkolla LCD-initialiseringskoden i proverna-stiftnumren måste vara korrekta eller så ser du ingenting.
Exempelvis har "Blink" -exemplet denna kod, som är korrekt med tanke på ovanstående inställning:
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Tips
- Spara dig lite lödning och investera i några krympändar och huvudkontakter. På sådana här projekt där vi ska klämma in elektroniken i ett litet fodral är det otroligt bra att kunna göra korta bygelkablar.
- På samma sätt är värmekrympslang verkligen användbar för att se till att ingenting kortas ut när allt pressas upp mot sig själv.
- Eftersom det finns så många saker som går till GND och +5V valde vi att göra en franken-kabel (se bilden ovan) för att vara så kompakt som möjligt. Om utrymmet var mindre av ett problem, hade en brödbräda eller protoshield varit ett enklare alternativ.
- Vissa potentiometrar är konstigt formade. Generellt används den vänstra ledningen som jord, den högra ledningen som effekt och den mellersta som utgång. Om din har två ledningar på framsidan och en på baksidan, är den på baksidan utgången.
Gotchas
- Om du inte ser något på LCD -skärmen, försök att vrida potentiometern hela vägen i ena riktningen, sedan den andra. Med sin lägsta kontrast är LCD -innehållet helt osynligt.
- Om du ser riktigt konstigt skräp på LCD -skärmen, eller bara en rad istället för två, se till att alla dina anslutningar är säkra. Vi hade en felaktig anslutning till marken och det orsakade de konstigaste skärmproblemen.
- LCD -initialiseringskoden (det som körs av lcd.init () i setup () -funktionen) är viktigt och tar ett tag. Om något är fel med din bildskärm och du misstänker en trasig tråd, förvänta dig inte att plötsliga saker plötsligt får det att fungera. Du kan behöva återställa Arduino så att initialiseringskoden har en chans att fungera korrekt.
- Se till att dina trådar är ganska korta, men inte för korta. Ingenting är värre än att behöva lösa eftersom du är några centimeter från en rubrik.
Bra! Låt oss nu få det att visa några snygga saker.
Steg 2: Kod: grunder
Första sakerna först: låt oss visa displayen "Aktuellt pris:" på den översta raden och ett slumpmässigt pris i något intervall på den andra. Var och en, låt oss få priset att uppdatera. Detta är ganska enkelt, men kommer att belysa den grundläggande användningen av LiquidCrystal -biblioteket och några av dess finesser.
Låt oss först dra in biblioteket och definiera några konstanter:
#omfatta
const uint8_t lcdWidth = 16;
const uint8_t lcdHeight = 2;
const long minPriceInCents = 50;
const long maxPriceInCents = 1999;
const osignerade långa minMillisBetweenPriceUpdates = 0,25 * 1000;
const unsigned long maxMillisBetweenPriceUpdates = 2 * 1000
Bra! Det är parametrarna för prisklassen och hur ofta den uppdateras. Låt oss nu göra en instans av LCD -klassen som tillhandahålls av biblioteket och initiera den. Vi kommer att skriva ut något över seriekonsolen, bara för att ha en viss försäkran om att saker fungerar, även om vi inte ser något på LCD -skärmen. Vi gör det i setup () -funktionen, som körs en gång efter Arduino -stövlarna. Observera dock att vi deklarerar lcd -variabeln utanför setup (), eftersom vi vill ha åtkomst till den i hela programmet.
LiquidCrystal lcd (12, 11, 5, 4, 3, 2); void setup () {Serial.begin (9600); lcd.begin (lcdWidth, lcdHeight);
Serial.println ("LCD initialiserad");
lcd.print ("Nuvarande pris:");
}
Och för köttet använder vi den inbyggda slumpmässiga () -funktionen och String () -initialiseraren för att konstruera ett decimalpris. random () genererar bara heltal, så vi delar resultatet med 100,0 för att få ett flytande värde. Vi gör detta i loop (), så det händer så ofta som möjligt, men med en slumpmässig fördröjning mellan de konstanter vi definierade tidigare.
void loop ()
{dubbelpris = random (minPriceInCents, maxPriceInCents) / 100,0; String prettyPrice = "$" + String (pris, 2); lcd.setCursor (0, 1); lcd.print (prettyPrice); delay (random (minMillisBetweenPriceUpdates, maxMillisBetweenPriceUpdates)); }
En sak att notera är uppmaningen till lcd.setCursor (). LiquidCrystal-biblioteket tar inte automatiskt fram din text till nästa rad efter en utskrift, så vi måste manuellt flytta (osynliga) markören till den andra raden (här 1-det är nollbaserat). Observera också att vi inte behövde skriva ut "Aktuellt pris:" igen; LCD -skärmen rensas inte om du gör det manuellt, så vi behöver bara uppdatera dynamisk text.
Kör det så ser du snabbt ett relaterat problem. Om priset var, säg "$ 14,99" och sedan "$ 7,22", kommer displayen att visa "$ 7,229". Kom ihåg att displayen inte rensar sig själv om du inte säger till den. Även om du skriver ut på samma rad, kvarstår all text förbi det du skriver ut. För att åtgärda detta problem måste vi stoppa vår sträng med mellanslag för att skriva över eventuellt skräp. Det enklaste sättet att göra detta är att bara ta några blanksteg till vår prettyPrice -variabel:
String prettyPrice = "$" + String (pris, 2) + "";
Med den förändringen på plats har vi ett bevis på konceptet! Låt oss tjata lite.
Steg 3: Kod: Anpassade tecken
En av de coolaste funktionerna i LCD -modulen vi använder är möjligheten att skapa upp till 8 anpassade tecken. Detta görs genom metoden createChar (). Denna metod tar en uppsättning av 8x5 bitar som beskriver vilka pixlar på LCD -skärmen som ska slås på för det givna tecknet. Det finns några verktyg online för att skapa dessa matriser. Jag använde den här.
Om du inte känner dig särskilt formgivande rekommenderar jag att du använder tröskelfiltret i Photoshop för att göra en bild till svartvitt och konvertera den till tecken. Kom ihåg att du har högst 8 anpassade tecken eller 64 x 5 pixlar.
Jag valde att använda 6 av dessa tecken för Amazon -pillogotypen, och de återstående 2 för en trevligare varumärkesymbol. Du kan följa CustomCharacter -exemplet i Arduino IDE för hur du använder API. Så här bestämde jag mig för att gruppera saker:
// Definiera data för varumärket
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, B000 B00000}}; uint8_t firstTrademarkCharByte; // Byten som används för att skriva ut detta tecken; tilldelad i initCustomChars ()
Sedan använde jag en funktion som denna, kallad från setup (), för att skapa tecknen:
void initCustomChars () {
firstTrademarkCharByte = 0; för (size_t i = 0; i <trademarkCharCount; i ++) {lcd.createChar (logoCharCount+i, (uint8_t *) trademarkChars ); }}
Efter det är det lika enkelt att skriva ut anpassade tecken som att använda lcd.write () med lämpliga byte. Jag skrev en hjälpfunktion för att skriva ut ett antal byte och definierade printTrademark () i termer av det:
void writeRawByteRange (uint8_t line, uint8_t col, uint8_t startValue, size_t numBytes)
{för (uint8_t i = 0; i <numBytes; i ++) {lcd.setCursor (col+i, rad); // behöver använda write (), inte print () - print kommer att göra heltalet // värde till en sträng och skriva ut * att * lcd.write (startValue + i); }} void printTrademark (uint8_t line, uint8_t col) {writeRawByteRange (line, col, firstTrademarkCharByte, trademarkCharCount); }
Amazon -pillogotypen behandlades på ett liknande sätt. Se bifogad kod för fullständig information.
Steg 4: Kod: trevligheter
För att göra det lite lättare för mig själv lade jag till några trevliga saker i koden. Detta inkluderar saker som: en funktion för att rensa en specifik rad genom att skriva över den med mellanslag och en funktion för att centrera en given sträng på en rad.
Jag ville också att skärmen skulle gå igenom tre olika faser:
- "Dynamisk prissättning" med logotypen nedan
- "av Amazon" med logotypen nedan
- slumpmässig prisvisning
För det byggde jag ett enkelt system som håller reda på hur länge en given fas har varit aktiv och efter en viss period går vidare till nästa.
Se den bifogade koden för alla tråkiga detaljer!
Steg 5: Boxen
Nu, så att vi inte får bombgruppen kallad till oss, låt oss göra en fin låda för det hela. Vi kommer att göra detta med laserskuren akryl. Det finns många onlineverktyg för att starta processen med att göra enkla lådor. Jag rekommenderar makercase.com, eftersom det låter dig ange de inre måtten och redogör för materialets tjocklek.
Vi mätte Arduino-, LCD- och 9V -batteriet och uppskattade att vi skulle kunna passa det i ett fodral som var 4 "x 2,5" x 2 ". Så, vi kopplade in dem i makercase, med en 1/8" tjock akryl. Vi ändrade den resulterande PDF -filen för att lägga till ett avrundat fönster för LCD -skärmen och en plats längst ner för en visningstagg (mer om det senare). Den resulterande filen bifogas som en PDF.
Vi använde akryllim (det giftiga metyletylketonet) för att montera fyra sidor av lådan. Sedan fäst vi LCD -panelen på framsidan med varmt lim. När vi hade allt fungerande och passande förseglade vi de två sista sidorna av lådan med varmt lim, så att vi lätt kunde ta isär det senare. Eftersom vi inte förväntade oss att enheten skulle få mycket slitage, lämnade vi Arduino och batteriet osäkert på botten av fodralet.
Potentiella förbättringar
- Vi försummade att bygga på något sätt för att slå på eller stänga av enheten. Ha. Plats för en omkopplare på lådans botten eller baksida hade varit en bra idé.
- Spåret längs botten för den hängande taggen kunde ha varit närmare framsidan av lådan för bättre synlighet.
Steg 6: Blanda in
Och nu, det svåra: att smyga in den i en butik.
Whole Foods varumärke
Några saker vi lärde oss i omvänd teknik Whole Foods och Amazon-varumärke:
- Brödtext är i allmänhet i Scala Sans
- Rubriktext är i något som liknar Brighton mycket - en av de generiska "varma och vänliga" teckensnitten
- Whole Foods Green är något nära #223323
- Besök din lokala butik för exempel på grafiska element som upprepas: de är förtjusta i skalade kanter, solbrott och enkel vektorkonst.
Den hängande taggen
Vi skar en slits i botten av akrylfodralet så att vi kunde fästa en hängande tagg på lådan och förklara vad som händer. Se bifogad PDF för ett exempel. Detta är utformat för att klippas ut och sättas in i spåret; den ska passa och hålla utan lim.
Hyllor
När det gäller att fästa lådan på en hylla använder Whole Foods ganska vanliga hyllkomponenter. Vi tog mätningar och hittade en kompatibel krok i en järnaffär. Vi fäster lådan på kroken med varmt lim.
Om du inte hittar en sådan krok kan du prova magneter - limma några på baksidan av lådan och bara knäppa den på en hylla.
Distribuera
Placera lådan i ögonhöjd för att locka förbipasserandes uppmärksamhet. Bli inte fångad! Lycka till!
Rekommenderad:
Dynamisk LED -belysningskontroller för konst: 16 steg (med bilder)
Dynamisk LED -belysningskontroller för konst: Introduktion: Belysning är en viktig aspekt av bildkonst. Och om belysningen kan förändras med tiden kan det bli en betydande dimension av konsten. Detta projekt började med att delta i en ljusshow och uppleva hur belysningen helt kunde
Dynamisk skrivbordslampa: 10 steg (med bilder)
Dynamisk skrivbordslampa: Hej killar Jag har gjort denna dynamiska ljusbordslampa som kommer att hålla miljön runt dig levande och lugnande och händer. Du kan välja ljusfärg med fjärrkontrollen och ändra den efter ditt humör, och även ljusmönstret
Dynamisk LED -belysning Skugglåda och ram för konst :: 16 steg (med bilder)
Dynamic LED Lighting Shadow Box and Frame for Art :: Belysning är en viktig aspekt av bildkonst. Och om belysningen kan förändras med tiden kan det bli en betydande dimension av konsten. Detta projekt började med att delta i en ljusshow och uppleva hur belysningen helt kunde förändra
Gör en dummy/falsk kamera: 3 steg
Gör en dummy/falsk kamera: Har du någonsin haft känslan av att någon var " hölje " ditt hus. Kanske skakade någon på din ytterdörr och när du frågade dem om du kunde hjälpa dem frågade de dig om detta var ------- hus. Du skulle säga nej och de skulle vandra iväg. De
Gör en falsk stapel i OS X 10.4: 3 steg
Gör en falsk stapel i OS X 10.4: Har Leopard i din Macintosh? Varken jag Det är därför jag gjorde det här instruerbart Bara för att jag vill ha allt mitt skit lättillgängligt! Det enda du behöver är din mac och den obligatoriska hårdvaran (mus, tangentbord, skärm …)