Fałszywa dynamiczna metka z ceną: 6 kroków (ze zdjęciami)
Fałszywa dynamiczna metka z ceną: 6 kroków (ze zdjęciami)
Anonim
Image
Image
Podłącz wyświetlacz
Podłącz wyświetlacz

Ceny Amazona ciągle się zmieniają. Jeśli zostawisz produkty w koszyku na dłużej niż kilka godzin, prawdopodobnie otrzymasz powiadomienie o wahaniach minutowych – 0,10 USD tutaj, 2,04 USD tam. Amazon i jego sprzedawcy oczywiście używają jakiejś formy algorytmicznej wyceny, aby wycisnąć z rynku ostatni grosz.

To wszystko, czego można się spodziewać (późny kapitalizm i tak dalej). Ale co się stanie, jeśli coś pójdzie nie tak? W 2011 roku wybuchła wojna cenowa między dwoma konkurującymi algorytmami. Rezultat: książka o cyklu życia much domowych (wyczerpana, ale niezbyt rzadka) poszybowała w górę do 23,6 miliona dolarów.

Niedawne przejęcie Whole Foods Market przez Amazon sprawiło, że zastanawialiśmy się: co powstrzymuje dynamiczne ceny przed wejściem do fizycznego świata handlu detalicznego? Co by było, gdyby ceny w supermarkecie były tak samo elastyczne jak te w Internecie?

Tak więc w tym Instructable zbudujemy dynamiczny wyświetlacz cen z Arduino i małym wyświetlaczem LCD. Porozmawiamy też krótko o ukrywaniu i instalowaniu go w sklepie.

(A jeśli jesteś zainteresowany, ta wtyczka Chrome może pokazać historię cen dowolnego produktu w Amazon w ciągu ostatnich 120 dni).

Potrzebny materiał

Oto czego użyliśmy do zbudowania tego projektu:

  • Arduino Uno R3
  • Standardowy wyświetlacz LCD 16x2. Użyliśmy tego z Adafruit, ale tak długo, jak jest kompatybilny z biblioteką LiquidCrystal, powinieneś być dobry. Będziesz potrzebować kilku rzeczy, aby podłączyć go do Arduino:

    • niektóre kable rozruchowe
    • rezystor 220 omów
    • potencjometr 10 kΩ (służy do kontrolowania kontrastu wyświetlacza. Jeśli znajdziesz odpowiedni kontrast, możesz zastąpić potencjometr stałym rezystorem.)
  • Trochę akrylu na pudełko. Użyliśmy odlewanego matowego czarnego akrylu, wyciętego laserowo i połączonego za pomocą akrylowego kleju rozpuszczalnikowego i kleju na gorąco.
  • Magnesy i/lub haczyk do półki do mocowania pudełka w sklepie. Jeśli pójdziesz szlakiem hakowym, możesz go zmierzyć i wydrukować w 3D lub spróbować znaleźć go online (może w Alibabie?) lub … zdobyć go w inny, bardziej nikczemny sposób. Bądź bezpieczny.

Najpierw włączmy wyświetlacz!

Krok 1: Podłącz wyświetlacz

Podłącz wyświetlacz
Podłącz wyświetlacz
Podłącz wyświetlacz
Podłącz wyświetlacz

Z tyłu tego wyświetlacza LCD jest wiele pinów. Na szczęście dokumentacja biblioteki oprogramowania, której będziemy używać, zawiera dobry przewodnik po jej okablowaniu. Sprawdź to.

Podsumowując, twoje okablowanie powinno wyglądać tak:

  • Moc:

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

    • LCD RS (pin 4) → cyfrowy pin Arduino 12
    • LCD Enable (pin 6) → Arduino cyfrowy pin 11
    • LCD D4 (pin 11) → cyfrowy pin 5
    • LCD D5 (pin 12) → cyfrowy pin 4
    • LCD D6 (pin 13) → cyfrowy pin 3
    • LCD D7 (pin 14) → cyfrowy pin 2
  • Kontrast wyświetlacza:

    • Podłącz nóżki potencjometru 10k do +5V i GND Arduino
    • Wyjście potencjometru → LCD VO (pin 3).
  • Podświetlenie:

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

Kiedy to wszystko ustawione, załaduj jeden z przykładowych projektów LiquidCrystal w Arduino IDE i sprawdź, czy działa! Pamiętaj, aby dokładnie sprawdzić kod inicjalizacji LCD w próbkach – numery pinów muszą być poprawne, inaczej nic nie zobaczysz.

Na przykład przykład „Mrugnięcie” zawiera ten kod, który jest poprawny, biorąc pod uwagę powyższą konfigurację:

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

Porady

  • Zaoszczędź sobie trochę lutowania i zainwestuj w kilka końcówek zaciskanych i złączy rozgałęźnych. W projektach takich jak ten, w których zamierzamy upchać elektronikę do małej obudowy, możliwość wykonania krótkich kabli rozruchowych jest niezwykle pomocna.
  • Podobnie, rurki termokurczliwe są naprawdę przydatne, aby upewnić się, że nic się nie zwiera, gdy wszystko jest do siebie dociśnięte.
  • Ponieważ jest tak wiele rzeczy idących do GND i +5V, zdecydowaliśmy się zrobić kabel franken (patrz zdjęcie powyżej), aby był tak kompaktowy, jak to tylko możliwe. Gdyby przestrzeń była mniejszym problemem, płytka prototypowa lub protoosłona byłyby łatwiejszą opcją.
  • Niektóre potencjometry mają dziwny kształt. Ogólnie rzecz biorąc, lewy przewód służy jako uziemienie, prawy przewód jako zasilanie, a środkowy jako wyjście. Jeśli twój ma dwa przewody z przodu i jeden z tyłu, wyjściem jest ten z tyłu.

Gotchas

  • Jeśli nic nie widzisz na ekranie LCD, spróbuj przekręcić potencjometr do końca w jednym kierunku, a potem w drugim. Przy najniższym kontraście zawartość wyświetlacza LCD jest całkowicie niewidoczna.
  • Jeśli widzisz naprawdę dziwny bełkot na wyświetlaczu LCD lub tylko jedną linię zamiast dwóch, upewnij się, że wszystkie połączenia są bezpieczne. Mieliśmy wadliwe połączenie z masą i powodowało to najdziwniejsze problemy z wyświetlaniem.
  • Kod inicjujący LCD (który jest uruchamiany przez lcd.init() w funkcji setup()) jest ważny i zajmuje trochę czasu. Jeśli coś jest nie tak z wyświetlaczem i podejrzewasz, że przewód jest wadliwy, nie oczekuj, że poruszenie rzeczy nagle sprawi, że zadziała. Może być konieczne zresetowanie Arduino, aby kod inicjalizacji miał szansę działać poprawnie.
  • Upewnij się, że przewody są dość krótkie, ale nie za krótkie. Nie ma nic gorszego niż konieczność odsprzedania, ponieważ jesteś kilka centymetrów od nagłówka.

Świetny! Teraz zróbmy to, aby pokazać kilka wymyślnych rzeczy.

Krok 2: Kod: Podstawy

Kod: Podstawy
Kod: Podstawy
Kod: Podstawy
Kod: Podstawy

Po pierwsze: niech wyświetlacz pokaże „Current Price:” w górnym wierszu, a losową cenę w pewnym zakresie w drugim. Co jakiś czas odświeżmy cenę. Jest to dość proste, ale podkreśli podstawowe zastosowanie biblioteki LiquidCrystal i niektóre z jej dziwactw.

Najpierw wciągnijmy bibliotekę i zdefiniujmy kilka stałych:

#włączać

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

Świetny! To są parametry przedziału cenowego i częstotliwości odświeżania. Teraz stwórzmy instancję klasy LCD dostarczonej przez bibliotekę i zainicjujmy ją. Wydrukujemy coś przez konsolę szeregową, żeby mieć pewność, że wszystko działa, nawet jeśli nic nie widzimy na wyświetlaczu LCD. Zrobimy to w funkcji setup(), która uruchamia się raz po uruchomieniu Arduino. Zauważ jednak, że deklarujemy zmienną lcd poza setup(), ponieważ chcemy mieć do niej dostęp w całym programie.

LCD LiquidCrystal(12, 11, 5, 4, 3, 2); void setup() { Serial.begin(9600); lcd.początek (szerokość lcd, wysokość lcd);

Serial.println("Inicjowanie LCD");

lcd.print("Aktualna cena:");

}

A w przypadku mięsa użyjemy wbudowanej funkcji random() i inicjatora String() do skonstruowania ceny dziesiętnej. random() generuje tylko liczby całkowite, więc podzielimy jego wynik przez 100.0, aby otrzymać wartość zmiennoprzecinkową. Zrobimy to w loop(), więc dzieje się to tak często, jak to możliwe, ale z losowym opóźnieniem między zdefiniowanymi wcześniej stałymi.

pusta pętla()

{ podwójna cena = losowo(minCenaInCents, maxPriceInCents) / 100,0; String prettyPrice = "$" + String(cena, 2); lcd.setCursor(0, 1); lcd.print(ładnaCena); delay(losowe(minMillisMiędzyAktualizacjamiCeny,maksymalneMillisMiędzyAktualizacjamiCeny)); }

Należy zwrócić uwagę na wywołanie lcd.setCursor(). Biblioteka LiquidCrystal nie przesuwa automatycznie tekstu do następnej linii po wydrukowaniu, więc musimy ręcznie przesunąć (niewidoczny) kursor do drugiej linii (tutaj 1 – jest od zera). Zwróć też uwagę, że nie musieliśmy ponownie drukować „Aktualna cena:”; wyświetlacz LCD nie jest czyszczony, chyba że zrobisz to ręcznie, więc musimy tylko zaktualizować tekst dynamiczny.

Przetestuj, a szybko zobaczysz powiązany problem. Jeśli cena wynosiła, powiedzmy, „14,99 USD”, a następnie „7,22 USD”, wyświetlacz pokaże „7,229 USD”. Pamiętaj, że wyświetlacz nie wyczyści się sam, chyba że mu każesz. Nawet jeśli drukujesz w tym samym wierszu, każdy tekst poza tym, który wydrukujesz, pozostanie. Aby rozwiązać ten problem, musimy uzupełnić nasz ciąg spacjami, aby nadpisać wszelkie potencjalne śmieci. Najłatwiej to zrobić, po prostu dołączając kilka spacji do naszej zmiennej prettyPrice:

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

Dzięki tej zmianie mamy dowód koncepcji! Podkręćmy to trochę.

Krok 3: Kod: znaki niestandardowe

Kod: Niestandardowe znaki
Kod: Niestandardowe znaki
Kod: Niestandardowe znaki
Kod: Niestandardowe znaki

Jedną z najfajniejszych funkcji modułu LCD, którego używamy, jest możliwość tworzenia do 8 niestandardowych znaków. Odbywa się to za pomocą metody createChar(). Ta metoda przyjmuje tablicę 8x5 bitów, które opisują, które piksele wyświetlacza LCD mają się włączyć dla danego znaku. Istnieje kilka narzędzi online, które pomagają w generowaniu tych tablic. Użyłem tego.

Jeśli nie czujesz się szczególnie designersko, polecam użycie filtra Threshold w Photoshopie, aby zmienić obraz na czarno-biały i przekonwertować go na znaki. Pamiętaj, że masz maksymalnie 8 niestandardowych znaków, czyli 64x5 pikseli.

Zdecydowałem się użyć 6 z tych znaków do logo strzałki Amazon, a pozostałe 2 do ładniejszego symbolu znaku towarowego. Możesz skorzystać z przykładu CustomCharacter w Arduino IDE, aby dowiedzieć się, jak korzystać z API. W ten sposób postanowiłem pogrupować rzeczy:

// Zdefiniuj dane dla znaków znaku towarowego

const size_t znak towarowyCharCount = 2;const uint8_t znak towarowyChars[trademarkCharCount][8] = { { B00111, B00010, B00010, B00000, B00000, B00000, B00000, B00000 }, { B10100, B11100, B10100, B00000, B00000, B00000, B00000, B00000 } }; uint8_t firstTrademarkCharByte; // Bajt użyty do wypisania tego znaku; przypisane w initCustomChars()

Następnie użyłem funkcji takiej jak ta, wywołanej z setup(), aby utworzyć znaki:

void initCustomChars() {

pierwszyznak towarowyCharByte = 0; for(size_t i = 0; i < znak towarowyCharCount; i++) { lcd.createChar(logoCharCount + i, (uint8_t *)trademarkChars); } }

Następnie drukowanie znaków niestandardowych jest tak proste, jak użycie lcd.write() z odpowiednimi bajtami. Napisałem funkcję pomocniczą do drukowania zakresu bajtów i zdefiniowałem printTrademark() pod tym kątem:

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

{ for(uint8_t i = 0; i <liczbabajtów; i++) { lcd.setCursor(col + i, line); // trzeba użyć write(), nie print() - print zamieni wartość // liczbę całkowitą na łańcuch i wypisze *that* lcd.write(startValue + i); } } void printTrademark(uint8_t line, uint8_t col) { writeRawByteRange(line, col, firstTrademarkCharByte, characterCharCount); }

Podobnie potraktowano logo strzałki Amazona. Zobacz załączony kod, aby uzyskać szczegółowe informacje.

Krok 4: Kod: uprzejmości

Aby trochę ułatwić sobie sprawę, dodałem kilka drobiazgów do kodu. Obejmuje to takie rzeczy jak: funkcja do czyszczenia określonego wiersza przez nadpisanie go spacjami oraz funkcja do centrowania danego ciągu w wierszu.

Chciałem również, aby wyświetlacz przechodził przez trzy różne fazy:

  1. „Dynamiczne ceny” z logo poniżej
  2. „by Amazon” z poniższym logo
  3. losowe wyświetlanie ceny

W tym celu zbudowałem prosty system, który śledzi, jak długo dana faza jest aktywna i po pewnym czasie przechodzi do następnej.

Zobacz załączony kod, aby zobaczyć wszystkie krwawe szczegóły!

Krok 5: Pudełko

Pudełko
Pudełko

Teraz, żeby nie wezwali nas oddział bombowy, zróbmy ładne pudełko na to wszystko. Będziemy to robić z akrylem wycinanym laserowo. Istnieje wiele narzędzi online, które przyspieszają proces tworzenia prostych pudełek. Polecam makercase.com, ponieważ pozwala on określić wymiary wewnętrzne i uwzględnia grubość materiału.

Zmierzyliśmy baterię Arduino, LCD i 9 V i oszacowaliśmy, że będziemy w stanie zmieścić ją w obudowie o wymiarach 4 "x 2,5" x 2". Więc podłączyliśmy je do obudowy o grubości 1/8 " akryl. Zmodyfikowaliśmy powstały plik PDF, aby dodać zaokrąglone okno dla wyświetlacza LCD i szczelinę u dołu na znacznik wyświetlania (więcej o tym później). Wynikowy plik jest dołączony jako PDF.

Do montażu czterech boków pudełka użyliśmy kleju akrylowego (rodzaj toksycznego ketonu metylowo-etylowego). Następnie przykleiliśmy panel LCD z przodu za pomocą gorącego kleju. Gdy wszystko było już sprawne i dopasowane, zakleiliśmy ostatnie dwa boki pudełka gorącym klejem, abyśmy mogli je później łatwo rozebrać. Ponieważ nie spodziewaliśmy się, że urządzenie będzie zużywać się dużo, zostawiliśmy Arduino i baterię niezabezpieczoną na spodzie obudowy.

Potencjalne ulepszenia

  • Zaniedbaliśmy zbudować w jakikolwiek sposób, aby włączyć lub wyłączyć urządzenie. Ha. Miejsce na przełącznik na spodzie lub z tyłu pudełka byłoby dobrym pomysłem.
  • Szczelina u dołu na zawieszoną zawieszkę mogła znajdować się bliżej przodu pudełka, aby poprawić widoczność.

Krok 6: Wtapianie

Mieszanie w
Mieszanie w
Mieszanie w
Mieszanie w

A teraz najtrudniejsza część: wkradanie się do sklepu.

Branding całej żywności

Kilka rzeczy, których nauczyliśmy się podczas inżynierii odwrotnej brandingu Whole Foods i Amazon:

  • Tekst główny jest zazwyczaj w Scala Sans
  • Tekst nagłówka jest czymś, co przypomina Brighton – jedną z tych ogólnych „ciepłych i przyjaznych” czcionek
  • Whole Foods Green to coś zbliżonego do #223323
  • Rozejrzyj się w lokalnym sklepie, aby znaleźć przykłady powtarzających się elementów graficznych: lubią zapiekane obramowania, sunbursts i prostą grafikę wektorową.

Wisząca zawieszka

Wycięliśmy szczelinę w dnie akrylowego etui, aby do pudełka przyczepić wiszącą zawieszkę wyjaśniającą, co się dzieje. Zobacz przykład w załączonym pliku PDF. Jest przeznaczony do wycięcia i włożenia do gniazda; powinien pasować i trzymać bez kleju.

Regały

Jeśli chodzi o faktyczne przymocowanie pudełka do półki, Whole Foods używa dość standardowych elementów półek. Zrobiliśmy pomiary i znaleźliśmy kompatybilny haczyk w sklepie z narzędziami. Pudełko przykleiliśmy do haczyka gorącym klejem.

Jeśli nie możesz znaleźć takiego haczyka, możesz spróbować magnesów – przyklej trochę z tyłu pudełka i po prostu zatrzaśnij je na półce.

Wdrożyć

Umieść pudełko na wysokości oczu, aby przyciągnąć uwagę przechodniów. Nie daj się złapać! Powodzenia!

Zalecana: