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.