Arduino Led Dot Matrix ile Dijital Saat Yapımı
Merhabalar,
Bu projede, bir önceki çalışmada öğrenmiş olduğumuz LED Dot Matrix kullanımı ve kayan yazı yapımı bilgilerini kullanarak kendi arduino dijital saatimi yapmaya çalıştım. 1302 RTC saat modülü, DHT11 Sıcaklık ve Nem Sensörü ve LDR kullanarak Tarihi, Saati, Günü, Ortam sıcaklığını ve rutubeti gösteren bir saat yapmayı amaçladım. Ayrıca görsel olarak da göze hoş görünmesi ve günlük yaşamda evin bir köşesinde kullanılabilecek şık bir saat olması için 3D modelleme programı Solidworks ile basit bir kutu tasarlayıp saati bu kutu içine yerleştirdim.Dot matrislerin kullanımının pekiştirilmesi, kendi tasarladığımız fontları nasıl kullanabileceğimizi anlamak, RTC saat modüllerinin kullanımını öğrenmek, sıcaklık ve nem sensöründen veri okuyabilmek ve tüm bunları tek bir potada toplayarak işe yarar bir ürün ortaya çıkarmak açısından faydalı bir uygulama olduğunu değerlendiriyorum. İnternet üzerinde bu konularda detaylı ve "gerçekten çalışan" Türkçe kaynağın ne denli az olduğu göz önünde bulundurulursa sizlerin de katkıları ile bu projenin detaylandırılabileceğini (alarm özelliği, buton ile zaman ayarı güncelleme vb özellikler gibi) düşünüyorum.
Umarım çalışmayı ve videoyu beğenmişsinizdir. Eğer beğendiyseniz lütfen Beğen işaretine tıklamayı ve Youtube kanalıma abone olmayı ihmal etmeyin.
Teşekkürler...
Gerekli Malzemeler
Arduino Kontrol Kartı- Nano
3 Adet LED Dot Matrix Modül
1 adet Buton
3 adet 16 100uf Kondansatör
2 adet 10K Ohm
5v regülatör
1 adet DHT 11 Isı ve Nem Sensörü
1 adet 1302 RTC Saat Modülü
1 adet ON OFF Switch
1 Adet LDR Sensör
Saat kutusu için 3d baskı parçaları (https://www.thingiverse.com/thing:4568856)
Devre Şeması
Gerekli Kütüphaneler
PAROLA
MD_MAX72https://github.com/MajicDesigns/MD_MAX72XX
RTC Saat Modülü
https://github.com/chrisfryer78/ArduinoRTClibrary/blob/master/virtuabotixRTC.h
DHT Isı ve Sıcaklık Sensörü
Arduino Kodu
//MUCİT PİLOT 2020 // LedSaat v1.0 //
// Saat, Tarih, Gün, Sıcaklık ve Nem gösteren Led Saat Uygulaması
//LDR ile ortam ışığına göre ekran parklaklığı
//Buton ile gösterilen bilgiyi seçme
//RTC Modül olarak 1302 kullanılmıştır.
//Sıcaklık sensörü olarak DHT11 kullanılmıştır.
//gerekli kütüphaneler
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include <virtuabotixRTC.h>
#include <avr/pgmspace.h>
#include <DHT.h>
//kendi oluşturduğumuz font dosyasını ekliyoruz
#include "Fonts_data.h"
//LED modül tanımlamaları ve PIN tanımlamaları
#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW //kullanılan modül tipi. 4ü bir arada modeller için FC16_HW kullanın
#define MAX_DEVICES 3 //kaç modül bağlı olduğu
#define CLK_PIN 13 //pinler
#define DATA_PIN 11
#define CS_PIN 10
#define BUTON_PIN 9
#define DHT_PIN 2 //sicaklik sensörü hangi pine bağlı
#define DHTTYPE DHT11 //sensör tipi DHT11 veya DHT22
// bir sıcaklık-nem sensörü nesnesi oluşturduk
DHT sicakliksensor(DHT_PIN, DHTTYPE);
//saat nesnesini ve gerekli değişkenleri oluşturduk
virtuabotixRTC myRTC(6, 7, 8); //clk,dat,rst pinleri
char gunsay;
char gun[]="";
char tarih[11];
char saat[9];
// Bir adet Parola nesnesi yaratıyoruz
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// Kayan Yazı Paramatreleri
uint8_t scrollSpeed = 50; // Kayma hızı, rakam küçüldükçe hız artar
//Giriş ve çıkışta kayma efektlerini seçin
textEffect_t scrollEffectin = PA_SCROLL_LEFT; //PA_SCROLL_LEFT,PA_SCROLL_RIGHT,PA_SCROLL_UP,PA_SCROLL_DOWN
textEffect_t scrollEffectout = PA_SCROLL_LEFT; //PA_SCROLL_LEFT,PA_SCROLL_RIGHT,PA_SCROLL_UP,PA_SCROLL_DOWN
//metin ne tarafa hizalanacak
textPosition_t scrollAlign = PA_CENTER;//PA_CENTER,PA_LEFT,PA_RIGHT
uint16_t scrollPause = 0; // Metin kaç milisaniye sabit olarak gösterimde kalacak
uint8_t inFX, outFX; //giriş ve çıkışta uygulanacak efektler
textEffect_t effect[] = //efektleri tuttuğumuz dizi
{
//kütüphanede tanımlı efektler...
PA_PRINT, //0
PA_SCAN_HORIZ,//1
PA_SCROLL_LEFT,//2
PA_WIPE, //3
PA_SCROLL_UP_LEFT,//4
PA_SCROLL_UP,//5
PA_OPENING_CURSOR,//6
PA_GROW_UP,//7
PA_MESH,//8
PA_SCROLL_UP_RIGHT,//9
PA_BLINDS,//10
PA_CLOSING,//11
PA_RANDOM,//12
PA_GROW_DOWN,//13
PA_SCAN_VERT,//14
PA_SCROLL_DOWN_LEFT,//15
PA_WIPE_CURSOR,//16
PA_DISSOLVE,//17
PA_OPENING,//18
PA_CLOSING_CURSOR, //19
PA_SCROLL_DOWN_RIGHT,//20
PA_SCROLL_RIGHT,//21
PA_SLICE,//22
PA_SCROLL_DOWN,//23
};
#define BUF_SIZE 75 //genel olarak kullanacağımız metin uzunluğu
char mesajyaz[BUF_SIZE]; //metinleri mesajyaz değişkeni ile yazdıracağız
const uint16_t WAIT_TIME = 0; //ilk açılış mesajı için yazının ekranda sabit bekleme süresi
String mesaj="Mucit Pilot LedSaat"; //ilk açılış mesajı
//ekran gösterim sıralaması ve menu butonu için gerekli değişkenleri tanımladık
int a=0;
int menu=0;
void setup()
{
Serial.begin(57600);
// Saat modülünü ilk aldığınızda bir seferlik doğru saati kaydetmek için:
// saniye, dakika, saat, haftanin kacinci günü, ayın kaçıncı günü, ay, yıl olacak şekilde
//myRTC.setDS1302Time(30, 22, 02, 3, 12, 8, 2020); //komutunu çalıştırın sonra tekrar comment yapın veya silin
P.begin();//parola kayan yazı nesnesini başlatıyoruz
sicakliksensor.begin();//sicaklik sensörü nesnesini başlatıyoruz
//mesajların gösterilmesi için gerekli ilk taımlamayı yaptık
P.displayText(mesajyaz, scrollAlign, scrollSpeed, scrollPause, scrollEffectin, scrollEffectout); //inFX, outFX
inFX=0; //açılış mesajının giriş çıkış efektlerini seçtik
outFX=0;
P.setIntensity(5);//açılış mesajının parlaklık seviyesini seçtik (0-15 arası)
mesaj.toCharArray(mesajyaz,BUF_SIZE);//toCharArray komutu ile mesajı yazdırılabilecek tek karakterlerden oluşan char dizisine çevirdik //ÖNEMLİ
P.setFont(kucukFont);//açılış mesajı için font tipi
pinMode(BUTON_PIN, INPUT);//butonun pinmodunu tanımladık
}
void loop()
{
while (digitalRead(BUTON_PIN)!=HIGH){ //butona basılmadığı sürece saat animasyonlarını oynat
if(P.displayAnimate()) //animasyonlarımız bu satır ve displayReset komutu arasında oynar
{
menu=0; //buton sayacını sıfırlıyourz
//LDR sensörden bilgiyi okuyoryuz
int isik = analogRead(A0);
int parlaklik=map(isik,0,1000,0,9);//okuduğumuz değeri 0-9 parlaklık aralığına uyarladık
P.setIntensity(parlaklik); //bu parlaklığı animasyona yazdırdık
P.setSpeed(100); // animasyondaki oynama hızını tanımladık
myRTC.updateTime(); //RTC saat nesnesinden biligiyi aldık
if (a==90){a=0;} //sayaç 90'a ulaşınca tekrar sıfırlıyoruz
//bu kısımda sayacın 5' göre modunu alıp mod değerinin 0-1-2-3-4 olmasına göre 5 farklı metin içeriği gösterimini sıra ile oynatacağız
if (a%5==0){
saatyazdir();//ekrana saati yazdıran fonksiyonumuz
}
else if (a%5==1){
P.setSpeed(75);
tarihyazdir();//ekrana tarihi yazdıran fonksiyonumuz
}
else if (a%5==2){
gunyazdir();//ekrana günü yazdıran fonksiyonumuz
}
else if (a%5==3){
sicaklikyazdir();//ekrana sıcaklık yazdıran fonksiyonumuz
}
else {
nemyazdir();//ekrana nemi yazdıran fonksiyonumuz
}
a++;//sayacı arttırdık
P.displayReset(); //animasyonlar bu noktadan sonra tekrar yukarı başa dönecek
}//if display animate'in sonu
digitalRead(BUTON_PIN);//while içinde sonsuz dönmesin diye buton durumunu tekrar okuduk
}//while'ın sonu
//bu kısımda butonun basılmasına göre yapılacak işlemleri hallediyoruz
if (digitalRead(BUTON_PIN)==HIGH){ //eğer butona basılmış ise
delay(100);//butona basmalarda sadece tek basma algılaması için koydum yoksa sayacı 2-3 arttırabilir.
int sayi=menu%5;//menu sayacının değerinin de 5'e göre modunu aldık çünkü 5 bilgimiz var
a=sayi+1;//butonu bırakınca yukarıda animasyona baştan başlaması için a sayacını sıfırladık
P.displayClear();//ekranı temizledik çünkü butona bastığımız için yeni bilgi yazacağız
switch (sayi){
case 0 :
menu++;//sayacı bir arttırdık
saatyazdir();
break;
case 1 :
menu++;//sayacı bir arttırdık
tarihyazdir();
break;
case 2 :
menu++;//sayacı bir arttırdık
gunyazdir();
break;
case 3 :
menu++;//sayacı bir arttırdık
sicaklikyazdir();
break;
case 4 :
menu++;//sayacı bir arttırdık
nemyazdir();
break;
}
P.displayReset(); //animasyonu başa döndürmek için
}
}//void loop'un sonu
//Yardımcı Fonksiyonları tanımlıyoruz
//saati yazdırdığımız fonkisyon
void saatyazdir(){
//saat hanesini al
int myhour=myRTC.hours;
String gecici1;
//gelen veri tek haneli ise başına sıfır koymak için
if (myhour < 10) {
gecici1='0'+String(myhour);
}
else {gecici1=String(myhour);}
// Serial.println(hourss);
//dakika hanesini al
int myminute=myRTC.minutes;
String gecici2;
//gelen veri tek haneli ise başına sıfır koymak için
if (myminute < 10) {
gecici2='0'+String(myminute);
}
else {gecici2=String(myminute);}
//Serial.println(minutess);
//saniye hanesini al
int mysecond=myRTC.seconds;
String gecici3;
//gelen veri tek haneli ise başına sıfır koymak için
if (mysecond < 10) {
gecici3='0'+String(mysecond);
}
else {gecici3=String(mysecond);}
//Serial.println(secondss);
String tamsaat=gecici1+':'+gecici2;
tamsaat.toCharArray(mesajyaz,BUF_SIZE);//oluşturduğumuz string metni Char dizisine çevirmeliyiz
inFX=5; //giriş efekti
outFX=23;//çıkış efekti
P.setTextEffect(effect[inFX], effect[outFX]);//efektleri uygula
P.setPause(5000); //metin ekrranda sabit kaç milisaniye kalacak
}
//tarihi yazdırdığımız fonkisyon
void tarihyazdir(){
int myyear=myRTC.year;
String gecici1=String(myyear);
//gecici1=gecici1.substring(2,4);
//Serial.println(years);
int mymonth=myRTC.month;
String gecici2;
if (mymonth < 10) {
gecici2='0'+String(mymonth);
}
else {gecici2=String(mymonth);}
//Serial.println(months);
int myday=myRTC.dayofmonth;
String gecici3;
if (myday < 10) {
gecici3='0'+String(myday);
}
else {gecici3=String(myday);}
//Serial.println(dayss);
String tarih=gecici3+'.'+gecici2+'.'+gecici1;
tarih.toCharArray(mesajyaz,BUF_SIZE);
inFX=2;
outFX=2;
P.setTextEffect(effect[inFX], effect[outFX]);
P.setPause(0);
}
//günü yazdırdığımız fonkisyon
void gunyazdir(){
int myday=myRTC.dayofweek;
String gun_gecici;
switch (myday) {
case 0 :
gun_gecici="PAZAR";
break;
case 1:
gun_gecici="PAZARTESi";
break;
case 2:
gun_gecici="SALI";
break;
case 3:
gun_gecici="CARSAMBA";
break;
case 4:
gun_gecici="PERSEMBE";
break;
case 5:
gun_gecici="CUMA";
break;
case 6:
gun_gecici="CUMARTESi";
break;
}
gun_gecici.toCharArray(mesajyaz,BUF_SIZE);
inFX=21;
outFX=21;
P.setTextEffect(effect[inFX], effect[outFX]);
P.setPause(0);
}
//sıcaklığı yazdırdığımız fonkisyon
void sicaklikyazdir(){
float derece=sicakliksensor.readTemperature();
String gecici1=String(derece);
gecici1=gecici1.substring(0,2);//okunan değerin ilk iki hanesini almak için
Serial.println(gecici1);
String sicak=gecici1+' '+"°C";
sicak.toCharArray(mesajyaz,BUF_SIZE);
inFX=6;
outFX=6;
P.setTextEffect(effect[inFX], effect[outFX]);
P.setPause(3000);
}
//nemi yazdırdığımız fonkisyon
void nemyazdir(){
float nem=sicakliksensor.readHumidity();
String gecici1=String(nem);
gecici1=gecici1.substring(0,2);//ilk iki haneyi almak için
String yuzde=String(char(37));//% işaretini yazdırabilmek için kullandım
String nems=yuzde+' '+gecici1;
Serial.println(nems);
nems.toCharArray(mesajyaz,BUF_SIZE);
inFX=13;
outFX=7;
P.setTextEffect(effect[inFX], effect[outFX]);
P.setPause(3000);
}
//saat modülünüzün doğru bilgi okuyup okumaduğunu kontrol etmek için kullanabilirsiniz
//void zamanyazdir(){
//
//
//
////Serial.print(myRTC.dayofmonth);
// Serial.println(myRTC.dayofweek);
// Serial.print(myRTC.dayofmonth);
// Serial.print("/");
// Serial.print(myRTC.month);
// Serial.print("/");
// Serial.print(myRTC.year);
// Serial.print(" ");
// Serial.print(myRTC.hours);
// Serial.print(":");
// Serial.print(myRTC.minutes);
// Serial.print(":");
// Serial.println(myRTC.seconds);
////Serial.print(":");
////Serial.println(myRTC.dayofweek);
//
//}
TANORE TIANO TIONO TIONO TIONO TIONO TIONO TIONO TIONO TIONO TIONO TIONO
YanıtlaSilTANORE TIONO TIONO TIONO TIONO TIONO micro touch trimmer TIONO TIONO TIONO nano titanium by babyliss pro TIONO TIONO TIONO TIONO TIONO titanium wok TIONO titanium dental TIONO TIONO TIONO TIONO TIONO TIONO TIONO TIONO TIONO TIONO TIONO TIONO titanium dioxide TIONO