כאשר אתה לוקח את הטלפון בשמש או בתאורה גבוהה, הוא מכוון את הבהירות באופן אוטומטי בהתאם לתנאי התאורה. ברוב מכשירי התצוגה בימים אלה, בין אם מדובר בטלוויזיה או בטלפון נייד, יש את חיישן התאורה הסביבה בכדי להתאים את הבהירות באופן אוטומטי. היום במדריך זה נשתמש בחיישן אחד כזה BH1750 מודול חיישן אור ונממשק אותו עם Arduino ונציג את ערך ה- Lux מעל 16x2 LCD.
מבוא למודול חיישן האור הדיגיטלי BH1750
BH1750 הוא חיישן תאורה סביבתית דיגיטלית או חיישן עוצמת אור, שבאמצעותו ניתן לכוונן אוטומטית את בהירות התצוגה בניידים, צגי LCD או להדליק / לכבות את הפנסים במכוניות בהתבסס על תנאי התאורה בחוץ.
החיישן משתמש בפרוטוקול תקשורת סדרתי I 2 C שמקל על השימוש עם מיקרו-בקרים. לתקשורת I2C יש לו סיכות SDI ו- SDA. Pinout של חיישן אור BH1750 אמביינט מוצג להלן:
הפלט של חיישן זה הוא ב- LUX (lx), כך שהוא אינו דורש חישובים נוספים. לוקס היא היחידה למדידת עוצמת האור. הוא מודד את העוצמה בהתאם לכמות האור המכה באזור מסוים. לוקס אחד שווה לומן אחד למטר מרובע.
החיישן פועל על מתח בין 2.4V ל 3.6V (בדרך כלל 3.0V) והיא צורכת הנוכחי של 0.12mA. לחיישן זה טווח רחב ורזולוציה גבוהה (1-65535lx) ובנוסף, גם וריאציית המדידה קטנה (בערך +/- 20%). זה יכול לעבוד גם באופן עצמאי ללא כל רכיב חיצוני.
אמנם ניתן להשתמש בחיישן LDR גם לשליטה בהתקנים בהתבסס על תנאי תאורה אך זה לא כל כך מדויק. השתמשנו בחיישן LDR לבניית יישומים רבים מבוקרי אור:
- מעגל חיישן אור Arduino באמצעות LDR
- גלאי כהה באמצעות LDR ו- IC 555 טיימר
- מעגל LDR פשוט לזיהוי אור
- מנורת ערבוב צבעונית Arduino באמצעות RGB LED ו- LDR
ארדואינו
תרשים המעגל לחיבור חיישן האור BH1750 עם Arduino מוצג להלן.
סיכות תקשורת I2C SDA ו- SCL של BH1750 מחוברות לסיכת Arduino A4 ו- A5 בהתאמה לתקשורת I 2 C. כידוע מתח ההפעלה של החיישן הוא 3.3v ולכן VCC ו- GND של BH1750 מחוברים ל- 3.3V ו- GND של Arduino. עבור LCD, סיכות נתונים (D4-D7) מחוברות לסיכות הדיגיטליות D2-D5 של Arduino ו- RS ו- EN פינים מחוברים ל- D6 ו- D7 של Arduino. V0 של LCD מחובר לסיר וסיר 10k משמש לשליטה על בהירות ה- LCD.
תכנות Arduino לממשק חיישן אור BH1750
חלק התכנות לשימוש בחיישן LUX זה עם Arduino קל מאוד. אמנם קיימת ספרייה עבור חיישן זה, אך אנו יכולים להשתמש בה גם ללא זה.
ראשית, כללנו קבצי כותרות עבור פרוטוקול LCD ו- I 2 C.
#לִכלוֹל
בשנת התקנת פונקציה, שמנו אותחלו שניהם LCD ו חיישן מודפס מסר הפתיחה על LCD.
הגדרת חלל () { Wire.begin (); lcd.begin (16,2); lcd.print ("אור BH1750"); lcd.setCursor (0,1); lcd.print ("חיישן עוצמה"); עיכוב (2000); }
הנה BH1750_Read ו BH1750_Init פונקציות משמשות לקרוא ולכתוב ערכי Lux בהתאמה. Wire.beginTransmission () הפונקציה משמשת כדי להתחיל את השידור ואת Wire.requestFrom (כתובת, 2) פונקציה משמשת לקריאת רושם שם 2 מציין את מספר האוגרים.
בהמשך Wire.endTransmission () משמש כדי לסיים את השידור ו Wire.write () פונקציה משמשת ללכת במרשם רצוי על ידי הזנת הכתובת של אותה הקופה בה.
int BH1750_Read (int כתובת) { int i = 0; Wire.beginTransmission (כתובת); Wire.requestFrom (כתובת, 2); בעוד (Wire.available ()) { buff = Wire.read (); i ++; } Wire.endTransmission (); להחזיר אני; } בטל BH1750_Init (כתובת int) { Wire.beginTransmission (כתובת); Wire.write (0x10); Wire.endTransmission (); }
בשנת לולאה פונקציה, אנחנו מדפיסים את הערכים לוקס בזמן אמת מעל LCD. ראשית השווה את ערך ההחזרה מפונקציית BH1750_Read עם 2, ואז התחל להדפיס את ערכי ה- Lux אם הוא שווה ל- 2. כאן הערכים מושווים עם 2 מכיוון שהפונקציה BH1750_Read מחזירה את ערך ספירת הרישום ואנחנו קוראים רק 2 רושמים. אז כשהוא מגיע ל -2, התוכנית מתחילה להדפיס את ערכי LUX בעוצמת האור.
ואז משתמשים בנוסחה כדי לקבל את הערכים משני הרשמים ולחלק אותם ל- 1.2, שזה דיוק המדידה.
לולאה בטלה () { int i; ערך uint16_t = 0; BH1750_Init (כתובת BH1750); עיכוב (200); אם (2 == BH1750_Read (כתובת BH1750)) { value = ((buff << 8) -buff) /1.2; lcd.clear (); lcd.print ("עוצמה ב- LUX"); lcd.setCursor (6,1); lcd.print (ערך); } עיכוב (150); }
לבסוף הפעל את הארדואינו והעלה את התוכנית לארדואינו. ברגע שהעלתה התוכנית LCD מתחיל להציג את עוצמת האור ביחידות LUX. ניתן גם לשנות את הערכים על ידי שינוי עוצמת האור סביב החיישן כפי שמוצג בסרטון להלן.