SIM 900 SMS empfangen keine Reaktion

Hallo Zusammen,

benötige mal eure Hilfe.

Beim empfangen eines bestimmten chars soll die LED auf HIGH gesetzt werden.

Problem:

Wenn ich eine SMS sende per Handy mit dem Buchstaben "B", reagiert das Modul so, dass er in die Variable inchar dauerhaft was anderes reinschreibt statt das er das "B" aus der SMS nimmt. Kennt das Problem jemand ? Siehe Bild so sieht es im Seriellen Monitor aus :frowning:

Das Problem fängt an wenn das SIM900 Modul die SMS Empfängt, heißt er bekommt die SMS kann aber das "B" nicht einlesen bzw in die Variable abspeichern. Stattdessen schreibt er i was rein.

Kann jmd. mir Helfen?

Hier der Code Abschnitt:

void loop() {

    
  if (SIM900.available() > 0)
  {
    if (b3 == true) {
      inchar = SIM900.read();
      Serial.println(inchar);
      b3 = false;
      if (inchar == "B")
      {
        delay(10);
        
        Serial.print("Empfangen");
        digitalWrite(offen, HIGH);
      }
      delay(10);
      SIM900.println("AT+CMGD=1,4"); // delete all SMS
      b3 = true;
    }
  }

Wäre gut, wenn du einen kompletten Sketch postest.
Der Fehler liegt meist im geheimen Teil

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

int b3 = true;

#include <SoftwareSerial.h>



SoftwareSerial SIM900(7, 8);

char inchar;

int a = true;

const int Fensterwg = 3;
int Fensterwk = 4;
int Fensters = 5;
int Fensterk = 6;
//const int abreset = 7;
int offen = 10;

int zustandsiren = true;

int n = 0;

void setup() {
  Serial.begin(9600);
  SIM900.begin(9600);
  //SIM900.print("AT+IRP=9600");
  pinMode(Fensterwg, INPUT);
  pinMode(Fensterwk, INPUT);
  pinMode(Fensters, INPUT);
  pinMode(Fensterk, INPUT);
  pinMode(offen, OUTPUT);
  
  displayfirst();

}

void loop() {

    
  if (SIM900.available() > 0)
  {
    if (b3 == true) {
      inchar = SIM900.read();
      Serial.println(inchar);
      b3 = false;
      if (inchar == "B")
      {
        delay(10);
        
        Serial.print("Empfangen");
        digitalWrite(offen, HIGH);
      }
      delay(10);
      SIM900.println("AT+CMGD=1,4"); // delete all SMS
      b3 = true;
    }
  }
    
  

  if ( zustandsiren == true and n < 1) {
    if (digitalRead(Fensterwg) == LOW /*|| digitalRead(Fensterwk) == LOW || digitalRead(Fensters) == LOW || digitalRead(Fensterk) == LOW*/ ) {
      siren();
      Serial.print("Einbruch sms wird gesendet");
      //smssend();
      n++;
    }
    else {
      digitalWrite(offen, LOW);
    }

  }
}

So..... ich hoffe das hilft das ihr mir helfen könnt:)

Über jede Antwort bin ich dankbar.

Jemand eine Idee ? Wo das Problem ist?

enrique1995:
Jemand eine Idee ? Wo das Problem ist?

char inchar;

  if (inchar == "B")

Ist "B" ein char?

Wie wäre es mit einem Vergleich auf 'B'?

Ich verstehe leider einiges an dem Code nicht. Es scheint so, als wäre es keine brauchbare Reduktion eines längeren Codes.

  1. Angefangen bei der Einbindung des I2C-LCD:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

Es gibt mehrere I2C-LCD Libraries, aber das sieht für mich eher nach einem "normalen" LCD aus, also ohne I2C.
Ich verwende auch verschiedene Libs für I2C-LCDs aber das schaut für mich ungewohnt aus.
Stehen diese (vielen) Zahlen für Pins?
Wenn ja, dann gäbe es ziemliche Konfilikte mit dem restlichen Code.
Welche LCD-Library verwendest du?
Andererseits: im restlichen Code wird gar nichts mit einem LCD gemacht. Also wieso stehen diese Zeilen überhaupt da?

  1. int a wird gar nicht verwendet - na gut, das ist natürlich kein wirkliches Problem.

  2. Es müsste wohl eher heißen:

if (inchar == 'B')
  1. Der Wert von b3 ist irrelevant, weil im gezeigten Code immer true:
if (b3 == true) {
      inchar = SIM900.read();
      Serial.println(inchar);
      b3 = false;
      if (inchar == "B")
      {
        delay(10);
       
        Serial.print("Empfangen");
        digitalWrite(offen, HIGH);
      }
      delay(10);
      SIM900.println("AT+CMGD=1,4"); // delete all SMS
      b3 = true;
}

Zuerst die Abfrage auf b3 == true, dann wird es kurzfristig auf false gesetzt um kurz vor Ende dieses Codeblocks wieder auf true gesetzt zu werden. Die Abfrage hat also "keine Wirkung".

Das erklärt möglicherweise nicht warum der Code nicht so funktioniert, wie du es möchtest.

Mein Rat: probiere zuerst mit ganz einfachem Code mit dem SIM 900 zu kommunizieren um herauszufinden, wie das funktioniert. Orientiere dich an (hoffentlich vorhandenen) Beispielen.

Der gezeigte Code ist zwar "ganz einfach", enthält aber "Eigenartiges" und ist deshalb möglicherweise nicht so gut geeignet.

Ich habe leider deine Hardware nicht, habe aber schon öfter mit GSM-Modulen gearbeitet. Ich kann also deinen Code nicht direkt testen.

Generell ist die Stromversorgung bei GSM oft der Grund für viele Fehlfunktionen.
Es wird meist eine getrennte (leistungsfähige) Stromversorgung für so ein Modul benötigt und eine Versorgung direkt vom Arduino ist nicht möglich.

Edit:
Da war Whandall schneller :slight_smile: