Arduino ve WS2812'yi temel alan eski bir ampulden gece lambası. Bağımsız çözüm için görevler

Muhtemelen herkesin çocuklukta bir hayali vardı (ve birden fazla). Hatta bir çocuğun hayali gerçekleştiğinde içini dolduran duyguyu ya da gözlerindeki o uzak, tanıdık ışıltıyı hatırlamaya çalışabilirsiniz... Çocukken kendi gece lambamın olmasını hayal ederdim.

Şimdi BSUIR'de 4. sınıf öğrencisiyim ve bize devre tasarımıyla ilgili bir ders projesinin kağıt üzerinde değil, bir donanım parçası üzerinde yapılabileceği söylendiğinde, birden aklıma geldi: o kadar çok arzuladığım gece lambasıydı ki. bir çocuk kendi başıma yapılabilir. Üstelik sadece karanlıkta odayı aydınlatacak bir nesne değil, her ruh haline uyacak şekilde kolayca kontrol edilebilecek bir cihaz yapın. Neden? Ellerimi kullanarak renk değiştirme özelliğini eklemeye karar verdim: elim gece ışığına ne kadar yakınsa, renklerden biri (RGB) o kadar parlak yanar. Uzaktan kumandayı kullanarak gece ışığını da kontrol etmek istiyorum.

Bu fikri cxem.net web sitesinde gördüğümü hemen itiraf edeceğim. Kısaca bu örnekte, kaydırma yazmaçları ve ultrasonik mesafe sensörleri kullanılarak kontrol edilen bir RGB matrisi kullanıldı. Ama matrisin sadece tek yönde parladığını düşündüm ama gece ışığının yanlarda parlamasını istedim.

Devre elemanlarının gerekçesi


Dikkatimi Arduino mikrodenetleyicilerine çevirdim. UNO benim fikrim için oldukça uygun bir seçenek, birincisi Mega'nın aksine en popüler platform olması ve pin sayısının çok fazla olmaması, ikincisi ona harici bir güç kaynağı bağlayabilirsiniz, benim durumumda 12V Nano'nun aksine, üçüncü olarak... sanırım bu iki noktada durabiliriz. Platform, programlama dilinin rahatlığı ve basitliğinin yanı sıra açık mimarisi ve program kodu nedeniyle tüm dünyada son derece popülerdir.

Daha detaylı bilgi Bu kurulla ilgili bilgileri internette kolayca bulabilirsiniz, bu yüzden makaleyi aşırı yüklemeyeceğim.

Yani sistemin temel gereksinimleri. Gerekli:
– sistemi kontrol etmek için engele olan mesafeyi takip edecek sensörler;
– uzaktan kumandadan sinyalleri okumak için sensör uzaktan kumanda;
– Gerekli aydınlatma işlevselliğini sağlayacak LED'ler;
– tüm sistemi kontrol edecek bir kontrol ünitesi.

Proje, mesafe sensörleri olarak her biri belirli bir renge karşılık gelecek telemetrelere ihtiyaç duyuyor: kırmızı, yeşil, mavi. Mesafe sensörleri, elin gece lambasına olan mesafesini izleyecek ve el belirli bir sensöre ne kadar yaklaşırsa, bu telemetreye karşılık gelen renk o kadar güçlü yanacaktır. Tersine, el ne kadar uzaktaysa sensöre karşılık gelen renge o kadar az voltaj uygulanır.

En popüler telemetreler şu an bunlar Sharp GP2Y0A21YK ve HC-SR04'tür. Sharp GP2Y0A21YK bir kızılötesi telemetredir. Bir IR yayıcı ve bir IR alıcısı ile donatılmıştır: Birincisi, yansıması ikincisi tarafından yakalanan ışının kaynağı olarak hizmet eder. Aynı zamanda sensörün IR ışınları insan gözüyle görülemez ve bu yoğunlukta zararsızdır.

HC-SR04 ultrasonik sensörle karşılaştırıldığında bu sensörün hem avantajları hem de dezavantajları vardır. Avantajları arasında tarafsızlık ve zararsızlık yer alır. Dezavantajları ise daha kısa menzil ve bazı aydınlatma türleri de dahil olmak üzere dış müdahalelere bağımlılıktır.

Proje için mesafe sensörleri olarak kullanıldı: ultrasonik telemetreler HC-SR04.
HC-SR04'ün çalışma prensibi, iyi bilinen ekolokasyon olgusuna dayanmaktadır. Bunu kullanırken, verici, engelden yansıyan, sensöre geri dönen ve alıcı tarafından kaydedilen bir akustik sinyal üretir. Ultrasonun havadaki yayılma hızı (yaklaşık 340 m/s) ve gönderilen ve alınan sinyal arasındaki gecikme süresi bilindiğinde akustik bariyere olan mesafeyi hesaplamak kolaydır.

TRIG girişi mikrodenetleyicinin herhangi bir pinine bağlanır. Bu pime bir darbe uygulanmalıdır. dijital sinyal süre 10 μs. TRIG girişindeki sinyale bağlı olarak sensör bir paket ultrasonik darbe gönderir. Yansıyan sinyali aldıktan sonra sensör, ECHO pininde süresi engele olan mesafeyle orantılı olan bir darbe sinyali üretir.

IR sensörü. Elbette uzaktan kumanda için gerekli olan sinyal bu sensörden okunacak ve kodu çözülecektir. TSOP18 birbirinden yalnızca frekans bakımından farklılık gösterir. Proje için VS1838B TSOP1838 sensörü seçildi.

Proje, odayı herhangi bir renkte aydınlatma fikrine dayanıyordu; bu, aydınlatmanın elde edileceği 3 ana renge ihtiyacınız olacağı anlamına geliyor: kırmızı, yeşil, mavi. Bu nedenle, görevin üstesinden mükemmel şekilde gelecek olan SMD 5050RGB LED modeli seçildi.

Her LED'e sağlanan voltaj miktarına bağlı olarak bu aydınlatmanın yoğunluğu değişecektir. LED'in bir direnç aracılığıyla bağlanması gerekir, aksi takdirde sadece onu değil Arduino'yu da mahvetme riskiyle karşı karşıya kalırız. LED üzerindeki akımı kabul edilebilir bir değere sınırlamak için direnç gereklidir. Gerçek şu ki, LED'in iç direnci çok düşüktür ve eğer bir direnç kullanmazsanız, o zaman LED'den öyle bir akım geçecek ki, hem LED'i hem de denetleyiciyi yakacaktır.

Projede kullanılan LED şeritler 12V ile beslenmektedir.

"Kapalı" durumdaki LED'lerdeki voltajın 6V olması ve 5V'u aşan güç kaynağının düzenlenmesinin gerekli olması nedeniyle, anahtarlama modunda devreye transistörlerin eklenmesi gerekmektedir. Seçimim BC547c modeline düştü.

Unutanlar için kısaca çalışma prensibini ele alalım. npn transistörü. Hiç voltaj uygulamazsanız, ancak kısa devre olmasa bile, birkaç ohm'luk bir direnç aracılığıyla taban ve verici terminallerine kısa devre yaparsanız, taban yayıcı voltajının sıfır olduğu ortaya çıkar. Sonuç olarak baz akımı yoktur. Transistör kapalı, kollektör akımı ihmal edilebilecek kadar küçük, sadece aynı başlangıç ​​akımı. Bu durumda transistörün kesim durumunda olduğu söylenir. Bunun tersi duruma doygunluk denir: transistör tamamen açık olduğunda, daha fazla açılacak hiçbir yer kalmaz. Bu açılma derecesiyle, kollektör-verici bölümünün direnci o kadar düşüktür ki, kolektör devresinde yük olmadan transistörü açmak imkansızdır; Bu durumda kollektördeki artık gerilim yalnızca 0,3...0,5V olabilir.

Bu iki durum, doyma ve kesme, transistör normal bir röle kontağı gibi bir anahtarlama modunda çalıştığında kullanılır. Bu modun ana anlamı, küçük bir taban akımının, taban akımından onlarca kat daha büyük olan büyük bir kollektör akımını kontrol etmesidir. Büyük bir kollektör akımı elde edilir dış kaynak enerji, ancak yine de dedikleri gibi mevcut kazanç açıktır. Bizim durumumuzda çalışma voltajı 5V olan mikro devre, 12V ile çalışan LED'li 3 şerit içermektedir.

Anahtar kademesinin çalışma modunu hesaplayalım. LED'lerin tam güçte yanması için baz devresindeki direncin değerini hesaplamak gerekir. Hesaplama sırasında gerekli bir koşul, akım kazancının mümkün olan maksimum kolektör akımının mümkün olan minimum taban akımına bölünmesi oranına eşit veya bundan büyük olmasıdır:

Bu nedenle şeritler 220V çalışma voltajına sahip olabilir ve taban devresi 5V voltajlı bir mikro devreden kontrol edilebilir. Transistör kollektörde böyle bir voltajla çalışacak şekilde tasarlanmışsa LED'ler sorunsuz yanacaktır.
Baz akımının 5mA ve kollektör akımının 0,1A olması koşuluyla, baz-verici bağlantısındaki voltaj düşüşü 0,77V'tur.
Baz direnç üzerindeki voltaj şöyle olacaktır:

Ohm Yasasına göre:

Standart direnç aralığından 8,2 kOhm'luk bir direnç seçiyoruz. Bu hesaplamayı tamamlar.

Karşılaştığım bir soruna dikkatinizi çekmek isterim. IRremote kütüphanesini kullanırken, mavi rengi ayarlarken Arduino dondu. İnternette uzun ve kapsamlı bir aramanın ardından, bu kütüphanenin bu Arduino modeli için varsayılan olarak Timer 2'yi kullandığı ortaya çıktı. Zamanlayıcılar PWM çıkışlarını kontrol etmek için kullanılır.

Zamanlayıcı 0 (Sistem zamanı, PWM 5 ve 6);
Zamanlayıcı 1 (PWM 9 ve 10);
Zamanlayıcı 2 (PWM 3 ve 11).

Başlangıçta mavi rengi düzenlemek için PWM 11'i kullandım. Bu nedenle PWM, zamanlayıcılar ve bunları kullanabilecek üçüncü taraf kütüphanelerle çalışırken dikkatli olun. Bu çok tuhaf ana sayfa Github'da bu nüans hakkında hiçbir şey söylenmedi. İsterseniz zamanlayıcı 1 ile satırın açıklamasını kaldırabilir ve yorum 2'yi iptal edebilirsiniz.

Breadboard üzerindeki elemanların bağlanması şöyle görünür:

Breadboard üzerinde yapılan testlerin ardından “Elemanların tahtaya yerleştirilmesi” ve “Havya ile çalışma” aşamaları başladı. Bitmiş tahtanın ilk testinden sonra aklıma bir düşünce geldi: bir şeyler ters gitti. Ve burada birçok kişinin aşina olduğu "Test uzmanıyla özenli çalışma" aşaması başlıyor. Bununla birlikte, sorunlar (birkaç bitişik kontak yanlışlıkla birbirine lehimlendi) hızla ortadan kaldırıldı ve işte LED'lerin uzun zamandır beklenen yaramaz ışığı.

O zaman mesele sadece beden meselesiydi. Bu nedenle sensörlerimiz için delikli kontrplak kesildi. Arka kapak içeriden manzaranın keyfini çıkarabilmeniz ve istenirse bir şeyi tamamlayabilmeniz veya yeniden yapabilmeniz için özel olarak çıkarılabilir hale getirildi. Ayrıca kartı ve güç kaynağını yeniden programlamak için 2 deliğe sahiptir.

Gövde iki bileşenli epoksi yapıştırıcı ile yapıştırıldı. Daha önce karşılaşmamış olanlar için bu yapıştırıcının özelliğini belirtmekte fayda var. Bu ürün iki ayrı kapta gelir ve içerikler karıştırıldığında anında kimyasal reaksiyon meydana gelir. Karıştırdıktan sonra 3-4 dakika içinde hızlı hareket etmelisiniz. Daha fazla kullanım için yeni bir kısmı karıştırmanız gerekir. O yüzden eğer bunu tekrarlamaya çalışıyorsanız size tavsiyem küçük porsiyonlarda karıştırıp çok hızlı hareket etmeniz, düşünmeye fazla zamanınız kalmayacaktır. Bu nedenle vücudun nasıl ve nereye yapıştırılacağını önceden düşünmeye değer. Üstelik bu bir oturuşta yapılamaz.

LED'li şeritleri monte etmek için kapak içinden tüm tellerin mükemmel bir şekilde geçtiği bir tüp yerleştirildi.

Abajurla ilgili sorun ortaya çıktığında, çocukken basit iplik, yapıştırıcı ve taban görevi gören bir balondan nasıl el sanatları yaptığımı hatırladım. Abajurun prensibi aynıdır, ancak bir çokyüzlünün sarılmasının toptan daha zor olduğu ortaya çıktı. İpliklerin yapıya uyguladığı baskı nedeniyle yukarı doğru daralmaya ve iplikler düşmeye başladı. Acil olarak ellerim tutkalla kaplanarak yapının yukarıdan güçlendirilmesine karar verildi. Ve sonra CD kurtarmaya geldi. Sonuçta bu gece lambası ortaya çıktı:

Sonunda ne söylemek istiyorsun?

Projede neyi değiştirmeliyim? TRIG sinyalini mesafe sensörlerine sağlamak için üç yerine bir Arduino çıkışı kullanılabilir. Ayrıca IR sensörü için (unuttuğum) bir delik de sağlardım; bu, ne yazık ki, doğal olarak uzaktan kumandadan gelen sinyalleri okuyamadığı durumda hala gizlidir. Ancak hiçbir şeyi lehimleyemeyeceğinizi veya delemeyeceğinizi kim söyledi?

Bunun ilginç bir dönem olduğunu ve kağıt üzerinde olmayan bir şeyler yapmayı denemek için harika bir fırsat olduğunu belirtmek isterim, bu sayede "çocukluk hayali" öğesinin yanına bir onay işareti daha koyabilirim. Yeni bir şey denemenin zor olduğunu düşünüyorsanız ve ilk önce ne yapacağınızı bilmiyorsanız endişelenmeyin. Pek çok insanın aklından bir düşünce geçiyor: Nereden başlamalı ve bu nasıl yapılabilir? Hayatta kafanızı karıştırabilecek pek çok görev vardır, ancak bir kez denediğinizde, bunun için biraz çabalamanız gerekse bile, gözlerinizde bir parıltıyla dağları yerinden oynatabileceğinizi fark edeceksiniz.

Ek bir görev için

    1 LED daha

    Nominal değeri 220 Ohm olan 1 direnç daha

    2 kablo daha

Şematik diyagram

Breadboard'daki şema

Not

    Bu deneyde güç kaynağı ile analog giriş arasına bir foto direnç yerleştiriyoruz. R1'i voltaj bölücü devrede konumlandırın. Aydınlatma azaldığında analog girişte daha az voltaj almamız için buna ihtiyacımız var.

    Bileşenleri, LED'in fotorezistörü aydınlatmaması için yerleştirmeye çalışı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() ( // ışık seviyesini oku. Bu arada duyurun // bir değişkene ve değere aynı anda atayabilirsiniz int hafiflik = analogRead(LDR_PIN) ; //regülasyon yaptığımız potansiyometreden değeri okuyalım // koşullu karanlık ve aydınlık arasındaki eşik değeri int eşik = analogRead(POT_PIN) ; // bir boole değişkeni tanımlayıp ona bir değer atayın // "Şimdi karanlık mı." Boole değişkenleri, aksine // tamsayılar iki değerden yalnızca birini içerebilir: // doğru ya da yanlış. Bu tür değerler // aynı zamanda boolean olarak da adlandırılır. boolean daKoyu = (açıklık< threshold) ; // program dallanmasını kullan: işlemci aşağıdakilerden birini yürütecektir // koşulun yürütülmesine bağlı olarak iki kod bloğu. // If (İngilizce “if”) çok karanlıksa... eğer (çokKaranlık) ( // ...ışığı aç digitalWrite(LED_PIN, YÜKSEK) ; ) başka ( // ...aksi halde ışığa gerek yoktur - kapatın digitalWrite(LED_PIN, DÜŞÜK) ; ))

Kod için açıklamalar

    Yalnızca true (true, 1) veya false (false, 0) değerlerini saklayan yeni bir değişken türü olan boolean kullanıyoruz. Bu değerler Boolean ifadelerinin değerlendirilmesinin sonucudur. Bu örnekte Boolean ifadesi hafifliktir< threshold . На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness и threshold , которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.

    Bu mantıksal ifadeyi yalnızca açıklık sağlamak amacıyla parantez içine aldık. Okunabilir kod yazmak her zaman daha iyidir. Diğer durumlarda parantezler, sıradan aritmetikte olduğu gibi işlemlerin sırasını etkileyebilir.

    Deneyimizde operatör kullandığımız için açıklık değeri eşik değerinden küçük olduğunda boolean ifadesi doğru olacaktır.< . Мы можем использовать операторы > , <= , >= , == , != sırasıyla "büyük", "küçük veya eşit", "büyük veya eşit", "eşit", "eşit değil" anlamına gelir.

    Mantıksal operatör == konusunda özellikle dikkatli olun ve onu atama operatörü = ile karıştırmayın. İlk durumda ifadelerin değerlerini karşılaştırıp mantıksal bir değer (doğru veya yanlış) elde ederiz, ikinci durumda ise sağ işlenenin değerini sol işlenene atarız. Derleyici niyetimizi bilmez ve hata vermez, ancak yanlışlıkla bazı değişkenlerin değerini değiştirebiliriz ve ardından uzun süre hata aramakla uğraşabiliriz.

    Koşullu if ifadesi çoğu programlama dilinde en önemli ifadelerden biridir. Onun yardımıyla, yalnızca kesin olarak tanımlanmış bir eylem dizisini gerçekleştirmekle kalmayıp, aynı zamanda belirli koşullara bağlı olarak algoritmanın hangi dalının takip edileceğine dair kararlar da verebiliriz.

    Mantıksal ifade hafifliği< threshold есть значение: true или false . Мы вычислили его и поместили в булеву переменную tooDark («слишком темно»). Таким образом мы как бы говорим «если слишком темно, то включить светодиод»

    Aynı başarı ile "aydınlatma eşik seviyesinin altındaysa LED'i açın" diyebiliriz. mantıksal ifadenin tamamını if öğesine iletin:

eğer (hafiflik< threshold) { // ... }

    Arka koşullu operatör if mutlaka mantıksal ifadenin doğru olması durumunda yürütülen bir kod bloğunu takip eder. Her iki kaşlı ayracı da () unutmayın!

    İfade doğruysa, yalnızca yürütmemiz gerekir bir talimat, eğer (...) olmadan hemen sonra yazılabilir kıvırcık parantez:

eğer (hafiflik< threshold) digitalWrite(LED_PIN, HIGH) ;

    If ifadesi else yapısıyla genişletilebilir. Kod bloğu veya onu takip eden tek ifade, yalnızca if'teki Boolean ifadesinin false olarak değerlendirilmesi durumunda yürütülecektir. Kıvırcık parantezlerle ilgili kurallar aynıdır. Deneyimizde "hava çok karanlıksa LED'i açın, değilse LED'i kapatın" diye yazdık.

Fotodirençler temelinde oluşturulan ışık sensörleri (aydınlatma), gerçek Arduino projelerinde oldukça sık kullanılmaktadır. Bunlar nispeten basittir, pahalı değildir ve herhangi bir çevrimiçi mağazada bulunup satın alınması kolaydır. Arduino fotodirenç, ışık seviyesini kontrol etmenize ve değişikliklerine yanıt vermenize olanak tanır. Bu yazıda bir fotorezistörün ne olduğuna, ona dayalı bir ışık sensörünün nasıl çalıştığına ve sensörün Arduino kartlarına doğru şekilde nasıl bağlanacağına bakacağız.

Adından da anlaşılacağı gibi bir fotodirenç, hemen hemen her elektronik devrede sıklıkla bulunan dirençlerle doğrudan ilişkilidir. Geleneksel bir direncin temel özelliği direncinin değeridir. Gerilim ve akım buna bağlıdır; bir direnç kullanarak diğer bileşenlerin gerekli çalışma modlarını ayarlıyoruz. Kural olarak, bir direncin direnç değeri aynı çalışma koşulları altında pratik olarak değişmez.

Geleneksel dirençlerden farklı olarak fotodirenç ortam ışığının seviyesine bağlı olarak direncini değiştirebilir. Bu şu anlama gelir: elektronik devre Parametreler sürekli değişecek; her şeyden önce, foto dirençteki voltajın düşmesiyle ilgileniyoruz. Bu voltaj değişimlerini Arduino'nun analog pinlerine kaydederek devrenin mantığını değiştirebilir, bu sayede dış koşullara uyum sağlayan cihazlar oluşturabiliriz.

Fotodirençler çok çeşitli sistemlerde oldukça aktif olarak kullanılmaktadır. En yaygın uygulama sokak aydınlatmasıdır. Şehrin üzerine gece çökerse veya hava bulutlu olursa ışıklar otomatik olarak açılır. Programa göre değil, aydınlatmaya bağlı olarak açılan bir fotodirençten ev için ekonomik bir ampul yapabilirsiniz. Hatta kapalı bir dolap veya kasanın açılıp aydınlatılmasından hemen sonra devreye girecek ışık sensörüne dayalı bir güvenlik sistemi bile yapabilirsiniz. Her zaman olduğu gibi, herhangi bir Arduino sensörünün uygulama kapsamı yalnızca hayal gücümüzle sınırlıdır.

Çevrimiçi mağazalardan hangi fotodirençler satın alınabilir?

En popüler ve uygun fiyatlı seçenek Piyasadaki sensörler, Çinli şirketlerin seri üretim modelleri, üretici VT'nin ürünlerinin klonlarıdır. Bu veya bu tedarikçinin tam olarak kimin ve ne ürettiğini anlamak her zaman mümkün değildir, ancak fotodirençlerle başlamak için en basit seçenek oldukça uygundur.

Acemi bir Arduino kullanıcısına şuna benzeyen hazır bir fotoğraf modülü satın alması önerilebilir:


Bu modül zaten gerekli tüm unsurları içermektedir. kolay bağlantı Arduino kartına foto direnç. Bazı modüller bir karşılaştırıcı devre uygular ve kontrol için bir dijital çıkış ve bir kesme direnci sağlar.

Bir Rus radyo amatörüne Rus PA sensörüne başvurması önerilebilir. Satışa sunulanlar FR1-3, FR1-4 vb.'dir. - Sovyet döneminde üretildi. Ancak buna rağmen FR1-3 daha doğru bir detaydır. Bundan fiyat farkı çıkıyor FR için 400 rubleden fazla istemiyorlar. FR1-3'ün tanesi bin rubleden fazlaya mal olacak.

Fotodirenç işaretleme

Rusya'da üretilen modellerin modern etiketlenmesi oldukça basittir. İlk iki harf PhotoResistor'dur, kısa çizgiden sonraki sayılar geliştirme numarasını gösterir. FR -765 - fotodirenç, geliştirme 765. Genellikle doğrudan parçanın gövdesi üzerinde işaretlenir

VT sensörü, işaretleme şemasında belirtilen bir direnç aralığına sahiptir. Örneğin:

  • VT83N1 - 12-100kOhm (12K – ışıklı, 100K – karanlıkta)
  • VT93N2 - 48-500kOhm (48K – ışıklı, 100K – karanlıkta).

Bazen modeller hakkındaki bilgileri açıklığa kavuşturmak için satıcı, üreticiden özel bir belge sağlar. Çalışma parametrelerinin yanı sıra parçanın doğruluğu da burada belirtilir. Tüm modellerin spektrumun görünür kısmında bir hassasiyet aralığı vardır. Toplama ışık sensörü Operasyon doğruluğunun göreceli bir kavram olduğunu anlamalısınız. Aynı üreticinin, aynı partinin veya aynı satın almanın modelleri için bile %50 veya daha fazla farklılık gösterebilir.

Fabrikada parçalar kırmızıdan yeşil ışığa kadar değişen dalga boylarına ayarlanıyor. Çoğu insan aynı zamanda kızılötesi radyasyonu da “görür”. Özellikle hassas parçalar ultraviyole ışığı bile algılayabilir.

Sensörün avantajları ve dezavantajları

Fotodirençlerin ana dezavantajı spektrum duyarlılığıdır. Gelen ışığın türüne bağlı olarak direnç birkaç büyüklük sırasına göre değişebilir. Dezavantajları ayrıca şunları içerir: düşük hız Aydınlatmadaki değişikliklere tepkiler. Işık yanıp sönerse sensörün tepki verecek zamanı yoktur. Değişim frekansı oldukça yüksekse, direnç genellikle aydınlatmanın değiştiğini "görmeyi" bırakacaktır.

Avantajları basitlik ve erişilebilirliği içerir. Üzerine düşen ışığa bağlı olarak direncin doğrudan değiştirilmesi, basitleştirmenizi sağlar elektrik şeması bağlantılar. Fotorezistörün kendisi çok ucuzdur, çok sayıda Arduino kitine ve yapıcısına dahil edilmiştir ve bu nedenle neredeyse tüm acemi Arduino üreticileri tarafından kullanılabilir.

Arduino'ya bir fotorezistörün bağlanması

Projelerde arduino Fotodirenç ışık sensörü olarak kullanılır. Karttan bilgi alan kart, röleleri açıp kapatabilir, motorları çalıştırabilir ve mesaj gönderebilir. Doğal olarak sensörü doğru şekilde bağlamamız gerekiyor.

Işık sensörünün Arduino'ya bağlantı şeması oldukça basittir. Bir fotodirenç kullanırsak, bağlantı şemasında sensör voltaj bölücü olarak uygulanır. Bir kol aydınlatma seviyesine göre değişir, ikincisi ise analog girişe voltaj sağlar. Kontrol çipinde bu voltaj bir ADC aracılığıyla dijital verilere dönüştürülür. Çünkü Işık çarptığında sensörün direnci azaldığında üzerine düşen voltajın değeri de azalacaktır.

Fotorezistörü yerleştirdiğimiz bölücünün hangi koluna bağlı olarak analog girişe artan veya azalan voltaj sağlanacaktır. Fotorezistörün bir ayağı toprağa bağlıysa, maksimum voltaj değeri karanlığa karşılık gelecektir (fotorezistörün direnci maksimumdur, neredeyse tüm voltaj onun üzerinde düşer) ve minimum değer iyi aydınlatmaya karşılık gelecektir (direnç sıfıra yakın, voltaj minimumdur). Fotodirenç kolunu güç kaynağına bağlarsak davranış tam tersi olacaktır.

Kartın kendisinin takılması herhangi bir zorluğa neden olmamalıdır. Fotorezistörün polaritesi olmadığı için her iki taraftan da bağlanabilir; panele lehimlenebilir, bir devre kartı kullanılarak kablolarla bağlanabilir veya bağlantı için sıradan klipslerle (timsah klipsleri) kullanılabilir. Devredeki güç kaynağı Arduino'nun kendisidir. Fotodirenç bir bacak yere, diğeri ADC kartına (örneğimizde - AO) bağlıdır. Aynı bacağa 10 kOhm'luk bir direnç bağlıyoruz. Doğal olarak, bir fotorezistörü yalnızca analog pin A0'a değil, aynı zamanda diğerine de bağlayabilirsiniz.

Ek 10 K direnç ile ilgili birkaç kelime Devremizde iki işlevi vardır: devredeki akımı sınırlamak ve oluşturmak. gerekli voltaj bölücülü bir devrede. Tamamen aydınlatılmış bir fotorezistörün direncini keskin bir şekilde azalttığı bir durumda akım sınırlaması gereklidir. Ve voltaj üretimi analog portta öngörülebilir değerler içindir. Aslında için normal operasyon Fotodirençlerimizle 1K'lık bir direnç yeterlidir.

Direnç değerini değiştirerek hassasiyet seviyesini “karanlık” ve “aydınlık” taraflara “kaydırabiliriz”. Yani 10K verecek hızlı geçişışığın başlangıcı. 1K durumunda ışık sensörü yüksek ışık seviyelerini daha doğru bir şekilde algılayacaktır.

Eğer kullanıyorsanız hazır modülışık sensörü, bağlantı daha da basitleşecektir. VCC modül çıkışını kart üzerindeki 5V konnektöre, GND’yi ise toprağa bağlıyoruz. Kalan pinleri Arduino konnektörlerine bağlıyoruz.

Eğer kartın dijital çıkışı varsa onu dijital pinlere gönderiyoruz. Analog ise analoga gidin. İlk durumda, bir tetikleme sinyali alacağız - aydınlatma seviyesi aşıldı (tetikleme eşiği bir ayar direnci kullanılarak ayarlanabilir). Analog pinlerden gerçek aydınlatma seviyesine orantılı bir voltaj değeri elde edebileceğiz.

Bir fotodirenç üzerindeki ışık sensörünün örnek çizimi

Devreyi fotodirençle Arduino'ya bağladık ve her şeyin doğru yapıldığından emin olduk. Artık geriye kalan tek şey denetleyiciyi programlamaktır.

Bir ışık sensörü için taslak yazmak oldukça basittir. Sensörün bağlı olduğu analog pinden sadece mevcut voltaj değerini çıkarmamız yeterli. Bu, hepimizin bildiği analogRead() işlevi kullanılarak yapılır. Daha sonra ışık seviyesine bağlı olarak bazı eylemler gerçekleştirebiliriz.

Aşağıdaki devreye göre bağlanan bir LED'i açıp kapatan ışık sensörünün çizimini yazalım.

Çalışma algoritması aşağıdaki gibidir:

  • Analog pinden sinyal seviyesini belirleyin.
  • Seviyeyi eşik değeriyle karşılaştırıyoruz. Maksimum değer karanlığa, minimum değer ise maksimum aydınlığa karşılık gelecektir. 300'e eşit bir eşik değeri seçelim.
  • Seviye eşikten düşükse karanlıktır, LED'i açmanız gerekir.
  • Aksi takdirde LED'i kapatı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); if ( val< 300) { digitalWrite(PIN_LED, LOW); } else { digitalWrite(PIN_LED, HIGH); } }

Fotorezistörün üzerini kapatarak (ellerinizle veya ışık geçirmez bir nesneyle) LED'in açılıp kapandığını gözlemleyebiliriz. Koddaki eşik parametresini değiştirerek ampulü farklı aydınlatma seviyelerinde açılıp kapanmaya zorlayabiliriz.

Takarken, parlak LED'den gelen ışık sensörünün üzerine daha az ışık düşmesi için fotorezistörü ve LED'i birbirinden mümkün olduğunca uzağa yerleştirmeye çalışın.

Işık sensörü ve arka ışık parlaklığında yumuşak değişim

Projeyi, LED'in parlaklığı aydınlatma seviyesine bağlı olarak değişecek şekilde değiştirebilirsiniz. Algoritmaya aşağıdaki değişiklikleri ekleyeceğiz:

  • AnalogWrite() kullanarak LED'li pine 0'dan 255'e kadar değerler göndererek ampulün parlaklığını PWM üzerinden değiştireceğiz.
  • Işık sensöründen gelen ışık seviyesinin dijital değerini (0'dan 1023'e kadar) LED parlaklığının PWM aralığına (0'dan 255'e kadar) dönüştürmek için map() işlevini kullanacağız.

Çizim örneği:

#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(val); int ledPower = harita(val, 0, 1023, 0, 255); // Ortaya çıkan değeri PWM sinyal seviyesine dönüştürün. Aydınlatma değeri ne kadar düşük olursa, PWM aracılığıyla LED'e o kadar az güç sağlamamız gerekir.

Analog bağlantı noktasından gelen sinyalin aydınlatma derecesiyle orantılı olduğu başka bir bağlantı yöntemi durumunda, değeri maksimumdan çıkararak ek olarak "tersine çevirmeniz" gerekecektir:

Int değer = 1023 – analogRead(PIN_PHOTO_RESISTOR);

Bir fotodirenç ve röle kullanan ışık sensörü devresi

Arduino'da rölelerin programlanması ile ilgili makalede rölelerle çalışmaya yönelik eskiz örnekleri verilmiştir. Bu durumda karmaşık hareketler yapmamıza gerek yok: "karanlığı" belirledikten sonra röleyi açıp ilgili değeri pinine uyguluyoruz.

#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); if (val< 300) { // Светло, выключаем реле digitalWrite(PIN_RELAY, HIGH); } else { // Темновато, включаем лампочку digitalWrite(PIN_RELAY, LOW); } }

Çözüm

Fotorezistöre dayalı bir ışık sensörü kullanan projeler oldukça basit ve etkilidir. Pek çok ilginç projeyi hayata geçirebilirsiniz ve ekipmanın maliyeti yüksek olmayacaktır. Fotodirenç, ek dirençli bir voltaj bölücü devre kullanılarak bağlanır. Sensör, çeşitli ışık seviyelerini ölçmek için bir analog bağlantı noktasına veya tek umursadığımız şey karanlıksa dijital bir bağlantı noktasına bağlanır. Taslakta, verileri analog (veya dijital) bir bağlantı noktasından okuyoruz ve değişikliklere nasıl tepki vereceğimize karar veriyoruz. Artık projelerinizde bu kadar basit "gözlerin" ortaya çıkacağını umalım.

Bu deneyde, ışık seviyesi potansiyometre tarafından belirlenen eşiğin altına düştüğünde LED yanmalıdır.

DENEY İÇİN PARÇA LİSTESİ

- 1 Arduino Uno kartı;

- 1 lehimsiz devre tahtası;

- 1 LED;

- 1 fotodirenç;

- 220 Ohm nominal değerde 1 direnç, 10 kOhm nominal değerde 1 direnç;

- 1 değişken direnç (potansiyometre);

- 10 adet erkek-erkek kablo.

EK GÖREV İÇİN DETAYLAR

1 LED daha;

Nominal değeri 220 Ohm olan başka bir 1 direnç;

2 kablo daha.

DEVRE ŞEMASI

EKMEK TAHTA ÜZERİNDEKİ ŞEMA

Kroki

Arduino IDE için taslağı indir
#define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT); ) void loop() ( // ışık seviyesini okuyun. Bu arada, // bir değişken bildirip atayabilirsiniz hemen bir değer int lightness = analogRead(LDR_PIN); // koşullu karanlık ve aydınlık arasındaki eşik değerini ayarlamak için kullandığımız potansiyometreden değeri okuyun int eşik = analogRead(POT_PIN); mantıksal değişken ve ona // değerini atayın. Boolean değişkenleri, // tam sayılardan farklı olarak iki değerden yalnızca birini içerebilir: // true veya false Bu tür değerlere // ayrıca boolean (boolean) adı verilir. çok Karanlık =).< threshold); // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH); } else { // ...иначе свет не нужен — выключаем его digitalWrite(LED_PIN, LOW); } }

KOD AÇIKLAMALARI

  • Yeni bir değişken türü kullanıyoruz – boolean yalnızca değerleri saklayan doğru (doğru, 1) veya YANLIŞ (yanlış, 0). Bu değerler Boolean ifadelerinin değerlendirilmesinin sonucudur. Bu örnekte Boole ifadesi şöyledir: hafiflik< threshold . İnsan dilinde bu şuna benzer: "eşik seviyesinin altındaki aydınlatma." Böyle bir ifade, aydınlatma eşik seviyesinin altında olduğunda doğru olacaktır. Mikrodenetleyici değişkenlerin değerlerini karşılaştırabilir hafiflik Ve eşik Bunlar da ölçüm sonuçlarıdır ve mantıksal ifadenin doğruluğunu hesaplar.
  • Bu mantıksal ifadeyi yalnızca açıklık sağlamak amacıyla parantez içine aldık. Okunabilir kod yazmak her zaman daha iyidir. Diğer durumlarda parantezler, sıradan aritmetikte olduğu gibi işlemlerin sırasını etkileyebilir.
  • Deneyimimizde, bir Boolean ifadesi şu durumda doğru olacaktır: hafiflik değerden az eşikçünkü operatörü kullandık < . Operatörleri kullanabiliriz > , <= , >= , = = , != , sırasıyla "büyüktür", "küçük veya eşittir", "büyük veya eşittir", "eşittir", "eşit değildir" anlamına gelir.
  • Mantıksal operatöre özellikle dikkat edin = = ve bunu atama operatörüyle karıştırmayın = . İlk durumda ifadelerin değerlerini karşılaştırıp mantıksal bir değer (doğru veya yanlış) elde ederiz, ikinci durumda ise sağ işlenenin değerini sol işlenene atarız. Derleyici niyetimizi bilmez ve hata vermez, ancak yanlışlıkla bazı değişkenlerin değerini değiştirebiliriz ve ardından uzun süre hata aramakla uğraşabiliriz.
  • Koşullu operatör eğerEğer") çoğu programlama dilinde anahtarlardan biridir. Onun yardımıyla, yalnızca kesin olarak tanımlanmış bir eylem dizisini gerçekleştirmekle kalmayıp, aynı zamanda belirli koşullara bağlı olarak algoritmanın hangi dalının takip edileceğine dair kararlar da verebiliriz.
  • Mantıksal bir ifade için hafiflik< threshold bir anlamı var: doğru veya YANLIŞ. Bunu hesapladık ve bir boole değişkenine koyduk çok karanlık("çok karanlık") Yani “hava çok karanlıksa LED’i açın” diyor gibiyiz.
  • Aynı başarı ile "aydınlatma eşik seviyesinin altındaysa LED'i açın" diyebiliriz. transfer eğer tüm mantıksal ifade:
eğer (hafiflik< threshold) { // ... }
  • Koşullu ifadenin arkasında eğer Mantıksal ifadenin doğru olması durumunda çalıştırılacak bir kod bloğunun olması gerekir. Her iki küme parantezini de unutma {} !
  • İfade doğruysa, yalnızca yürütmemiz gerekir bir talimatlardan hemen sonra yazılabilir. eğer (…) küme parantezleri olmadan:
eğer (hafiflik< threshold) digitalWrite(LED_PIN, HIGH);
  • Şebeke eğer tasarımla genişletilebilir başka("aksi takdirde"). Bir kod bloğu veya onu takip eden tek bir ifade, yalnızca içindeki mantıksal ifadenin çalıştırılması durumunda yürütülür. eğer anlamı var YANLIŞ , « yalan" Kıvırcık parantezlerle ilgili kurallar aynıdır. Deneyimizde "hava çok karanlıksa LED'i açın, değilse LED'i kapatın" diye yazdık.

KENDİNİZİ TEST EDECEĞİNİZ SORULAR

  1. Analog giriş ile toprak arasına fotorezistör takarsak cihazımız ters yönde çalışacaktır: ışık miktarı arttığında LED yanacaktır. Neden?
  2. LED'den gelen ışık fotorezistörün üzerine düşerse cihazın çalışmasından ne gibi bir sonuç elde edeceğiz?
  3. Önceki soruda belirtildiği gibi fotorezistörü kurarsak cihazın doğru çalışması için programı nasıl değiştirmemiz gerekir?
  4. Diyelim ki kodumuz var if (koşul) (eylem;). Hangi durumlarda yapılacak? aksiyon ?
  5. Hangi değerlerde sen ifade x + y > 0 eğer doğru olacak x > 0 ?
  6. Koşul ifadede yer alıyorsa hangi talimatların yürütüleceğini belirtmek gerekli midir? eğer YANLIŞ?
  7. Operatör arasındaki fark nedir? = = operatörden = ?
  8. Eğer inşaatı kullanırsak if (koşul) eylem1; aksi halde eylem2;, eylemlerin hiçbirinin yürütülmediği bir durum olabilir mi? Neden?

BAĞIMSIZ ÇÖZÜM İÇİN GÖREVLER

  1. Değişkeni kullanmadan programı yeniden yazın çok karanlık cihazın işlevselliğini korurken.
  2. Devreye başka bir LED ekleyin. Aydınlatma eşik değerinin altına düştüğünde bir LED yanacak, aydınlatma eşik değerinin yarısının altına düştüğünde her iki LED de yanacak şekilde programı tamamlayın.
  3. Devreyi değiştirin ve LED'lerin aynı prensibe göre yanmasını sağlayın, ancak fotorezistöre ne kadar az ışık düşerse o kadar yoğun parlayın.




Tepe