Arduino ve C# Haberleşmesi: E-posta ile Veri Gönderimi – 8. Ders

Arkadaşlar merhaba, bu derste C# ile gmail üzerinden e-posta göndermeyi göreceğiz. Hareket algılama sensörü kullanarak ortamdaki hareketi algılayan ve hareket durumunda e-posta ile bildirim alabileceğimiz bir proje yapacağız.

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

PIR (Passive Infra-Red) sensörünün genel kullanımını, iç yapısını ve çalışma şeklini anlattığımız yazının linkine buradan ulaşabilirsiniz. Bu yazıda bir de hırsız alarmı yapmıştık. Bu projede de e-posta ile uyarı gönderebilen basit bir alarm sistemi yapmış olacağız. Yazının esas amacı C# form uygulamaları üzerinden e-posta gönderimi olduğundan siz hareket sensörü yerine başka bir sensör kullanarak farklı bir proje geliştirebilirsiniz. (Belli periyotlarda sıcaklık gönderimi, Keypad ile mail gönderimi vb).

>> Arduino İle Hareket (PIR) Sensörü Kullanımı – Hırsız Alarmı Yap!

Bağlantı Şeması

Gerekli Malzemeler:

3D çıktı alma imkanınız varsa sensörünüz için bir kasa bastırabilirsiniz. PIR sensörleri için hazırlanmış birçok tasarıma buradan ulaşabilirsiniz.

Arduino Kodu

Proje kodunu aşağıda bulabilirsiniz. Kod içerisinde “kesme” kullandık, bu konuya yabancı olanların “Arduino’da Kesme İşlemleri” yazımızı okumasını tavsiye ederim.

Kısaca kesme, belirlediğimiz durumlar için işlemcimizin yaptığı işi bırakarak bizim belirlediğimiz işi yapmasını sağlar. Kodda da gördüğünüz gibi “void loop()” içerisinde herhangi bir işlem yapmıyoruz. Fakat 2. pinimiz yükselen kenar olduğunda “hareket()” fonksiyonumuz devreye giriyor. Bu sayede yalnızca 2. pinimizden “HIGH” aldığımız durumlarda veri gönderiyoruz.

 #define PIR 2   //Pin tanımlaması
 bool durum = 0;
 void setup() {
   pinMode(PIR, INPUT);             
   Serial.begin(9600);           
   attachInterrupt(0, hareket, RISING);  //Kesme ayarı
                                         //2. pin "yükselen kenar" olduğunda hareket fonksiyonu çağırılır
 }
 void loop() {
   delay(1000);
 }
 void hareket()
 {
   durum = digitalRead(PIR);   //Sensör durumu oku
   Serial.println(durum);      //Sensör durumunu gönder
   delay(100);
 }

C# Arayüz Tasarımı

Arayüz kısmında önceki projelerde kullandığımız araçlar ile farklı bir form uygulaması geliştirebilirsiniz. Ben basit bir şekilde hareket algılandığında rengi değişecek bir panel ekledim. Her projede eklediğimiz buton, comboBox ve bağlantı durumunu gösteren label’ı da ekleyerek oldukça sade bir arayüz oluşturmuş oldum.

C# Arayüz Tasarımı

Meraklısı için kullandığım font: Century Gothic 🙂

C# Proje Kodu

Yazının bu kısmında form uygulaması üzerinden e-mail gönderiminin üzerinde duracağız. System.Net ve System.Net.Mail namespace’lerini kodumuza ekleyerek işe başlamamız gerekiyor. System.Net ve System.Net.Mail namespace’leri kolay bir şekilde e-posta iletimi yapmamıza olanak sağlıyor. E-posta gönderimini SMTP (Simple Mail Transfer Protocol) kullanarak gerçekleştireceğiz. Peki nedir bu SMTP?

Kısaca SMTP e-postaların internet üzerinden gönderimini sağlayan protokoldür. Sunucu ile istemci arasındaki iletişim şeklini belirler. Bu projedeki ayarlar “gmail” için tanımlanmıştır.

Gmail SMTP Ayarları:

  • SMTP Sunucusu: smtp.gmail.com
  • SSL Bağlantı Noktası: 465
  • TLS/STARTTLS Bağlantı Noktası: 587
  • SSL gerektirir: Evet
  • TLS gerektirir: Evet (varsa)

E-posta gönderim işlemini port üzerinden veri geldiğinde yapacağımız için ilgili kodları “SerialPort1_DataReceived” içine yazmamız gerekiyor.

DataReceived eventi

SmtpClient sınıfından bir değişken oluşturuyorum. Ardından Port ve Host tanımlamalarını yapıyorum. Bu kısımlara port ve sunucu bilgilerini giriyoruz, bu bilgileri yukarıda bulabilirsiniz. Kimlik tanımlaması için NetworkCredential sınıfından bir değişken oluşturmamız gerekiyor, ardından içerisine e-posta adresi ve şifre bilgilerini yazmalıyız. Bu kısmı kendi bilgilerinize göre doldurmayı unutmayın. Son olarak da “EnableSsl” özelliğini sunucunun SSL gerektirip gerektirmemesine bağlı olarak belirtiyorum.

 SmtpClient SmtpServer = new SmtpClient();
 SmtpServer.Credentials = new NetworkCredential("makerrobotistan@gmail.com ", "sifreniz");
 SmtpServer.Port = 587;
 SmtpServer.Host = "smtp.gmail.com";
 SmtpServer.EnableSsl = true;

Sunucu tarafındaki ayarlamaları yaptıktan sonra göndereceğimiz mailin özelliği ile ilgili kodu yazmamız gerekiyor. Bu kısımda da MailMessage sınıfından bir değişken oluşturarak gönderilecek e-postanın genel özelliklerini belirliyoruz (konusu, metni, gönderilecek kişi vb.) Bu kısımdaki her şeyi kendinize göre düzenleyebilirsiniz. Göndereceğiniz maili kendinize veya başka bir adrese yönlendirebilirsiniz. Buradaki ayarları da tamamladıktan sonra e-posta gönderilmeye hazır.

MailMessage mail = new MailMessage(); 
mail.To.Add( "makerrobotistan@gmail.com" );
mail.From = new MailAddress("makerrobotistan@gmail.com", "Arduino - PIR Sensörü");
mail.Subject = "Hareket algılandı!";
mail.Body = "Ortamda hareket algılandı!";
SmtpServer.Send(mail);

Kodun kalan kısmı veri aldığımızda panelin rengini belli bir süre değiştiren kod satırlarından ve her yazıda yaptığımız bağlantı ayarlarından oluşuyor. Kodun tamamını yorum satırlarıyla beraber inceleyebilirsiniz.

NOT: Gmail güvenlik ayarlarındaki “Daha az güvenli uygulama erişimi” izniniz kapalıysa e-posta gönderirken problem ile karşılaşırsınız. Bu erişimi “açık” hale getirmeniz gerekiyor. Bu erişimi açmak tavsiye edilmeyen bir durum olduğundan bu uygulamayı bu iş için açtığınız bir gmail hesabı ile veya kullanmadığınız bir hesap ile yapmanızı tavsiye ederim.

 using System;
 using System.Windows.Forms;
 using System.Drawing;
 using System.Net.Mail;
 using System.Net;
 using System.IO.Ports;

namespace arduino_hareket_algilama
{

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        string[] ports = SerialPort.GetPortNames();  //Seri portları diziye ekleme
        foreach (string port in ports)
            comboBox1.Items.Add(port);               //Seri portları comboBox1'e ekleme

        serialPort1.DataReceived += new SerialDataReceivedEventHandler(SerialPort1_DataReceived); //DataReceived eventini oluşturma
    }

    private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string data = serialPort1.ReadLine();
        panel1.BackColor = Color.LightGreen;       //Panel rengini LightGreen yap
        SmtpClient SmtpServer = new SmtpClient();  
        SmtpServer.Credentials = new NetworkCredential("makerrobotistan@gmail.com", "sifreniz");  //Buraya kendi gmail adresinizi ve şifrenizi girin
        SmtpServer.Port = 587;                              //Port Numarası
        SmtpServer.Host = "smtp.gmail.com";                 //Sunucu adresi
        SmtpServer.EnableSsl = true;                        //SSL ayarı
        MailMessage mail = new MailMessage();
        mail.To.Add("makerrobotistan@gmail.com");            //Gönderilecek adres
        mail.From = new MailAddress("makerrobotistan@gmail.com", "Arduino - PIR Sensörü");  //Mailin gönderildiği adres ve isim tanımlaması
        mail.Subject = "Hareket Algılandı!";     //Mail konusu
        mail.Body = "Ortamda hareket algılandı!";//Mailin body kısmındaki metin
        SmtpServer.Send(mail);  //Maili gönder
       // Console.WriteLine(data);

        System.Threading.Thread.Sleep(2000);  //2000 ms bekleme süresi
        panel1.BackColor = Color.Silver;      //Panel rengini Silver yap
    }



    private void baglan_Click(object sender, EventArgs e)
    {
        try
        {
            if (!serialPort1.IsOpen)
            {
                /* Seri Port Ayarları */
                serialPort1.PortName = comboBox1.Text;
                serialPort1.BaudRate = 9600;
                serialPort1.Parity = Parity.None;
                serialPort1.DataBits = 8;
                serialPort1.StopBits = StopBits.One;
                serialPort1.Open(); //Seri portu aç
                /* ------------------ */

                label1.Text = "Bağlantı Sağlandı.";
                label1.ForeColor = Color.Green;
                baglan.Text = "KES";                 //Buton1 yazısını değiştir
            }
            else
            {
                label1.Text = "Bağlantı Kesildi.";
                label1.ForeColor = Color.Red;
                baglan.Text = "BAĞLAN";              //Buton1 yazısını değiştir
                serialPort1.Close();                 //Seri portu kapa

            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Hata");      //Hata mesajı
        }
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        if (serialPort1.IsOpen) serialPort1.Close();    //Seri port açıksa kapat
    }

  }
}
Gelen Mail

Projemizin sonuna gelmiş olduk.

https://arduinohocam.com/

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir