Hallo, ich spiele gerade mit einem Siemens TC35 SMS-Modul und einem UNO. Hierbei tritt ein Problem auf welches ich mir nicht so ganz richtig erklären kann.
In den beiden Funktionen unten möchte ich aus dem GSM-Netz den Netzbetreiber und die Signalstärke auslesen, sowie das noch vorhandene Restguthaben der Telefonkarte...
Die erste Funktion wird etwa alle 60sec. durchlaufen, die zweite 1xtäglich.
Problem dabei ist, wenn ich den void Guthaben mit in den Programmablauf einbringe, funktioniert der SMS Versand nicht mehr, und auch beim Aktualisieren der GSM-Daten (Netzbetreiber/Signal) gibt es immer wieder mal Probleme (Lesefehler). Ohne geht es einwandfrei.
meine Vermutung ist dass sich die Arrays irgendwie untereinander beeinflussen. Kann das sein?
Die beiden Funktionen erstellen lokale char's und die seriellen Daten zwischen zu speichern, die benötigten Werte werden dann an globale int's weitergegeben und weiterverarbeitet.
Wo liegt hier das Problem?
Danke und Gruß Stefan
void GSM_DATEN_HOLEN() {
char NETZ[200]; //200speicher fuer Serielle Daten des GSM-Modules
char SIGNAL[40];//40
int Platz = 0; //Platz im char-Array
//Einlesen ob mit Vodafone verbunden
gsm.println("AT+CSQ"); //Abfrage des Netzes
while (gsm.available() > 0) {
NETZ[Platz] = gsm.read();
Platz++;
}
if (strstr(NETZ, "Vodafone")) { //schauen ob in den empfangenen Daten der Teile #Vodafone# enthalten ist, wenn ja Netzbetreiebr auf 1 setzen, ansonsten 0
Netzbetreiber = 1;
}
else {
Netzbetreiber = 0;
}
delay(2000);
// Die Signalstaerke des Funknetzes einlesen
Platz = 0;
gsm.println("AT+COPS?"); //Abfrage der Signalqualitaet
while (gsm.available() > 0) {
SIGNAL[Platz] = gsm.read();
Platz++;
}
// den Signal-string aufteilen und nur den Wert (der zweite im String) der die Feldstaerke enthaelt als int in Signal uebertragen
char *Wert; //Speicher fuer die Stringteile die ausgelesen wurden
byte Pos = 1;
Wert = strtok(SIGNAL, ", "); //den String nach Trenzeichen , und Leerzeichen durchsuchen und ausgeben, solange bis kpl. durchsucht
while (Wert != NULL) {
if (Pos == 2) {
Signal = map(atoi(Wert), 0, 31, 0, 100) ; //den Wert von 0-31 auf 0-100 skalieren und an Signal uebergeben, mit atoi wird der Wert von char in int gewandelt!
if (atoi(Wert) > 90) { //Wenn er erhaltenen Wert gr. 90 ist Signal auf 0 setzen, da das Signal nicht lesbar ist oder nicht verfuegbar
Signal = 0;
}
}
Pos++;
// naechsten Abschnitt erstellen
Wert = strtok(NULL, ", ");
}
}
void Guthaben() {
//Abfragen des Kontostandes der Guthabenkarte
lcd.clear();
lcd.print("lade GSM-Guthab.");
char Daten[300]; //300
int Stelle = 0; //Platz im char-Arry
delay(500);
gsm.println("AT+CUSD=1,\"*100#\""); //GSM-Code - Abfrage des Kontostand
while (gsm.available() > 0) {
Daten[Stelle] = gsm.read();
Stelle++;
if (Stelle > 299) { //Das Empfangsarry auf 299 Stellen begrenzen
Stelle = 299;
}
}
if (strstr(Daten, "Kontostand")) { //schauen ob in den empfangenen Daten der Teile #Kontostand:# enthalten ist, wenn ja sind die Daten gueltig und werden weiterverarbeitet
char *Wert; //Speicher fuer die Stringteile die ausgelesen wurden
byte Pos = 1;
Wert = strtok(Daten, "; "); //den String nach Trenzeichen , und Leerzeichen durchsuchen und ausgeben, solange bis kpl. durchsucht
while (Wert != NULL) {
if (Pos == 3) { //der benoetigte Wert befindet sich an der 3ten Stelle in der Stringzerlegung
EUR = (atof(Wert) * 100) + 1; //Berechnen der EUR Guthabens in EUR und an EUR-Variable uebergeben.
}
Pos++;
// naechsten Abschnitt erstellen
Wert = strtok(NULL, "; ");
}
lcd.clear();
lcd.print("GSM-Guthaben: "); lcd.setCursor (0, 1); lcd.print(EUR / 100.0); lcd.print(" EUR");
letzte_EUR = millis(); //speichern der letzten erfolgreichen Abfrage des Kontostandes
delay(5000);
}
else {
lcd.clear();
lcd.print("GSM-Lesefehler!");
}
delay(1000);
lcd.clear();
}