Arduino və WS2812 əsasında köhnə lampadan gecə işığı. Müstəqil həll üçün tapşırıqlar

Yəqin ki, hər kəs uşaqlıqda bir yuxu görmüşdür (və birdən çox). Siz hətta uşağın arzusu gerçəkləşəndə ​​onun ruhunu dolduran hissi və ya onun gözlərindəki o uzaq, tanış parıldamağı xatırlamağa cəhd edə bilərsiniz... Uşaqlıqda öz gecə işığımın olmasını arzulayırdım.

İndi mən BSUİR-də 4-cü kurs tələbəsiyəm və bizə dövrə dizaynı üzrə bir kurs layihəsinin kağız üzərində deyil, bir aparat parçasının üzərində edilə biləcəyini söyləyəndə ağlıma gəldi: çox istədiyim gecə işığı. uşaq özüm düzəldə bilər. Üstəlik, yalnız qaranlıqda otağı işıqlandıracaq bir obyekt deyil, istənilən əhval-ruhiyyəyə uyğun olaraq asanlıqla idarə oluna bilən bir cihaz hazırlayın. Niyə də yox? Əllərimdən istifadə edərək rəngləri dəyişdirmək qabiliyyətini əlavə etmək qərarına gəldim: əlim gecə işığına nə qədər yaxın olsa, rənglərdən daha parlaq biri (RGB) yanır. Mən də pultdan istifadə edərək gecə işığını idarə etmək istərdim.

Dərhal etiraf edim ki, bu ideyanı cxem.net saytında gördüm. Qısaca olaraq, bu nümunədə sürüşmə registrləri və ultrasəs məsafə sensorları ilə idarə olunan RGB matrisindən istifadə edilmişdir. Amma mən düşünürdüm ki, matrisa yalnız bir istiqamətdə parlayır, amma gecə işığının yanlarda parlamasını istəyirdim.

Dövrə elementlərinin əsaslandırılması


Diqqətimi Arduino mikrokontrollerlərinə yönəltdim. UNO mənim fikrim üçün kifayət qədər uyğun variantdır, birincisi ona görə ki, o, ən populyar platformadır və pinlərin sayı Meqadan fərqli olaraq çox da böyük deyil, ikincisi, ona xarici enerji mənbəyi qoşa bilərsiniz, mənim vəziyyətimdə 12V-dir. , Nanodan fərqli olaraq, üçüncüsü... yaxşı, məncə, bu iki nöqtədə dayana bilərik. Platforma proqramlaşdırma dilinin rahatlığı və sadəliyi, eləcə də açıq arxitekturası və proqram koduna görə bütün dünyada olduqca populyardır.

Daha çox ətraflı məlumat Bu lövhə haqqında məlumatı İnternetdə asanlıqla tapa bilərsiniz, ona görə də məqaləni çox yükləməyəcəyəm.

Beləliklə, sistem üçün əsas tələblər. Tələb olunur:
– sistemi idarə etmək üçün maneəyə qədər olan məsafəni izləyəcək sensorlar;
– pultdan siqnalları oxumaq üçün sensor uzaqdan nəzarət;
– lazımi işıqlandırma funksionallığını təmin edəcək LED-lər;
– bütün sistemi idarə edəcək idarəetmə bloku.

Layihə məsafə ölçənlər kimi məsafəölçənlər tələb edir, onların hər biri müəyyən bir rəngə uyğun olacaq: qırmızı, yaşıl, mavi. Məsafə sensorları əlin gecə işığına olan məsafəsini izləyəcək və əl müəyyən sensora nə qədər yaxınlaşsa, bu məsafəölçənə uyğun rəng bir o qədər güclü yanacaq. Əksinə, əl nə qədər uzaq olarsa, sensora uyğun rəngə bir o qədər az gərginlik tətbiq olunur.

Ən məşhur məsafəölçənlər Bu an bunlar Sharp GP2Y0A21YK və HC-SR04-dür. Sharp GP2Y0A21YK infraqırmızı məsafəölçəndir. O, bir IR emitent və bir IR qəbuledicisi ilə təchiz edilmişdir: birincisi şüanın mənbəyi kimi xidmət edir, əksi ikinci tərəfindən tutulur. Eyni zamanda, sensorun IR şüaları insan gözü üçün görünməzdir və belə bir intensivlikdə zərərsizdir.

HC-SR04 ultrasəs sensoru ilə müqayisədə bu sensorun həm üstünlükləri, həm də mənfi cəhətləri var. Üstünlüklərə neytrallıq və zərərsizlik daxildir. Dezavantajlar daha qısa diapazon və bəzi işıqlandırma növləri də daxil olmaqla xarici müdaxilədən asılılıqdır.

Layihə üçün məsafə sensorları kimi istifadə olunur: ultrasəs məsafəölçənləri HC-SR04.
HC-SR04-ün iş prinsipi məlum ekolokasiya fenomeninə əsaslanır. Onu istifadə edərkən emitent akustik siqnal yaradır, maneədən əks olunaraq sensora qayıdır və qəbuledici tərəfindən qeydə alınır. Ultrasəsin havada yayılma sürətini (təxminən 340 m/s) və buraxılan və qəbul edilən siqnal arasındakı gecikmə müddətini bilməklə, akustik maneəyə qədər olan məsafəni hesablamaq asandır.

TRIG girişi mikrokontrolörün istənilən pininə qoşulur. Bu sancağa nəbz vurulmalıdır. rəqəmsal siqnal müddəti 10 μs. TRIG girişindəki siqnal əsasında sensor ultrasəs impulsları paketi göndərir. Yansıtılan siqnalı qəbul etdikdən sonra sensor ECHO pinində nəbz siqnalı yaradır, onun müddəti maneəyə olan məsafəyə mütənasibdir.

