SMS Auslesen und umwandeln

Sehr geehrte Community,

Ich habe bei meinem eigenen Projekt ein Porblem vieles hab ich herausgefunden bei dem Epaper Projekt.

Bei meinem Projekt verwenden ich einen Arduino Uno, ein GSM Shield(Telefonica) und ein ePaper.

Ich habe mein Programm jetzt so weit das ich die SMS Ausgelesen bekomme nur das Problem ist dabei wenn ich eine 1 auslesen will bekomme ich 49 raus (decimal) und ich habe es mit if(Volt == 49) versucht aber genau so mit switch(Volt){ case 49: ..... break;} jedes mal kam aber leider das selbe ergebnis das er switch case ignoriert und bei if zur else rüber springt obwohl im seriellen monitor die 49(1) angezeigt wird. Hier ist noch der if befehl drin 49 wird angezeigt im serielen monitor und bei der if abfrage wird die 49 nicht akzeptiert und es kommt geht nicht :confused:

Programm:

#include <GSM.h>
#include <Arduino.h>
#include <epa20.h>
#include <font_8x16.h>
#include <font_16x32nums.h>

#define PINNUMBER ""

epa20 EPA20;
GSM gsmAccess;
GSM_SMS sms;

char remoteNumber[20];

void setup() {
 //Seriel initialisieren
 Serial.begin(9600);

 //Display Initialisieren
 EPA20.initialize(10,0,0,0,9,8);
 EPA20.clear();

 //DEBUG
 Serial.println("SMS Empfangssystem");
 //NORMAL
 EPA20.clear();
 EPA20.string(33,54,font_8x16,"Empfangssystem",BLACK,WHITE);
 EPA20.string(48,38,font_8x16,"Startet...",BLACK,WHITE);
 EPA20.update();

 //PIN CHECK
 boolean notConnected = true;
 while(notConnected)
 {
   if(gsmAccess.begin(PINNUMBER)==GSM_READY)
     notConnected = false;
   else
   {
     //DEBUG
     Serial.println("Nicht verbunden(SIM Karten Fehler/Falsche Pin");
     //NORMAL
     EPA20.clear();
     EPA20.string(25,54,font_8x16,"SIM KARTEN ERROR",BLACK,WHITE);
     EPA20.string(73,38,font_8x16,"ODER",BLACK,WHITE);
     EPA20.string(25,20,font_8x16,"PIN NUMMER ERROR",BLACK,WHITE);
     EPA20.update();
     delay(3000);
     //DEBUG
     Serial.println("Gerät wurde ausgeschaltet");
     //Normal
     EPA20.clear();
     EPA20.string(40,54,font_8x16,"SYSTEM WURDE",BLACK,WHITE);
     EPA20.string(35,38,font_8x16,"AUSGESCHALTEN",BLACK,WHITE);
     EPA20.update();
     delay(999999999999999999999);
   }
 }
 //DEBUG
 Serial.println("GSM Initialisiert");
 Serial.println("Warte auf SMS");
 //Normal
 EPA20.clear();
 EPA20.string(20,38,font_8x16,"GSM Initialisiert",BLACK,WHITE);
 EPA20.update();
 delay(3000);
 EPA20.clear();
 EPA20.string(28,38,font_8x16,"Warte auf Daten",BLACK,WHITE);
 EPA20.update();
}

void loop() {
 Abfrage();
 delay(500);
}

void Abfrage() {
 uint32_t c;
 char Volt[20];


 if (sms.available())
 {
   Serial.println("Nachricht von:");

   sms.remoteNumber(remoteNumber, 20);
   Serial.println(remoteNumber);

   if(sms.peek()=='#')
   {
     Serial.println("Discarded SMS");
     sms.flush();
   }
   
   while(c=sms.read())
     //Serial.print(c);
     snprintf(Volt,sizeof(c), "%ld", c/1,c%100);
     Serial.print(Volt);
     EPA20.clear();
     EPA20.string(0,0,font_8x16,Volt,BLACK,WHITE);
     EPA20.update();
     delay(5000);
     Serial.print("Switch");
     if(Volt == 49){
       Serial.print("geht");
     }
     else{
       Serial.print("geht nicht");
     }
     delay(5000);
     Serial.print("Ende");

   Serial.println("\nEnde der Nachricht");

   sms.flush();
   Serial.println("Nachricht gelöscht");
 }
}

Genau an dem Probelm hänge ich auch zurzeit wäre cool wenn jemand eine lösung wüsste

und die Testausgabe mit

Serial.print(Volt);

bringt dir sicher schon eine 1 oder ist die auch schon 49?

Bei der Serial.print(Volt) bekomme ich 49 ( = 1 ) raus und die 49 sowie 48(0),49(1),50(2),51(3),52(4),53(5) rausfiltern mit switch case oder if abfrage.

Nur wenn ich die abfrage auf 49 dann auch mache bekomme ich aber hier nur zu default (Switch case) oder zu else (if abfrage).

Im Bibliotheksbeispiel ReceiveSMS sehe ich:

 char c;
...
    // Read message bytes and print them
    while (c = sms.read()) {
      Serial.print(c);
    }

Da kommen also einzelne Zeichen, die zur Weiterverarbeitung in eine Zeichenkette abgelegt werden wollen.

Das macht keinen Sinn, wenn nur ein Zeichen kommt:

 uint32_t c;

Wenn ich char c sage dann bekomme ich garnix mehr in Serial.print sowie auch im Display nur mit uint32_t bekomme ich die ASCII Dezimale raus. ich muss diese nur umwandeln und im Display nur sagen 49 = 1 z.B

Das sind ja gleich mindestens 3 Fehler drin.
Den dicksten hat mein Vorredner schon beschrieben.
Das sms.read() liefert nur ein Zeichen. Was steht denn in deiner SMS?
Die Spannung als Asciistring ? Oder schickst du eine binäre sms ?

Angenommen sie wäre binär : Was soll dann

snprintf(Volt,sizeof(c), "%ld", c/1,c%100);

Das willst du 2 Werte in einen String schreiben,gibst aber nur eine Maske an %d der zweite Wert verschwindet im
Nichts. Was soll c/1 ? Das ist doch c. Und dann kommt der Rest einer Division durch 100 (den du aber wegwirfst wg. nur einem %d).
Ach so, und dann noch das sizeof(c) ?? Das ist Konstant 4 und das bei einer Maske von %ld. Das können
schon mal locker mehr als 10 Ziffern sein, OK wenn man den Wertebereich kennt. Aber sizeof (c)
ist auf jeden Fall einfach Blö.....n.

Und letztendlich das

if(Volt == 49){

Volt ist bei dir ein char[] du testest hier also einen Pointer auf einen Speicherbereich auf 49.

Angenommen Volt enthielte als String "49" müsste der Code so aussehen :

if (! strcmp(volt,"49") )
{

Hier fehlen ganz viele Informationen für uns (ist die SMS binär oder nicht).
Und sehr viele für dich. Du solltest erst mal ein C (C++) Tutorial durcharbeiten.

Gruß
Ulli

@beeblebrox: In einem anderen Thema hatte ich die Verwendung von snprintf angeregt, sah dann so aus:

snprintf(spannung,sizeof(spannung), "%ld.%ld V", voltage/100,voltage%100);

Leider ist meine Anregung nicht auf fruchtbaren Boden gefallen ::slight_smile: