Robotik Kodlama

Robotik Kodlama
Ana Sayfa

İLGİNİZİ ÇEKEBİLECEK LİNKLER :

5 Mayıs 2021 Çarşamba

WS2812B NEOPIXEL Tek Tek Adreslenebilir LED'ler Arduino ile Nasıl Kontrol Edilir ?

 

WS2812B Tek Tek Adreslenebilir LED'ler Arduino ile Nasıl Kontrol Edilir ?

LED şeride daha yakından bir göz atarak başlayalım. Oldukça kompakt WS2812B LED sürücü IC'nin entegre edildiği tip 5050 RGB LED'lerden oluşur.


WS2812B LED Sürücü IC 5050 RGB LED

Üç ayrı Kırmızı, Yeşil ve Mavi LED'in yoğunluğuna bağlı olarak, istediğimiz herhangi bir rengi simüle edebiliriz.

WS2812B RGB LED'ler çalışır

Bu LED'lerin harika yanı, tüm LED şeridini bile Arduino kartımızdan tek bir pinle kontrol edebilmemizdir. Her LED'in her iki ucunda ikisi güç ve biri veriler için olmak üzere üç konektörü vardır. Ok, veri akış yönünü gösterir. Önceki LED'in veri çıkış pedi, sonraki LED'in Veri Giriş pedine bağlanır. Şeridi istediğimiz boyutta kesebiliriz, ayrıca bazı teller kullanarak LED'leri uzak tutabiliriz.


Güç vermeye gelince, 5V üzerinde çalışıyorlar ve her Kırmızı, Yeşil ve Mavi LED yaklaşık 20mA, yani tam parlaklıkta her LED için toplam 60mA çekiyor. Arduino'ya USB üzerinden güç verildiğinde, 5V pinin yalnızca 400 mA civarında işleyebileceğini ve namlu güç konektörü kullanılarak çalıştırıldığında 5V pinin yaklaşık 900 mA işleyebileceğini unutmayın.

Daha fazla LED kullanıyorsanız ve çekecekleri akım miktarı yukarıda belirtilen sınırları aşıyorsa, ayrı bir 5V güç kaynağı kullanmalısınız. Böyle bir durumda, iki Toprak hattını da birbirine bağlamanız gerekir. Ek olarak, bu hattaki gürültüyü azaltmak için Arduino ve LED şerit veri pini arasında yaklaşık 330 Ohm'luk bir direnç ve güç kaynağını yumuşatmak için 5V ve Ground boyunca yaklaşık 100 uF'lik bir kapasitör kullanılması önerilir. .

Arduino ve WS2812B LED Örnekleri

örnek 1

Şimdi bir örnek olarak, yukarıda açıklandığı gibi, Arduino'ya 330 Ohm'luk bir dirençle bağlanan ve ayrı bir 5V güç kaynağıyla çalışan 20 LED uzunluğunda şerit kullanacağım. Arduino'yu programlamak için FastLED kütüphanesini kullanacağız Bu, WS2812B LED'lerin kolay kontrolünü sağlayan mükemmel ve iyi belgelenmiş bir kitaplıktır.

İşte ilk örnek için Arduino kaynak kodu:
#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB ledleri [ NUM_LEDS ] ;
geçersiz kurulum () {
FastLED. addLeds < WS2812, LED_PIN, GRB > ( ledler, NUM_LEDS ) ;
}
geçersiz döngü () {
ledler [ 0 ] = CRGB ( 255, 0, 0 ) ;
FastLED. göster () ;
gecikme ( 500 ) ;
ledler [ 1 ] = CRGB ( 0, 255, 0 ) ;
FastLED. göster () ;
gecikme ( 500 ) ;
ledler [ 2 ] = CRGB ( 0, 0, 255 ) ;
FastLED. göster () ;
gecikme ( 500 ) ;
ledler [ 5 ] = CRGB ( 150, 0, 255 ) ;
FastLED. göster () ;
gecikme ( 500 ) ;
ledler [ 9 ] = CRGB ( 255, 200, 20 ) ;
FastLED. göster () ;
gecikme ( 500 ) ;
ledler [ 14 ] = CRGB ( 85, 60, 180 ) ;
FastLED. göster () ;
gecikme ( 500 ) ;
ledler [ 19 ] = CRGB ( 50, 255, 20 ) ;
FastLED. göster () ;
gecikme ( 500 ) ;
}

Açıklama:  Bu yüzden önce FastLED kitaplığını dahil etmemiz, LED şerit verilerinin bağlı olduğu pini tanımlamamız, LED sayısını tanımlamamız ve ayrıca bir CRGB türü dizisi tanımlamamız gerekir. Bu tür, üç Kırmızı, Yeşil ve Mavi renk kanalının her biri için üç bir baytlık veri üyeli LED'leri içerir.

Kurulum bölümünde, FastLED'i yukarıda tanımlanan parametrelerle başlatmamız yeterlidir. Artık ana döngü, LED'lerimizi istediğimiz şekilde kontrol edebiliyoruz. CRGB işlevini kullanarak herhangi bir LED'i Kırmızı, Yeşil ve Mavi renkten oluşan üç parametre kullanarak herhangi bir renge ayarlayabiliriz. LED'lerde değişikliğin gerçekleşmesi için FastLED.show () işlevini çağırmamız gerekir.

Örnek 2

Bazı "for" döngüleri kullanarak bazı animasyonları kolayca yapabiliriz.

Arduino ve WS2812B Örnek 2

İşte ikinci örnek için Arduino kaynak kodu:

#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB ledleri [ NUM_LEDS ] ;
geçersiz kurulum () {
FastLED. addLeds < WS2812, LED_PIN, GRB > ( ledler, NUM_LEDS ) ;
}
geçersiz döngü () {
for ( int i = 0; i < = 19; i ++ ) {
ledler [ i ] = CRGB ( 0, 0, 255 ) ;
FastLED. göster () ;
gecikme ( 40 ) ;
}
for ( int i = 19; i > = 0; i-- ) {
ledler [ i ] = CRGB ( 255, 0, 0 ) ;
FastLED. göster () ;
gecikme ( 40 ) ;
}
}

Burada ilk "for" döngüsü, 40 milisaniye gecikmeyle ilk LED'den son LED'e kadar tüm 20 LED'i mavi renkte yakar. Bir sonraki “for” döngüsü 20 LED'in tümünü tekrar yanar, ancak bu sefer kırmızı renkte ve sondan ilk LED'e kadar ters sırada.

FastLED kütüphanesi, gerçekten ilginç animasyonlar ve ışık gösterileri yapmak için kullanılabilecek birçok başka fonksiyona sahiptir, bu nedenle bir sonraki LED projenizi parlatmak yalnızca hayal gücünüze bağlıdır.

WS2812B LED'leri kullanan interaktif LED Sehpa

Şimdi başında bahsettiğim DIY interaktif LED sehpa projesine bir göz atalım. Bu, benim ve Creativity Hero'dan Marija arasındaki bir işbirliği projesiydi.

Yaratıcılık Kahramanı Etkileşimli LED kahve masası

Ahşap konstrüksiyonun kesilmesi ve montajından başlayarak tüm elektronik parçaların lehimlenmesine ve birbirine bağlanmasına kadar tüm süreci anlattığı web sitesi makalesine göz atabilirsiniz. Burada elektronik parçanın nasıl çalıştığını, özel Android uygulamasının nasıl oluşturulacağını ve Arduino kartının nasıl programlanacağını açıklayacağım.

İşte bu projenin tam devre şeması.


Dolayısıyla tablo, tümü bir Arduino Mega kartına bağlı olan 45 adreslenebilir LED, 45 kızılötesi yakınlık sensörü ve bir HC-05 Bluetooth modülünden oluşur. Devre, 5V 6A güç kaynağı ile güçlendirilmiştir.

Bu örnek için gerekli olan bileşenleri aşağıdaki bağlantılardan edinebilirsiniz:

Kaynak Kodları

İşte bu proje için Arduino kodu ve Bluetooth renk kontrol özelliğini dışlarsak, kodun aslında çok basit olduğunu fark edebiliriz.

#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB ledleri [ NUM_LEDS ] ;
geçersiz kurulum () {
FastLED. addLeds < WS2812, LED_PIN, COLOR_ORDER > ( ledler, NUM_LEDS ) ;
FastLED. setBrightness ( parlaklık ) ;
// Dijital pin 3'ten pin 48'e kadar 45 yakınlık sensörü pinini giriş olarak ayarlayın
for ( int pinNo = 0 + 3; pinNo < = 45 + 3; pinNo ++ ) {
pinMode ( pinNo, GİRİŞ ) ;
}
}
geçersiz döngü () {
for ( int pinNo = 0; pinNo < = NUM_LEDS-1; pinNo ++ ) {
ledler [ pinNo ] = CRGB ( 0, 255, 0 ) ; // 45 LED'in tamamını yeşil renge ayarlayın
// Belirli sensörün üzerinde bir nesne algılanırsa, belirli led'i açın
if ( digitalRead ( pinNo + 3 ) == LOW ) {
ledler [ pinNo ] = CRGB ( 0, 0, 255 ) ; // Reaktif LED'i maviye ayarlayın
}
}
FastLED. göster () ; // LED'leri güncelleyin
gecikme ( 20 ) ;
}

Açıklama: Öncelikle, daha önce açıklandığı gibi temel parametreleri tanımlamamız ve 45 yakınlık sensörü pinini giriş olarak ayarlamamız gerekir.

Tek bir "for" döngüsü kullanan ana döngüde, tüm LED'leri belirli bir renge ayarlıyoruz ve ayrıca yakınlık sensörünün bir nesneyi algılayıp algılamadığını kontrol ediyoruz. Bu doğruysa veya bu durumda bir DÜŞÜK mantık durumu varsa, belirli reaktif renk belirli LED'e ayarlanacaktır. FastLED.show () işlevini kullanarak sonunda LED renklerini güncelliyoruz.

Bluetooth renk kontrol özelliğini dahil etmek için Android uygulamasını yapmanın yanı sıra biraz daha fazla kod satırı eklememiz gerekiyor. HC-05 Bluetooth modülünü Arduino  ile nasıl kullanacağınıza ve MIT App Inventor çevrimiçi uygulamasını kullanarak kendi Android uygulamamızı yapmalıyız.

Android uygulamasının çalışma şekli aşağıda açıklanmıştır. Renkleri alabileceğimiz bir renk paleti görüntüsü, seçilen rengin reaktif mi yoksa arka plan LED'lerine mi uygulanacağını seçebileceğimiz iki onay düğmesi ve parlaklığı ayarlamak için bir kaydırıcıdan oluşur.



Uygulamanın bloklarına bakarsak, renk paleti görüntüsünün yerleştirildiği tuvale dokunduğumuzda ne olduğunu görebiliriz. .GetPixelColor bloklarını kullanarak, alınan renk için Kırmızı, Yeşil ve Mavi değerlerini alıyoruz ve Bluetooth SendText bloğunu kullanarak bu bilgiyi Arduino'ya bir metin biçiminde gönderiyoruz.



Seçilen onay kutusuna bağlı olarak, metni Arduino'da alırken yardımcı olan farklı bir ilk karakter veya işaret göndeririz. Kaydırıcının konumunu değiştirdiğimizde de aynı şey olur, 10'dan 100'e kadar bir değer, önünde “3” işareti bulunan bir metin biçiminde Arduino'ya gönderilir.

Telefon için program kodu apk

İşte Arduino kodu:

#include <SoftwareSerial.h>
#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB ledleri [ NUM_LEDS ] ;
Yazılım Seri Bluetooth ( 53, 52 ) ; // Arduino (RX, TX) - Bluetooth (TX, RX)
// İlk arka plan rengi
int backR = 100;
int backG = 50;
int backB = 10;
// İlk reaktif renk
int reactiveR = 10;
int reactiveG = 50;
int reaktifB = 100;
int parlaklık = 50; // İlk parlaklık
Dize dataIn = "" ;
geçersiz kurulum () {
FastLED.addLeds < WS2812, LED_PIN, COLOR_ORDER > ( ledler, NUM_LEDS ) ;
FastLED. setBrightness ( parlaklık ) ;
Seri.başlangıç ( 38400 ) ;
Bluetooth. başlangıç ( 38400 ) ; // Bluetooth modülünün varsayılan baud hızı
for ( int pinNo = 0 + 3; pinNo < = 45 + 3; pinNo ++ ) {
pinMode( pinNo, GİRİŞ ) ;
}
}
boşluk döngüsü () {
eğer ( Bluetooth. var () > 0 ) {
dataIn = Bluetooth.readString () ;
gecikme( 20 ) ;
eğer ( dataIn. başlarWith ( "1" )) {
gecikme ( 10 ) ;
String stringR = dataIn. alt dize ( dataIn. indexOf ( "R" ) + 1, dataIn. indexOf ( "G" )) ;
reactiveR = stringR. toInt () ;
Dize stringG = dataIn. alt dize ( dataIn. indexOf ( "G" ) + 1, dataIn. indexOf ( "B" )) ;
reactiveG = stringG.toInt () ;
Dize stringB = dataIn. alt dize ( dataIn. indexOf ( "B" ) + 1, dataIn. indexOf ( "E" )) ;
reactiveB = stringB. toInt () ;
}
else if ( dataIn. startsWith ( "2" )) {
String stringR = dataIn. substring ( dataIn. indexOf ( "R" ) + 1, dataIn. indexOf ("G" )) ;
backR = stringR.toInt () ;
Dize stringG = dataIn. substring ( dataIn. indexOf ( "G" ) + 1, dataIn. indexOf ("B" )) ;
backG = stringG.toInt () ;
Dize stringB = dataIn. substring ( dataIn. indexOf ( "B" ) + 1, dataIn. indexOf ("E" )) ;
backB = stringB. toInt () ;
}
else if ( dataIn. startsWith ( "3" )) {
String stringBrightness = dataIn. substring ( dataIn. indexOf ( "3" ) + 1, dataIn. length ()) ;
parlaklık = stringBrightness. toInt () ;
FastLED. setBrightness ( parlaklık ) ;
}
}
for ( int pinNo = 0; pinNo < = NUM_LEDS-1; pinNo ++ ) {
ledler [ pinNo ] = CRGB ( backR, backG, backB ) ;
if ( digitalRead ( pinNo + 3 ) == LOW ) {
ledler [ pinNo ] = CRGB ( reactiveR, reactiveG, reactiveB ) ;
}
}
FastLED. göster () ;
gecikme ( 20 ) ;
}

Açıklama: Öncelikle Arduino ile HC-05 Bluetooth modülü veya modülün bağlı olduğu pinler arasındaki seri iletişimi tanımlamamız gerekir. Kurulum bölümünde, bu modülün çalıştığı baud hızını ayarlamamız gerekiyor. Ardından ana döngüde Bluetooth.available () işlevini kullanarak Akıllı Telefondan gelen bir veri olup olmadığını kontrol ederiz. Bu doğruysa, Bluetooth.readString () işlevini kullanarak verileri dize olarak alırız. Daha sonra .startsWith () işlevini kullanarak ilk karakteri veya işaretçiyi kontrol ederiz ve bu şekilde reaktif rengi, arka planı veya parlaklığı değiştirmek isteyip istemediğimizi biliriz.

.Substring () işlevini kullanarak, alınan metinden Kırmızı, Yeşil ve Mavi değerleri çıkarır ve bunları tam sayılara dönüştürürüz. Bu değerler daha sonra, rengi ayarlayan ve daha önce açıklandığı gibi LED'leri yakan aşağıdaki "for" döngüsünde kullanılır. Aynı şekilde LED'lerin parlaklığını da ayarlıyoruz.

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.

4 Mayıs 2021 Salı

DS1307 RTC Modülü ile Arduino

 

DS1307 RTC Modülü ile Arduino


Hepimiz projelerimiz için kullandığımız çoğu MCU'nun zamandan bağımsız olduğunu biliyoruz; basitçe çevrelerindeki zamanın farkında değillerdir. Projelerimizin çoğu için sorun değil, ancak arada bir zamanı tutmanın başlıca endişe kaynağı olduğu bir fikirle karşılaştığınızda, DS1307 RTC modülü bir kurtarıcıdır. Veri kaydı, saat oluşturma, zaman damgası, zamanlayıcılar ve alarmlar içeren projeler için mükemmeldir.



DS1307 RTC yongası

Modülün merkezinde Maxim - DS1307'den düşük maliyetli, oldukça hassas bir RTC çipi bulunuyor Tüm zaman işleyişi işlevlerini yönetir ve seçtiğiniz herhangi bir mikro denetleyici ile kolayca arayüzlenebilen basit bir iki kablolu I2C arabirimine sahiptir.

Çip saniye, dakika, saat, gün, tarih, ay ve yıl bilgilerini saklar. Ayın sonundaki tarih, artık yıl düzeltmeleri dahil (2100'e kadar geçerli) 31 günden daha az olan aylar için otomatik olarak ayarlanır. Saat, AM / PM göstergesiyle 24 saat veya 12 saat biçiminde çalışır.

Bu kartın diğer harika özelliği, 1Hz, 4kHz, 8kHz veya 32kHz dört kare dalga frekansından birini veren ve programlı olarak etkinleştirilebilen SQW pini ile birlikte gelir.DS1307, zaman tutmak için harici bir 32kHz kristal ile birlikte gelir. Bu kristallerle ilgili sorun, dış sıcaklığın salınım frekanslarını etkileyebilmesidir. Sıklıktaki bu değişiklik önemsizdir, ancak kesinlikle artar.









Bu bir sorun gibi görünebilir, ama değil. Aslında bu, saatin ayda yaklaşık beş dakika kadar kapalı kalmasıyla sonuçlanır.

Yedek batarya

DS1307, bir pil girişi içerir ve cihazın ana gücü kesildiğinde doğru zaman işleyişi sağlar.

Yerleşik güç algılama devresi, güç kesintilerini tespit etmek için VCC'nin durumunu sürekli olarak izler ve otomatik olarak yedek kaynağa geçer. Dolayısıyla, elektrik kesintileri konusunda endişelenmenize gerek yok, MCU'nuz yine de zamanı takip edebilir.

DS1307 Modülünde CR2032 Pil Tutucu

Kartın alt tarafında 20mm 3V lityum çakmaklar için bir pil tutucu bulunur. Herhangi bir CR2032 pil uygun olabilir.

47mAh kapasiteli tam şarjlı bir CR2032 pil kullanıldığını ve çipin minimum 300nA tükettiğini varsayarsak, pil harici bir 5V güç kaynağı olmadan RTC'nin minimum 17.87 yıl çalışmasını sağlayabilir.

47mAh / 300nA = 156666.67 saat = 6527.78 gün = 17.87 yıl

Yerleşik 24C32 EEPROM

DS1307 RTC modülü, sınırlı okuma-yazma döngülerine sahip Atmel'in 32 baytlık 24C32 EEPROM yongasıyla birlikte gelir. Ayarları veya gerçekten herhangi bir şeyi kaydetmek için kullanılabilir.

DS1307 Modülünde 24C32 EEPROM Çip

24C32 EEPROM, iletişim için I2C arayüzünü kullanır ve DS1307 ile aynı I2C veriyolunu paylaşır.

Yerleşik 24C32 EEPROM, kablolu bir I2C adresine sahiptir ve 0x50 HEX olarak ayarlanmıştır.

Eğitimin sonunda 24C32 EEPROM üzerinde okuma / yazma için kod verilmiştir.



Modülün Gizli Özelliği - DS18B20DS1307 RTC modülümüzde genellikle fark edilmeyen bir hüküm vardır. DS18B20 sıcaklık sensörünü kurmamıza izin verir.Pil tutucunun hemen yanındaki üst köşedeki 3 delik (U1 olarak etiketlenmiştir) DS18B20'nin takılı olduğu yerdir.
DS1307 Modülünde DS18B20 için provizyon

DS18B20'yi kurduğunuzda, DS pininden sıcaklık okumaları alabileceksiniz Bu okumalar ayrıca koddaki sıcaklık temelli zaman kaymasını telafi etmek için kullanılabilir.

DS18B20'yi lehimlemek için ipek ekranı takip edin. Ayrıca VCC ve DS arasında bir 4.7K dirence ihtiyacınız olabilir.

DS1307 RTC Modülü Pinout

DS1307 RTC modülü, kendisini dış dünyaya arayüzleyen toplam 7 pime sahiptir. Bağlantılar aşağıdaki gibidir:

DS1307 RTC Modülü Pinout

SQW pin, 1Hz, 4kHz, 8kHz veya 32kHz dört kare dalga frekansından birini çıkarır ve programlı olarak etkinleştirilebilir.

DS Modülünüzde pil tutucusunun hemen yanında (U1 olarak etiketlenen) bir DS18B20 sıcaklık sensörü takılıysa, pinin çıkış sıcaklığı okumaları olduğu varsayılır.

SCL I2C arayüzü için saat girişidir ve seri arayüzde veri hareketini senkronize etmek için kullanılır.

SDA I2C seri arabirimi için veri girişi / çıkışıdır.

VCCpin, modül için güç sağlar. 3.3V ile 5.5V arasında herhangi bir yerde olabilir.

GND bir toprak pimidir.

BAT cihaza giden ana güç kesildiğinde doğru zaman işleyişi sağlamak için herhangi bir standart 3V lityum hücre veya diğer enerji kaynağı için bir yedek besleme girişidir.

DS1307 RTC modülü

RTC'yi Arduino'ya bağlayalım.

Bağlantılar oldukça basit. VCC pinini Arduino'daki 5V çıkışına bağlayarak başlayın ve GND'yi toprağa bağlayın.

Şimdi I2C iletişimi için kullanılan pinlerde kaldık. Her Arduino Board'un uygun şekilde bağlanması gereken farklı I2C pinlerine sahip olduğunu unutmayın. R3 düzenine sahip Arduino kartlarında, SDA (veri hattı) ve SCL (saat hattı), AREF pinine yakın pin başlıkları üzerindedir. A5 (SCL) ve A4 (SDA) olarak da bilinirler.

Bir Mega'nız varsa, iğneler farklıdır! Dijital 21 (SCL) ve 20 (SDA) kullanmak isteyeceksiniz. Hızlı anlamak için aşağıdaki tabloya bakın.

SCLSDA
Arduino UnoA5A4
Arduino NanoA5A4
Arduino Mega2120
Leonardo / Mikro32

Aşağıdaki şema, her şeyi nasıl bağlayacağınızı gösterir.

Arduino ile kablolama DS1307 RTC modülü
Arduino ile kablolama DS1307 RTC modülü
RTClib kitaplığını yükleme

Bir RTC modülüyle iletişim kurmak bir sürü iştir. Neyse ki, RTClib kitaplığı tüm karmaşıklıkları gizlemek için yazılmıştır, böylece RTC verilerini okumak için basit komutlar verebiliriz.Kitaplığı kurmak için Sketch> Dahil Et> Kitaplıkları Yönet'e gidin… Kitaplık Yöneticisinin kitaplıklar dizinini indirmesini ve kurulu kitaplıkların listesini güncellemesini bekleyin.Arduino Kitaplığı Kurulumu - Arduino IDE'de Kitaplıkları Yönetmeyi Seçme









Aramanızı ' rtclib ' yazarak filtreleyin Birkaç giriş olmalı. Adafruit by RTClib'i arayın. Bu girişe tıklayın ve ardından Yükle'yi seçin.

RTClib Arduino kütüphanesini kurma

Arduino Kodu - Tarih ve Saat Okuma

Aşağıdaki taslak, DS1307 RTC modülünde tarih ve saati nasıl ayarlayacağınız / okuyacağınız konusunda size tam bir anlayış verecektir ve daha pratik deneyler ve projeler için temel oluşturabilir.

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () 
{
  Serial.begin(9600);
  delay(3000); // wait for console opening

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (!rtc.isrunning()) {
    Serial.println("RTC lost power, lets set the time!");
	
	// Comment out below lines once you set the date & time.
    // Following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
	
    // Following line sets the RTC with an explicit date & time
    // for example to set January 27 2017 at 12:56 you would call:
    // rtc.adjust(DateTime(2017, 1, 27, 12, 56, 0));
  }
}

void loop () 
{
    DateTime now = rtc.now();
    
    Serial.println("Current Date & Time: ");
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
    Serial.println("Unix Time: ");
    Serial.print("elapsed ");
    Serial.print(now.unixtime());
    Serial.print(" seconds/");
    Serial.print(now.unixtime() / 86400L);
    Serial.println(" days since 1/1/1970");
    
    // calculate a date which is 7 days & 30 seconds into the future
    DateTime future (now + TimeSpan(7,0,0,30));
    
    Serial.println("Future Date & Time (Now + 7days & 30s): ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
    
    Serial.println();
    delay(1000);
}

Seri monitörde çıkışın nasıl göründüğü aşağıda açıklanmıştır.

Seri Monitörde DS1307 Çıkışı
Seri Monitörde DS1307 Çıkışı

Kod Açıklaması:

Taslak, modülle iletişim kurmak için wire.h & RTClib.h kitaplıklarını dahil ederek başlar. Daha sonra bir RTClib kitaplığı nesnesi oluşturuyoruz ve daysOfTheWeekgün bilgilerini depolamak için 2D karakter dizisi tanımlıyoruz .

Kodun kurulum ve döngü bölümlerinde, RTC modülüyle etkileşim kurmak için aşağıdaki işlevleri kullanırız.

begin () işlevi, RTC modülünün bağlı olmasını sağlar.

isrunning () işlevi, çipin zaman izini kaybedip kaybetmediğini kontrol etmek için DS1307'nin dahili I2C kayıtlarını okur. İşlev yanlış döndürürse, tarih ve saati ayarlayabiliriz.

Adjust () işlevi tarih ve saati ayarlar. Bu aşırı yüklenmiş bir işlevdir.

  • Aşırı yüklenmiş bir yöntem DateTime(F(__DATE__), F(__TIME__)), eskizin derlendiği tarih ve saati ayarlar.
  • İkinci aşırı yüklenmiş yöntem DateTime(YYYY, M, D, H, M, s), RTC'yi kesin bir tarih ve saatle ayarlar. Örneğin, 27 Ocak 2017'yi saat 12: 56'ya ayarlamak için şunları arayabilirsiniz:rtc.adjust(DateTime(2017, 1, 27, 12, 56, 0));

now () işlevi geçerli tarih ve saati döndürür. Dönüş değeri genellikle veri türü DateTime değişkeninde saklanır.

year () işlevi geçerli yılı döndürür.

month () işlevi geçerli ayı döndürür.

day () işlevi geçerli günü döndürür.

dayOfTheWeek () işlevi haftanın geçerli gününü döndürür. Bu işlev genellikle yukarıdaki programda tanımlandığı gibi gün bilgilerini depolayan bir 2D karakter dizisinin dizini olarak kullanılır.daysOfTheWeek

hour () işlevi mevcut saati döndürür.

dakika () işlevi geçerli dakikayı döndürür.

second () işlevi geçerli saniyeyi döndürür.

unixtime () işlevi saniye cinsinden unix zamanını döndürür. Unix zamanı, zamandaki bir noktayı tanımlamak için kullanılan bir sistemdir. 00: 00: 00'dan beri geçen saniye sayısıdır (Koordineli Evrensel Saat olarak bilinir - 1 Ocak 1970 Perşembe).

TimeSpan () işlevi, geçerli saate / zamandan zaman eklemek / çıkarmak için kullanılır. Gün, saat, dakika ve saniye ekleyebilir / çıkarabilirsiniz. Aynı zamanda aşırı yüklenmiş bir işlevdir.

  • now() + TimeSpan(seconds) geçerli saate eklenen saniye ile gelecekteki zamanı döndürür.
  • now() - TimeSpan(days,hours, minutes, seconds) geçmiş zamanı döndürür.

Arduino Kodu - 24C32 EEPROM'da Okuma / Yazma

DS1307 RTC modülü ile bonus olarak 32 bayt Elektrikle Silinebilir ROM elde edersiniz. Cihazın ana gücü kesilse bile içeriği silinmeyecektir.

Aşağıdaki program 24C32 EEPROM'dan bir mesaj yazar ve sonra okur. Bu programı ayarları veya şifreleri veya herhangi bir şeyi kaydetmek için kullanabilirsiniz.

#include <Wire.h>

void setup()
{
    char somedata[] = "lastminuteengineers.com"; // data to write
    Wire.begin(); // initialise the connection
    Serial.begin(9600);
    Serial.println("Writing into memory...");
	
	// write to EEPROM
    i2c_eeprom_write_page(0x57, 0, (byte *)somedata, sizeof(somedata));

    delay(100); //add a small delay
    Serial.println("Memory written");
}

void loop()
{
    Serial.print("Reading memory: ");
    int addr=0; //first address
	
	// access the first address from the memory
    byte b = i2c_eeprom_read_byte(0x57, 0);

    while (b!=0)
    {
        Serial.print((char)b); //print content to serial port
        addr++; //increase address
        b = i2c_eeprom_read_byte(0x57, addr); //access an address from the memory
    }
    Serial.println(" ");
    delay(2000);
}

void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
    int rdata = data;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.write(rdata);
    Wire.endTransmission();
}

// WARNING: address is a page address, 6-bit end will wrap around
// also, data can be maximum of about 30 bytes, because the Wire library has a buffer of 32 bytes
void i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length ) {
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddresspage >> 8)); // MSB
    Wire.write((int)(eeaddresspage & 0xFF)); // LSB
    byte c;
    for ( c = 0; c < length; c++)
        Wire.write(data[c]);
    Wire.endTransmission();
}

byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
    byte rdata = 0xFF;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    Wire.requestFrom(deviceaddress,1);
    if (Wire.available()) rdata = Wire.read();
    return rdata;
}

// maybe let's not read more than 30 or 32 bytes at a time!
void i2c_eeprom_read_buffer( int deviceaddress, unsigned int eeaddress, byte *buffer, int length ) {
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    Wire.requestFrom(deviceaddress,length);
    int c = 0;
    for ( c = 0; c < length; c++ )
        if (Wire.available()) buffer[c] = Wire.read();
}

Seri monitörde çıkışın nasıl göründüğü aşağıda açıklanmıştır.

Seri Monitörde 24C32 EEPROM Çıkışı

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.