Inhoudsopgave:
- Stap 1: Sluit het scherm aan
- Stap 2: Code: Basis
- Stap 3: Code: aangepaste tekens
- Stap 4: Code: Niceties
- Stap 5: De doos
- Stap 6: Invloeien
Video: Nep dynamisch prijskaartje: 6 stappen (met afbeeldingen)
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:18
De prijzen van Amazon veranderen voortdurend. Als u artikelen langer dan een paar uur in uw winkelwagen laat liggen, wordt u waarschijnlijk gewaarschuwd voor kleine fluctuaties: $ 0,10 hier, $ 2,04 daar. Amazon en zijn handelaren gebruiken duidelijk een vorm van algoritmische prijsstelling om de laatste cent uit de markt te persen.
Dat is allemaal te verwachten (laatkapitalisme en zo). Maar wat gebeurt er als het mis gaat? In 2011 brak er een prijzenoorlog uit tussen twee concurrerende algoritmen. Het resultaat: een boek over de levenscyclus van huisvliegen (uitverkocht, maar niet bijzonder zeldzaam) schoot omhoog naar een prijs van $ 23,6 miljoen.
De recente overname door Amazon van Whole Foods Market deed ons afvragen: wat weerhoudt dynamische prijsstelling ervan om de fysieke wereld van de detailhandel te betreden? Wat als de prijzen in een supermarkt net zo flexibel waren als online?
Dus in deze Instructable bouwen we een dynamische prijsweergave met een Arduino en een klein LCD-scherm. We zullen het ook kort hebben over het vermommen en installeren in een winkel.
(En als je geïnteresseerd bent, kan deze Chrome-plug-in je de prijsgeschiedenis van elk item op Amazon in de afgelopen 120 dagen laten zien.)
Benodigd materiaal
Dit is wat we hebben gebruikt om dit project te bouwen:
- Een Arduino Uno R3
-
Een standaard 16x2 LCD-scherm. We hebben deze van Adafruit gebruikt, maar zolang het compatibel is met de LiquidCrystal-bibliotheek, zou je goed moeten zijn. Je hebt een paar dingen nodig om het op de Arduino aan te sluiten:
- sommige startkabels
- een weerstand van 220 ohm
- een 10k ohm potentiometer (Dit is voor het regelen van het contrast van het display. Als u een contrast vindt dat u bevalt, kunt u de potentiometer vervangen door een vaste weerstand.)
- Wat acryl voor de doos. We gebruikten een gegoten matzwart acryl, laser gesneden en geassembleerd met acryl oplosmiddel-lijm en hete lijm.
- Magneten en/of een schaphaak om de box in de winkel te bevestigen. Als je de haakroute volgt, zou je er een kunnen meten en 3D-printen, of proberen er een online te vinden (Alibaba, misschien?), of … het op een andere, meer snode manier verwerven. Wees veilig.
Laten we eerst het display aan de gang krijgen!
Stap 1: Sluit het scherm aan
Er zijn zeker veel pinnen op de achterkant van dat LCD-scherm. Gelukkig bevat de documentatie voor de softwarebibliotheek die we gaan gebruiken een goede handleiding voor het aansluiten ervan. Bekijken.
Samengevat zou uw bedrading als volgt moeten eindigen:
-
Stroom:
- LCD GND (pin 1) → Arduino GND
- LCD VDD (pin 2) → Arduino +5V
- LCD RW (pin 5) → Arduino GND
-
Gegevens dingen:
- LCD RS (pin 4) → Arduino digitale pin 12
- LCD inschakelen (pin 6) → Arduino digitale pin 11
- LCD D4 (pin 11) → digitale pin 5
- LCD D5 (pin 12) → digitale pin 4
- LCD D6 (pin 13) → digitale pin 3
- LCD D7 (pin 14) → digitale pin 2
-
Displaycontrast:
- Sluit de poten van een 10k-potentiometer aan op Arduino's +5V en GND
- Uitgang potentiometer → LCD VO (pin 3).
-
Achtergrondverlichting:
- LCD BL1 (pin 15) → 220 ohm weerstand → Arduino +5V
- LCD BL2 (pin 16) → Arduino GND
Als dat allemaal is ingesteld, laadt u een van de voorbeeld LiquidCrystal-projecten in de Arduino IDE en kijkt u of het werkt! Vergeet niet om de LCD-initialisatiecode in de voorbeelden te controleren - de pincodes moeten correct zijn, anders ziet u niets.
Het voorbeeld "Blink" heeft bijvoorbeeld deze code, die correct is gezien de bovenstaande instellingen:
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
Tips
- Bespaar uzelf wat soldeerwerk en investeer in enkele krimpuiteinden en kopconnectoren. Bij projecten als deze waar we de elektronica in een kleine behuizing proppen, is het ongelooflijk handig om korte startkabels te kunnen maken.
- Evenzo is krimpkous erg handig om ervoor te zorgen dat er niets kortsluit wanneer het allemaal tegen zichzelf wordt gedrukt.
- Omdat er zoveel dingen naar GND en +5V gaan, hebben we ervoor gekozen om een franken-kabel (zie de foto hierboven) zo compact mogelijk te maken. Als ruimte minder een probleem was, zou een breadboard of protoshield een gemakkelijkere optie zijn geweest.
- Sommige potentiometers hebben een vreemde vorm. Over het algemeen wordt de linkerkabel gebruikt als aarde, de meest rechtse kabel als voeding en de middelste als uitgang. Als de jouwe twee kabels aan de voorkant en één aan de achterkant heeft, is die aan de achterkant de uitgang.
Gotchas
- Als u niets op uw LCD-scherm ziet, probeer dan de potentiometer helemaal in de ene richting te draaien en dan in de andere. Bij het laagste contrast is de inhoud van het LCD-scherm volledig onzichtbaar.
- Als je echt raar gebrabbel op het LCD-scherm ziet, of slechts één regel in plaats van twee, zorg er dan voor dat al je verbindingen veilig zijn. We hadden een defecte verbinding met aarde en dit veroorzaakte de vreemdste weergaveproblemen.
- De LCD-initialisatiecode (wat wordt uitgevoerd door lcd.init() in de setup()-functie) is belangrijk en duurt even. Als er iets mis is met je display en je vermoedt een defecte draad, verwacht dan niet dat wispelturige dingen het plotseling laten werken. Mogelijk moet u de Arduino opnieuw instellen, zodat de initialisatiecode de kans krijgt om correct te werken.
- Zorg ervoor dat je draden vrij kort zijn, maar niet te kort. Niets is erger dan opnieuw moeten solderen omdat je een paar centimeter verwijderd bent van een header.
Super goed! Laten we er nu een paar mooie dingen van laten zien.
Stap 2: Code: Basis
Allereerst: laten we het display "Huidige prijs:" op de bovenste regel laten zien, en een willekeurige prijs in een bepaald bereik op de tweede regel. Laten we af en toe de prijs vernieuwen. Dit is vrij eenvoudig, maar zal het basisgebruik van de LiquidCrystal-bibliotheek en enkele van zijn eigenaardigheden benadrukken.
Laten we eerst de bibliotheek binnenhalen en enkele constanten definiëren:
#erbij betrekken
const uint8_t lcdWidth = 16;
const uint8_t lcdHeight = 2;
const lang minPriceInCents = 50;
const lang maxPriceInCents = 1999;
const unsigned long minMillisBetweenPriceUpdates = 0.25 * 1000;
const unsigned long maxMillisBetweenPriceUpdates = 2 * 1000
Super goed! Dat zijn de parameters voor de prijsklasse en hoe vaak deze wordt vernieuwd. Laten we nu een instantie maken van de LCD-klasse die door de bibliotheek wordt geleverd en deze initialiseren. We zullen iets uitprinten via de seriële console, alleen om enige zekerheid te hebben dat de dingen werken, zelfs als we niets op het LCD-scherm zien. We doen dat in de setup()-functie, die één keer wordt uitgevoerd nadat de Arduino is opgestart. Merk echter op dat we de lcd-variabele buiten setup() declareren, omdat we er in het hele programma toegang toe willen hebben.
LiquidCrystal lcd (12, 11, 5, 4, 3, 2); void setup() { Serial.begin(9600); lcd.begin(lcdWidth, lcdHeight);
Serial.println("LCD geïnitialiseerd");
lcd.print("Huidige prijs:");
}
En voor het vlees gebruiken we de ingebouwde functie random() en de initialisatie String() om een decimale prijs te construeren. random() genereert alleen gehele getallen, dus we delen het resultaat door 100,0 om een drijvende-kommawaarde te krijgen. We doen dit in loop(), dus het gebeurt zo vaak mogelijk, maar met een willekeurige vertraging tussen de constanten die we eerder hebben gedefinieerd.
lege lus()
{ dubbele prijs = willekeurig (minPriceInCents, maxPriceInCents) / 100.0; String prettyPrice = "$" + String (prijs, 2); lcd.setCursor(0, 1); lcd.print(prettyPrice); vertraging (willekeurig (minMillisBetweenPriceUpdates, maxMillisBetweenPriceUpdates)); }
Een ding om op te merken is de aanroep naar lcd.setCursor(). De LiquidCrystal-bibliotheek brengt uw tekst niet automatisch naar de volgende regel na een afdruk, dus we moeten de (onzichtbare) cursor handmatig naar de tweede regel verplaatsen (hier 1 - het is op nul gebaseerd). Merk ook op dat we "Huidige prijs:" niet opnieuw hoefden af te drukken; het LCD-scherm wordt niet gewist, tenzij u dit handmatig doet, dus we hoeven alleen dynamische tekst bij te werken.
Geef het een run en je zult snel een gerelateerd probleem zien. Als de prijs bijvoorbeeld "$14.99" en vervolgens "$7.22" was, toont het display "$7.229". Onthoud dat het display zichzelf niet leegmaakt, tenzij u dit aangeeft. Zelfs als u op dezelfde regel afdrukt, blijft alle tekst achter wat u afdrukt. Om dit probleem op te lossen, moeten we onze string opvullen met spaties om eventuele rommel te overschrijven. De eenvoudigste manier om dit te doen, is door een paar spaties aan onze prettyPrice-variabele toe te voegen:
String prettyPrice = "$" + String (prijs, 2) + " ";
Met die verandering hebben we een proof of concept! Laten we het een beetje opfleuren.
Stap 3: Code: aangepaste tekens
Een van de coolste functies van de LCD-module die we gebruiken, is de mogelijkheid om maximaal 8 aangepaste tekens te maken. Dit wordt gedaan via de methode createChar(). Deze methode vereist een array van 8x5 bits die beschrijven welke pixels van het LCD-scherm moeten worden ingeschakeld voor het gegeven teken. Er zijn een paar tools online om te helpen bij het genereren van deze arrays. Ik heb deze gebruikt.
Als je je niet bepaald designgericht voelt, raad ik aan om het Drempelfilter in Photoshop te gebruiken om een afbeelding om te zetten in zwart-wit en die om te zetten in tekens. Onthoud dat u maximaal 8 aangepaste tekens of 64x5 pixels hebt.
Ik koos ervoor om 6 van die tekens te gebruiken voor het Amazon-pijllogo en de resterende 2 voor een mooier handelsmerksymbool. U kunt het CustomCharacter-voorbeeld in de Arduino IDE volgen voor het gebruik van API. Dit is hoe ik besloot om dingen te groeperen:
// Definieer de gegevens voor de handelsmerktekens
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 B00000 } }; uint8_t firstTrademarkCharByte; // De byte die wordt gebruikt om dit teken af te drukken; toegewezen in initCustomChars()
Vervolgens gebruikte ik een functie als deze, aangeroepen vanuit setup(), om de tekens te maken:
ongeldig initCustomChars() {
eersteHandelsmerkCharByte = 0; for(size_t i = 0; i <trademarkCharCount; i++) { lcd.createChar(logoCharCount + i, (uint8_t *)handelsmerkChars); } }
Daarna is het afdrukken van de aangepaste tekens net zo eenvoudig als het gebruik van lcd.write() met de juiste bytes. Ik schreef een helperfunctie om een reeks bytes af te drukken, en definieerde printTrademark() in termen van:
void writeRawByteRange(uint8_t line, uint8_t col, uint8_t startValue, size_t numBytes)
{ for(uint8_t i = 0; i < numBytes; i++) { lcd.setCursor (col + i, regel); // moet write() gebruiken, niet print() - print verandert de integer // waarde in een string en print *that* lcd.write(startValue + i); } } void printTrademark(uint8_t line, uint8_t col) {writeRawByteRange(line, col, firstTrademarkCharByte, trademarkCharCount); }
Het Amazon-pijllogo werd op een vergelijkbare manier behandeld. Zie de bijgevoegde code voor alle details.
Stap 4: Code: Niceties
Om het mezelf een beetje gemakkelijker te maken, heb ik een paar aardigheden aan de code toegevoegd. Dit omvat zaken als: een functie voor het wissen van een specifieke regel door deze te overschrijven met spaties, en een functie voor het centreren van een gegeven string op een regel.
Ik wilde ook dat het scherm door drie verschillende fasen zou gaan:
- "Dynamic Pricing" met onderstaand logo
- "by Amazon" met onderstaand logo
- willekeurige prijsweergave
Daarvoor heb ik een eenvoudig systeem gebouwd dat bijhoudt hoe lang een bepaalde fase actief is en na een bepaalde periode doorgaat naar de volgende.
Zie de bijgevoegde code voor alle bloederige details!
Stap 5: De doos
Laten we een mooie doos maken voor het hele ding, zodat we de bomaanslag niet krijgen. We doen dit met lasergesneden acryl. Er zijn veel online tools om het proces van het maken van eenvoudige dozen een vliegende start te geven. Ik raad makercase.com aan, omdat je hiermee de binnenafmetingen kunt specificeren en rekening kunt houden met de dikte van het materiaal.
We hebben de Arduino-, LCD- en 9V-batterij gemeten en geschat dat we deze in een behuizing van 4 "x 2,5" x 2" zouden kunnen passen. Dus die hebben we in de makercase gestopt, met een 1/8" dikke acryl. We hebben de resulterende PDF aangepast om een afgerond venster voor het LCD-scherm toe te voegen en een gleuf aan de onderkant voor een display-tag (daarover later meer). Het resulterende bestand is als PDF bijgevoegd.
We gebruikten acrylkleefstof (de giftige methylethylketonsoort) om vier zijden van de doos te monteren. Vervolgens hebben we het LCD-paneel aan de voorkant bevestigd met hete lijm. Toen alles eenmaal werkend en passend was, hebben we de laatste twee zijden van de doos met hete lijm verzegeld, zodat we hem later gemakkelijk uit elkaar konden halen. Omdat we niet verwachtten dat het apparaat veel slijtage zou krijgen, lieten we de Arduino en de batterij onbeveiligd op de onderkant van de behuizing.
Potentiële verbeteringen
- We hebben nagelaten om op welke manier dan ook te bouwen om het apparaat aan of uit te zetten. Ha. Ruimte voor een schakelaar aan de onderkant of achterkant van de doos zou een goed idee zijn geweest.
- De gleuf aan de onderkant voor het ophanglabel had dichter bij de voorkant van de doos kunnen zitten, voor een betere zichtbaarheid.
Stap 6: Invloeien
En nu het moeilijkste: een winkel binnensluipen.
Whole Foods-branding
Enkele dingen die we hebben geleerd bij reverse-engineering van Whole Foods en Amazon-branding:
- Bodytekst is over het algemeen in Scala Sans
- Koptekst staat in iets dat veel op Brighton lijkt - een van die generieke "warme en vriendelijke" lettertypen
- Whole Foods Green is iets dat in de buurt komt van #223323
- Zet je lokale winkel in de gaten voor voorbeelden van grafische elementen die zich herhalen: ze zijn dol op geschulpte randen, zonnestralen en eenvoudige vectorkunst.
De hangende tag
We hebben een gleuf in de onderkant van de acrylbehuizing gemaakt, zodat we een ophanglabel aan de doos konden bevestigen, met uitleg over wat er aan de hand is. Zie de bijgevoegde pdf voor een voorbeeld. Dit is ontworpen om te worden uitgesneden en in de sleuf te worden gestoken; het moet passen en vasthouden zonder lijm.
rekken
Wat betreft het bevestigen van de doos aan een plank, gebruikt Whole Foods vrij standaard rekcomponenten. We namen metingen en vonden een compatibele haak in een ijzerhandel. We hebben de doos met hete lijm aan de haak bevestigd.
Als je zo'n haak niet kunt vinden, kun je magneten proberen - plak er een paar op de achterkant van de doos en klik hem gewoon op een plank.
Aanwenden
Plaats de doos op ooghoogte om de aandacht van voorbijgangers te trekken. Laat je niet vangen! Veel succes!
Aanbevolen:
HUISDECORATIE MET NEP INDUSTRILE HOGEDRUKLAMP - Ajarnpa
WOONDECORATIE MET NEP INDUSTRILE HOGEDRUKLAMP: Ik zag op de schroothoop een paar mooie lampen weggegooid. Ik kwam met enkele ideeën voor het maken van een decoratieve lamp voor thuis van deze kapotte lampen en verzamelde een paar lampen. Vandaag ben ik bereid om te delen hoe ik deze bollen heb veranderd in home deco
Hoe maak je een nep auto-alarm met behulp van een 555 Timer - Ajarnpa
Hoe maak je een nep auto-alarm met behulp van een 555 Timer: Dit project laat zien hoe je een knipperend LED-licht maakt met een vertraging van vijf seconden met behulp van een NE555. Dit zou kunnen dienen als een nep auto-alarm, omdat het een auto-alarmsysteem nabootst met zijn felrode knipperende LED. Moeilijkheidsgraad Het circuit zelf is niet moeilijk
DIY dynamisch geheugenblok - Ajarnpa
DIY Dynamic Memory Block: De SLG46880 en SLG46881 introduceren verschillende nieuwe blokken die niet zijn verschenen in eerdere GreenPAK-apparaten. Deze toepassingsnota beschrijft de Dynamic Memory (DM)-blokken en hoe ze te gebruiken. Het belangrijkste voordeel van DM-blokken is dat ze opnieuw kunnen worden geconfigureerd
Nep STUN GUN!: 3 stappen
Fake STUN GUN !: Laten we beginnen met een leuke video (met leuke muziek)
Nep TP4056 laadcurvetester met INA219 - Ajarnpa
Nep TP4056 laadcurvetester met INA219: waarom het nodig is Ik gebruik al een tijdje TP4056-modules en ben er onlangs achter gekomen dat er nu talloze nep-modules zijn. Het is eigenlijk heel moeilijk om echte TP4056-chips te vinden. Deze blog heeft een mooi overzicht