C# dan gönderilen veriyi GSM Shield kullanarak kullanıcı telefonuna mesaj atma (Çözüldü)
  • Merhabalar. Elimde sensörlerden aldığım sıcaklık, nem, rüzgar hızı vb. gibi veriler var. Bu verileri C# üzerinden mysql veritabanına belirli süreler ile kaydediyorum. Kaydedeceğim veriyi C# üzerinden serial ile GSM shield'e gönderip mesaj atmak istiyorum. Böyle bir şey mümkün müdür? Mümkünse bunu nasıl yapabilirim ? Şimdiden teşekkürler.
    Şöyle bir deneme yaptım.
    C# kodları :

    namespace WindowsFormsApplication6
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private SerialPort myport;

    private void button1_Click(object sender, EventArgs e)
    {
    try
    {
    myport.Write("deneme");
    }
    catch (Exception)
    {

    MessageBox.Show("Veri Gönderilemedi");
    }

    }

    private void fonk()
    {
    try
    {
    myport = new SerialPort();
    myport.BaudRate = 9600;
    myport.PortName = "COM3";
    myport.Open();
    }
    catch (Exception)
    {

    MessageBox.Show("Port Açılamadı.");
    }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
    fonk();
    }
    private void Form1_FormClosing(object sender,FormClosingEventArgs e)
    {
    if (serialPort1.IsOpen) serialPort1.Close();
    }
    }
    }

    Arduino Kodları :

    #include < SoftwareSerial.h>
    SoftwareSerial gsm(2, 3);
    String smsMetni = "";
    char gelen;
    char data;

    #define BEKLE 3

    void SMSgonder(String mesaj) {
    gsm.print("AT+CMGF=1\r");
    delay(100);
    gsm.println("AT+CMGS=\"+905393939393\"");// telefon numarasi degistir
    delay(100);
    gsm.println(mesaj);
    delay(100);
    gsm.println((char)26);
    delay(100);
    gsm.println();
    delay(100);
    gsm.println("AT+CMGD=1,4");
    delay(100);
    gsm.println("AT+CMGF=1");
    delay(100);
    gsm.println("AT+CNMI=1,2,0,0,0");
    delay(200);
    smsMetni = "";
    }


    void smscoz() {
    while (gsm.available()) {
    delay(BEKLE);
    gelen = gsm.read();
    if (gelen == '#') {
    if (gsm.available()) {
    delay(BEKLE);
    gelen = gsm.read();
    if (gelen == 'H') {
    if (gsm.available()) {
    delay(BEKLE);
    gelen = gsm.read();
    if (gelen == 'A') {
    if (gsm.available()) {
    delay(BEKLE);
    gelen = gsm.read();
    if (gelen == 'V') {
    if (gsm.available()) {
    delay(BEKLE);
    gelen = gsm.read();
    if (gelen == 'A') {
    SMSgonder(smsMetni);
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }

    void setup() {
    gsm.begin(9600);
    delay(2000);
    gsm.println("AT+CMGF=1");
    delay(100);
    gsm.println("AT+CNMI=1,2,0,0,0");
    delay(100);
    gsm.println("AT+CMGD=1,4");
    delay(1000);
    //SMSgonder("Sistem Acildi");
    gsm.flush();
    delay(100);
    }

    void loop() {
    smscoz();
    if(Serial.available())
    {
    data = Serial.read();
    if(data == 'd')
    {
    smsMetni = "deneme";
    }
    else
    {
    smsMetni = "Mesajyok";
    }
    }

    delay(1);
    }

    Bu şekilde loop() kısmında if bloğuna girmiyor. Cevap olarak boş mesaj gönderiyor.
  • Yapı yanlış değil mi , smscoz içerisinde mesaj gidiyor zaten , string ilk halde boş olduğu boş gidiyor , Serialden okuduğunuz değere baktınız mı ne gelmiş c# tarafından
  • void loop() {
    if(Serial.available())
    {
    data = Serial.read();
    if(data == "deneme")
    {
    smsMetni = "deneme";
    }
    }
    else
    {
    smsMetni = "Mesajyok";
    }
    smscoz();
    delay(1);
    }
    Kodu bu şekilde düzelttim. Okuduğum data yı sms olarak gönderdiğimde -1 yazıyor. Yani serial porttan veri gelmiyor mu acaba?
  • Serial.read 1 bayt okuması lazim sen direkt string okutmuşsun o kısmı düzeltmelisin.
  • if(Serial.available()) bloğuna hiç girmiyor. Sizin dediğiniz gibi string ve bayt şekilde okumaları yaptık. Burada kodun üst tarafında aslında data nın veri tipi string. Ama sorun if bloğuna hiç girmemesi. Yukarıdaki c# kodlarında Butona basınca myPort.Write() ile veriyi göndermesi gerekmiyor mu?
  • Bir de acaba sms gönderme işlemini c# üzerinde yapabileceğimiz bir GSM kütüphanesi var mıdır ?
  • Yorumlarınız için teşekkürler. Sorunu çözdüm. Aşağıda kodları paylaşacağım. Belki birine faydası dokunur.

    Arduino Kodları :

    #include
    SoftwareSerial gsm(2, 3);
    String smsMetni="MesajYok";
    char gelen;
    String data;

    #define BEKLE 3

    void SMSgonder(String mesaj) {
    gsm.print("AT+CMGF=1\r");
    delay(100);
    gsm.println("AT+CMGS=\"+905438821699\"");// telefon numarasi degistir
    delay(100);
    gsm.println(mesaj);
    delay(100);
    gsm.println((char)26);
    delay(100);
    gsm.println();
    delay(100);
    gsm.println("AT+CMGD=1,4");
    delay(100);
    gsm.println("AT+CMGF=1");
    delay(100);
    gsm.println("AT+CNMI=1,2,0,0,0");
    delay(200);
    smsMetni;
    }


    void smscoz() {
    while (gsm.available()) {
    delay(BEKLE);
    gelen = gsm.read();
    if (gelen == '#') {
    if (gsm.available()) {
    delay(BEKLE);
    gelen = gsm.read();
    if (gelen == 'H') {
    if (gsm.available()) {
    delay(BEKLE);
    gelen = gsm.read();
    if (gelen == 'A') {
    if (gsm.available()) {
    delay(BEKLE);
    gelen = gsm.read();
    if (gelen == 'V') {
    if (gsm.available()) {
    delay(BEKLE);
    gelen = gsm.read();
    if (gelen == 'A') {
    SMSgonder(smsMetni);
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }

    void setup() {
    delay(3000);
    gsm.begin(9600);
    Serial.begin(9600);
    delay(2000);
    gsm.println("AT+CMGF=1");
    delay(100);
    gsm.println("AT+CNMI=1,2,0,0,0");
    delay(100);
    gsm.println("AT+CMGD=1,4");
    delay(1000);
    //SMSgonder("Sistem Acildi");
    gsm.flush();
    delay(100);
    }

    void loop() {
    if(Serial.available()>0)
    {
    data = Serial.readStringUntil(':');
    if(data.equals("1"))
    {
    smsMetni = "deneme";
    }
    }

    smscoz();
    delay(1);
    }

    C# kodları :

    namespace WindowsFormsApplication6
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private SerialPort myport;

    private void button1_Click(object sender, EventArgs e)
    {
    try
    {
    myport.WriteLine("1:");
    }
    catch (Exception)
    {

    MessageBox.Show("Veri Gönderilemedi");
    }

    }

    private void fonk()
    {
    try
    {
    myport = new SerialPort();
    myport.BaudRate = 9600;
    myport.PortName = "COM3";
    myport.Open();
    }
    catch (Exception)
    {

    MessageBox.Show("Port Açılamadı.");
    }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
    fonk();
    }
    private void Form1_FormClosing(object sender,FormClosingEventArgs e)
    {
    if (serialPort1.IsOpen) serialPort1.Close();
    }
    }
    }
  • metinden sonra smscoz() çağırmanız bir önce ki dediğim gibi mantıklı olmuş elinize sağlık paylaştığınız için

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.