Мазмуну:

Жасалма динамикалык баа теги: 6 кадам (сүрөттөр менен)
Жасалма динамикалык баа теги: 6 кадам (сүрөттөр менен)

Video: Жасалма динамикалык баа теги: 6 кадам (сүрөттөр менен)

Video: Жасалма динамикалык баа теги: 6 кадам (сүрөттөр менен)
Video: Мега макак и змея ► 7 Прохождение Sekiro: Shadows Die Twice 2024, Июль
Anonim
Image
Image
Дисплейди жандандыруу
Дисплейди жандандыруу

Amazonдун баасы дайыма өзгөрүп турат. Эгерде сиз товарларыңызды арабаңызга бир нече сааттан ашык калтырсаңыз, анда сиз мүнөттүк өзгөрүүлөр жөнүндө эскертүү аласыз - бул жерде $ 0.10, ал жерде $ 2.04. Amazon жана анын соодагерлери, албетте, акыркы тыйынды базардан чыгаруу үчүн кандайдыр бир алгоритмдик бааны колдонуп жатышат.

Муну баары күтөт (кеч капитализм жана мунун баары). Бирок, баары ойдогудай болбой калса эмне болот? 2011 -жылы эки атаандаш алгоритмдин ортосунда баа согушу башталган. Жыйынтык: үй чымындарынын жашоо цикли жөнүндө китеп (басылып чыкпаган, бирок өзгөчө сейрек эмес) 23,6 миллион долларга кымбаттады.

Amazonдун Whole Foods Marketти жакында сатып алышы бизди таң калтырды: динамикалык баа чекене соода дүйнөсүнө киришине эмне тоскоол болуп жатат? Супермаркетте баалар интернеттегидей ийкемдүү болсочу?

Ошентип, бул Нускамада биз Arduino жана кичинекей ЖК менен динамикалык баа дисплейин курабыз. Дүкөнгө маскировкалоо жана орнотуу жөнүндө да кыскача сүйлөшөбүз.

(Эгер сизди кызыктырса, бул Chrome плагин сизге акыркы 120 күндүн ичинде Amazonдогу каалаган нерсенин баасынын тарыхын көрсөтө алат.)

Керектүү материал

Бул жерде биз бул долбоорду куруу үчүн эмне кылдык:

  • An Arduino Uno R3
  • Стандарттык 16x2 LCD дисплей. Биз муну Adafruitтен колдондук, бирок ал LiquidCrystal китепканасы менен шайкеш болгондо, сиз жакшы болушуңуз керек. Ардуиного туташтыруу үчүн сизге бир нече нерсе керек болот:

    • кээ бир кабелдер
    • 220 Ом каршылыгы
    • 10k ohm потенциометр (Бул дисплейдин контрастын көзөмөлдөө үчүн. Эгер сиз жактырган контрастты тапсаңыз, потенциометрди туруктуу резистор менен алмаштырсаңыз болот.)
  • Кутуга кээ бир акрил. Биз куюлган жалтырабаган кара акрилди, лазердик кесүүнү колдонуп, акрил ээритүүчү-клей жана ысык клей менен чогулду.
  • Дүкөндө кутучаны бекитүү үчүн магниттер жана/же текче илгичи. Эгерде сиз кайырмак жолуна түшсөңүз, бирөөнү ченеп, 3D басып чыгарсаңыз болот же интернеттен табууга аракет кылсаңыз болот (Alibaba, балким?), Же … аны башка, ыплас түрдө сатып алсаңыз болот. Аман болуңуз.

Биринчиден, дисплейди иштетели!

1 -кадам: Дисплейди жандандыруу

Дисплейин жандандыруу
Дисплейин жандандыруу
Дисплейин жандандыруу
Дисплейин жандандыруу

Албетте, ошол ЖКнын артында көптөгөн казыктар бар. Бактыга жараша, биз колдоно турган программалык китепкананын документтери аны туташтыруу үчүн жакшы колдонмого ээ. Муну карап көр.

Жыйынтыктап айтканда, сиздин зым төмөнкүчө бүтүшү керек:

  • Кубат:

    • LCD GND (пин 1) → Arduino GND
    • ЖК VDD (2 -пин) → Arduino +5V
    • LCD RW (пин 5) → Arduino GND
  • Маалыматтар:

    • LCD RS (пин 4) → Arduino санарип пин 12
    • LCD иштетүү (пин 6) → Arduino санарип пин 11
    • LCD D4 (пин 11) → санарип пин 5
    • LCD D5 (пин 12) → санарип пин 4
    • LCD D6 (пин 13) → санарип пин 3
    • LCD D7 (пин 14) → санарип пин 2
  • Контраст дисплейи:

    • 10k потенциометрдин буттарын Arduino +5V жана GNDге өткөрүңүз
    • Потенциометрдин чыгышы → LCD VO (пин 3).
  • Арткы жарык:

    • LCD BL1 (пин 15) → 220 ом каршылыгы → Arduino +5V
    • LCD BL2 (пин 16) → Arduino GND

