תוכן עניינים:
- שלב 1: חיבר את הצג
- שלב 2: קוד: יסודות
- שלב 3: קוד: תווים מותאמים אישית
- שלב 4: קוד: נחמדות
- שלב 5: הקופסה
- שלב 6: מיזוג
וִידֵאוֹ: תג מחיר דינמי מזויף: 6 שלבים (עם תמונות)
2024 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2024-01-30 09:16
המחירים של אמזון משתנים כל הזמן. אם תשאיר פריטים בעגלת הקניות שלך למשך יותר מכמה שעות, סביר להניח שתקבל התראה על תנודות דקות - $ 0.10 כאן, $ 2.04 שם. אמזון וסוחריה משתמשים ללא ספק בתמחור אלגוריתמי כלשהו כדי לסחוט את הפרוטה האחרונה מהשוק.
זה הכל צפוי (קפיטליזם מאוחר וכל זה). אבל מה קורה אם הדברים משתבשים? בשנת 2011 פרצה מלחמת תמחור בין שני אלגוריתמים מתחרים. התוצאה: ספר על מחזור החיים של זבובי הבית (אזל, אך לא נדיר במיוחד) זינק למחיר של 23.6 מיליון דולר.
הרכישה האחרונה של אמזון את שוק המזון כולו גרמה לנו לתהות: מה מונע ממחירים דינאמיים להיכנס לעולם הפיזי של הקמעונאות? מה אם המחירים בסופרמרקט היו גמישים לא פחות מהמחירים המקוונים?
אז במדריך זה נבנה תצוגת מחירים דינאמית עם Arduino ו- LCD קטן. נדבר גם בקצרה על התחפושת והתקנתה בחנות.
(ואם אתה מעוניין, תוסף Chrome זה יכול להראות לך את היסטוריית התמחור של כל פריט באמזון במהלך 120 הימים האחרונים.)
חומר נחוץ
להלן מה שנהגנו לבניית הפרויקט הזה:
- Arduino Uno R3
-
צג LCD רגיל בגודל 16x2. השתמשנו בזה מ- Adafruit, אבל כל עוד הוא תואם את ספריית LiquidCrystal, אתה אמור להיות טוב. תצטרך כמה דברים כדי לחבר אותו לארדואינו:
- כמה כבלי מגשר
- נגד 220 אוהם
- פוטנציומטר של 10k אוהם (זה לשליטה בניגודיות התצוגה. אם אתה מוצא ניגודיות שאתה אוהב, אתה יכול להחליף את הפוטנציומטר בנגד קבוע).
- קצת אקריליק לקופסה. השתמשנו באקריליק שחור מאט יצוק, חתוך בלייזר והורכב בעזרת דבק ממס אקרילי ודבק חם.
- מגנטים ו/או וו מדפים לחיבור הקופסה בחנות. אם תלך למסלול הקרס, תוכל למדוד אחד ולהדפיס תלת מימד, או לנסות למצוא אותו באינטרנט (אולי עליבאבא?), או … לרכוש אותו בצורה אחרת ומגעילה יותר. שמרי על עצמך.
ראשית, בואו נתניע את התצוגה!
שלב 1: חיבר את הצג
בוודאי שיש הרבה סיכות בגב ה- LCD הזה. למרבה המזל, בתיעוד של ספריית התוכנה שבה נשתמש יש מדריך טוב לחיבורו. תבדוק את זה.
לסיכום, החיווט שלך אמור להסתיים כך:
-
כּוֹחַ:
- LCD GND (סיכה 1) → Arduino GND
- LCD 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
כשהכל מוכן, טען את אחד הפרויקטים של LiquidCrystal לדוגמה ב- Arduino IDE ובדוק אם זה עובד! זכור לבדוק שוב את קוד האתחול של ה- LCD בדגימות-מספרי הסיכה צריכים להיות נכונים או שלא תראה דבר.
לדוגמה, לדוגמא "מהבהב" יש קוד זה, הנכון בהתחשב בהתקנה שלמעלה:
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
טיפים
- חסוך לעצמך הלחמה והשקיע בכמה קצוות כיווץ ומחברי כותרות. בפרויקטים כאלה שבהם אנחנו הולכים לדחוס את האלקטרוניקה למארז קטן, היכולת ליצור כבלי מגשר קצרים עוזרת להפליא.
- באופן דומה, צינורות חום הם ממש שימושיים כדי לוודא ששום דבר לא יתקצר כשהכל לחוץ כלפי עצמו.
- מכיוון שיש כל כך הרבה דברים שהולכים ל- GND ו- +5V, בחרנו לייצר כבל פרנק (ראו את התמונה למעלה) כדי להיות קומפקטי ככל האפשר. אם שטח היה פחות בעיה, לוח לחם או פרוטושילד היו אופציה קלה יותר.
- כמה פוטנציומטרים מעוצבים בצורה מוזרה. באופן כללי, ההובלה השמאלית משמשת כקרקע, המוביל הימני ביותר ככוח, והאמצעי כפלט. אם שלך יש שני מוליכים בחזית ואחד מאחור, האחד מאחור הוא הפלט.
גוטצ'ס
- אם אינך רואה דבר על מסך ה- LCD שלך, נסה לסובב את הפוטנציומטר עד לכיוון אחד, ואז לכיוון השני. בניגוד הנמוך ביותר שלו, התוכן של ה- LCD בלתי נראה לחלוטין.
- אם אתה רואה זבל ממש מוזר על ה- LCD, או רק שורה אחת במקום שתיים, ודא שכל החיבורים שלך מאובטחים. היה לנו חיבור לקוי לקרקע וזה גרם לבעיות התצוגה המוזרות ביותר.
- קוד האתחול של LCD (מה שמופעל על ידי lcd.init () בפונקציית ההתקנה ()) חשוב ולוקח זמן. אם משהו לא בסדר בתצוגה שלך ואתה חושד בחוט פגום, אל תצפה שדברים מתנודדים יפתחו אותו פתאום. ייתכן שיהיה עליך לאפס את ה- 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 המסופקת על ידי הספרייה ונאתחל אותה. אנו נדפיס משהו על הקונסולה הסדרתית, רק כדי שיהיה לנו ביטחון שהדברים עובדים, גם אם איננו רואים דבר על ה- LCD. אנו נעשה זאת בפונקציית ההתקנה (), הפועלת פעם אחת לאחר מגפי הארדואינו. עם זאת, שים לב כי אנו מצהירים על משתנה lcd מחוץ להגדרות (), מכיוון שאנו רוצים גישה אליו לאורך כל התוכנית.
LiquidCrystal lcd (12, 11, 5, 4, 3, 2); הגדרת void () {Serial.begin (9600); lcd.begin (lcdWidth, lcdHeight);
Serial.println ("אתחול LCD");
lcd.print ("מחיר נוכחי:");
}
ולבשר, נשתמש בפונקציה האקראית () המובנית ובאתחול String () לבניית מחיר עשרוני. random () יוצר רק מספרים שלמים, לכן נחלק את התוצאה שלו ב -100.0 כדי לקבל ערך נקודה צפה. אנו נעשה זאת בלולאה (), כך שזה קורה לעתים קרובות ככל האפשר, אך בעיכוב אקראי בין הקבועים שהגדרנו קודם לכן.
לולאת חלל ()
{מחיר כפול = אקראי (minPriceInCents, maxPriceInCents) / 100.0; String prettyPrice = "$" + מחרוזת (מחיר, 2); lcd.setCursor (0, 1); lcd.print (prettyPrice); עיכוב (אקראי (minMillisBetweenPriceUpdates, maxMillisBetweenPriceUpdates)); }
דבר אחד שצריך לשים לב אליו הוא הקריאה ל lcd.setCursor (). ספריית LiquidCrystal לא מקדמת את הטקסט שלך אוטומטית לשורה הבאה לאחר הדפסה, לכן עלינו להעביר את הסמן (הבלתי נראה) ידנית לשורה השנייה (כאן 1-הוא מבוסס על אפס). שים לב גם שלא היינו צריכים להדפיס שוב "מחיר נוכחי:"; מסך ה- LCD אינו מוסר אלא אם כן אתה עושה זאת באופן ידני, לכן עלינו לעדכן רק טקסט דינמי.
תן לזה לרוץ ותראה במהירות בעיה קשורה. אם המחיר היה, למשל, "$ 14.99" ולאחר מכן "$ 7.22", התצוגה תציג "$ 7.229". זכור, התצוגה אינה מנקה את עצמה אלא אם כן אתה אומר זאת. גם אם תדפיס על אותה שורה, כל טקסט שעבר מה שאתה מדפיס יישאר. כדי לפתור בעיה זו, עלינו לרפד את המחרוזת ברווחים כדי להחליף כל זבל אפשרי. הדרך הקלה ביותר לעשות זאת היא רק להדביק כמה רווחים למשתנה prettyPrice שלנו:
String prettyPrice = "$" + מחרוזת (מחיר, 2) + "";
עם שינוי זה במקום, יש לנו הוכחת מושג! בואו נתעסק קצת.
שלב 3: קוד: תווים מותאמים אישית
אחת התכונות המגניבות ביותר של מודול ה- LCD בה אנו משתמשים היא היכולת ליצור עד 8 תווים מותאמים אישית. זה נעשה באמצעות שיטת createChar (). שיטה זו לוקחת מערך של 8x5 סיביות המתאר את אילו הפיקסלים של ה- LCD להפעיל עבור התו הנתון. ישנם כמה כלים מקוונים שיסייעו ליצירת מערכים אלה. השתמשתי בזה.
אם אינך מרגיש מעוצב במיוחד, אני ממליץ להשתמש במסנן סף ב- Photoshop כדי להפוך תמונה לשחור-לבן ולהמיר אותה לתווים. זכור שיש לך עד 8 תווים מותאמים אישית לכל היותר, או 64x5 פיקסלים.
בחרתי להשתמש ב -6 מהתווים האלה ללוגו החץ של אמזון, וב -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, B000 B00000}}; uint8_t firstTrademarkCharByte; // הבייט המשמש להדפסת תו זה; מוקצה ב- initCustomChars ()
לאחר מכן השתמשתי בפונקציה כזו, הנקראת מתוך setup (), ליצירת התווים:
בטל 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)
{for (uint8_t i = 0; i <numBytes; i ++) {lcd.setCursor (col+i, line); // צריך להשתמש בכתוב (), לא בהדפסה () - הדפסה תהפוך את ערך המספר השלם // למחרוזת ותדפיס * ש * lcd.write (startValue + i); }} void printTrademark (uint8_t line, uint8_t col) {writeRawByteRange (line, col, firstTrademarkCharByte, trademarkCharCount); }
הלוגו של חץ אמזון טופל באופן דומה. עיין בקוד המצורף לפרטים מלאים.
שלב 4: קוד: נחמדות
כדי להקל על עצמי קצת, הוספתי כמה ניגונים לקוד. זה כולל דברים כמו: פונקציה לניקוי קו ספציפי על ידי החלפתו ברווחים ופונקציה למרכז מחרוזת נתונה על קו.
רציתי גם שהתצוגה תעבור בין שלושה שלבים נפרדים:
- "תמחור דינמי" עם הלוגו למטה
- "מאת אמזון" עם הלוגו למטה
- הצגת מחיר אקראי
לשם כך בניתי מערכת פשוטה שעוקבת אחר כמה זמן שלב נתון היה פעיל, ולאחר תקופה מסוימת, עובר לשלב הבא.
עיינו בקוד המצורף לכל הפרטים המטורפים!
שלב 5: הקופסה
עכשיו, כדי שלא נקרא אלינו את כיתת הפצצות, בואו נכין קופסה יפה לכל העניין. אנו נעשה זאת בעזרת אקריליק בחיתוך לייזר. ישנם הרבה כלים מקוונים לזינוק בתהליך הכנת קופסאות פשוטות. אני ממליץ על makercase.com, מכיוון שהוא מאפשר לך לציין את הממדים הפנימיים ואת החשבונות של עובי החומר.
מדדנו את סוללת ה- Arduino, ה- LCD וה- 9V, והערכנו שנוכל להתאים אותה למארז בגודל 4 "x 2.5" x 2 ". לכן חיברנו אותם לארגז, עם עובי של 1/8" אַקרִילִי. שינינו את קובץ ה- PDF שנוצר כדי להוסיף חלון מעוגל עבור ה- LCD, וחריץ לאורך החלק התחתון של תג תצוגה (עוד על כך בהמשך). הקובץ המתקבל מצורף כקובץ PDF.
השתמשנו בדבק אקרילי (מסוג מתיל אתיל קטון רעיל) להרכיב ארבעה צדדים של הקופסה. לאחר מכן חיברנו את לוח ה- LCD לחזית בעזרת דבק חם. לאחר שהכל עובד ומתאים, אטמנו את שני הצדדים האחרונים של הקופסה בדבק חם, כך שנוכל לפרק אותה בקלות מאוחר יותר. מכיוון שלא ציפינו שהמכשיר יקבל בלאי רב, השארנו את הארדואינו והסוללה ללא אבטחה בתחתית המארז.
שיפורים אפשריים
- הזנחנו לבנות בכל דרך להפעלה או כיבוי של המכשיר. הא. מקום למתג בתחתית או בחלק האחורי של הקופסה היה רעיון טוב.
- החריץ לאורך החלק התחתון של התג התלוי יכול היה להיות קרוב יותר לחזית התיבה, לשיפור הראות.
שלב 6: מיזוג
ועכשיו, החלק הקשה: להתגנב לחנות.
מיתוג Whole Foods
כמה דברים שלמדנו בהנדסה הפוכה של Whole Foods ומיתוג אמזון:
- טקסט גוף הוא בדרך כלל ב- Scala Sans
- טקסט כותרת נמצא במשהו שנראה מאוד כמו ברייטון - אחד מאותם גופנים "חמים וידידותיים" גנריים
- Whole Foods Green הוא משהו קרוב למספר 223323
- צא מהחנות המקומית שלך לקבלת דוגמאות לאלמנטים גרפיים שחוזרים על עצמם: הם אוהבים גבולות קרועים, התפרצויות שמש ואמנות וקטורית פשוטה.
התג התלוי
חתכנו חריץ בתחתית מארז האקריליק כדי שנוכל להצמיד תג תלוי לקופסה, המסביר מה קורה. עיין בדף ה- PDF המצורף לדוגמא. זה נועד לחתוך ולהכניס לחריץ; זה צריך להתאים ולהחזיק ללא כל דבק.
מדפים
באשר לחיבור הקופסה למעשה למדף, Whole Foods משתמשת ברכיבי מדפים סטנדרטיים למדי. לקחנו מדידות ומצאנו וו תואם בחנות חומרי בניין. הדבקנו את הקופסה על הקרס בעזרת דבק חם.
אם אינך יכול למצוא קרס כזה, תוכל לנסות מגנטים - הדבק מעט בחלק האחורי של הקופסה ופשוט הצמיד אותו למדף.
לפרוס
הנח את הקופסה בגובה העיניים כדי למשוך את תשומת לב העוברים והשבים. אל תתפסו! בהצלחה!
מוּמלָץ:
קבל מחיר ביטקוין בשידור חי TTGO ESP32: 10 שלבים
קבל מחיר BITCOIN LIVE TTGO ESP32: במדריך זה נלמד כיצד לקבל מחיר ביטקוין נוכחי בדולר ארה"ב באמצעות TTGO ESP32 ו- Visuino. צפה בסרטון. (קובץ עדכון חדש להורדה למטה!)
כיצד ליצור אזעקה לרכב מזויף באמצעות טיימר 555: 5 שלבים
כיצד ליצור אזעקת רכב מזויפת באמצעות טיימר 555: פרויקט זה מראה כיצד להכין נורת LED מהבהבת בעיכוב של חמש שניות באמצעות NE555. זה יכול לשמש אזעקת רכב מזויפת, מכיוון שהיא מחקה מערכת אזעקה לרכב עם נורית LED מהבהבת אדומה בוהקת. רמת קושי המעגל עצמו אינו קשה
בלוק זיכרון דינמי DIY: 5 שלבים
בלוק זיכרון דינמי DIY: SLG46880 ו- SLG46881 מציגים מספר בלוקים חדשים שלא הופיעו במכשירי GreenPAK קודמים. הערת יישום זו מתארת את בלוקי הזיכרון הדינמי (DM) ואת אופן השימוש בהם. היתרון העיקרי של בלוקים DM הוא שניתן להגדירם מחדש
מחיר מטבע במט"ח VISUINO Live מהאינטרנט: 9 שלבים
VISUINO הצג מחיר מטבע במט"ח חי מהאינטרנט: במדריך זה נשתמש ב- NodeMCU Mini, OLED Lcd ו- Visuino כדי להציג מחיר מטבע חי EUR/USD כל כמה שניות מהאינטרנט על LCD. צפה בסרטון הדגמה
בקר דינמי ELIO: 3 שלבים
בקר דינמי ELIO: ELIO הוא בקר רב-תפקודי ליוצרים. בתי, כיתה ה ', עשתה מכונית נעה בבית הספר שלה. המכונית הייתה כל כך פשוטה, צעצוע המופעל על ידי מתג. היא שלחה את המכונית לאחותה בצד השני ביד, מכיוון שלמכונית אין שליטה