örnek kod etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
örnek kod etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Arduino Hareket Sensörü Kullanımı | PIR Sensör Örnek Kod

 Arduino ile Hareket Sensörü (PIR Sensör) Kullanımı

    HC-Sr501 sensörü kullanacağımız bu uygulamada sensörün Arduino Uno 'ya bağlanmasını ve basit bir kod ile nasıl çalıştırılabildiğine bakıyor olacağız. Sensörün nasıl çalıştığını özelliklerini ya da modifikasyonlarını merak ediyorsanız sensörü detaylıca yazdığım : Hc-SR501  Sensör İncelemesi konusuna bakıp gelebilirsiniz.
    Bu sensörü basitçe bir anahtar (switch) gibi düşünebilirsiniz, tek yaptığı şey bir hareket algıladığında sinyal pini üzerinden 5v vermesidir.

Arduino PIR sensör bağlantısı


    Görselde gördüğünüz bağlantıyı yapmanız yeterli, ben sinyal pinini Arduino 'nun ikinci pinine bağladım, siz dilediğiniz herhangi boş bir pine bağlayabilirsiniz, 1 ve 0 pinlerinden birini tercih etmenizi önermem, seri iletişim için o pinler kullanılıyor zira.


Kod kısmına gelecek olursak o da gayet basitçe şu şekilde olacak

// C++ code
//
#define MOTION 2
void setup()
{
  pinMode(MOTION, INPUT);
  Serial.begin(115200);
}

void loop()
{
  if(digitalRead(MOTION))
  {
    Serial.println("Motion Detected!");
  }
}


    Burada Arduino 'nun yapacağı iş; sensör bir hareket algıladığında seri ekrana seri bir şekilde "Motion Detected!" yazacak. Sanki başka hiç işimiz yokmuş gibi :) Tamam başka işlerimiz de olabilir, örneğin hareket algılandığında alarm çalabiliriz buzzer kullanarak, ya da bir ikaz lambası da yakabiliriz aynı zamanda, ya da yanan sönen lambalar kullanabiliriz, örnekler çoğaltılabilir. Bu yapmayı hayal ettiğimiz herşeyi if bloğunun içine yazarsak işimizi görür, ancak şöyle bir durum var, hareketin algılanması tek bir durumdur, dolayısıyla hareket algılandığında tek bir işler serisi yapmak isteriz. Eğer yukarıdaki kodu kullanacak olursanız, nasıl ki seri ekrana seri şekilde defalarca ( bu aslında sensörün hareket algıladığı andan sonra sinyal pinini ne süreyle HIGH seviyede tuttuğuyla alakalı ) "Motion Detected!" yazıyorsa, oradaki tüm işleri de sinyal kesilene kadar yapacak demektir.


    Peki ne yapalım, kesme kullanabiliriz, kesme tetikleyicisi olarak da RISING seçersek yani yükselen kenarda tetiklensin, bu durumda sadece bir kez istediğimiz tüm fonksiyonları çalıştırabiliriz :

// C++ code
//
#define MOTION 2
void setup()
{
  pinMode(MOTION, INPUT);
  Serial.begin(115200);
  attachInterrupt(digitalPinToInterrupt(MOTION), MotionRoutine, RISING);
}

void loop()
{
 
}
void MotionRoutine()
{
 Serial.println("Motion Detected!");  
 playAlarm();
 FlashLeds();
 doOtherStaff();
}
void playAlarm()
{
  // play Alarm code
}
void FlashLeds()
{
  //Flash Leds code
}
void doOtherStaff()
{
  // do sth 
}

    Yukarıdaki kod ile sadece bir defa MotionRoutine fonksiyonu yürütülür. Diğer fonksiyonları dilediğiniz işler için kullanabilirsiniz. Interrupt konusunda henüz birşeyler yazmadım ancak kısaca bahsedelim; bu noktada artık dilediğiniz pini kullanabilirsiniz lüksüne sahip değilsiniz, arduino uno için yalnızca 2 ve 3 numaralı pinlerin kesme özelliği var, yani ya 2 ya 3 başka şansınız yok.
    
Kesme için diğer seçenekler de :
  • FALLING : hareket bittiğinde yürütülür.
  • HIGH : ilk örnekle aynı şekilde HIGH iken peşpeşe yürütülür.
  • LOW : hareket bittikten sonre bir sonraki harekete kadar peşpeşe yürütülür.
  • CHANGE : lazım olur mu bilmem ama 5 iken 0 olursa, ya da 0 iken 5 olursa bir kez yürütülür.
Eğer olur da sensörünüz düzgün çalışmazsa hareket algılanmadığında da fonksiyonlarını çalışıyorsa mesela; sensörün sinyal pininden arduino GND 'ye 1k 'lık bir direnç bağlarsanız bu sorunu yaşamazsını diye ümid ediyorum, Bir dikkat etmeniz gereken şey de, sensörün düzgün çalışmaya başlaması çalışmaya başladığı andan sonra bie dakikayı buluyor olması, bunu da aklınızda bulundurun derim.

Tinkercad simulasyonu :



Herkese kolay gelsin!


Arduino buton ile led yakmak | Örnek kod

Arduino buton ve led bağlantısı

 

Arduino button ile led yakma uygulamasına geçmeden önce buton nedir kısaca ona bakalım. Buton iki veya bazen ikişerli ortak olmak üzere 4 adet terminalden oluşan anahtarlama elemanıdır diyebiliriz. Anahtarlama elemanı olması sebebiyle elektrik devresine seri olarak bağlanırlar. yani devreyi herhangi bir yerinden keserler, butona basıldığı anda terminaller fiziksel olarak temas eder ve devre buton üzerinden tamamlanmış olur.


Yukarıdaki animasyona bakıldığında çalışma prensibini anlamak gayet basittir. Söz konusu animasyon Sparkfun 'un web sitesinden alınmıştır. 

    Sayfanın girişinde yer alan Arduino buton ve led bağlantısının gösterildiği görselden biraz bahsedelim. Arduino 'nun 13 üncü pinine bir ader direnç üzerinden (Buradaki direncin nasıl hesaplandığını öğrenmek için lütfen tıklayınız) ledin anod (+) ucu bağlanmıştır. Ledin diğer ucu (katot) da Arduino 'nun GND pinine bağlanmıştır. Butona gelince, görsele göre konuşmak gerekirse solda kalan terminaller birbirine içerden fiziksel olarak bağlıdır, sağdaki terminaller de içerden birbirine bağlıdır, soldaki ve sağdaki terminaller butona basıldığında birleşir ve devre tamamlanmış olur. Burada butonun bir terminalini soldakilerden üstteki ya da alttaki olabilir, Arduino 'nın digital pinlerinden birine, diğer terminali de Arduino 'nun GND pinine bağlanmıştır. Bu durumda pin üzerinde LOW kontrolü yapıyor olacağız, pinimizi kod kısmında INPUT_PULLUP olarak belirleyebildiğimiz için buton için fazladan bir direnç kullanmaktan kurtulmuş oluyoruz. Eğer ki butonda +5V anahtarlamak istiyor olsaydık, ki gördüğünüz üzere gereksiz fantastik bir durum olur bu durumda, o zaman GND' ye bağladığımız terminali 5V 'a bağlamamız ve de Arduino 'nın dijital pinine bağladığımız terminalini de bir pull down direnci ile GND 'ye bağlamamız gerekiyor olacaktı, neden ? çünkü Arduino input modlar içerisinde INPUT_PULLDOWN diye bir seçeneğimiz yok. Her iki durum için de Pull-up ya da pull-down yapmamızın nedeni digital pinin giriş seviyesinin kararsız kalmasını engellemektir. Kararsız kaldığı zaman, butona basılmasa da etraftan alacağı gürültü sebebiyle zaman zaman butona basılmış gibi davranması kaçınılmazdır. Devre ve kurgu anlaşıldıysa kod kısmına geçebiliriz.


Arduino ile buton yakmak örnek kod:


#define LED 13
#define BUTTON 7
void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(BUTTON, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(BUTTON) == LOW)
  {
    digitalWrite(LED, HIGH);
  }
  else
  {
    digitalWrite(LED, LOW);
  }
}

Şimdi satır satır bakalım neler yazdık, 

#define LED 13 satırıyla 13 yazmamız gereken yerlere artık LED yazabiliriz demiş olduk

aynı şekilde 7 yerine BUTTON yazabiliriz demiş olduk, define kullanımı hakkında detaylı bilgi sahibi olmak istiyorsanız arduino ve c++ için define kullanımını anlattığım youtube videoma bakabilirsiniz.

Geldik setup kısmına, Led imizin bağlı olduğu pini çıkış olarak ayarladık, bunda sorun yok, dikkat edeceğimiz nokta butonun bağlı olduğu pindeki INPUT_PULLUP ibaresi dikkat edin yalnızca INPUT değil, yine youtube da yayınladığım Arduino digital pinlere erişim videosunu izlemenizi tavsiye ederim tüm detayları orada bulacaksınız. Bu kısmı INPUT olarak belirlerseniz, digital pini bir dirençle pull-up yapmanız gerekmekte. 

Loop içerisinde, kod enerji kesilene kadar dönüp duracaktır, if ibaresine yabancı olanlar için yine detaylı C++ Arduino If kullanımı Videosu youtube kanalımda mevcut, digitalRead fonksiyonu ile butonun bağlı olduğu pinin seviyesini okuyoruz, eğer ki pin seviyesi LOW ise-bu durumun oluşabilmesi için butona basılmış olması gerekiyor- digitalWrite ile led in bağlı olduğu pin seviyesini HIGH yaparak ledin yanmasını sağlamış oluyoruz. Bu durumda ledimizin sürekli yanık kalmaması için butondan el çekildiğinde sönmesi için de else kısmında ledin bağlı olduğu pin seviyesini LOW yapıyoruz. 

    Konu bu kadar basit bir konu olsa da mevzuya uzak olan kimseler için anlaşılması zor olabilir, herşeyi detaylıca yazmaya çalıştım, yine de kafanızda soru işareti oluşturysa lütfen yorumlarda sormaktan çekinmeyiniz

    Herkese kolay gelsin!

Tinkercad proje linki

Nesnelerin Interneti MQTT NodeMCU Virtuino

     shiftr.io MQTT server kullanarak NodeMCU (ESP8266) ile android tarafta Virtuino kullanarak veri alışverişini gerçekleştirdiğim video 'ya yazının sonunda ulaşabilirsiniz. Video da yazdığım kod şu şekilde


#include <ESP8266WiFi.h>
#include <MQTT.h>
#include <MQTTClient.h>

const char* ssid = ""; // bağlanılanacak Wifi Adı
const char* pwd = ""; // wifi ağının şifresi
WiFiClient net;

const char* broker = ""; // shiftr erişim adresi
char mqttUsername[] = ""; // shiftr kullanıcı adı
char mqttPass[] = ""; // shiftr secret token
MQTTClient client;

void setup() {

Serial.begin(115200);
WiFi.begin(ssid,pwd);
Serial.print("Wifi ağına bağlanılıyor");
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH); // HIGH yazınca led sönük oluyor.
while (WiFi.status() != WL_CONNECTED)
{
  Serial.print(".");
  delay(500);
}
Serial.print(" bağlantı başarılı. \n");
client.begin(broker, net);
char clientID[] = "NodeMCU"; // shiftr de görünmesini istediğimiz isim
while(!client.connect(clientID, mqttUsername, mqttPass))
{
  Serial.print(".");
  delay(500);
}
Serial.print("Shiftr bağlantısı başarılı.\n");

client.subscribe("LEDSTATUS");
client.subscribe("mesaj");

client.onMessage(messageReceived);
}

void loop() {
  // put your main code here, to run repeatedly:
  client.loop();
  delay(10); //<- fixes some issues with wifi stability

  int Temp = random(18,30);
  int Humi = random(25, 55);
  client.publish("Temp",String(Temp));
  client.publish("Humidity",String(Humi));
  client.publish("mesaj","MSGNodeMCU");
 delay(5000);
}

void messageReceived(String &topic, String &payload)
{
  if (topic == "LEDSTATUS")
  {
    int LEDVAL = payload.toInt();
    digitalWrite(LED_BUILTIN, LEDVAL);
  }
  else if (topic == "mesaj")
  {
    String msg = payload;
    Serial.print("[MGS from Virtuino] ");
    Serial.print(msg);
  }
}








Türksat Saat Kanalı ve IRIG-B Time Code

Türksat Saat Kanalından Saat Bilgisi Nasıl Alınır? Uyduda kanalları dolaşırken, şu Türksat Saat kanalı hep dikkatimi çekmiştir. Özellikle  S...