bin neu hier und das ist mein erstes Arduino Projekt. Ich habe vor mehrere Temp Sensoren auszulesen und falls diese eine zu hohe Temp erreichen eine Warnungs SMS und eine Warnungs Email zu senden. Außerdem sollen Daten wie "Ist auf der Stromleiste noch Saft drauf" getestet werden. Das habe ich schon mit einem Relais realisiert und die Temp Sensoren DHT 22 funktionieren auch super. Nur dieses billig GSM Modul Sim800L will nicht wirklich laufen.
Das Problem: Wenn ich über AT Commands ( Serielle Schnittstelle auslesen und an GSM Modul weiterleiten)
das Teil ansteuere , funktionieren die Commands bis zu dem Teil wo ich den Inhalt der SMS eingeben muss.
Da gibt es ja das allgemeine Problem das man keine Tastenkombinationen über die Serielle Schnittstelle übertragen kann. Dafür hatte ich im Internet eine Lösung gefunden.
if(Serial.available()){
byte b = Serial.read();
if (b == '%')
{
serialSIM800.write( 0x1A );
}
else
{
serialSIM800.write(b);
}
Dieser Code sollte (ich hoffe es mal) bei der Eingabe in der Seriellen Konsole '%' erkennen und sie mit 0x1A (ASCII code für CTRL-Z) ersetzen. Doch ich weiß nicht ob das das Problem ist das dass nicht funktioniert oder ob es an etwas anderem liegt aber ich werde bei der Eingabe des Inhalts und abschließendem % in eine weitere Zeile weiter geleitet. Ab da funktionieren die normalen Commands auch nicht mehr ( logisch man ist ja in dem SMS Inhalt). Hier ein Bild wie weit ich bei den Commands komme. (ka warum aber der imgur link wird nicht eingebettet Imgur: The magic of the Internet .
Dann habe ich ausprobiert die Commands in meinen Code zu schreiben weil das ja auch die Methode ist die später im richtigen Projekt angewendet werden sollte doch ohne Erfolg.Die Reihenfolge der Commands habe ich übrigends von dieser Seite Send SMS using AT commands . Durch langes googeln , youtuben und selber testen hatte ich auch herausgefunden das das Modul eventuell etwas Zeit brauch um zu starten. Habe deswegen einen Code geschrieben der erst seeeeeeeeeehr spät anfängt (25 sek delay zum starten) und dann den loop immer einmal durchlaufen lässt bevor er ein neues AT command sendet. Das hat auch ziemlich wenig gebracht weil ich dann aus der Seriellen Schnittstelle zwar meine Commands zurück bekommen habe aber in komischen Zeitabständen und anscheinend wie gesagt , auch ohne Erfolg. Die AT commands stehen dann da und machen nix. Jemand eine Idee ? Ist wie gesagt mein erstes Projekt und bin schon recht verzweifelt. Danke für die Antworten hier nochmal der "aktuelle" Code mit den langen Delays damit die AT commands schön Zeit haben (was nix bringt).
#include <SoftwareSerial.h>
//SIM800 TX is connected to Arduino D8
#define SIM800_TX_PIN 8
//SIM800 RX is connected to Arduino D7
#define SIM800_RX_PIN 7
//Create software serial object to communicate with SIM800
SoftwareSerial serialSIM800(SIM800_TX_PIN,SIM800_RX_PIN);
int i = 1;
int counter = 1;
void setup() {
//Begin serial comunication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
while(!Serial);
//Being serial communication witj Arduino and SIM800
serialSIM800.begin(9600);
delay(1000);
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("Setup Complete!");
delay(5000);
}
void loop() {
//Read SIM800 output (if available) and print it in Arduino IDE Serial Monitor
if(serialSIM800.available()){
Serial.write(serialSIM800.read());
}
//Read Arduino IDE Serial Monitor inputs (if available) and send them to SIM800
if(Serial.available()){
byte b = Serial.read();
if (b == '%')
{
serialSIM800.write( 0x1A ); // ASCII WERT FÜR
}
else
{
serialSIM800.write(b);
}
}
if (i == 1)
{
digitalWrite(LED_BUILTIN, LOW);
delay(25000);
serialSIM800.write("AT");
//Serial.write("AT");
delay(5000);
digitalWrite(LED_BUILTIN, HIGH);
counter++;
}
if (i == 2)
{
serialSIM800.write("AT+CMGF=1");
//Serial.write("AT+CMGF=1");
delay(5000);
counter++;
}
if (i == 3)
{
serialSIM800.write("AT+CSMP=17,167,0,16");
//Serial.write("AT+CSMP=17,167,0,16");
delay(5000);
counter++;
}
if (i == 4)
{
serialSIM800.write("AT+CMGS=\"+49151XXXXXXXX\"");
//Serial.write("AT+CMGS=\"+49151XXXXXXXX\"");
delay(5000);
counter++;
}
if (i == 5)
{
serialSIM800.write("TESTTESTSTKJLKSDJFLJ");
//Serial.write("TESTTESTSTKJLKSDJFLJ");
delay(5000);
serialSIM800.write(0x1A);
digitalWrite(LED_BUILTIN, LOW);
}
i = counter;
}
Also ich habe mit dem SIM800L bisher keine Probleme gehabt.
Deinen Sketch habe ich grob überflogen, komme aber nicht mit deiner Logik klar.
Was sollen die "Counter" da drin und die langen delays stören den sauberen Ablauf.
Wichtig ist, hat sich dein SIM auch richtig eingebucht ?
Und NEIN, wenn das SIM eingebucht ist, braucht es nicht lange zum Senden der SMS.
Also so habe ich mit dem Sketch auch nicht angefangen das ist nur daraus entstanden da ich dachte das die Commands eventuell etwas Zeit brauchen und ich diese deswegen mit delays verziert habe und versucht habe in jedem Loop Vorgang nur ein Command zu benutzen (wie gesagt hat nichts gebracht). Im Prinzip koennte man das alles löschen bzw einklammern ab der ersten if funktion dann wäre der Sketch nur noch ein Kommunikationsmittel zwischen Serielle Konsole am Pc und dem GSM Modul.
Sorry aber verstehe nicht was mit eingebucht gemeint ist? Ein richtiger Vertrag bzw Geld auf der Karte ? Sollte vorhanden sein ja. Ein Pin Code ist nicht vorhanden den habe ich vorher extra mit dem Handy entfernt. Netz finden usw funktioniert ich habe bereits mit anderen Commands mir die Netze die er gefunden hat angezeigt ist aber nichts spektakuläres.
Das Bild habe ich angefügt , zeigt aber nur meine Serielle Console wie ich versuche eine SMS zu versenden und daran Scheitere das ich die Tastenkombination nicht ausführen kann. Habe mir gerade ein anderes Programm heruntergeladen um die Serielle Schnittstelle auszulesen (HTERM) . Damit kann ich Hex werte übertragen und ASCII in einer Konsole. Kann auch noch ein Bild anfügen was ich übertragen habe und was ich als "Received Data" bekommen habe. Imgur: The magic of the Internet
Verbindung ist eigentlich hergestellt. Die LED blinkt am Anfang im 1 Sek Takt und
nach ein wenig Zeit im 3 Sek Takt. Während das Gerät im 1 Sek Takt ist gibt es mir
auch nichts im Seriellen Monitor wieder (logisch). Wie kann ich denn 100% feststellen ob
ich meine SIM "Eingebucht" habe ? Gibt es ein spezifisches AT Command mit dem ich das
feststellen kann?
Okay Gut, Probiere gerade das selbe in Grün mit Putty, komme auch nicht gerade weiter. Es klappt
alles bis zu dem Punkt wo ich mit der Tastenkombination STRG + Z die Nachricht abschicke. Dort
scheint es irgendwie zu hängen oder ähnliches . Nachdem ich die Tastenkombination ausgeführt habe
kann ich auch nichts mehr schreiben oder ähnliches es hängt einfach....
AlexArduinoP:
Okay Gut, Probiere gerade das selbe in Grün mit Putty, komme auch nicht gerade weiter. Es klappt
alles bis zu dem Punkt wo ich mit der Tastenkombination STRG + Z die Nachricht abschicke. Dort
scheint es irgendwie zu hängen oder ähnliches . Nachdem ich die Tastenkombination ausgeführt habe
kann ich auch nichts mehr schreiben oder ähnliches es hängt einfach....
Ich habe es nie über die serielle Eingabe getestet.
Immer nur direkt über den Sketch, was auch gut funktioniert.
Hier mal ein Beispiel-Sketch (Auszug aus meinem Sketch) mit dem es funktioniert.
#include <SoftwareSerial.h> // https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/libraries/SoftwareSerial/src/SoftwareSerial.h
#define rxSS 7 // RX-SoftSerial
#define txSS 8 // TX-SoftSerial
SoftwareSerial gsmSerial(rxSS, txSS); // RX-SoftSerial, TX-SoftSerial für GSM-Modul
// SMS-Texte
char* SmsTxt[] = { "Erste Meldung", "zweite Meldung" };
// SMS-Nummern
char* SmsNmr[] = { "0170xxxxxx", "0170xxxxxx" };
// SMS Länder-Vorwahl
String lCode = "+49";
const int Kontrolle = 13; // SMS-Kontrolle Onboard Led (13)
String message = "";
String number = "";
void setup()
{
Serial.begin(9600);
pinMode (Kontrolle, OUTPUT); // zur Sensorkontrolle (Pin 13)
gsmSerial.begin (9600); // Start SoftwareSerial für GSM-Modul
}
void loop()
{
SendSMS(0); // erste SMS senden
delay(10000);
SendSMS(1); // zweite SMS senden
}
void SendSMS(unsigned int i) {
digitalWrite(Kontrolle, HIGH);
message = SmsTxt[i]; // SMS Text
number = SmsNmr[i]; // Nummer
SendTextMessage(); // SMS starten
delay(100);
message = "";
number = "";
delay(200);
digitalWrite(Kontrolle, LOW);
}
void SendTextMessage() {
// hier wird die Nummer + Vorwahl und der Text ans GSM SIM800L übermittelt
gsmSerial.print("AT+CMGF=1\r");
delay(300);
gsmSerial.print("AT+CMGS=\"" + lCode + number + "\"\r");
delay(300);
gsmSerial.println(message);
gsmSerial.print("\r");
delay(300);
gsmSerial.println((char)26);
gsmSerial.println();
}
void ShowSerialData() {
// SIM800L Ausgabe lesen
if (gsmSerial.available())
Serial.write(gsmSerial.read());
}
Über die Funktion ShowSerialData() wird im Serial Monitor ein Ergebnis angezeigt.
Du kannst die unterschiedlichen SMS per Taster in der Loop bei Bedarf starten.
Habe mir den Sketch angeschaut und verstehe den Code eigentlich.
Habe dann meine Nummer in beide Array Fächer reingepackt und
die ShowSerialData Funktion in den Loop gesetzt? Ich war mir nicht ganz Sicher aber
wenn die Funktion am Ende des Loops steht sollte ich doch trotzdem irgendwelche
Werte erhalten richtig? Bei mir wird nämlich nichts angezeigt und eine SMS habe ich
auch nicht erhalten..... Also muss es an der Verkabelung bzw Hardware bzw Stromversorgung liegen?
Die LED geht zumindest manchmal an und wieder aus also durchlaufen tut das irgendwie...
AAAAAAAAAAAAAAAlllllllsooooooo das mit dem Strom leuft bei mir so ab.
Aktuell funktioniert das senden von AT Commands (über die Serielle Schnittstelle mit Arduini IDE) NUR wenn ich das Orginale Netzteil was ich zu meinem Arduino dazu bekommen habe anschließe (9v 1A) und dann wenn sich das sim800l gefunden hat (bis es anfängt im 3 sek takt zu blinken , dauert je nach Ausrichtung der Antenne länger) und danach USB reinstecke und das Netzteil (9v 1A) rausziehe. Dann kann ich nämlich über USB auf die Serielle Schnittstelle schauen und die LED leuchtet im 3 Sek Takt was nicht der Fall ist wenn ich das sim800l über das Board per USB starte. Für dieses Problem hatte ich mir ein weiteres externes Netzteil besorgt , die Isolierung abgeschnitten und dann damit mein Sim800L Modul betrieben. Ich habe festgestellt das das dann auch funktioniert hat aber relativ lange dauert bis die LED im 3 Sek Takt blinkt und das das Teils auch gar nicht mit dem Netzteil funktioniert hat. Obwohl dieses 5v 2A ausgeben kann also ist es ja Prinzipiell besser als meine 9v 1A
reinstecken rausziehen Lösung.
Deine Schaltung verstehe ich nicht.
Du solltest mal ein Schaltbild posten.
Ich vermute jetzt, da liegt dein Problem.
Die SIM800L können nur 4,2 Volt ab, zumindest die die ich bisher eingesetzt habe.
Sooooo das Problem ist halt das das alles zu kompliziert (unnötig) von mir gemacht wurde und es schwierig zu erklären ist.
Was aber Positiv ist das ich es geschafft habe das Modul zum laufen zu bringen. Das Problem liegt anscheinend (Dank dir habe ich nochmal alles 5mal überdacht) doch an der Strom-Versorgung. An sich sollte es doch kein Problem sein ein 5v 2A Netzteil anzuschließen? Mehr Strom ist doch nicht schlecht wird ja nicht unbedingt genutzt. Im Moment funktioniert es indem ich das vom Arduino mitgelieferte 9v 1A an das Arduino anschließe und das sim800l modul über die 5v Rail aufm Uno. Vorher muss allerdings das Arduino mit USB verbunden sein damit ich die Serielle Schnittstelle nutzen kann. Das Arduino wählt glaube ich automatisch dann das 9V 1A aus und das Sim800L Modul findet Netz. Mit dieser Konstellation "stürzt" die Serielle Schnittstelle nicht mehr ab wenn ich Versuche eine Nachricht zu senden. Mein aktueller Code beinhaltet jetzt auch \r was am Ende einer Nachricht dafür sorgt das ein Zeilenumbruch passiert.
Danke aufjedenfall für die Unterstützung nur ich habe noch das Problem dass das Arduino später mehr Strom fressen wird (Temp sensoren + anderen Kram)und die 9v 1a nicht ausreichen werden. Wie schließt du das Modul an? Über eine Batterie oder auch über ein externes Netzteil?
Oh...super. Freut mich, dass es jetzt funktioniert.
Ich verwende in meinen Projekten einen Atmega328 Standalone und betreibe den mit einem 5 Volt Regler der am 9 Volt 2 Amp. Netzteil angeschlossen ist. Ein Stepdown-Regler auf 4,2 Volt eingestellt versorgt das SIM800.
Das läuft sehr stabil.
Ich hätte Bedenken, das SIM für längere Zeit mit 5 Volt zu versorgen.
In meinem Projekt würde das Teil sogar 24/7 laufen... über Monate ://///. Werde eventuell da die 2G Netzwerke ja angeblich bald alle abgeschaltet werden mir sowieso ein 4G GSM Modul kaufen.