IR sensoru. Əlbəttə ki, uzaqdan idarəetmə üçün tələb olunan siqnal bu sensordan oxunacaq və deşifrə olunacaq. TSOP18 bir-birindən yalnız tezliyə görə fərqlənir. Layihə üçün VS1838B TSOP1838 sensoru seçilib.

Layihə otağın istənilən rəngdə işıqlandırılması ideyasına əsaslanırdı, yəni işıqlandırmanın alınacağı 3 əsas rəngə ehtiyacınız olacaq: qırmızı, yaşıl, mavi. Buna görə də SMD 5050RGB LED modeli seçildi, bu da vəzifənin öhdəsindən mükəmməl gələcəkdir.

Hər bir LED-ə verilən gərginliyin miqdarından asılı olaraq, onlar bu işıqlandırmanın intensivliyini dəyişəcəklər. LED bir rezistor vasitəsilə birləşdirilməlidir, əks halda biz təkcə onu deyil, həm də Arduino-nu məhv etmək riskimiz var. LED-də cərəyanı məqbul bir dəyərə məhdudlaşdırmaq üçün rezistor lazımdır. Fakt budur ki, LED-in daxili müqaviməti çox aşağıdır və bir rezistor istifadə etməsəniz, belə bir cərəyan LED-dən keçəcək ki, o, həm LED, həm də nəzarətçini yandıracaq.

Layihədə istifadə olunan LED zolaqlar 12V-dən enerji alır.

"Söndürülmüş" vəziyyətdə olan LED-lərdəki gərginliyin 6V olması və 5V-dən çox olan enerji təchizatını tənzimləmək lazım olduğuna görə keçid rejimində dövrəyə tranzistorlar əlavə etmək lazımdır. Mənim seçimim BC547c modelinə düşdü.

Unutmuşlar üçün iş prinsipini qısaca nəzərdən keçirək npn tranzistor. Əgər siz ümumiyyətlə gərginlik tətbiq etmirsinizsə, sadəcə olaraq baza və emitent terminallarını qısaqapansanız, hətta qısaqapanma olmasa da, lakin bir neçə ohmluq bir rezistor vasitəsilə, baza-emitter gərginliyinin sıfır olduğu ortaya çıxır. Beləliklə, əsas cərəyan yoxdur. Tranzistor bağlıdır, kollektor cərəyanı əhəmiyyətsiz dərəcədə kiçikdir, yalnız eyni başlanğıc cərəyanı. Bu halda tranzistorun kəsilmə vəziyyətində olduğu deyilir. Əks vəziyyətə doyma deyilir: tranzistor tamamilə açıq olduqda, daha açılacaq yer qalmasın. Bu açılma dərəcəsi ilə kollektor-emitter bölməsinin müqaviməti o qədər aşağıdır ki, kollektor dövrəsində yük olmadan tranzistoru açmaq sadəcə mümkün deyil, dərhal yanacaq. Bu halda kollektorda qalıq gərginlik yalnız 0,3...0,5V ola bilər.

Bu iki vəziyyət, doyma və kəsmə, tranzistor adi rele kontaktı kimi keçid rejimində işləyərkən istifadə olunur. Bu rejimin əsas mənası ondan ibarətdir ki, kiçik bir əsas cərəyan əsas cərəyandan bir neçə on dəfə böyük olan böyük bir kollektor cərəyanını idarə edir. sayəsində böyük bir kollektor cərəyanı əldə edilir xarici mənbə enerji, amma yenə də indiki qazanc, necə deyərlər, göz qabağındadır. Bizim vəziyyətimizdə, işləmə gərginliyi 5V olan mikrosxem, 12V-dən işləyən LED-ləri olan 3 zolaqdan ibarətdir.

Açar kaskadının iş rejimini hesablayaq. LED-lərin tam gücdə yanması üçün əsas dövrədə rezistorun dəyərini hesablamaq lazımdır. Hesablama zamanı zəruri şərt, cari qazancın maksimum mümkün kollektor cərəyanını minimum mümkün əsas cərəyana bölmək əmsalından çox və ya ona bərabər olmasıdır:

Buna görə, zolaqlar 220V işləmə gərginliyinə malik ola bilər və əsas dövrə 5V gərginlikli bir mikrosxemdən idarə oluna bilər. Əgər tranzistor kollektorda belə bir gərginliklə işləmək üçün nəzərdə tutulubsa, o zaman LED-lər problemsiz yanar.
Baza cərəyanı 5mA və kollektor cərəyanı 0,1A olduqda, baza-emitter qovşağında gərginliyin düşməsi 0,77V-dir.
Əsas rezistordakı gərginlik aşağıdakı kimi olacaq:

Ohm qanununa görə:

Standart müqavimət diapazonundan 8,2 kOhm rezistor seçirik. Bu hesablamanı tamamlayır.

Qarşılaşdığım bir problemə diqqətinizi çəkmək istəyirəm. IRremote kitabxanasından istifadə edərkən, mavi rəngi tənzimləyən zaman Arduino dondu. İnternetdə uzun və hərtərəfli axtarışdan sonra məlum oldu ki, bu kitabxana bu Arduino modeli üçün standart olaraq Timer 2-dən istifadə edir. Taymerlər PWM çıxışlarını idarə etmək üçün istifadə olunur.

Taymer 0 (Sistem vaxtı, PWM 5 və 6);
Taymer 1 (PWM 9 və 10);
Taymer 2 (PWM 3 və 11).

Əvvəlcə mavi rəngi tənzimləmək üçün PWM 11 istifadə etdim. Buna görə də, PWM, taymerlər və onlardan istifadə edə biləcək üçüncü tərəf kitabxanaları ilə işləyərkən diqqətli olun. Qəribədir ki ana səhifə Github-da bu nüans haqqında heç nə deyilməyib. İstəyirsinizsə, taymer 1 ilə sətri şərhdən çıxara və 2-ni şərh edə bilərsiniz.

Çörək lövhəsindəki elementləri birləşdirmək belə görünür:

Çörək lövhəsində sınaqdan keçirildikdən sonra "Elementlərin lövhəyə yerləşdirilməsi" və "Lehimləmə dəmiri ilə işləmək" mərhələləri başladı. Hazır lövhənin ilk sınağından sonra ağlıma bir fikir gəlir: bir şey səhv oldu. Və burada çoxlarına tanış olan "Sınaqçı ilə zəhmətli iş" mərhələsi başlayır. Bununla belə, problemlər (bir neçə bitişik kontakt təsadüfən birlikdə lehimləndi) tez bir zamanda aradan qaldırıldı və burada LED-lərin çoxdan gözlənilən nadinc işığı.

Sonra bu, sadəcə, bədən məsələsi idi. Bu səbəbdən sensorlarımız üçün deşikli kontrplak kəsildi. Arxa qapaq o, xüsusi olaraq çıxarıla bilən şəkildə hazırlanmışdır ki, içəridən mənzərədən həzz ala biləsiniz və istəsəniz nəyisə bitirə və ya yenidən edə biləsiniz. Həmçinin lövhəni və enerji təchizatını yenidən proqramlaşdırmaq üçün 2 deşik var.

Bədən iki komponentli epoksi yapışqan ilə yapışdırıldı. Daha əvvəl qarşılaşmayanlar üçün bu yapışqanın özəlliyini qeyd etmək lazımdır. Bu məhsul iki ayrı qabda olur və içindəkilər qarışdırıldıqda ani kimyəvi reaksiya baş verir. Qarışdırdıqdan sonra 3-4 dəqiqə ərzində tez hərəkət etməlisiniz. Sonrakı istifadə üçün yeni bir hissəni qarışdırmaq lazımdır. Buna görə də bunu təkrarlamağa çalışırsınızsa, sizə məsləhətim odur ki, kiçik hissələrdə qarışdırın və çox tez hərəkət edin, düşünməyə çox vaxt olmayacaq. Buna görə bədəni necə və harada yapışdırmaq barədə əvvəlcədən düşünməyə dəyər. Üstəlik, bunu bir oturuşda etmək olmaz.

İçərisində LED-ləri olan zolaqların quraşdırılması üçün üst örtük bütün tellərin mükəmməl keçdiyi bir boru daxil edildi.

Abajurla bağlı problem yarananda, uşaq vaxtı sadə sapdan, yapışqandan və əsas rolunu oynayan şardan necə sənətkarlıq etdiyimi xatırladım. Abajur üçün prinsip eynidır, lakin çoxhedronun bükülməsi topdan daha çətin olduğu ortaya çıxdı. Sapların konstruksiyaya vurduğu təzyiq nəticəsində yuxarıya doğru daralmağa başladı və saplar qopmağa başladı. Təcili olaraq, əllərim yapışqanla örtülmüş, quruluşu yuxarıdan gücləndirmək qərara alındı. Və sonra CD köməyə gəldi. Son nəticə bu gecə işığıdır:

Sonda nə demək istərdiniz?

Layihədə nəyi dəyişməliyəm? Məsafə sensorlarına TRIG siqnalını vermək üçün üç əvəzinə bir Arduino çıxışından istifadə etmək olar. Mən də IR sensoru üçün bir çuxur təqdim edərdim (bu barədə unutmuşam), təəssüf ki, hələ də uzaqdan idarəetmə pultundan gələn siqnalları oxuya bilmədiyi halda gizlidir. Ancaq kim dedi ki, heç nə lehimləyə və ya qaza bilməyəcəksiniz?

Qeyd etmək istərdim ki, bu, maraqlı bir semestr idi və kağız üzərində olmayan bir şey etməyə çalışmaq üçün əla fürsət idi, bunun sayəsində "uşaqlıq arzusu" maddəsinin yanına başqa bir işarə qoya bilərəm. Yeni bir şey sınamağın çətin olduğunu düşünürsənsə və əvvəlcə nə edəcəyinizi bilmirsinizsə, narahat olmayın. Bir çox insanın beynində bir fikir var: haradan başlamaq və bunu necə etmək olar? Həyatda çaşqın ola biləcəyiniz bir çox vəzifə var, ancaq bir dəfə cəhd etdikdə, bunun üçün bir az cəhd etməli olsanız belə, gözlərinizdəki bir parıltı ilə dağları yerindən tərpətə biləcəyinizi görəcəksiniz.

Əlavə tapşırıq üçün

    Daha 1 LED

    Nominal dəyəri 220 Ohm olan daha 1 rezistor

    daha 2 tel

Sxematik diaqram

Çörək lövhəsindəki sxem

Qeyd

    Bu təcrübədə enerji təchizatı və analoq giriş arasında bir fotorezistor quraşdırırıq, yəni. gərginlik bölücü dövrədə R1 mövqeyinə. Buna ehtiyacımız var ki, işıqlandırma azaldıqda analoq girişdə daha az gərginlik alırıq.

    Komponentləri elə yerləşdirməyə çalışın ki, LED fotorezistoru işıqlandırmasın.

Eskiz

