Arduino mit GSM/SIM900 Shield SMS verschicken

Hallo

Ich habe ein Arduino Uno mit einem GSM/SIM900 Shield bestückt.
Nach anfänglichen Problemen mit einer Lötbrücke für
den Pin an D9 (Power On GSM) und dem Kampf mit dem seriellen Port habe ich das Shiel soweit
das es ein Anruf tätigt.
Große Hilfe war auf dieser Seite Arduino Project Hub
da hier auch die Richtige Biblothek verlinkt war und auch die Anpassung der Biblio. erkärt wurde.

Die Jumper stehen auf Pin 7/8. Mit dem Ultraschallsensor löst das Shield wie gesagt Anrufe aus.
Soweit bin ich nun.

Ich möchte gerne statt Ultraschall nur ein Digiport nutzen an dem ein Schalter sitzt.
Gibt der Kontakt soll eine SMS gesendet werden.
Gibt es da irgendwo Hilfe oder muß ich mich da komplett durchbeissen.

Gruß Bernd

Da musst du dich garnicht groß durchbeißen. Schau dir die Beispiele für Buttons in der IDE an, da findest du, was du brauchst.
Weiteres geht, wenn du deinen aktuellen Sketch zeigst.
Den bitte in Code-Tags posten.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Hallo

Also dann mal gleich probieren so sieht der Code bis jetzt aus.
An Pin D3 und D4 ist der Ultraschallsensor angeschaltet.
Ich werde jetzt mal versuchen das ganze umzuschreiben das ich das mit einem Taster auslosen
kann. Danach muß ich sehen das ich statt Call eine SMS verschicke.
Erwartet nicht zuviel ich steige gerade mit dem Arduino ein.

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "call.h"


//Classes for the gsm libs
CallGSM call;


char phone_number[20];
char user_phone_number[] = "xxxxxxxxxxxx"; //DEFINE YOUR USER CELLPHONE NUMBER

//Flag to just inform the user one time
boolean user_informed_movement = false;


byte trigPin = 3; //Pin from HC-SR04 "Trig"
byte echoPin = 4; //Pin from HC-SR04 "Echo"




void setup() {


  //Define HC-SR04 pins
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT); 
  pinMode(GSM_ON, OUTPUT); //Pinmode for Digital Pin 9


  Serial.begin(9600); //Start a Serial COM
  
  Serial.println(F("GSM ALARM V1.0"));
  
  Serial.print(F("Starting GSM COM..."));

  if (gsm.begin(9600)) //Start the GSM COM
  {
    Serial.println(F("ready"));
  }
  else
  {
    Serial.println(F("Could not connect to GSM modem"));
  }


  //Wait for the GSM to register in an network
  while (gsm.CheckRegistration() != 1) {

    Serial.println(F("Waiting for Network Registration"));
    delay(5000);
  }

}



void loop() {

  //First lets see if we have a call to reset the "already informed user"
  if (user_informed_movement==true) check_call();

  //Check for movement
  //If we have movement and the user is still not informed, lets do a call.
  if (movement() && user_informed_movement == false)
  {
    Serial.println(F("Movement"));

    //If there is no active call, we can do a call
    if (call.CallStatus() != CALL_ACTIVE_VOICE) {

      call.Call(user_phone_number);

      delay(15000); //Give some time for the call to take place
      call.HangUp();


      //User is already informed of movement
      user_informed_movement = true;

    }
  }

}


//******************************************************************************//***************************    CHECK CALL    *********************************
//******************************************************************************

void check_call()
{

  //Check call from an any number
  byte stat = call.CallStatusWithAuth(phone_number, 0, 0);


  //A call if being placed
  if (stat == CALL_INCOM_VOICE_AUTH) {
    //Hang up the call.
    call.HangUp();

    delay(1000);

    //Compare the phone number from the call placer to the user number
    if (strcmp(phone_number, user_phone_number) == 0)
    {
      //Reset warning flag
      user_informed_movement = false;
    }
  }

}

//******************************************************************************
//****************************    MOVEMENT    **********************************
//******************************************************************************

byte movement()
{

  long duration, distance;

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);

  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);

  //Calculate the distance (in cm) based on the speed of sound.
  distance = duration / 58.2;

  Serial.print(F("Dist:"));
  Serial.println(distance);

  delay(50);

  if (distance >= 80 || distance <= 0)  return 0; //Ajust this values according to your needs

  else
  {
    return 1;
  }

}

Gruß Bernd

Dann nimm erst mal den Pin 5 als ButtonPin und im Setup als "pinMode(ButtonPin , INPUT_PULLUP);"
Danach erfolgt die Abfrage in der Loop und damit schaltest du eine Led.
Wenn das funktioniert sehen wir weiter.

Edit:
Nimm deine Telefonnummer besser raus und ersetze die durch "x".

Hallo

Ich habe etwas herumprobiert
Ich kann das Shield per AT Befehl ansprechen.
Auch das versenden von SMS auf Knopfdruck klappt.

#include <SerialGSM.h>
#include <SoftwareSerial.h>
SerialGSM cell(7,8);
void setup()
{
  pinMode(4, INPUT);
  delay(30000); //warte auf das GSM Modul
  cell.begin(19200);

}
void textSomeone()
{
  cell.Verbose(true); //dient zum debuggen
  cell.Boot();
  cell.FwdSMS2Serial();
  cell.Rcpt("+49xxxxxxxx");
  cell.Message("Test SMS auf Tasterdruck");
  cell.SendSMS();
}

void loop() 
{
  if (digitalRead(4) == HIGH)
  {
    textSomeone();
  }
  if (cell.ReceiveSMS())
  {
    Serial.println(cell.Message());
    cell.DeleteAllSMS();
  }

}

Power On über Pin 9 ist nocht nicht realisiert.
Ein Problem ist noch das wählen und zwar möchte ich die SMS
an mehrere Teilnehmer senden.

Wie kann ich das realisieren.

Gruß Bernd

Der einfache Weg ist es, die Anweisungen in "void textSomeone()" mehrfach und mit geänderten Daten zu durchlaufen.
Besser ist das natürlich über eine Schleife, in der sich bei jedem Durchlauf die Telefonnummer ändert. Die kannst du dann aus einem Array auslesen.
Allerdings solltest du hinter jeder Aussendung eine genügend große Pause einlegen.
Die Größe ist von deinem GSM abhängig.