Оглавление:

Поддельный динамический ценник: 6 шагов (с изображениями)
Поддельный динамический ценник: 6 шагов (с изображениями)

Видео: Поддельный динамический ценник: 6 шагов (с изображениями)

Видео: Поддельный динамический ценник: 6 шагов (с изображениями)
Видео: Nokia 6 или то как китайцы зарабатывают на чужом имени… 2024, Ноябрь
Anonim
Image
Image
Подключите дисплей
Подключите дисплей

Цены на Amazon постоянно меняются. Если вы оставите товары в корзине дольше, чем на несколько часов, вы, скорее всего, получите уведомление о минутных колебаниях - 0,10 доллара здесь, 2,04 доллара там. Amazon и ее продавцы, очевидно, используют ту или иную форму алгоритмического ценообразования, чтобы выжать с рынка последнюю копейку.

Этого и следовало ожидать (поздний капитализм и все такое). Но что произойдет, если что-то пойдет не так? В 2011 году разразилась ценовая война между двумя конкурирующими алгоритмами. Результат: книга о жизненном цикле комнатных мух (вышедшая из печати, но не особо редкая) взлетела до 23,6 миллиона долларов.

Недавнее приобретение Amazon Whole Foods Market заставило нас задуматься: что мешает динамическому ценообразованию войти в физический мир розничной торговли? Что, если бы цены в супермаркете были такими же гибкими, как и в Интернете?

Итак, в этом руководстве мы создадим динамический дисплей цен с помощью Arduino и небольшого ЖК-дисплея. Также вкратце поговорим о маскировке и установке в магазине.

(И, если вам интересно, этот плагин Chrome может показать вам историю цен на любой товар на Amazon за последние 120 дней.)

Необходимый материал

Вот что мы использовали для создания этого проекта:

  • Arduino Uno R3
  • Стандартный ЖК-дисплей 16x2. Мы использовали этот от Adafruit, но если он совместим с библиотекой LiquidCrystal, все должно быть хорошо. Чтобы подключить его к Arduino, вам понадобится несколько вещей:

    • некоторые соединительные кабели
    • резистор 220 Ом
    • потенциометр на 10 кОм (предназначен для управления контрастностью дисплея. Если вы найдете контраст, который вам нравится, вы можете заменить потенциометр на фиксированный резистор.)
  • Немного акрила для коробки. Мы использовали литой матовый черный акрил, вырезанный лазером и собранный с помощью акрилового клея-растворителя и горячего клея.
  • Магниты и / или крючок для стеллажа для крепления коробки в магазине. Если вы пойдете по крючковому маршруту, вы можете измерить и распечатать его на 3D-принтере, или попытаться найти его в Интернете (Alibaba, возможно?), Или… приобрести его каким-либо другим, более гнусным способом. Быть в безопасности.

Во-первых, давайте запустим дисплей!

Шаг 1. Подключите дисплей

Подключите дисплей
Подключите дисплей
Подключите дисплей
Подключите дисплей

На задней панели ЖК-дисплея наверняка много контактов. К счастью, в документации к программной библиотеке, которую мы собираемся использовать, есть хорошее руководство по ее подключению. Проверить это.

Таким образом, ваша проводка должна выглядеть так:

  • Власть:

    • ЖК-GND (контакт 1) → Arduino GND
    • ЖК-дисплей VDD (контакт 2) → Arduino + 5 В
    • LCD RW (вывод 5) → Arduino GND
  • Данные:

    • LCD RS (вывод 4) → цифровой вывод 12 Arduino
    • Включение ЖК-дисплея (вывод 6) → цифровой вывод 11 Arduino
    • ЖК-дисплей D4 (вывод 11) → цифровой вывод 5
    • ЖК-дисплей D5 (вывод 12) → цифровой вывод 4
    • ЖК-дисплей D6 (вывод 13) → цифровой вывод 3
    • ЖК-дисплей D7 (вывод 14) → цифровой вывод 2
  • Контрастность дисплея:

    • Подключите ножки потенциометра 10k к + 5V и GND Arduino.
    • Выход потенциометра → LCD VO (контакт 3).
  • Подсветка:

    • LCD BL1 (вывод 15) → резистор 220 Ом → Arduino + 5V
    • ЖК-дисплей BL2 (вывод 16) → Arduino GND

Когда все настроено, загрузите один из примеров проектов LiquidCrystal в Arduino IDE и посмотрите, работает ли он! Не забудьте дважды проверить код инициализации ЖК-дисплея в образцах - номера контактов должны быть правильными, иначе вы ничего не увидите.

Например, в примере «Blink» есть этот код, который является правильным с учетом приведенной выше настройки:

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; ЖК-дисплей LiquidCrystal (rs, en, d4, d5, d6, d7);

подсказки

  • Избавьтесь от пайки и вложите средства в обжимные концы и соединители. В подобных проектах, где мы собираемся втиснуть электронику в небольшой корпус, возможность сделать короткие перемычки невероятно полезна.
  • Точно так же термоусадочная трубка действительно полезна, чтобы ничего не закорочить, когда она все прижимается к себе.
  • Так как к GND и + 5V идет очень много всего, мы решили сделать франк-кабель (см. Фото выше) как можно более компактным. Если бы пространство не было проблемой, проще было бы использовать макет или протощит.
  • Некоторые потенциометры имеют причудливую форму. Как правило, левый вывод используется как земля, крайний правый вывод - как питание, а средний - как выход. Если у вас два вывода спереди и один сзади, выходом будет один сзади.

Попался

  • Если вы ничего не видите на ЖК-дисплее, попробуйте повернуть потенциометр полностью в одном направлении, а затем в другом. При самом низком контрасте содержимое ЖК-дисплея полностью невидимо.
  • Если вы видите действительно странную тарабарщину на ЖК-дисплее или только одну строку вместо двух, убедитесь, что все ваши соединения защищены. У нас было неисправное соединение с землей, и это вызывало самые странные проблемы с отображением.
  • Код инициализации ЖК-дисплея (который запускается lcd.init () в функции setup ()) важен и требует времени. Если что-то не так с вашим дисплеем, и вы подозреваете, что неисправен провод, не ждите, что из-за тряски он внезапно заработает. Возможно, вам потребуется перезагрузить Arduino, чтобы код инициализации работал правильно.
  • Убедитесь, что ваши провода довольно короткие, но не слишком короткие. Нет ничего хуже, чем перепаивать, потому что вы находитесь в нескольких сантиметрах от заголовка.

Большой! Теперь давайте заставим его показать несколько необычных вещей.

Шаг 2. Код: основы

Код: Основы
Код: Основы
Код: Основы
Код: Основы

Перво-наперво: пусть в верхней строке дисплея будет отображаться «Текущая цена:», а во второй - случайная цена в некотором диапазоне. Время от времени давайте обновлять цены. Это довольно просто, но подчеркнет основные принципы использования библиотеки LiquidCrystal и некоторые ее особенности.

Сначала давайте подключим библиотеку и определим некоторые константы:

#включают

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

Большой! Это параметры ценового диапазона и того, как часто он будет обновляться. Теперь давайте создадим экземпляр класса LCD, предоставленный библиотекой, и инициализируем его. Мы напечатаем что-нибудь на последовательной консоли, просто чтобы убедиться, что все работает, даже если мы ничего не видим на ЖК-дисплее. Мы сделаем это в функции setup (), которая запускается один раз после загрузки Arduino. Однако обратите внимание, что мы объявляем переменную lcd вне setup (), потому что нам нужен доступ к ней во всей программе.

ЖК-дисплей LiquidCrystal (12, 11, 5, 4, 3, 2); void setup () {Serial.begin (9600); lcd.begin (lcdWidth, lcdHeight);

Serial.println («ЖК-дисплей инициализирован»);

lcd.print ("Текущая цена:");

}

А для мяса мы будем использовать встроенную функцию random () и инициализатор String () для построения десятичной цены. random () генерирует только целые числа, поэтому мы разделим его результат на 100,0, чтобы получить значение с плавающей запятой. Мы сделаем это в loop (), чтобы это происходило как можно чаще, но со случайной задержкой между константами, которые мы определили ранее.

пустой цикл ()

{двойная цена = случайная (minPriceInCents, maxPriceInCents) / 100,0; Строка prettyPrice = "$" + Строка (цена, 2); lcd.setCursor (0, 1); lcd.print (prettyPrice); задержка (случайный (minMillisBetweenPriceUpdates, maxMillisBetweenPriceUpdates)); }

Следует отметить вызов lcd.setCursor (). Библиотека LiquidCrystal не перемещает ваш текст автоматически на следующую строку после печати, поэтому нам нужно вручную переместить (невидимый) курсор на вторую строку (здесь 1 - отсчитывается от нуля). Также обратите внимание, что нам не нужно было снова печатать «Текущая цена:»; ЖК-дисплей не очищается, если вы не сделаете это вручную, поэтому нам нужно только обновить динамический текст.

Попробуйте, и вы быстро увидите связанную проблему. Если цена была, скажем, «14,99 доллара», а затем «7,22 доллара», на дисплее отобразится «7,229 доллара». Помните, что дисплей не очищается сам по себе, если вы этого не сделаете. Даже если вы печатаете в той же строке, любой текст за пределами того, что вы печатаете, останется. Чтобы решить эту проблему, мы должны заполнить нашу строку пробелами, чтобы перезаписать любой потенциальный мусор. Самый простой способ сделать это - просто добавить несколько пробелов в нашу переменную prettyPrice:

Строка prettyPrice = "$" + Строка (цена, 2) + "";

С этим изменением у нас есть доказательство концепции! Давайте немного пофантазируем.

Шаг 3. Код: настраиваемые символы

Код: пользовательские символы
Код: пользовательские символы
Код: пользовательские символы
Код: пользовательские символы

Одна из самых крутых особенностей используемого нами ЖК-модуля - это возможность создавать до 8 пользовательских символов. Это делается с помощью метода createChar (). Этот метод принимает массив размером 8x5 бит, который описывает, какие пиксели ЖК-дисплея включить для данного символа. В Интернете есть несколько инструментов, которые помогут сгенерировать эти массивы. Я использовал этот.

Если вы не чувствуете себя дизайнером, я рекомендую использовать фильтр «Порог» в Photoshop, чтобы превратить изображение в черно-белое и преобразовать его в символы. Помните, что у вас есть максимум 8 пользовательских символов или 64x5 пикселей.

Я решил использовать 6 из этих символов для логотипа со стрелкой Amazon, а оставшиеся 2 - для более красивого символа торговой марки. Вы можете следовать примеру CustomCharacter в Arduino IDE, чтобы узнать, как использовать API. Вот как я решил сгруппировать вещи:

// Определяем данные для символов торговой марки

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; // Байт, используемый для печати этого символа; назначается в initCustomChars ()

Затем я использовал такую функцию, вызываемую из setup (), для создания символов:

void initCustomChars () {

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

После этого напечатать пользовательские символы так же просто, как использовать lcd.write () с соответствующими байтами. Я написал вспомогательную функцию для печати диапазона байтов и определил printTrademark () в ее терминах:

void writeRawByteRange (строка uint8_t, uint8_t col, uint8_t startValue, size_t numBytes)

{для (uint8_t i = 0; i <numBytes; i ++) {lcd.setCursor (col + i, line); // нужно использовать write (), а не print () - print превратит // целое значение в строку и напечатает * это * lcd.write (startValue + i); }} void printTrademark (строка uint8_t, uint8_t col) {writeRawByteRange (строка, столбец, firstTrademarkCharByte, trademarkCharCount); }

Аналогичным образом был обработан логотип стрелки Amazon. См. Прилагаемый код для получения полной информации.

Шаг 4: Код: тонкости

Чтобы облегчить себе жизнь, я добавил в код несколько тонкостей. Сюда входят такие вещи, как: функция для очистки определенной строки путем перезаписи ее пробелами и функция для центрирования данной строки на строке.

Я также хотел, чтобы дисплей циклически проходил через три отдельных этапа:

  1. «Динамическое ценообразование» с логотипом ниже
  2. "by Amazon" с логотипом ниже
  3. отображение случайной цены

Для этого я построил простую систему, которая отслеживает, как долго данная фаза была активной, и после определенного периода переходит к следующей.

См. Прилагаемый код для получения всех подробностей о кровопролитии!

Шаг 5: Коробка

Коробка
Коробка

Теперь, чтобы нас не вызвали саперы, давайте сделаем для всего этого хороший ящик. Мы будем делать это с помощью лазерной резки акрила. Существует множество онлайн-инструментов для быстрого запуска процесса изготовления простых коробок. Я рекомендую сайт makercase.com, поскольку он позволяет указать внутренние размеры и учитывает толщину материала.

Мы измерили Arduino, ЖК-дисплей и батарею на 9 В и подсчитали, что сможем поместить ее в корпус размером 4 x 2,5 x 2 дюйма. Итак, мы подключили их к makercase с толщиной 1/8 дюйма. акрил. Мы изменили получившийся PDF-файл, добавив закругленное окно для ЖК-дисплея и прорезь внизу для тега отображения (подробнее об этом позже). Полученный файл прилагается в виде PDF-файла.

Мы использовали акриловый клей (токсичный метилэтилкетон) для сборки четырех сторон коробки. Затем мы прикрепили ЖК-панель к передней панели горячим клеем. После того, как у нас все заработало и подобралось, мы заклеили последние две стороны коробки горячим клеем, чтобы потом можно было легко разобрать ее. Поскольку мы не ожидали значительного износа устройства, мы оставили Arduino и батарею незакрепленными в нижней части корпуса.

Возможные улучшения

  • Мы не позаботились о том, чтобы включить или выключить устройство. Ха. Место для переключателя на дне или задней части коробки было бы хорошей идеей.
  • Прорезь в нижней части для бирки для подвешивания могла быть ближе к передней части коробки для лучшей видимости.

Шаг 6: смешивание

Смешивание
Смешивание
Смешивание
Смешивание

А теперь самое сложное: украсть его в магазин.

Брендирование Whole Foods

Вот некоторые вещи, которые мы узнали в ходе реверс-инжиниринга брендов Whole Foods и Amazon:

  • Основной текст обычно написан на Scala Sans.
  • Текст заголовка во многом похож на Brighton - один из тех общих «теплых и дружелюбных» шрифтов.
  • Whole Foods Green - это что-то близкое к # 223323
  • Найдите в своем местном магазине примеры повторяющихся графических элементов: им нравятся зубчатые границы, солнечные лучи и простая векторная графика.

Подвесной тег

Мы сделали прорезь в нижней части акрилового футляра, чтобы мы могли прикрепить к коробке подвесную бирку, поясняющую, что происходит. См. Пример в прилагаемом PDF-файле. Его нужно вырезать и вставить в прорезь; он должен подходить и держаться без клея.

Стеллажи

Что касается фактического крепления коробки к полке, Whole Foods использует довольно стандартные компоненты полок. Сняли мерки и нашли в строительном магазине подходящий крючок. Прикрепляем коробку к крючку горячим клеем.

Если вы не можете найти такой крючок, вы можете попробовать магниты - приклейте немного к задней части коробки и просто защелкните на полке.

Развертывать

Установите коробку на уровне глаз, чтобы привлечь внимание прохожих. Не попадитесь! Удачи!

Рекомендуемые: