Hallo,
ich habe einen Arduino Mega und ein Sim800c Modul. Beide funktionieren soweit gut, doch ich habe Probleme beim Programmieren.
Mein Stand ist:
Ich kann über den seriellen Monitor mit dem Modul kommunizieren und so funktionieren SMS senden, empfangen und Anrufe entgegennehmen einwandfrei. Anrufe absenden kriege ich leider noch nicht hin. Dafür nutze ich folgenden Code:
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
}
void loop() {
if (Serial1.available()) {
int inByte = Serial1.read();
Serial.write(inByte);
}
// read from port 0, send to port 1:
if (Serial.available()) {
int inByte = Serial.read();
Serial1.write(inByte);
}
}
Mein Ziel ist es, einen Anruf zu tätigen, sobald ein Pin HIGH ist, besser sogar einen Gruppenanruf mit vorher im Programm festgelegten Nummern, und SMS auswerten, d.h. es soll etwas passieren, wenn eine (vorher festgelegte) Nummer etwas schreibt.
Eigentlich wirkt das gar nicht so schwer, doch ich kriege es einfach nicht hin, serielle Daten auszuwerten. Die Library des Simkartenshields, die hier angewendet wurde, funktioniert mit meinem Modul nicht, was mich eigentlich wundert, weil ich den Unterschied zwischen dem Shield und dem Modul nicht sehe. (Mein Modul hat keinen Reset Pin.)
Wie ich mir das vereinfacht vorgestellt habe:
void loop() {
if (SMSAbsender == 49163XXXXXXX && SMS == "Timer, 5") { // 49163XXXXXXX durch die Nummer von der der Command kommen darf ersetzen.
int Timer = 5; // Die zahl hinter dem Komma kann variieren.
SMSsenden("Timer auf 5 gesetzt");
} else {
if (SMSAbsender == 49163XXXXXXX && SMS == "Orten") {
GPSDatenSenden(); //um es kurz zu fassen schreibe ich das nun für Beispielzwecke so
}
}
if (digitalRead(20) == HIGH) {
Anruf(+49163XXXXXXX); //hier auch wieder nur verkürzt
//Gruppenanruf(+49163XXXXXXX, +49163XXXXXXX, +49163XXXXXXX); Ein Gruppenanruf wäre deutlich besser, wenn das geht
}
}
Was ich bisher versuchte um SMS aufzuteilen/zu empfangen:
while (rx_byte = Serial1.read()){
rx_str += rx_byte; //wobei ich das += nicht verstehe. (Habe den Code im Netz gefunden)
}
int n;
if (rx_str.startsWith("OK")){ //Falls das Modul mit "OK" Antwortet, soll ich im Seriellen Monitor "Erkannt!" lesen können.
n = "0";
Serial.println("Erkannt!");
}
Es kam kein "Erkannt" im seriellen Monitor.
int SMSNummer = Serial1.parseInt(); //Falls eine Antwort des Moduls mit einer Nummer kommt (was bei meinen Anwendungen nur bei einer Empfangenden SMS ist), soll diese gespeichert werden.
Serial.println(SMSNummer); //Zur überprüfung soll diese in meinem Seriellen Monitor angezeigt werden (es war immer 0, auch wenn es z.B. 25 hätte sein sollen)
if (SMSNummer != 0) { //Es wird geguckt, ob es nicht 0 ist, denn dann kann das Programm anfangen, die SMS auszuwerten.
Serial1.println("AT+CMGF=1"); //Code zum Schreiben von SMS.
Serial.println("AT+CMGF=1"); //Code zum SChreiben von SMS für mich im Seriellen Monitor zur Überprüfung
delay(50);
Serial1.println("AT+CMGR=" + SMSNummer); //Code zum Angucken von SMS
Serial.println("AT+CMGR=" + SMSNummer); //Code zum Angucken von SMS für mich im Seriellen Monitor
delay(10);
int inByte = Serial1.read(); //damit mir im Seriellen Monitor die nun ausgegebene SMS des Moduls angezeigt wird
Serial.write(inByte); //damit mir im Seriellen Monitor die nun ausgegebene SMS des Moduls angezeigt wird
}
Leider ist das Programm nie in die if-Abfrage gekommen, weil SMSNummer immer 0 war.
int const LED = 13;
int intLoopCounter = 0;
String strSerialInput = "";
void setup(){
pinMode(LED, OUTPUT);
Serial.begin(9600);
Serial1.begin(9600);
}
void loop(){
delay(1);
CheckAndExecuteSerialCommand();
if (Serial.available()) {
int inByte = Serial.read();
Serial1.write(inByte);
}
if (Serial1.available()) {
int inByte = Serial1.read();
Serial.write(inByte);
}
}
void CheckAndExecuteSerialCommand(){
String serialData = GetPossibleSerialData();
bool commandAccepted = false;
if (serialData.startsWith("\n OK")){ //-----ich hatte es auch ohne \n probiert. Was bedeutet das?-------------------------------------> Hier Commands rein
commandAccepted = true;
digitalWrite(LED, HIGH);
Serial.println("Geschafft!");
}
else if (serialData.startsWith("LED.AUS")){ //--------------------------------------------------> Hier Commands rein
commandAccepted = true;
digitalWrite(LED, LOW);
}
else if (serialData != ""){
// Serial.println("Richtige Befehle eingeben");
}
}
String GetPossibleSerialData(){
String retVal;
int iteration = 10; // 10 times the time it takes to do the main loop
if (strSerialInput.length() > 0){
// Print the retreived string after looping 10(iteration) ex times
if (intLoopCounter > strSerialInput.length() + iteration){
retVal = strSerialInput;
strSerialInput = "";
intLoopCounter = 0;
}
intLoopCounter++;
}
return retVal;
}
void serialEvent(){
while (Serial1.available()){
strSerialInput.concat((char) Serial1.read());
}
}
auch hier passierte leider nichts. Doch als ich diesen mit dem normalen Serial Port getestet habe und im seriellen Monitor LED.AUS, bzw. (habe ich ja jetzt auf OK geändert) LED.AN rein geschrieben habe, ist die LED auch an / aus gegangen, deswegen wundert es mich umso mehr, dass es nicht funktioniert.
char c = 0;
void setup()
{
Serial1.begin(9600); // Setting the baud rate of GSM Module
Serial.begin(9600); // Setting the baud rate of Serial Monitor (Arduino)
delay(100);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
if (Serial.available() > 0)
switch (Serial.read())
{
default:
RecieveMessage();
break;
}
if (Serial1.available() > 0) {
Serial.write(Serial1.read());
}
}
void RecieveMessage() {
Serial1.println("AT+CNMI=2,2,0,0,0"); // AT Command to receive a live SMS
delay(1000);
if (Serial1.available() > 0) {
c = Serial1.read();
if (c == 'y' || c == 'Y') {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000);
}
if (c == 'n' || c == 'N') {
digitalWrite(LED_BUILTIN, LOW); // turn the LED on (HIGH is the voltage level)
delay(1000);
}
}
if (Serial.available() > 0) {
c = Serial.read();
Serial1.print(c);
}
Hier tat sich an der LED auch nichts...
if (Serial1.available()) {
String Daten = Serial1.readString();
if(Daten == "OK"){
Serial.println("Geschafft")
Daten = "";
}
int inByte = Serial1.read();
Serial.write(inByte);
}
Das ist eigentlich der einfachste Code denke ich, doch auch das läuft nicht.
Ich hoffe, ich habe keinen Beitrag im Forum, wo dasselbe gefragt wurde übersehen und ihr könnt mir helfen. Ich habe schon einiges Versucht, vieles davon auch nur halb verstanden und aus dem Internet kopiert, vielleicht sind es deswegen auch nur Kleinigkeiten, die ich wegen meiner Unwissenheit übersehen habe.
Vielen Dank für eure Mühe
Finn.