Uno - TC35 - SMS Versand

Hallo,

ich versuche gerade eine SMS zu verschicken mit dem TC35 Modul.

Ich habe einen Arduino UNO angeschlossen.

Belegung:

UNO 0(RX) auf RX0 GSM Modul
UNO 1(TX) auf TX0 GSM Modul
UNO GND auf GND GSM Modul
UNO 2 auf GND - nur kurz angetickt, damit eine SMS versendet wird.

Ich habe ein 5V Netzteil mit 2,1A an meinem GSM Modul und an meinem UNO gehe ich mit einer normalen USB Strippe vom PC.

SIM Karte von Congstar.

Das TC35 blinkt jede Sekunde würde ich mal sagen. Ab und zu blinkt es auch langsamer.
Laut Siemens is das Gerät dann bereit zum verschicken von Nachrichten.
Wenn es langsam blinkt und ich meinen Eingang 2 auf GND setze, passiert nichts.

Es hat auch schon paar Nachrichten verschickt. Paar tage später, ging nichts mehr. Jetzt habe ich schon einen Arduino Uno, SaintSmart UNO/Mega ausprobiert. Leider funktioniert überhaupt nichts.

Ich habe Hyperterminal ausprobiert und mich mit einem seriellen Kabel angeschlossen.

Einstellung :

19200 8 N 1 Hardware

bzw. 9600 8 N 1 Hardware (Hier bekomme ich die Befehle angezeigt, wenn ich Eingang 2 auf GND setze aber nur wenn ich von UNO 1 (TX) auf RX0 vom GSM Modul gehe.

Vllt. habt ihr ja eine gute Idee. Ich bin schon fast soweit mir noch ein GSM Modul zu kaufen, vllt. is mein jetziges irgendwie kaputt gegangen?

Ich habe es quasi 1 zu 1 nachgebaut wie in diesem Video hier: https://www.youtube.com/watch?v=AERVQOQDeus

Gruß
Jan

void setup()
{
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
}

void loop() {
if(digitalRead(2) == 0) {
Serial.println("AT+CMGF=1");
delay(500);
Serial.println("AT+CMGS=<+4917670815653>");
delay(1000);
Serial.print("TEST");
delay(500);
Serial.println((char)26);
delay(5000);
}
}

UNO 0(RX) auf RX0 GSM Modul
UNO 1(TX) auf TX0 GSM Modul

Das ist schonmal falsch, es muss so aussehen

UNO 1(TX) auf RX0 GSM Modul
UNO 0(RX) auf TX0 GSM Modul

Ansonsten findet keine Kommunikation statt

R steht für receive -> erhalten/empfangen
T steht für transfer -> was überbringen/losschicken

Also muss RX immer mit TX verbunden werden und umgekehrt.

Und das USB Kabel muss abgezogen sein, sonst quatscht evtl. der 16U2/8U2 des UNOs dazwischen.

Denn UNO Pin 1 und 0 sind mit diesem verbunden.

Stimmt, wieder vergessen zu erwähnen. :confused:

Ich habe jetzt ein 2tes Netzteil an den UNO angeschlossen.

RX/TX und TX/RX habe ich auch verbunden.

USB habe ich auch währenddessen entfernt.

Nachdem das GSM Modul langsam blinkte, habe ich Eingang 2 wieder kurz auf GND gelegt. Im Hyperterminal kamen die Befehle an, jedoch wurde keine SMS Verschickt.

Im Hyperterminal kann ich auch keine AT Befehle rein schreiben, es kommt einfach nichts. Nicht mal bei "AT".

Ich habe noch mal ein anderes Beispiel Programm rein geladen. Das hat auch funktioniert. Leider ist hier auch kein Erfolg zu verbuchen. Ich werde mal schauen, was das Forum evtl. noch für Ideen parat hat :).

Das andere Beispiel Programm:

#include <SoftwareSerial.h>
SoftwareSerial gsmSerial(2,3);

void setup()
{
gsmSerial.begin(9600);
delay(2000);
}
void loop() {
sendTextMessage();
delay(90000);
}
void sendTextMessage() {
gsmSerial.print("AT+CMGF=1\r");
delay(100);
gsmSerial.println("AT+CMGS="+4917670815653"");
delay(100);
gsmSerial.print("TEST");

delay(100);
gsmSerial.println((char)26);
}

Hast du überhaupt Empfang? Teste das mal.

Das ist ja auch ein Problem. Ich kann über Hyperterminal nicht mit dem GSM Modul Kommunizieren.

Ich sehe das dort Befehle ankommen. Aber wenn ich jetzt "AT" eintippe, kommt kein "OK" zurück.

Und ich habe sogar noch einen Laptop mit einer richtigen seriellen Schnittstelle.

Zitterhand:
Und ich habe sogar noch einen Laptop mit einer richtigen seriellen Schnittstelle.

Die darfst du dann aber nicht direkt an ein Gerät anschließen das TTL-Pegel erwartet (bzw. 0/5V)

Und auch wenn ein Pegelwandler vorhanden ist, nicht vergessen das Kommando mit einem CR abzuschließen.

Hallo liebe Leute,

ich kann mittlerweile fleißig SMS verschicken.

Mein Modul war defekt. Ein anderes Modul hat sofort funktioniert.

Jetzt habe ich leider ein neues Problem. Ich poste euch dafür, dass Programm. Es ist jetzt noch nicht ganz so hübsch eingerückt u.s.w.

Wenn mein Interrupt Eingang 21, 1 wird soll mir über eine positive Flanke eine SMS verschickt werden.

Aber ich schätze durch den Interrupt wird meine SMS geblockt, obwohl er in das Programm rein springt.

Ich benutze dafür die Library, SoftSerial. RX 2 - TX 3.

Vllt. hat ja jemand eine Idee, wie ich das hinbekommen könnte.

Schaut etwas wild aus :).

#include <SoftwareSerial.h>
SoftwareSerial gsmSerial(2,3);

//Belegung der Ein/Ausgägen(D und A)
int sensorPin_1 = A8; //Analogwerte vom MQ-5 erfassen
int sensorPin_2 = A9; //Analogwerte vom MQ-5 erfassen
int sensorWert_1 = 0;
int sensorWert_2 = 0;
int ledPin_1 = 23; //LED zur Anzeige ob der Brandmelder ausgelöst hat
int ledPin_2 = 24; //LED zur Anzeige ob der Brandmelder ausgelöst hat
int buzzer_1 = 22; //Piezo Buzzer - piept wenn ein Brand detektiert wird.
int buzzer_2 = 25; //Piezo Buzzer - piept wenn ein Brand detektiert wird.
int sensorDigi_1 = 21; // Digitaler Ausgang vom MQ-5
int sensorDigi_2 = 28; // Digitaler Ausgang vom MQ-5
int sensor_status_1 = LOW;
int sensor_status_2 = LOW;
int alarmAlt=0;
int alarmNeu=0;
int posFlanke=0;
int gas=0;
int reset =29;
int neustart=1;

void setup() {
// Benennung der Ein und Ausgänge
pinMode(ledPin_1, OUTPUT);
pinMode(ledPin_2, OUTPUT);
pinMode(buzzer_1, OUTPUT);
pinMode(buzzer_2, OUTPUT);
pinMode(sensorDigi_1, INPUT);
pinMode(sensorDigi_2, INPUT);

Serial.begin(9600);
attachInterrupt(2, alarmISR, RISING);

pinMode(8, INPUT); //IGT setzen (GSM Modul)
digitalWrite(8, LOW);
pinMode(8, OUTPUT);
delay(100);
pinMode(8, INPUT);

}

void loop() {
if(neustart==1)
{
noInterrupts();
delay(1000);
neustart=0;
interrupts();
}

if (alarmNeu ==1 && alarmAlt ==0)
{
posFlanke = 1;

}
else
{
posFlanke = 0;
}
alarmAlt = alarmNeu;
meldungAbschicken();
Serial.print(alarmNeu);
Serial.print(" ");
Serial.println(posFlanke);
delay(200);
}

void meldungAbschicken()
{

if(posFlanke==1)
{
meldungMelder();
Serial.println("SMS");
}
}

void alarmISR()
{
alarmNeu = 1;
digitalWrite(ledPin_1, HIGH);
digitalWrite(buzzer_1, HIGH);
digitalWrite(buzzer_2, HIGH);
digitalWrite(ledPin_2, HIGH);
}

void meldungMelder()
{
gsmSerial.print("AT+CMGF=1\r");
delay(100);
gsmSerial.println("AT+CMGS="+4917670815653"");
delay(100);
gsmSerial.print("Feuer_Alarm! BM1");
delay(100);
gsmSerial.println((char)26);
}

Warum das ganze per Interrupt?

Warum nicht? :o

Also ich dachte, dass wäre die beste Idee.

Wenn der Sensor 1 wird, soll dauerhaft die LED anbleiben und der Buzzer. Auch wenn der Sensor auf 0 wechselt. Ich möchte dann noch einen "Reset-Taster" mit einbauen.

Geht das noch anders? :slight_smile:

Du brauchst für diese "einfache" Funktion def. keinen Interrupt.

Du must nur die Information das der Sensor 1 hat in eine Variable ablegen und diese in der Loop abfragen. Mit deinem Reset-Taster setzt du die Variable wieder auf 0.

Und den Code kannst du in der IDE (V1.6.5) mit "Werkzeuge-Automatische Formatierung" schon mal sauber formatieren.

Kannst du mir mal ein Bsp. zeigen? Ist das ähnlich wie ich das mache mit der positiven Flanke? Aber die ist ja nicht dauerhaft.

Okay, das rückt ja tatsächlich wenig ein.

Hallo,

hier ein Beispiel-Code, den du in deine Loop einbauen kannst.

void loop() {

  if (digitalRead(sensorDigi_1) == 1)       // wenn Sensor1 = 1
    Sensor1Value = 1;                             // wird Variable auch 1  

  if (Sensor1Value == 1) {                     // wenn Variable = 1 
    // hier kommt der Alarm o. ä.            // dann geht Alarm los
    digitalWrite(ledPin_1, HIGH);            // led1 leuchtet
    digitalWrite(buzzer_1, HIGH);           // Buzzer macht Lärm
  }
  else {
    digitalWrite(ledPin_1, LOW);             // led1 aus
    digitalWrite(buzzer_1, LOW);            // Buzzer aus
  }
  
  if (digitalRead(taster_1) == 0)           // wenn Taster  gedrückt (LOW)
    Sensor1Value = 0;                        // dann Variable auch LOW und Alarm geht aus
    
}

Bitte beim Taster und bei den digitalen Sensoren auf Pullup bzw. Pulldown Widerstand achten.
Diese Code muss bei dir noch angepasst werden.

Hi,

vielen Dank :). Das ist ja wirklich simpel :o , wenn man weiß wie es geht :).

Ich habe jetzt alles soweit angepasst, läuft so weit auch total gut.

Ich musste nur aus einer 1, eine 0 machen. Ansonsten Top.

Ein Problem gibt es noch. Er verschickt mir keine SMS. Ich glaube, dass ganze geht zu schnell. Kann man das irgendwie künstlich ausbremsen? Delay? Er springt kurz in das Programm, verschickt aber nichts.

void loop() {

  if (alarmNeu == 1 && alarmAlt == 0)
  {
    posFlanke = 1;

  }
  else
  {
    posFlanke = 0;
  }
  alarmAlt = alarmNeu;


  if (posFlanke == 1)
  {
    meldungMelder();
    Serial.println("SMS");
  }

  if (digitalRead(sensorDigi_1) == 0)       // wenn Sensor1 = 1
    alarmNeu = 1;


  if (digitalRead(sensorDigi_1) == 0)       // wenn Sensor1 = 1
    sensor_status_1 = 1;                    // wird Variable auch 1

  if (sensor_status_1 == 1) {                     // wenn Variable = 1
    // hier kommt der Alarm o. ä.            // dann geht Alarm los
    digitalWrite(ledPin_1, HIGH);            // led1 leuchtet
    digitalWrite(buzzer_1, HIGH);         // Buzzer macht Lärm

  }
  else {
    digitalWrite(ledPin_1, LOW);             // led1 aus
    digitalWrite(buzzer_1, LOW);            // Buzzer aus
  }

  if (digitalRead(reset) == 0)           // wenn Taster  gedrückt (LOW)
    sensor_status_1 = 0;                  // dann Variable auch LOW und Alarm geht aus

  Serial.print(sensor_status_1);
  Serial.print("   ");
  Serial.println(posFlanke);
  delay(200);

}

void meldungMelder()
{
  gsmSerial.print("AT+CMGF=1\r");
  delay(100);
  gsmSerial.println("AT+CMGS=\"+4917670815653\"");
  delay(100);
  gsmSerial.print("Feuer_Alarm! BM1");
  delay(100);
  gsmSerial.println((char)26);
}

Was meinst du mit "er springt nur kurz ins Programm"?
also verzögern musst du da nix.
Du kannst es doch debuggen, wenn du Informationen an den SerialMonitor schickst.
Dann siehst du genau, ob er in die Funktion springt.

Hi,

Genau, das hatte ich ja auch gemacht. Er hat es mir ja auch gezeigt, im Monitor, dass er in das Programm springt.

ich habe meinen Fehler gefunden.

Ich hatte im Void Setup (), gsmSerial.begin(9600); vergessen.

Danach schickte er brav seine SMS raus.

Jetzt habe ich nur noch das Problem, dass er nur einmal die positive Flanke erkennt und nach dem drücken meines "reset´s" erkennt er sie nicht wieder.

Zitterhand:
Ich hatte im Void Setup (), gsmSerial.begin(9600); vergessen.

Danach schickte er brav seine SMS raus.

Jetzt habe ich nur noch das Problem, dass er nur einmal die positive Flanke erkennt und nach dem drücken meines "reset´s" erkennt er sie nicht wieder.

Was für einen "Reset" meinst du?

In der Loop wird er doch jedes mal an dieser Abfrage vorbei kommen.

Dann zeig uns doch bitte nochmal den jetzigen Sketch.

Hi...

hier mal der Code. Viel hat sich nicht getan. Ich habe imo. nicht so die Zeit.

Also wenn ich die Reset-Taste mit dem AlarmNeu = 0; verknüpfe, dürfte er es doch erkennen oder?
Weil wenn ich jetzt Reset drücke, erkennt er keine neue positive Flanke mehr.

if (digitalRead(sensorDigi_1) == 0) // wenn Sensor1 = 1
alarmNeu = 1;

hier soll er einfach nur kurz die positive Flanke erkennen.

#include <SoftwareSerial.h>
SoftwareSerial gsmSerial(2, 3);

//Belegung der Ein/Ausgägen(D und A)


int ledPin_1 = 23;      //LED zur Anzeige ob der Brandmelder ausgelöst hat
int buzzer_1 = 22;      //Piezo Buzzer - piept wenn ein Brand detektiert wird.
int sensorDigi_1 = 21;  // Digitaler Ausgang vom MQ-5
int sensor_status_1 = 0; //gespeicherte Werte
int alarmAlt = 0;
int alarmNeu = 0;
int posFlanke = 0;
int reset = 29;

void setup() {
  // Benennung der Ein und Ausgänge
  pinMode(ledPin_1, OUTPUT);
  pinMode(buzzer_1, OUTPUT);
  pinMode(sensorDigi_1, INPUT);
  pinMode(reset, INPUT_PULLUP);

  Serial.begin(9600);


  gsmSerial.begin(9600);
  delay(2000);

  pinMode(8, INPUT);
  digitalWrite(8, LOW);
  pinMode(8, OUTPUT);
  delay(100);
  pinMode(8, INPUT);

}


void loop() {

  if (alarmNeu == 1 && alarmAlt == 0)
  {
    posFlanke = 1;

  }
  else
  {
    posFlanke = 0;
  }
  alarmAlt = alarmNeu;


  if (posFlanke == 1)
  {
    meldungMelder();
    Serial.println("SMS");
  }


  if (digitalRead(sensorDigi_1) == 0)       // wenn Sensor1 = 1
    alarmNeu = 1;


  if (digitalRead(sensorDigi_1) == 0)       // wenn Sensor1 = 1
    sensor_status_1 = 1;                    // wird Variable auch 1

  if (sensor_status_1 == 1) {                     // wenn Variable = 1
    // hier kommt der Alarm o. ä.            // dann geht Alarm los
    digitalWrite(ledPin_1, HIGH);            // led1 leuchtet
    digitalWrite(buzzer_1, HIGH);         // Buzzer macht Lärm

  }
  else {
    digitalWrite(ledPin_1, LOW);             // led1 aus
    digitalWrite(buzzer_1, LOW);            // Buzzer aus
  }

  if (digitalRead(reset) == 0)           // wenn Taster  gedrückt (LOW)
    sensor_status_1 = 0;                // dann Variable auch LOW und Alarm geht aus


  Serial.print(sensor_status_1);
  Serial.print("   ");
  Serial.println(posFlanke);
  delay(200);

}

void meldungMelder()
{
  gsmSerial.print("AT+CMGF=1\r");
  delay(100);
  gsmSerial.println("AT+CMGS=\"+4917670815653\"");
  delay(100);
  gsmSerial.print("Feuer Alarm!");
  delay(100);
  gsmSerial.println((char)26);
}

Die Zuordnungen deiner einzelnen Sensorwerte sind nicht richtig.
Du fragst nach "0" ab, aber die Beschreibung sagt "1".

Dadurch kann die SMS nicht rausgehen.

digitalRead(Sensordigi_1==0)

Sollte dann doch mit "1" verglichen werden.

Und die beiden gleichlautenden Zeilen kannst du zusammenfassen.

  if (digitalRead(sensorDigi_1) == 0)       // wenn Sensor1 = 1
    alarmNeu = 1;
    sensor_status_1 = 1;                    // wird Variable auch 1

Und "sensor_status_1" wird nicht mehr "0".