Баары бүткөндөн кийин, Arduino IDEдеги LiquidCrystal долбоорлорунун бирин жүктөңүз жана анын иштээрин көрүңүз! Үлгүлөрдөгү ЖК инициализация кодун эки жолу текшерүүнү унутпаңыз-пин сандары туура болушу керек, болбосо сиз эч нерсе көрбөйсүз.

Мисалы, "Blink" мисалында бул код бар, ал жогоруда орнотулганда туура болот:

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

Кеңештер

  • Өзүңүздү бир аз ширетүүдөн сактаңыз жана кээ бир бурмаланган учтарга жана баш коннекторлоруна инвестиция салыңыз. Электрониканы кичинекей коробкага тыгып турган мындай долбоорлордо кыска секирүүчү кабелдерди жасоо абдан пайдалуу.
  • Ошо сыяктуу эле, heatshrink түтүкчөлөрү өзүнө каршы басылганда эч нерсе кыскартылбашы үчүн чындап эле пайдалуу.
  • GND жана +5V үчүн көп нерселер бар болгондуктан, биз мүмкүн болушунча компакт болуш үчүн ачык кабель жасоону чечтик (жогорудагы сүрөттү караңыз). Эгерде мейкиндик көйгөйү азыраак болсо, нан тактасы же протошел оңой болмок.
  • Кээ бир потенциометрлер кызыктай формада. Жалпысынан алганда, сол коргошун жер катары, эң оң коргошун күч катары жана ортоңку бөлүгү чыгаруу катары колдонулат. Эгерде сиздики алдыңкы жана арткы эки учу бар болсо, анда арткы жагындагысы чыгаруу болуп саналат.

Gotchas

  • Эгерде сиз ЖКда эч нерсе көрбөй жатсаңыз, потенциометрди бир жакка, андан кийин башка жакка буруп көрүңүз. Эң төмөнкү контрастта ЖКнын мазмуну таптакыр көрүнбөйт.
  • Эгерде сиз ЖКда чындап эле кызыктай же эки сызыктын ордуна бир гана линияны көрсөңүз, анда бардык туташууларыңыздын коопсуздугун текшериңиз. Бизде жерге туура эмес туташуу болгон жана ал эң кызык дисплей көйгөйлөрүн жаратып жаткан.
  • ЖКнын инициализация коду (lcd.init () тарабынан орнотулган () функциясында) маанилүү жана бир аз убакыт талап кылынат. Эгерде дисплейиңизде бир нерсе туура эмес болсо жана сиз зымдын бузулганынан шектенсеңиз, анда күтүлбөгөн жерден иштей баштайт деп күтпөңүз. Ардуинону баштапкы абалга келтирүү керек болушу мүмкүн, андыктан инициализация коду туура иштөөгө мүмкүнчүлүк алат.
  • Сиздин зымдар абдан кыска экенин текшериңиз, бирок өтө кыска эмес. Башынан бир нече сантиметр алыстыкта болгондуктан, кайра сатууга туура келгенден өткөн жаман нерсе жок.

Абдан жакшы! Эми муну кээ бир кооз нерселерди көрсөтөлү.

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

Абдан жакшы! Бул баа диапазонунун параметрлери жана ал канчалык тез -тез жаңырат. Эми китепкана тарабынан берилген ЖК классынын мисалын түзүп, аны инициализациялайбыз. Биз ЖКда эч нерсе көрбөсөк дагы, баары иштеп жатканына ынануу үчүн, сериялык консолго бир нерсени басып чыгарабыз. Биз муну Arduino өтүгүнөн кийин бир жолу иштей турган setup () функциясында жасайбыз. Эске алчу нерсе, биз lcd өзгөрмөсүн setup () сыртында жарыялайбыз, анткени биз ага программа бою жетүүнү каалайбыз.

LiquidCrystal lcd (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; String prettyPrice = "$" + Стринг (баасы, 2); lcd.setCursor (0, 1); lcd.print (prettyPrice); кечигүү (туш келди (minMillisBetweenPriceUpdates, maxMillisBetweenPriceUpdates)); }

Белгилей кетчү нерсе, lcd.setCursor (). LiquidCrystal китепканасы басып чыгаргандан кийин текстти кийинки сапка автоматтык түрдө жылдырбайт, ошондуктан биз (көрүнбөгөн) курсорду экинчи сапка кол менен жылдырышыбыз керек (бул жерде 1-бул нөлгө негизделген). Ошондой эле, "Учурдагы баа:" дегенди кайра басып чыгаруунун кажети жок экенин эске алыңыз; эгер сиз муну кол менен жасабасаңыз, ЖК тазаланбайт, андыктан динамикалык текстти гана жаңыртуу керек.

Чуркап көрүңүз, ошондо сиз тийиштүү көйгөйдү тез көрөсүз. Эгер баасы "$ 14.99", анан "$ 7.22" болгон болсо, дисплейде "$ 7.229" көрсөтүлөт. Унутпаңыз, дисплей өзү айтпаса өзү тазаланбайт. Эгер сиз ошол эле сапта басып чыгарсаңыз да, басып чыгарган тексттин баары калат. Бул көйгөйдү чечүү үчүн, биз потенциалдуу таштандылардын үстүнө жазуу үчүн сапты боштуктар менен толтурушубуз керек. Муну жасоонун эң оңой жолу - бул биздин бир нече боштукту колдонуу менен биздин prettyPrice өзгөрмөсү:

String prettyPrice = "$" + Стринг (баасы, 2) + "";

Бул өзгөрүү менен бизде түшүнүктүн далили бар! Келгиле, аны бир аз чыңдап алалы.

3 -кадам: Код: Ыңгайлаштырылган белгилер

Код: Ыңгайлаштырылган белгилер
Код: Ыңгайлаштырылган белгилер
Код: Ыңгайлаштырылган белгилер
Код: Ыңгайлаштырылган белгилер

Биз колдонуп жаткан ЖК модулунун эң сонун өзгөчөлүктөрүнүн бири - бул 8 бажы белгисине чейин түзүү. Бул createChar () ыкмасы аркылуу жасалат. Бул ыкма 8х5 биттен турган массивди камтыйт, алар ЖКнын кайсы пикселдери берилген белгини күйгүзүүнү сүрөттөйт. Бул массивдерди түзүүгө жардам берүү үчүн Интернетте бир нече куралдар бар. Мен муну колдондум.

Эгерде сизде өзгөчө дизайнерлик сезим жок болсо, мен сүрөттү ак-карага айландыруу үчүн Photoshopтун босогосундагы чыпканы колдонууну жана муну каармандарга айландырууну сунуштайм. Эсиңизде болсун, сизде эң көп 8 бажы белгиси же 64x5 пиксел бар.

Мен Amazon жебесинин логотиби үчүн ошол 6 белгини, ал эми калган 2син жакшы соода белгиси үчүн колдонууну чечтим. API'ди кантип колдонуу керектигин билүү үчүн, Arduino IDEдеги CustomCharacter мисалын ээрчип алсаңыз болот. Мен нерселерди топтоону чечтим:

// Соода белгисинин маалыматтарын аныктаңыз

const size_t соода маркасыCharCount = 2; const uint8_t соода маркасыChars [trademarkCharCount] [8] = {{B00111, B00010, B00010, B00000, B00000, B00000, B00000, B00000}, {B10100, B11100, B10100, B00000, B00000, B00000, B00000 B00000}}; uint8_t firstTrademarkCharByte; // Бул белгини басып чыгаруу үчүн колдонулган байт; initCustomChars () ичинде дайындалган

Андан кийин мен белгилерди түзүү үчүн setup () деп аталган функцияны колдондум:

жараксыз initCustomChars () {

firstTrademarkCharByte = 0; for (size_t i = 0; i <trademarkCharCount; i ++) {lcd.createChar (logoCharCount+i, (uint8_t *) соода маркасыChars ); }}

Андан кийин, ыңгайлаштырылган белгилерди басып чыгаруу lcd.write () ды тиешелүү байттар менен колдонуу сыяктуу жөнөкөй. Мен бир катар байттарды басып чыгаруу үчүн жардамчы функциясын жаздым жана printTrademark () дегенди аныктадым:

жараксыз WriteRawByteRange (uint8_t сап, uint8_t col, uint8_t startValue, size_t numBytes)

{for (uint8_t i = 0; i <numBytes; i ++) {lcd.setCursor (col+i, line); // print () эмес, write () колдонуу керек - print бүтүн // маанисин сапка айлантат жана * lcd.write (startValue + i) басып чыгарат; }} жараксыз printTrademark (uint8_t сап, uint8_t col) {writeRawByteRange (сызык, кол, биринчиTrademarkCharByte, соода маркасыCharCount); }

Amazon жебесинин логотипине да ушундай мамиле жасалды. Толук маалымат алуу үчүн тиркелген кодду караңыз.

4 -кадам: Код: Жөнөкөй

Өзүмдү бир аз жеңилдетүү үчүн, мен кодго бир нече кооздуктарды коштум. Бул сыяктуу нерселерди камтыйт: белгилүү бир сапты боштуктар менен кайра жазуу менен тазалоо функциясы жана берилген сапты сапка борборлоштуруу функциясы.

Мен ошондой эле дисплейдин үч фазадан өтүшүн кааладым:

  1. Төмөндө логотиби бар "Динамикалык баа"
  2. Төмөндө логотиби бар "Amazon тарабынан"
  3. туш келди дисплей

Бул үчүн мен кайсы бир фазанын канча убакыт активдүү болгонун эсепке алган жана белгилүү бир убакыттан кийин экинчисине өтүүчү жөнөкөй системаны түздүм.

Бардык коркунучтуу деталдар үчүн тиркелген кодду караңыз!

5 -кадам: кутуча

Куту
Куту

Эми, ошондуктан биз бомба отряды чакырылган жок, келгиле, бардыгы үчүн жакшы куту жасайбыз. Биз муну лазер менен кесилген акрил менен жасайбыз. Жөнөкөй кутучаларды жасоо процессин баштоо үчүн көптөгөн онлайн инструменттери бар. Мен makercase.com сунуштайм, анткени ал материалдын калыңдыгын ички өлчөмдөрүн жана эсептерин көрсөтүүгө мүмкүндүк берет.

Биз Arduino, LCD жана 9V батарейкасын ченеп, аны 4 "x 2.5" x 2 "өлчөмүндөгү корпуска сыйдыра алаарыбызды эсептедик. Ошентип, биз аларды калыңдыгы 1/8 дюймга коштук. акрил. Биз ЖК үчүн тегеректелген терезени жана дисплей теги үчүн ылдый жагындагы слотту кошуу үчүн пайда болгон PDFти өзгөрттүк (бул тууралуу кийинчерээк). Алынган файл PDF катары тиркелет.

Биз кутунун төрт тарабын чогултуу үчүн акрил клейин (уулуу метил этил кетон түрү) колдондук. Андан кийин биз LCD панелди ысык клей менен маңдайына бекиттик. Баары иштеп, жабдылгандан кийин, кутунун акыркы эки жагын ысык клей менен мөөрлөдүк, ошондон кийин аны оңой эле бөлүп алчубуз. Биз түзмөктүн эскирүүсүн күтпөгөндүктөн, Arduino менен батарейканы корпустун ылдый жагында калтырып койдук.

Мүмкүн болгон жакшыртуулар

  • Биз аппаратты күйгүзүү же өчүрүү үчүн кандайдыр бир жол менен курууга көңүл бурбай койдук. Ха. Кутунун түбүнө же артына которуштуруу үчүн бөлмө жакшы идея болмок.
  • Илинип турган теги үчүн түбүндөгү оюк жакшыртылган көрүнүшү үчүн, кутунун алдыңкы жагына жакыныраак болмок.

6 -кадам: аралаштыруу

Аралашуу
Аралашуу
Аралашуу
Аралашуу

Эми, кыйын бөлүгү: дүкөнгө кирүү.

Whole Foods бренди

Whole Foods жана Amazon брендинин тескери инженериясында үйрөнгөн нерселерибиз:

  • Негизги текст жалпысынан Scala Sans тилинде
  • Башкы текст Брайтонго окшош нерседе - жалпы "жылуу жана достук" шрифттердин бири
  • Whole Foods Green - бул #223323кө жакын нерсе
  • Жергиликтүү дүкөнүңүздү кайталап турган графикалык элементтердин мисалдары үчүн кызыктырыңыз: алар кыркылган чек араларды, күндүн нурун жана жөнөкөй вектордук чеберчиликти жакшы көрүшөт.

Илинип турган тег

Биз акрил корпустун түбүндөгү тешикти кесип, кутуга илинип турган тегди бекитип, эмне болуп жатканын түшүндүрүп бердик. Мисал үчүн тиркелген PDFти караңыз. Бул кесип жана оюкка салуу үчүн иштелип чыккан; ал эч кандай жабышкаксыз туруп, кармалышы керек.

Текчелер

Чындыгында кутуну текчеге тиркөө боюнча айта турган болсок, Whole Foods текченин стандарттык компоненттерин колдонот. Биз өлчөөлөрдү алып, шаймандар дүкөнүнөн ылайыктуу илгичти таптык. Коробканы илмекке ысык клей менен чаптадык.

Эгер андай илгич таба албасаңыз, анда магнитти колдонуп көрүңүз - кээ бирлерди кутунун артына чаптап, текчеге илип коюңуз.

Орнотуу

Өткөөлдөрдүн көңүлүн буруу үчүн кутучаны көздүн деңгээлине коюңуз. Кармаңыз! Ийгилик каалайм!

Сунушталууда: