SIM800L SMS und anrufen in einem Sketch

Servus zusammen,

ich habe den SIM800L und möchte:

  • angerufen werden => klappt
  • SMS schicken => klappt
  • Akkustand auslesen mit AT+CBC => klappt (Serieller Monitor)

Jetzt die Frage.
Kann ich die Werte die ich im seriellen Monitor lese als Variable nutzbar machen? Ich würde den Akkustand mit einer Status-SMS mitgeben. Ich übergebe im Programm:
mySerial.print("AT+CBC"); //Battery Status
updateSerial();

Das wird dann wunderbar im Monitor angezeigt.

Weiter versuche ich schon länger den Akkustand des Arduino in die SMS reinzubekommen.

Ziel wäre eine Status-SMS, mit Akku SIM800, Akku Arduino und als Auslöser eine Schwelle. Das die SMS verschickt wird, wenn die Messung ergibt, das es knapp wird.

Einzeln finde ich Beispiele, die das eine oder andere können. Daraus aber etwas eigenes zu machen, und alles zusammenzuführen, da habe ich eine Blockade.

Code ist HIER her.

Würdet ihr mir da helfen?

Gruß
Claus

Im SMS senden kannst du an der passenden Stelle mit mySerial.print alles einfügen was du senden willst.

Versuche, deine gefundene Software zu verstehen.

michael_x:
Im SMS senden kannst du an der passenden Stelle mit mySerial.print alles einfügen was du senden willst.

Versuche, deine gefundene Software zu verstehen.

Hi Michael,

das habe ich probiert zu schaffen. Daher ja auch mein Post, weil ich eben nicht alles einzufügen vermag.

Meine Frage war, wie ich das, was er im Seriellen Monitor auswirft, wenn ich AT+CBC eingebe (+CBC: , ,) wieder zurückbekomme.

Ich weiss nicht, wie ich die Information zurück in eine Variable bekomme.

Wie kriege ich die Anzeige aus dem SM in den Arduino.

Gesucht habe ich, finden tue ich aber nichts.

Hilfreich könnte auch sein, wenn du mir den Suchterm vorgibst. Ich suchte nach “mySerial.print”, “mySerial”, aber auch nach “print()”. Auch habe ich die Ergebnisse weitergelesen, in der Hoffnung was zu finden.
Alles in allem musste ich aber einsehen, dass die Ergebnisse nicht zu meiner Erhellung beigetragen haben.

Vielleicht weisst du ja, wo ich das nachlesen und mir erarbeiten kann und sagst es mir einfach.

Leider bin ich offensichtlich noch nicht so gut, wie du es bist, daher habe bitte etwas Nachsicht, wenn ich mit Links zu Projekten, aus denen ich mir das Wissen ableiten kann wenn ich mal so gut bin wie du, noch nichts anfangen kann.

Ich lerne noch, und möchte auch lernen. Wenn mir ab und an mal jemand eine dumme Frage verzeiht und eventuell auch beantwortet, ohne auf RTFM hinzuweisen, wäre das schön.

Übrigens, Michael, eine Zielführende Antwort dauert fast genau so lang, wie eine "MannwassnDeppwasfragtderjetzschonwiederkanndernichteinfachmalnichtdummfragen-Antwort.

Gruß auch.

@Glasreiniger

Wo, bitte, hat der Michael Dich 'blöd' angemacht?

Wenn Du aber SO über Dir gegebene und durchaus brauchbare Antworten (ok, ist erst Eine) denkst, sollten wir Das aber auch so belassen, oder?

MfG

Übrigens, Michael, eine Zielführende Antwort dauert fast genau so lang

Gut, dass du das weißt.

Eigentlich war mein Fehler, dass ich mir dein "Code ist HIER her" angesehen habe, bzw. trotzdem drauf reagiert habe. Keine Ahnung, wie du es schaffst, eine SMS zu senden. Aber das ist ja nicht dein Problem, sagst du.

Die Frage ordentlich zu stellen, dauert erheblich länger als dein Post.

Wenn du einen empfangenen Text speichern willst, statt ihn gleich von deinem mySerial (das ist übrigens nur dein Name für deine SoftSerial Schnittstelle, und damit ein schlechtes Suchkriterium) nach Serial zu kopieren, brauchst du einen Speicherbereich dafür: Ein char Array.

Du könntest z.B. deine Funktion updateSerial erweitern.

char* updateSerial()
{
  static char antwort[50];
  char* ap = antwort; // Die aktuelle Speicherposition initialisieren
 
  delay(500);
  while (Serial.available()) 
  {
    mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
  }
  while(mySerial.available()) 
  { //Forward what Software Serial received to Serial Port, and return it to caller
     *ap = mySerial.read();
     Serial.write(*ap++);
  }
  *ap = 0; // Endekennung anfügen
  return antwort;  
}

Zusätzlich zu deiner Voraussetzung, dass die AT-Antwort in 0.5 s vorliegt, setzen wir voraus, dass die Antwort kürzer als 50 Buchstaben ist. Außerdem bleibt sie nur bis zum nächsten updateSerial() verfügbar. Keine Ahnung, ob das passt, denn deinen Sketch kenne ich nicht.

Hi,

niemand hat von blöd anmachen geredet.

Hier war die Frage:
Jetzt die Frage.
Kann ich die Werte die ich im seriellen Monitor lese als Variable nutzbar machen? Ich würde den Akkustand mit einer Status-SMS mitgeben. Ich übergebe im Programm:
mySerial.print(“AT+CBC”); //Battery Status
updateSerial();

Und der letzte Post war die Antwort.

Alles gut. Das war mein Ziel.

Daran arbeiten kann ich selbst. Lernen will ich es ja auch.
Nur wenn du nicht weisst, wie man den ersten Stein ins Rollen bringt, dann wird es schwer.

Jetzt habe ich was, womit ich rumprobieren kann und was eine Grundlage darstellt.

Damit habe ich im übrigen die SMS versendet:

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(11, 10); //SIM800L Tx & Rx is connected to Arduino #11 & #10

void setup()
{
  //Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  
  //Begin serial communication with Arduino and SIM800L
  mySerial.begin(9600);

  Serial.println("Initializing..."); 
  delay(1000);

  mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
  updateSerial();
  mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
  updateSerial();
  mySerial.println("AT+CMGS=\"+4916094966100\"");//change ZZ with country code and xxxxxxxxxxx with phone number to sms
  updateSerial();
  mySerial.print("Falle ausgeloest"); //text content
  //mySerial.print("AT+CBC"); //Battery Status 
  updateSerial();
  mySerial.write(26);
}

void loop()
{
}

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
  }
}

und dank deiner Antwort weiss ich jetzt, dass hier:

void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}

die Lösung liegen muss, weil da die Werte drinstehen müssten.

Gruß
Claus

und dank deiner Antwort weiss ich jetzt, dass hier:
while (mySerial.available()) Serial.write(mySerial.read());
die Lösung liegen muss

Ja, richtig. Das überträgt, solange etwas da ist, jeweils ein (1) Zeichen von der mySerial- zur Serial-Schnittstelle.

Du musst stattdessen alle Zeichen von mySerial in einen Puffer packen und diesen Puffer dann später, nach erneutem “AT+CMGS=” und der Telefon-Nummer wieder an mySerial schicken.

Die allgemeine Kopierfunktion updateSerial(), die du gefunden hast, ist zwar schön für die Demo. Aber dort deine Zusatzfunktion reinzupacken bzw. diese für deinen Anwendungsfall zu verwenden, ist nicht so schön.

Demo Code ist prima um zu lernen wie es geht, und wie man es nachher aber nicht machen sollte. :wink:

OK.

Ohne es zunächst probiert zu haben…

void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
battery= mySerial.readString();
}
}

So denke ich meintest du das, oder?

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(11, 10); //SIM800L Tx & Rx is connected to Arduino #11 & #10
String battery;

void setup()
{
  //Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  
  //Begin serial communication with Arduino and SIM800L
  mySerial.begin(9600);

  Serial.println("Initializing..."); 
  delay(1000);

  mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
  updateSerial();
  mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
  updateSerial();
  mySerial.println("AT+CMGS=\"+4916094966100\"");//change ZZ with country code and xxxxxxxxxxx with phone number to sms
  updateSerial();
  mySerial.print("Falle ausgeloest"); //text content
  updateSerial();
  mySerial.print(battery); // string content
  updateSerial();
  mySerial.print("AT+CBC"); //Battery Status 
  updateSerial();
  mySerial.write(26);
}

void loop()
{
}

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
    battery= mySerial.readString();  
  }
}

So denke ich meintest du das, oder?

Nein.
String Objekte sind böse. ( Machen alles komplizierter als nötig )

while(mySerial.available()) 
    mySerial.read();  // wird für jedes Zeichen einmal aufgerufen

Natürlich kann man es zur Not auch mit String machen:

String battery;
...
if(mySerial.available()) 
  {
    battery= mySerial.readString();  // ganzen Text auf einmal ( mit Timeout )
    Serial.println(battery);
  }

Wenn es unbedingt String sein muß:
readStringUntil('\n'); wäre eine Alternative, ohne die Timeout Funktion zu strapazieren

OK. Danke. Gut zu wissen.

while(mySerial.available())
mySerial.read(); // wird für jedes Zeichen einmal aufgerufen

So lange mySerial was drinnen hat, lese es.

Das ist dann in mySerial abgelegt. Dann muss ich es in einer Variable Speichern. Was, wenn String doof ist, nehme ich da am dümmsten?
Mir ist der Schritt nicht klar, wo ich es aus der Übertragung rauslese. Ich stelle es mir vor, das ich die gesamte Ausgabe in eine Variable packe und als Text diese Variable sende.
Nur werden ja die AT Befehle an den SIM800 gesendet und dort sofort umgesetzt. Der Übergang zu void setup und void loop raff ich nicht. Müsste ich dann nicht im void setup einen Aufruf zum lesen der Variable per Funktion machen und den Rückgabewert in die Übertragung packen?

btw.... woher weis ich welcher Datentyp gut und schlecht ist? Was ist an String schlecht? Nur das ich es mal gehört habe.

Danke für die Hilfe.

Schau Dir zu Zeichenketten auf dem Arduino mal diese Info an. Da habe ich einiges dazu geschrieben.

Gruß Tommy

OK. Danke Tommy.

Ich sehe es ein.

Ohne vernünftig programmieren zu können ist Arduino nicht, was ich vermutet habe.

Die Hoffnung war, das ich mich da reindenken kann, ohne C zu lernen.

Das habe ich schon paar mal versucht, aber schaffe es nicht. Bei Arduino habe ich gehofft, das so etwas wie eine Doku, Beispiele, oder sonstwelche Lektüre existiert. Es gibt aber nur die Beispiele, die dabei sind, ich finde aber keine Beispiele, die auf einem so niedrigen Niveau sind, das ich daraus Lernerfolge ableiten kann.

Danke für deine sicher wertvolle Arbeit.

Aber ich verstehe nichts davon.

// oder auch (wenn man das Ziel nicht nochmal abspeichern will
Warum sollte ich das Ziel nicht noch mal abspeichern wollen?

Serial.println(zeiger);
Was steht da drin? Ich habe eine Vermutung..... "Arduino Uno"? Geraten.

zahl = strlen(quelle); // liefert 11 also ohne die abschließende 0!
Da wird das Ergebnis erklärt.

Nicht das ich deine Arbeit schlecht aussehen lassen wollen würde!
Ich weiss es aber nicht und kann daher deine Gedanken schwer fassen.

Mir ist das Grundprinzip nicht klar.
void Setup() //wird einmal ausgeführt
void loop() // wird dauernd ausgeführt

Dann ist es also nicht Möglich, eine Variable aus dem Loop in das Setup zu bekommen. Weil das wurde ja schon ausgeführt.
Ende der Fahnenstange,
Wenn ich es in ein Array lese, wie kommt es da wieder raus? Ausgeben.... da wo ich es brauche wird aber nichts mehr gemacht. Setup wurde einmal ausgeführt.
Oder muss ich dann die Funktion im Loop aufrufen, statt sie ins setup zu schreiben?

Videos Hilfen und was ich so gefunden habe ist entweder Level 0 oder Level 100. Dazwischen gibt es nix.
Nerd-Talk oder "Hello World".

Wenn man die Basis nicht versteht, nutzen einem Lesehilfestellungen wenig.

Dachte die Arduino-Idee wäre, eine vereinfachte Platform zu haben, um programmieren auch nicht-Programmierern zu ermöglichen.Das war wohl ein Denkfehler.

Sorry für den Redeschwall.
Ich muss wohl einsehen, dass ich mich auf Basic-Level besinnen muss.

Noch mal zum Code:
String battery;
...
if(mySerial.available())
{
battery= mySerial.readString(); // ganzen Text auf einmal ( mit Timeout )
Serial.println(battery);
}

Dann habe ich es alles in battery drinstehen. Wie kommt es jetzt aber in die SMS?

Gruß

Mit dieser Herangehensweise wird das nix. Du musst schon die Grundlagen von C/C++ lernen, wenn Du selbst etwas entwickeln willst. Ansonsten kannst Du nur hoffen, dass Du irgendwo was findest, was genau das macht, was Du willst. Die Wahrscheinlichkeit ist eher gering.

Ansonsten könntest Du Dir noch einen Dienstleister kaufen, der das für Dich baut.

Gruß Tommy

Hi,

genau das meine ich.
Es gibt Grundlagen und Beispiele.
Leider aber nur wenige Erklärungen.

Hinweise auf RTFM habe ich schon vorher gefunden.

Es ist immer das gleiche in Foren. Es gibt einige, die helfen könnten. Es gibt wenige die Helfen wollen, aber kaum jemanden der hilft.
Es findet sich aber immer jemand, der sich für einen Hinweis auf RTFM nicht zu schade ist.

Was ein Glück habe ich NIX vom Original-Store gekauft. So habe ich nur ne Handvoll Kohle versenkt, um einzusehen, das Arduino DOCH C/C++ Können erfordert.

Nix da von alles einfach.

Danke für die Hilfe.

Gruß

genau das meine ich.
Es gibt Grundlagen und Beispiele.
Leider aber nur wenige Erklärungen.

Das sehe ich anders.

Arduino's Erfolg beruht darauf, dass es (vieles) doch erstaunlich einfach geht und viele der vielen Beispiele leicht verständlich sind und als Basis für eigenes dienen können, auch ohne tiefer einzusteigen.

Wenn das ganze doch ein Fehlstart war, ist das ganze immerhin ein preiswerter Spaß gewesen, da stimme ich dir zu. ( Keine aufwendige Entwicklungsumgebung kaufen, Open Source Software )

Es gibt Grundlagen und Beispiele.
Leider aber nur wenige Erklärungen.

Auch ich sehe das anders: sieh Dir die Beispiele in der IDE an, stöber im Playground, steigere die Anforderungen mit Deinem Lernerfolg und nimm Dir nicht gleich was vor das Du nicht überblickst.

Ist wie Fahrrad fahren: Du fängst auch nicht mit nem Einrad an, oder?

OK.
Das habe ich.
Also Beispiele durchgearbeitet und so weiter, probiert, erweitert.

Ich denke, das ich solche Themen recht schnell blicke. Es gibt, wie bei allem aber Herangehensweisen, die grundsätzlich dumm sind, aber nicht falsch. Das sind aber Erfahrungswerte, die jeder machen muss....

es sei denn, er ist in einem Forum......

bei dem man solche Tips bekommt, die das verhindern, oder erklären.

Und wenn man Rückfragen hat, dann hoffte ich auf etwas konkretere Hinweise.

Die Geschichte mit dem String... String Objekte sind böse. Das ist sicher gut gemeint, aber würde mich da das "warum Böse" brennend interessieren. Auch der Hinweis auf die Sammlung. Gut gemeint.

Das Thema könne wir aber abkürzen, da ich mittlerweile auf andere (leider Unlösbare) Probleme gestossen bin.

Das ist aber ein anderes Thema für einen anderen Thread.

Gruß