p050_night_light.ino #define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT) ; ) void loop() ( // işıq səviyyəsini oxuyun. Yeri gəlmişkən, elan edin // siz ona eyni anda dəyişən və qiymət təyin edə bilərsiniz int yüngüllük = analogRead(LDR_PIN) ; // tənzimlədiyimiz potensiometrdən dəyəri oxuyun // şərti qaranlıq və işıq arasındakı hədd dəyəri int həddi = analogRead(POT_PIN) ; // boolean dəyişəni elan edin və ona qiymət təyin edin // "İndi qaranlıqdır." Boolean dəyişənləri, əksinə // tam ədədlər, iki dəyərdən yalnız birini ehtiva edə bilər: // doğru və ya yanlış. Belə dəyərlər // Boolean da deyilir. boolean daDark = (yüngüllük< threshold) ; // proqramın budaqlanmasından istifadə edin: prosessor bunlardan birini yerinə yetirəcək // şərtin yerinə yetirilməsindən asılı olaraq iki kod bloku. // Əgər (İngiliscə “if”) çox qaranlıqdır...əgər (çox qaranlıq) ( // ...işıqlandırmanı yandırın digitalWrite(LED_PIN, HIGH); ) başqa ( // ...əks halda işıq lazım deyil - söndürün digitalWrite(LED_PIN, LOW) ; ) )

Kod üçün izahatlar

    Biz yalnız doğru (doğru, 1) və ya yanlış (yanlış, 0) dəyərlərini saxlayan yeni bir dəyişən növündən istifadə edirik. Bu dəyərlər Boolean ifadələrinin qiymətləndirilməsinin nəticəsidir. Bu nümunədə Boolean ifadəsi yüngüllükdür< threshold . На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness и threshold , которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.

    Bu məntiqi ifadəni yalnız aydınlıq üçün mötərizədə qoyuruq. Hər zaman oxuna bilən kod yazmaq daha yaxşıdır. Digər hallarda mötərizələr adi hesabda olduğu kimi əməliyyatların ardıcıllığına təsir göstərə bilər.

    Təcrübəmizdə, operatordan istifadə etdiyimiz üçün yüngüllük dəyəri eşik dəyərdən az olduqda boolean ifadəsi doğru olacaq.< . Мы можем использовать операторы > , <= , >= , == , != , müvafiq olaraq “böyük”, “kiçik və ya bərabər”, “böyük və ya bərabər”, “bərabər”, “bərabər deyil” deməkdir.

    Məntiqi operator == ilə xüsusilə diqqətli olun və onu təyin operatoru ilə qarışdırmayın = . Birinci halda biz ifadələrin qiymətlərini müqayisə edib məntiqi qiymət alırıq (doğru və ya yalan), ikinci halda isə sağ operandın qiymətini sol operanda təyin edirik. Kompilyator bizim niyyətlərimizi bilmir və xəta verməyəcək, lakin biz təsadüfən bəzi dəyişənin dəyərini dəyişə bilərik və sonra xəta axtarmağa uzun müddət sərf edə bilərik.

    Şərti if ifadəsi əksər proqramlaşdırma dillərində əsas olanlardan biridir. Onun köməyi ilə biz nəinki ciddi şəkildə müəyyən edilmiş hərəkətlər ardıcıllığını yerinə yetirə bilərik, həm də müəyyən şərtlərdən asılı olaraq alqoritmin hansı qolunu izləmək barədə qərar qəbul edə bilərik.

    Məntiqi ifadə yüngüllük< threshold есть значение: true или false . Мы вычислили его и поместили в булеву переменную tooDark («слишком темно»). Таким образом мы как бы говорим «если слишком темно, то включить светодиод»

    Eyni müvəffəqiyyətlə "əgər işıqlandırma eşik səviyyəsindən azdırsa, LED-i yandırın" deyə bilərik, yəni. bütün məntiqi ifadəni aşağıdakılara ötürün:

əgər (yüngüllük< threshold) { // ... }

    Arxada şərti operatorəgər məntiqi ifadə doğrudursa, icra olunan kod blokunu mütləq izləyirsə. Hər iki qıvrım mötərizəni () unutmayın!

    Əgər ifadə doğrudursa, biz yalnız icra etməliyik bir təlimat, əgər (...) olmadan dərhal sonra yazıla bilər buruq mötərizələr:

əgər (yüngüllük< threshold) digitalWrite(LED_PIN, HIGH) ;

    if ifadəsi else konstruksiyası ilə genişləndirilə bilər. Kod bloku və ya ondan sonrakı tək ifadə yalnız if-dəki Boolean ifadəsi yanlış olaraq qiymətləndirildikdə yerinə yetiriləcək. Buruq braces ilə bağlı qaydalar eynidir. Təcrübəmizdə "çox qaranlıqdırsa, LED-i yandırın, əks halda LED-i söndürün" yazdıq.

Fotorezistorlar əsasında qurulmuş işıq sensorları (işıqlandırma) real Arduino layihələrində olduqca tez-tez istifadə olunur. Onlar nisbətən sadədir, bahalı deyil və istənilən onlayn mağazada tapmaq və almaq asandır. Arduino fotorezistoru sizə işıq səviyyəsini idarə etməyə və onun dəyişikliklərinə cavab verməyə imkan verir. Bu yazıda biz fotorezistorun nə olduğunu, ona əsaslanan işıq sensorunun necə işlədiyini və sensoru Arduino lövhələrinə düzgün şəkildə necə qoşacağına baxacağıq.

Fotorezistor, adından da göründüyü kimi, demək olar ki, hər hansı bir elektron dövrədə tez-tez rast gəlinən rezistorlarla birbaşa əlaqəlidir. Adi bir rezistorun əsas xüsusiyyəti onun müqavimətinin dəyəridir. Gərginlik və cərəyan ondan asılıdır, bir rezistordan istifadə edərək digər komponentlərin tələb olunan iş rejimlərini təyin edirik. Bir qayda olaraq, eyni iş şəraitində bir rezistorun müqavimət dəyəri praktiki olaraq dəyişmir.

Ənənəvi rezistordan fərqli olaraq, fotorezistor mühit işığının səviyyəsindən asılı olaraq müqavimətini dəyişə bilər. Bu o deməkdir ki, in elektron dövrə Parametrlər daim dəyişəcək, ilk növbədə, fotorezistorda gərginliyin düşməsi ilə maraqlanırıq. Bu gərginlik dəyişikliklərini Arduino-nun analoq sancaqlarında qeyd etməklə biz dövrənin məntiqini dəyişə bilərik və bununla da xarici şəraitə uyğunlaşan qurğular yarada bilərik.

Fotorezistorlar müxtəlif sistemlərdə olduqca fəal şəkildə istifadə olunur. Ən çox yayılmış tətbiq küçə işıqlandırmasıdır. Şəhərə gecə düşərsə və ya buludlu olarsa, işıqlar avtomatik olaraq yanır. Cədvələ görə deyil, işıqlandırmadan asılı olaraq yanan bir fotorezistordan ev üçün qənaətcil bir ampul edə bilərsiniz. Siz hətta qapalı kabinet və ya seyf açıldıqdan və işıqlandırıldıqdan dərhal sonra işə salınacaq işıq sensoru əsasında təhlükəsizlik sistemi də edə bilərsiniz. Həmişə olduğu kimi, hər hansı bir Arduino sensorunun tətbiq sahəsi yalnız təsəvvürümüzlə məhdudlaşır.

Onlayn mağazalarda hansı fotorezistorları almaq olar

Ən məşhur və sərfəli variant bazarda sensorlar Çin şirkətlərinin kütləvi istehsal modelləri, istehsalçı VT məhsullarının klonlarıdır. Bu və ya digər təchizatçının kim və nə istehsal etdiyini anlamaq həmişə mümkün deyil, lakin fotorezistorlarla başlamaq üçün ən sadə seçim olduqca uyğundur.

Təcrübəsiz Arduino istifadəçisinə bu kimi görünən hazır foto modul almağı tövsiyə etmək olar:


Bu modul artıq bütün lazımi elementləri ehtiva edir asan əlaqə Arduino lövhəsinə fotorezistor. Bəzi modullar müqayisəli dövrəni həyata keçirir və idarəetmə üçün rəqəmsal çıxış və trim rezistorunu təmin edir.

Rus radio həvəskarına rus PA sensoruna müraciət etmək tövsiyə edilə bilər. Satışda FR1-3, FR1-4 və s. - Sovet dövründə istehsal edilmişdir. Ancaq buna baxmayaraq, FR1-3 daha dəqiq bir detaldır. Bundan qiymət fərqi yaranır.FR üçün onlar 400 rubldan çox tələb etmirlər. FR1-3 hər biri min rubldan çox olacaq.

Fotorezistor markalanması

Rusiyada istehsal olunan modellərin müasir etiketlənməsi olduqca sadədir. İlk iki hərf PhotoResistor-dur, tiredən sonrakı rəqəmlər inkişaf nömrəsini göstərir. FR -765 - fotorezistor, inkişaf 765. Adətən birbaşa hissənin gövdəsində qeyd olunur.

VT sensoru işarələmə diaqramında göstərilən müqavimət diapazonuna malikdir. Misal üçün:

  • VT83N1 - 12-100kOhm (12K - işıqlı, 100K - qaranlıqda)
  • VT93N2 - 48-500kOhm (48K – işıqlı, 100K – qaranlıqda).

Bəzən modellər haqqında məlumatı aydınlaşdırmaq üçün satıcı istehsalçıdan xüsusi sənəd təqdim edir. Əməliyyat parametrlərinə əlavə olaraq, hissənin dəqiqliyi də orada göstərilir. Bütün modellər spektrin görünən hissəsində həssaslıq diapazonuna malikdir. Toplama işıq sensoruƏməliyyatın dəqiqliyinin nisbi bir anlayış olduğunu başa düşməlisiniz. Eyni istehsalçıdan, eyni partiyadan və ya eyni alışdan olan modellər üçün belə, 50% və ya daha çox fərqlənə bilər.

Zavodda hissələr qırmızıdan yaşıl işığa qədər dəyişən dalğa uzunluqlarına uyğunlaşdırılır. Əksər insanlar infraqırmızı şüalanmanı da “görürlər”. Xüsusilə dəqiq hissələr ultrabənövşəyi işığı belə aşkar edə bilir.

Sensorun üstünlükləri və mənfi cəhətləri

Fotorezistorların əsas çatışmazlığı spektrin həssaslığıdır. Düşən işığın növündən asılı olaraq, müqavimət bir neçə böyüklük sırasına görə dəyişə bilər. Mənfi cəhətlərə də daxildir aşağı sürət işıqlandırma dəyişikliklərinə reaksiyalar. İşıq yanıb-sönürsə, sensorun reaksiya verməyə vaxtı yoxdur. Dəyişiklik tezliyi olduqca yüksəkdirsə, rezistor ümumiyyətlə işıqlandırmanın dəyişdiyini "görməyi" dayandıracaq.

Üstünlüklərə sadəlik və əlçatanlıq daxildir. Üzərinə düşən işıqdan asılı olaraq müqavimətin birbaşa dəyişdirilməsi sadələşdirməyə imkan verir elektrik diaqramıəlaqələri. Fotorezistorun özü çox ucuzdur, o, çoxsaylı Arduino dəstlərinə və konstruktorlarına daxildir və buna görə də demək olar ki, hər hansı bir təcrübəsiz Arduino istehsalçısı üçün əlçatandır.

Fotorezistorun Arduino-ya qoşulması

Layihələrdə arduino Fotorezistor işıq sensoru kimi istifadə olunur. Ondan məlumat alan lövhə releləri işə sala və ya söndürə, mühərrikləri işə sala və mesaj göndərə bilər. Təbii ki, sensoru düzgün birləşdirməliyik.

İşıq sensorunun Arduino ilə əlaqə diaqramı olduqca sadədir. Bir fotorezistordan istifadə etsək, əlaqə diaqramında sensor gərginlik bölücü kimi həyata keçirilir. Bir qol işıqlandırma səviyyəsindən asılı olaraq dəyişir, ikincisi analoq girişə gərginlik verir. Nəzarətçi çipində bu gərginlik ADC vasitəsilə rəqəmsal məlumatlara çevrilir. Çünki İşıq ona dəydikdə sensorun müqaviməti azaldıqda ona düşən gərginliyin dəyəri də azalacaq.

Fotorezistoru ayırıcının hansı qoluna yerləşdirdiyimizdən asılı olaraq, analoq girişə artan və ya azalmış gərginlik veriləcək. Fotorezistorun bir ayağı yerə bağlıdırsa, maksimum gərginlik dəyəri qaranlığa uyğun olacaq (fotorezistorun müqaviməti maksimumdur, demək olar ki, bütün gərginlik onun üzərindən düşür) və minimum dəyər yaxşı işıqlandırmaya uyğun olacaq (müqavimət sıfıra yaxın, gərginlik minimaldır). Fotorezistor qolunu enerji təchizatı ilə birləşdirsək, davranış əksinə olacaq.

Lövhənin özü quraşdırılması heç bir çətinlik yaratmamalıdır. Fotorezistorun polaritesi olmadığı üçün o, hər iki tərəfdən birləşdirilə bilər, lövhəyə lehimlənə bilər, elektron lövhədən istifadə edərək naqillərlə birləşdirilə bilər və ya qoşulma üçün adi kliplərlə (timsah klipləri) istifadə edilə bilər. Dövrədəki enerji mənbəyi Arduino özüdür. Fotorezistor bir ayaq yerə bağlıdır, digəri ADC lövhəsinə bağlıdır (bizim nümunəmizdə - AO). 10 kOhm rezistoru eyni ayağa bağlayırıq. Təbii ki, bir fotorezistoru yalnız analoq A0 pininə deyil, həm də hər hansı digərinə bağlaya bilərsiniz.

Əlavə 10 K rezistor haqqında bir neçə söz.Onun dövrəmizdə iki funksiyası var: dövrədə cərəyanı məhdudlaşdırmaq və formalaşdırmaq tələb olunan gərginlik bölücü ilə bir dövrədə. Tam işıqlandırılmış bir fotorezistorun müqavimətini kəskin şəkildə azaltdığı bir vəziyyətdə cari məhdudiyyət lazımdır. Və gərginlik istehsalı analoq portda proqnozlaşdırıla bilən dəyərlər üçündür. Əslində üçün normal əməliyyat Fotorezistorlarımızla 1K müqavimət kifayətdir.

Rezistorun dəyərini dəyişdirməklə həssaslıq səviyyəsini "qaranlıq" və "işıq" tərəflərinə "köçürə" bilərik. Beləliklə, 10 K verəcək sürətli keçid işığın başlanğıcı. 1K vəziyyətində, işıq sensoru yüksək işıq səviyyələrini daha dəqiq aşkar edəcək.

Əgər istifadə edirsinizsə hazır modul işıq sensoru, sonra əlaqə daha da sadə olacaq. VCC modulunun çıxışını lövhədəki 5V konnektora, GND-ni yerə bağlayırıq. Qalan sancaqları Arduino konnektorlarına bağlayırıq.

Lövhənin rəqəmsal çıxışı varsa, onu rəqəmsal pinlərə göndəririk. Analoqdursa, analoqa keçin. Birinci halda, bir tətik siqnalı alacağıq - işıqlandırma səviyyəsi aşıldı (tətik həddi bir tənzimləmə rezistorundan istifadə edərək tənzimlənə bilər). Analoq sancaqlardan faktiki işıqlandırma səviyyəsinə mütənasib bir gərginlik dəyəri əldə edə biləcəyik.

Fotorezistorda işıq sensorunun nümunə eskizi

Fotorezistor ilə dövrəni Arduino ilə birləşdirdik və hər şeyin düzgün aparıldığına əmin olduq. İndi yalnız nəzarətçini proqramlaşdırmaq qalır.

İşıq sensoru üçün eskiz yazmaq olduqca sadədir. Biz yalnız sensorun qoşulduğu analoq pindən cari gərginlik dəyərini çıxarmalıyıq. Bu, hamımızın bildiyimiz analogRead() funksiyasından istifadə etməklə edilir. Daha sonra işıq səviyyəsindən asılı olaraq bəzi hərəkətləri edə bilərik.

Aşağıdakı sxemə uyğun olaraq birləşdirilmiş LED-i yandıran və ya söndürən işıq sensoru üçün bir eskiz yazaq.

Əməliyyat alqoritmi aşağıdakı kimidir:

  • Analoq pindən siqnal səviyyəsini təyin edin.
  • Səviyyəni eşik dəyəri ilə müqayisə edirik. Maksimum dəyər qaranlığa, minimum dəyər isə maksimum işıqlandırmaya uyğun olacaq. Gəlin 300-ə bərabər olan hədd dəyərini seçək.
  • Səviyyə eşikdən azdırsa, qaranlıqdır, LED-i yandırmaq lazımdır.
  • Əks halda, LED-i söndürün.
#define PIN_LED 13 #define PIN_PHOTO_SENSOR A0 void setup() ( Serial.begin(9600); pinMode(PIN_LED, OUTPUT); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR); Serial.println val< 300) { digitalWrite(PIN_LED, LOW); } else { digitalWrite(PIN_LED, HIGH); } }

Fotorezistoru (əllərinizlə və ya işığa davamlı bir obyektlə) örtməklə biz LED-in yandığını və söndüyünü müşahidə edə bilərik. Koddakı eşik parametrini dəyişdirərək, biz ampulü müxtəlif işıqlandırma səviyyələrində yandırmağa/sönməyə məcbur edə bilərik.

Quraşdırarkən, parlaq LED-dən daha az işıq işıq sensoruna düşməsi üçün fotorezistor və LED-i bir-birindən mümkün qədər uzaqlaşdırmağa çalışın.

İşıq sensoru və arxa işığın parlaqlığının hamar dəyişməsi

Siz layihəni elə dəyişdirə bilərsiniz ki, LED-in parlaqlığı işıqlandırma səviyyəsindən asılı olaraq dəyişsin. Alqoritmə aşağıdakı dəyişiklikləri əlavə edəcəyik:

  • AnalogWrite() istifadə edərək, 0-dan 255-ə qədər olan dəyərləri LED ilə pinə göndərərək, PWM vasitəsilə lampanın parlaqlığını dəyişəcəyik.
  • İşıq səviyyəsinin rəqəmsal dəyərini işıq sensorundan (0-dan 1023-ə qədər) LED parlaqlığının PWM diapazonuna (0-dan 255-ə qədər) çevirmək üçün map() funksiyasından istifadə edəcəyik.

Eskiz nümunəsi:

#define PIN_LED 10 #define PIN_PHOTO_SENSOR A0 void setup() ( Serial.begin(9600); pinMode(PIN_LED, OUTPUT); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR); Serial.println(Serial.println); = map(val, 0, 1023, 0, 255); // Əldə edilən dəyəri PWM siqnal səviyyəsinə çevirin. İşıqlandırma dəyəri nə qədər aşağı olarsa, PWM vasitəsilə LED-ə bir o qədər az enerji verməliyik. analogWrite(PIN_LED, ledPower) ; // Parlaqlığı dəyişdirin)

Analoq portdan gələn siqnalın işıqlandırma dərəcəsinə mütənasib olduğu başqa bir əlaqə metodu halında, dəyəri maksimumdan çıxararaq əlavə olaraq "əksinə" ehtiyacınız olacaq:

Int val = 1023 – analogRead(PIN_PHOTO_RESISTOR);

Fotorezistor və rele istifadə edərək işıq sensoru dövrəsi

Rölələr ilə işləmək üçün eskizlərin nümunələri Arduino-da relelərin proqramlaşdırılması haqqında məqalədə verilmişdir. Bu vəziyyətdə mürəkkəb hərəkətlər etmək lazım deyil: "qaranlığı" təyin etdikdən sonra sadəcə röleyi yandırırıq və müvafiq dəyəri onun sancağına tətbiq edirik.

#define PIN_RELAY 10 #define PIN_PHOTO_SENSOR A0 void setup() ( pinMode(PIN_RELAY, OUTPUT); digitalWrite(PIN_RELAY, HIGH); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR) (əgər varsa);< 300) { // Светло, выключаем реле digitalWrite(PIN_RELAY, HIGH); } else { // Темновато, включаем лампочку digitalWrite(PIN_RELAY, LOW); } }

Nəticə

Fotorezistor əsasında işıq sensoru istifadə edən layihələr olduqca sadə və effektivdir. Çox maraqlı layihələr həyata keçirə bilərsiniz və avadanlıqların qiyməti yüksək olmayacaq. Fotorezistor əlavə müqavimətə malik bir gərginlik bölücü dövrə istifadə edərək bağlanır. Sensor müxtəlif işıq səviyyələrini ölçmək üçün analoq porta və ya bizi maraqlandıran qaranlıq faktdırsa, rəqəmsal porta qoşulur. Eskizdə biz sadəcə olaraq analoq (və ya rəqəmsal) portdan məlumatları oxuyuruq və dəyişikliklərə necə reaksiya verəcəyimizə qərar veririk. Ümid edək ki, indi layihələrinizdə belə sadə “gözlər” görünəcək.

Bu təcrübədə işıq səviyyəsi potensiometr tərəfindən müəyyən edilmiş həddən aşağı düşəndə ​​LED yanmalıdır.

TƏCRÜBƏ ÜÇÜN HİSSƏLƏRİN SİYAHISI

- 1 Arduino Uno lövhəsi;

- 1 lehimsiz çörək lövhəsi;

- 1 LED;

- 1 fotorezistor;

- 220 Ohm nominal dəyəri olan 1 rezistor, nominal dəyəri 10 kOhm olan 1 rezistor;

- 1 dəyişən rezistor (potentsiometr);

- 10 kişi-kişi tel.

ƏLAVƏ VƏZİFƏ ÜÇÜN TƏFƏRRÜATLAR

daha 1 LED;

Nominal dəyəri 220 Ohm olan başqa 1 rezistor;

daha 2 tel.

DÖVƏ SƏHƏMİ

BREADBOARD ÜZRƏ DİQRAM

eskiz

Arduino IDE üçün eskizi yükləyin
#define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT); ) void loop() ( // işıq səviyyəsini oxuyun. Yeri gəlmişkən, // siz dəyişən elan edə və təyin edə bilərsiniz. bir anda ona bir dəyər int lightness = analogRead(LDR_PIN); // tənzimləmək üçün istifadə etdiyimiz potensiometrdən dəyəri oxuyun // şərti qaranlıq və işıq arasındakı hədd dəyəri int həddi = analogRead(POT_PIN); // elan edin məntiqi dəyişən və ona qiymət təyin edin // “indi qaranlıqdır”. Məntiqi dəyişənlər, // tam dəyişənlərdən fərqli olaraq, iki dəyərdən yalnız birini ehtiva edə bilər: // doğru və ya yanlış. Belə qiymətlərə // həm də mantiq deyilir. boolean daDark = (yüngüllük< threshold); // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH); } else { // ...иначе свет не нужен — выключаем его digitalWrite(LED_PIN, LOW); } }

KOD ÜÇÜN İZAHLAR

  • Biz dəyişənlərin yeni növündən istifadə edirik - boolean, yalnız dəyərləri saxlayan doğru (doğrudur, 1) və ya yalan (yalan, 0). Bu dəyərlər Boolean ifadələrinin qiymətləndirilməsinin nəticəsidir. Bu misalda Boolean ifadəsi belədir yüngüllük< threshold . İnsan dilində bu belə səslənir: “ərəfəsində olan işıqlandırma”. Belə bir ifadə, işıqlandırma eşik səviyyəsindən aşağı olduqda doğru olacaqdır. Mikrokontroller dəyişənlərin dəyərlərini müqayisə edə bilər yüngüllükeşik, bu da öz növbəsində ölçmə nəticələridir və məntiqi ifadənin həqiqətini hesablayın.
  • Bu məntiqi ifadəni yalnız aydınlıq üçün mötərizədə qoyuruq. Hər zaman oxuna bilən kod yazmaq daha yaxşıdır. Digər hallarda mötərizələr adi hesabda olduğu kimi əməliyyatların ardıcıllığına təsir göstərə bilər.
  • Təcrübəmizdə dəyər olduqda bir Boole ifadəsi doğru olacaqdır yüngüllük dəyərindən azdır eşikçünki operatordan istifadə etdik < . operatorlardan istifadə edə bilərik > , <= , >= , = = , != , müvafiq olaraq “böyük”, “kiçik və ya bərabər”, “böyük və ya bərabər”, “bərabər”, “bərabər deyil” deməkdir.
  • Məntiqi operatorla xüsusilə diqqətli olun = = və onu təyin operatoru ilə qarışdırmayın = . Birinci halda biz ifadələrin qiymətlərini müqayisə edib məntiqi qiymət alırıq (doğru və ya yalan), ikinci halda isə sağ operandın qiymətini sol operanda təyin edirik. Kompilyator bizim niyyətlərimizi bilmir və xəta verməyəcək, lakin biz təsadüfən bəzi dəyişənin dəyərini dəyişə bilərik və sonra xəta axtarmağa uzun müddət sərf edə bilərik.
  • Şərti operator əgərƏgər") əksər proqramlaşdırma dillərində əsas dillərdən biridir. Onun köməyi ilə biz nəinki ciddi şəkildə müəyyən edilmiş hərəkətlər ardıcıllığını yerinə yetirə bilərik, həm də müəyyən şərtlərdən asılı olaraq alqoritmin hansı qolunu izləmək barədə qərar qəbul edə bilərik.
  • Məntiqi ifadə üçün yüngüllük< threshold mənası var: doğru və ya yalan. Biz onu hesabladıq və boolean dəyişəninə qoyduq çox Qaranlıq(“çox qaranlıq”) Beləliklə, "əgər çox qaranlıqdırsa, LED-i yandırın" deyirik
  • Eyni müvəffəqiyyətlə "əgər işıqlandırma eşik səviyyəsindən azdırsa, LED-i yandırın" deyə bilərik, yəni. -ə köçürmək əgər bütün məntiqi ifadə:
əgər (yüngüllük< threshold) { // ... }
  • Şərti ifadənin arxasında əgər Məntiqi ifadə doğru olarsa, icra olunan kod bloku olmalıdır. Hər iki qıvrım mötərizəni unutma {} !
  • Əgər ifadə doğrudursa, biz yalnız icra etməliyik bir təlimatlar, dərhal sonra yazıla bilər əgər (...) qıvrım mötərizəsiz:
əgər (yüngüllük< threshold) digitalWrite(LED_PIN, HIGH);
  • Operator əgər dizaynla genişləndirilə bilər başqa("əks halda"). Kod bloku və ya ondan sonrakı tək bəyanat yalnız məntiqi ifadənin daxil olduğu halda yerinə yetiriləcək əgər mənası var yalan , « yalan" Buruq braces ilə bağlı qaydalar eynidir. Təcrübəmizdə "çox qaranlıqdırsa, LED-i yandırın, əks halda LED-i söndürün" yazdıq.

ÖZÜNÜZÜ SINAQ ÜÇÜN SUALLAR

  1. Analoq giriş və torpaq arasında bir fotorezistor quraşdırsaq, cihazımız tərs işləyəcək: işığın miqdarı artdıqda LED yanacaq. Niyə?
  2. LED-dən gələn işıq fotorezistora düşərsə, cihazın işinin hansı nəticəsini alacağıq?
  3. Əvvəlki sualda deyildiyi kimi fotorezistoru quraşdırsaq, cihazın düzgün işləməsi üçün proqramı necə dəyişdirməliyik?
  4. Deyək ki, kodumuz var əgər (şərt) (hərəkət;). Hansı hallarda ediləcək? hərəkət ?
  5. Hansı dəyərlərdə y ifadə x + y > 0 doğru olarsa x > 0 ?
  6. Şərt ifadədə olarsa, hansı göstərişlərin yerinə yetirilməsini göstərmək lazımdırmı əgər yalan?
  7. Operator arasındakı fərq nədir = = operatordan = ?
  8. Tikintidən istifadə etsək əgər (şərt) tədbir1; başqa hərəkət 2;, hərəkətlərin heç birinin icra edilmədiyi bir vəziyyət ola bilərmi? Niyə?

MÜSTƏQİL HƏLL ÜÇÜN VƏZİFƏLƏR

  1. Dəyişəndən istifadə etmədən proqramı yenidən yazın çox Qaranlıq cihazın funksionallığını qoruyarkən.
  2. Dövrəyə başqa bir LED əlavə edin. Proqramı elə tamamlayın ki, işıqlandırma eşik dəyərindən aşağı düşdükdə bir LED yanır, işıqlandırma eşik dəyərinin yarısından aşağı düşdükdə isə hər iki LED yanır.
  3. Dövrəni və proqramı dəyişdirin ki, LED-lər eyni prinsipə uyğun olaraq yansın, lakin daha intensiv parıldayır, fotorezistora daha az işıq düşür.




Üst