GSM-Modul - SMS senden, wenn Arduino Pin aktiviert wird

Hallo zusammen,

irgendwie blicke ich es nicht, oder sehe den Wald vor lauter Bäumen nicht ?

Ich bin vor ca. 6 Monaten mit den Arduinos angefangen und konnte mir bis heute bei meinen Projekten immer ganz gut weiterhelfen, auch als mitlesender hier im Forum. Doch nun komme ich irgendwie nicht mehr weiter.

Ich hatte mir ein GSM Modul gekauft: SainSmart Kompatibel Drahtlos Module Für GSM SIEMENS TC35 SMS Module Board UART/RS232.

Soweit habe ich es auch am laufen, doch nun wollte ich es ganz banal schalten, wenn ein Digital Pin am Arduino Nano geschaltet wird. So läuft das Modul wie gesagt perfekt. Ich glaube, ich habe einfach nur ein Brett vor dem Kopf :astonished: .

Hier ein Auszug aus dem Setup:

void setup() /----( SETUP: RUNS ONCE )----/
{
gsmSerial.begin(9600);
delay(2000);
Serial.begin(9600); // Used to type in characters
Serial.println("System startet...");
mlx.begin();

//Autostart des GSM-Moduls
pinMode(6, INPUT);
digitalWrite(6, LOW);
pinMode(6, OUTPUT);
delay(100);
pinMode(6, INPUT);

//Konfiguration des Relais-Outputs
pinMode(RELAIS10, OUTPUT);
pinMode(RELAIS9, OUTPUT);
pinMode(RELAIS8, OUTPUT);
pinMode(RELAIS7, OUTPUT);

Ich nutze eine Melexis-Infrarotmessung um ab einer bestimmten Temperatur einen Pin zu schalten.

Hier noch das Loop:

//Schaltbedingung für das Relais - Wann soll der Alarm ausgelöst werden

if (mlx.readObjectTempC() <= -8.0)
{
digitalWrite(RELAIS10, HIGH); // RELAIS anschalten
}
else
{
digitalWrite(RELAIS10, LOW); // RELAIS ausschalten
}

// Status des Sensors - LED Anzeige

if (mlx.readObjectTempC() >= 100.00)
{
digitalWrite(RELAIS9, HIGH); //Störungs-LED (Rot) An - Messung Defekt
digitalWrite(RELAIS8, LOW);
digitalWrite(RELAIS7, LOW);
}

else
{ digitalWrite(RELAIS9, LOW);

if (mlx.readObjectTempC() <= -8.0)
{
digitalWrite(RELAIS8, HIGH); //Status: Anzeige-LED (Gelb) - Erkennung positiv
digitalWrite(RELAIS7, LOW);
}
else
{ digitalWrite(RELAIS8, LOW); //Status: Anzeige-LED (Gelb) - Erkennung negativ

if (mlx.readObjectTempC() >= -8.0)
{
digitalWrite(RELAIS7, HIGH); //Status: Sensor aktiv - Betriebs-LED (Grün) an
}
else
{ digitalWrite(RELAIS7, LOW); //Status: Sensor aktiv - Betriebs-LED (Grün) aus

Wie muss ich den folgenden Block in das Loop eintragen, damit die dieser bei dem Schalten von Relais 8 gesendet wird ?

GSM-Loop-Block:

sendTextMessage();
delay(300000);
}
void sendTextMessage() {
gsmSerial.print("AT+CMGF=1\r");
delay(100);
gsmSerial.println("AT+CMGS="+49XXXXXXXXX"");
delay(100);
gsmSerial.print("Temperatur erreicht");

delay(100);
gsmSerial.println((char)26);

Ich bin da derzeit echt überfragt, wie das gehen soll.

Habt ihr da noch eine Idee ?

Viele Grüße und besten Dank

André

Als Mitlesender solltest du auch wissen, das Sketch hier in Code-Tags gepostet werden. Verwende die Schaltfläche </> im Editor-Fenster.

Und poste den kompletten Sketch, mit Fragmenten können wir nichts anfangen.

Hallo,

Okay...Sorry..jetzt nochmal der komplette Code im Fenster:

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
#include <SoftwareSerial.h>
SoftwareSerial gsmSerial(2, 3);
const int RELAIS10 = 10;
const int RELAIS9 = 9;
const int RELAIS8 = 8;
const int RELAIS7 = 7;
unsigned long previousMillis = 0;
unsigned long time;
// set the LCD address to 0x27 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address


/*-----( Declare Variables )-----*/


void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  gsmSerial.begin(9600);
  delay(2000);
  Serial.begin(9600);  // Used to type in characters
  Serial.println("Temperaturerkennungssystem startet...");
  mlx.begin();

  //Autostart des GSM-Moduls
  pinMode(6, INPUT);
  digitalWrite(6, LOW);
  pinMode(6, OUTPUT);
  delay(100);
  pinMode(6, INPUT);

  //Konfiguration des Relais-Outputs
  pinMode(RELAIS10, OUTPUT);
  pinMode(RELAIS9, OUTPUT);
  pinMode(RELAIS8, OUTPUT);
  pinMode(RELAIS7, OUTPUT);
 
 //Initialisierung LCD-Display
  lcd.begin(20, 4);        // initialize the lcd for 20 chars 4 lines, turn on backlight

  // ------- Quick 3 blinks of backlight  -------------
  for (int i = 0; i < 3; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on

  // Intro und Boot-Vorgang auf LCD Display
  lcd.setCursor(0, 0); //Start at character 4 on line 0
  lcd.print("Temperaurerkennungssystem...");
  lcd.setCursor(0, 1);
  lcd.print("Version 1.0");
  lcd.setCursor(0, 3);
  lcd.print("by Stargazer_loehne");
  delay(5000);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("System bootet...");
  delay(2000);
  lcd.clear();



}/*--(end setup )---*/


void loop() {              /*----( LOOP: RUNS CONSTANTLY )----*/

sendTextMessage();
delay(300000);
}
void sendTextMessage() {
gsmSerial.print("AT+CMGF=1\r");
delay(100);
gsmSerial.println("AT+CMGS=\"+49XXXXXXXXX\"");
delay(100);
gsmSerial.print("Temperartur erreicht");

delay(100);
gsmSerial.println((char)26);



// Darstellung auf IDE-serieller Monitor

Serial.print("Umgebungstemperatur = "); Serial.print(mlx.readAmbientTempC());
Serial.print("*C\tObjekttemperatur = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C");
delay(500);     //Abtastrate für die MLX-Messung in ms


// Darstellung auf LCD Display

lcd.clear();
lcd.setCursor(1, 0);
lcd.print ("Akt. Temperaturen:");
lcd.setCursor(0, 2);
lcd.print ("Umgebung = ");
lcd.print (mlx.readAmbientTempC());
lcd.setCursor(2, 4);
lcd.print ("Himmel = ");
lcd.print (mlx.readObjectTempC());
Serial.println();




//Schaltbedingung für das Relais - Wann soll der Alarm ausgelöst werden

if (mlx.readObjectTempC() <= -8.0)
{
  digitalWrite(RELAIS10, HIGH); // RELAIS anschalten
}
else
{
  digitalWrite(RELAIS10, LOW); // RELAIS ausschalten
}

// Status des Hagelsensors - LED Anzeige

if (mlx.readObjectTempC() >= 100.00)
{
  digitalWrite(RELAIS9, HIGH);  //Störungs-LED (Rot) An - Messung Defekt
  digitalWrite(RELAIS8, LOW);
  digitalWrite(RELAIS7, LOW);
}

else
{ digitalWrite(RELAIS9, LOW);

  if (mlx.readObjectTempC() <= -8.0)
  {
    digitalWrite(RELAIS8, HIGH);  //Status:  Anzeige-LED (Gelb) - Erkennung  positiv
    digitalWrite(RELAIS7, LOW);
  }
  else
  { digitalWrite(RELAIS8, LOW);  //Status:  Anzeige-LED (Gelb) - Erkennung negativ

    if (mlx.readObjectTempC() >= -8.0)
    {
      digitalWrite(RELAIS7, HIGH);  //Status:  Sensor aktiv - Betriebs-LED (Grün) an
    }
    else
    { digitalWrite(RELAIS7, LOW);  //Status: Sensor aktiv - Betriebs-LED (Grün) aus 



      // when characters arrive over the serial port...
      if (Serial.available())
      {
        // wait a bit for the entire message to arrive
        delay(100);
        // clear the screen
        lcd.clear();
        // read all the available characters
        while (Serial.available() > 0) {
          // display each character to the LCD
          lcd.write(Serial.read());
        }
      }
    }
  }
}
}

Ist derzeit noch mit dem Display drin, von einem anderen Projekt. Werde das wohl aber doch abstoßen.
Wie gesagt. Stehe noch mit der ganzen Arduino-Geschichte am Anfang. Es macht aber viel Spaß. Habe aber auch noch eine Menge zu lernen...

Viele Grüße

André

Was soll denn das riesen delay in der Loop ?
Das ist großer Mist, damit blockierst du deinen kompletten Sketch.

Setze eine Tasterabfrage in die Loop, mit der startest du deine SMS-Funkion.
Beispiele zur Tasterabfrage findest du in der IDE unter Beispiele.

Das mit dem delay von 30000 ist derzeit noch ja noch Notwendig, da er sonst sofort wieder eine SMS sendet, wenn er das Loop neu startet. Das war noch zu Testzwecken.

Danke für den Tipp mit dem Taster. Das werde ich mal versuchen.

Viele Grüße

Du könntest dir einfach merken das du gerade erst eine SMS versendet hast und diesen Merker erst nach einer gewissen Zeit wieder rücksetzen.

Gruß

Im Übrigen ist das aktuelle delay = 300000, nicht 30000, also 5 Minuten.

Wenn er es mit einem Taster macht, braucht er keinen Merker.
Dann wird die SMS ja nur einmal abgesetzt, wenn der Taster gedrückt wird.

So !

Da wäre ich wieder... :confused:

Ich habe jetzt folgenden Code :

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
#include <SoftwareSerial.h>
SoftwareSerial gsmSerial(2, 3);
const int RELAIS10 = 10;
const int RELAIS9 = 9;
const int RELAIS8 = 8;
const int RELAIS7 = 7;
unsigned long previousMillis = 0;
unsigned long time;
// set the LCD address to 0x27 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address


/*-----( Declare Variables )-----*/


void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  gsmSerial.begin(9600);
  delay(2000);
  Serial.begin(9600);  // Used to type in characters
  Serial.println("Temperaturerkennungssystem startet...");
  mlx.begin();

  //Autostart des GSM-Moduls
  pinMode(6, INPUT);
  digitalWrite(6, LOW);
  pinMode(6, OUTPUT);
  delay(100);
  pinMode(6, INPUT);

  //Konfiguration des Relais-Outputs
  pinMode(RELAIS10, OUTPUT);
  pinMode(RELAIS9, OUTPUT);
  pinMode(RELAIS8, OUTPUT);
  pinMode(RELAIS7, OUTPUT);
 
 //Initialisierung LCD-Display
  lcd.begin(20, 4);        // initialize the lcd for 20 chars 4 lines, turn on backlight

  // ------- Quick 3 blinks of backlight  -------------
  for (int i = 0; i < 3; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on

  // Intro und Boot-Vorgang auf LCD Display
  lcd.setCursor(0, 0); //Start at character 4 on line 0
  lcd.print("Temperaurerkennungssystem...");
  lcd.setCursor(0, 1);
  lcd.print("Version 1.0");
  lcd.setCursor(0, 3);
  lcd.print("by Stargazer_loehne");
  delay(5000);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("System bootet...");
  delay(2000);
  lcd.clear();



}/*--(end setup )---*/


void loop() {              /*----( LOOP: RUNS CONSTANTLY )----*/

// Textnachricht senden
  void SMSversenden()
  
    mySerial.print(" AT+CMGF=1\r ");                        //  Nachricht als Text versenden; -> Textmode = AT-Befehl "CMGF=1" (siehe: http://www.nobbi.com/atgsm.html)
    delay(100);
    mySerial.println(" AT+CMGS=\" +49XXXXXXXXXXX\" ");              // Nachricht senden -> Telefonnummer IMMER mit internationaler Vorwahl!
    delay(100);
    mySerial.print(" Sensor ausgeloest ");                 //Inhalt der Nachricht
    delay(100);
    mySerial.print((char)26);                         //  der ASCII-Code von STRG+Z ist 26
    delay(100);
    mySerial.println();
  }


{
  int SchalterStatus = digitalRead(RELAIS8);
  if (SchalterStatus == HIGH) {
    SMSversenden();
}


// Darstellung auf IDE-serieller Monitor

Serial.print("Umgebungstemperatur = "); Serial.print(mlx.readAmbientTempC());
Serial.print("*C\tObjekttemperatur = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C");
delay(500);     //Abtastrate für die MLX-Messung in ms


// Darstellung auf LCD Display

lcd.clear();
lcd.setCursor(1, 0);
lcd.print ("Akt. Temperaturen:");
lcd.setCursor(0, 2);
lcd.print ("Umgebung = ");
lcd.print (mlx.readAmbientTempC());
lcd.setCursor(2, 4);
lcd.print ("Himmel = ");
lcd.print (mlx.readObjectTempC());
Serial.println();




//Schaltbedingung für das Relais - Wann soll der Alarm ausgelöst werden

if (mlx.readObjectTempC() <= -8.0)
{
  digitalWrite(RELAIS10, HIGH); // RELAIS anschalten
}
else
{
  digitalWrite(RELAIS10, LOW); // RELAIS ausschalten
}

// Status des Hagelsensors - LED Anzeige

if (mlx.readObjectTempC() >= 100.00)
{
  digitalWrite(RELAIS9, HIGH);  //Störungs-LED (Rot) An - Messung Defekt
  digitalWrite(RELAIS8, LOW);
  digitalWrite(RELAIS7, LOW);
}

else
{ digitalWrite(RELAIS9, LOW);

  if (mlx.readObjectTempC() <= -8.0)
  {
    digitalWrite(RELAIS8, HIGH);  //Status:  Anzeige-LED (Gelb) - Erkennung  positiv
    digitalWrite(RELAIS7, LOW);
  }
  else
  { digitalWrite(RELAIS8, LOW);  //Status:  Anzeige-LED (Gelb) - Erkennung negativ

    if (mlx.readObjectTempC() >= -8.0)
    {
      digitalWrite(RELAIS7, HIGH);  //Status:  Sensor aktiv - Betriebs-LED (Grün) an
    }
    else
    { digitalWrite(RELAIS7, LOW);  //Status: Sensor aktiv - Betriebs-LED (Grün) aus 



      // when characters arrive over the serial port...
      if (Serial.available())
      {
        // wait a bit for the entire message to arrive
        delay(100);
        // clear the screen
        lcd.clear();
        // read all the available characters
        while (Serial.available() > 0) {
          // display each character to the LCD
          lcd.write(Serial.read());
        }
      }
    }
  }
}
}

Ich werte nun einfach desn Zustand des RELAIS8 aus. Wenn HIGH, dann SMSversenden.
So zumindest der Plan. Lasse ich dieses durch die Überprüfung laufen, kommt er mit folgendem Problem:

Arduino: 1.6.11 (Windows 10), Board: "Arduino Nano, ATmega328"

In function 'void loop()':

Sensor-experimental:79: error: expected initializer before 'mySerial'

mySerial.print(" AT+CMGF=1\r "); // Nachricht als Text versenden; -> Textmode = AT-Befehl "CMGF=1" (siehe: GSM-spezifische AT-Kommandos)

^

Sensor-experimental:81: error: 'mySerial' was not declared in this scope

mySerial.println(" AT+CMGS=" +4917664303641" "); // Nachricht senden -> Telefonnummer IMMER mit internationaler Vorwahl!

^

At global scope:

Sensor-experimental:91: error: expected unqualified-id before '{' token

{

^

exit status 1
expected initializer before 'mySerial'

Invalid version found: 1.04

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

Tja..wieder ein paar Baustellen. Aber man macht ja auch Fehler um was zu lernen...

Viele Grüße und Danke

André

Wenn du das machen würdest, was dir die Meldung der IDE vorschlägt und auch lesen würdest, was da steht, dann könntest du sicher selber deinen Fehler finden.

Warum schreibst du in der Definition "gsmSerial" und in der Loop "mySerial" ?

Und die Funktion "SMSversenden" gehört sicher nicht in die Loop.

Hi "HotSystems",

ich habe jetzt nochmal diesen Beispiel-Sketch geladen, der Astrein funktioniert.
Diesen wollte ich übernehmen und in meinem etwas modifiziert übernehmen.

Da er funktioniert, dachte ich, dass das "SMSversenden", welches hier "sendTextMessage" heißt, so in das Loop geschrieben wird.

Sodass ich praktisch eine Bedingung schreibe, wo er dann, wenn RELAIS8 auf High steht, diesen übernommenen "sendTextMessage" aktiviert. Im Setup starte ich über das kurze 100ms Signal an Pin6
das Modul.

Hier mal das Beispiel-Sketch:

#include <SoftwareSerial.h>
SoftwareSerial gsmSerial(2,3);

void setup()
{
gsmSerial.begin(9600);
delay(2000);
//--- turn on TC35 ---
// wire pin 6 Arduino to IGT pin on TC35
// ground pin for 100 ms - this is the same as pressing the button on the TC35 to start it up
pinMode(6, INPUT);
digitalWrite(6, LOW);
pinMode(6, OUTPUT);
delay(100);
pinMode(6, INPUT);
}


void loop() {

sendTextMessage();
delay(3000);
}
void sendTextMessage() {
gsmSerial.print("AT+CMGF=1\r");
delay(100);
gsmSerial.println("AT+CMGS=\"+4917XXXXXXX\"");
delay(100);
gsmSerial.print("Test vom Arduino");

delay(100);
gsmSerial.println((char)26);

}

Ist also jetzt eine reine Verständnisfrage. Das müsste doch eigentlich so funktionieren, oder ?

VG und besten Dank

André

Stargazer_loehne:
Ist also jetzt eine reine Verständnisfrage. Das müsste doch eigentlich so funktionieren, oder ?

Ja, so sollte das funktionieren.

Wenn du jetzt eine "if-Anweisung" schreibst und über diese die Funktion "sendTextMessage" aufrufst, hast du das was du brauchst.

Nur nimm das delay(3000) raus, damit bremst du die Loop aus.
Das TC35 gibt erst wieder frei, wenn die SMS raus ist, da braucht es kein weiteres delay.

Hi,

erst einmal vielen Dank für deine Mühen, HotSystems

dann bin ich von der Denkweise ja eigentlich schonmal richtig.

Ich habe die Blöcke jetzt so in meinen Sketch integriert. Da wo sie hin sollen.
Da ich ja schon einige if-Anweisungen habe, dachte ich mir, ich könnte den Block bei der betreffenden Anweisung mit einfügen. Das habe ich jetzt so gemacht:

if (mlx.readObjectTempC() >= 30.0)
    {
      digitalWrite(RELAIS8, HIGH);  //Status:  Anzeige-LED (Gelb) - Erkennung  positiv
      digitalWrite(RELAIS7, LOW);
      {
        if (RELAIS8 == HIGH) {
        sendTextMessage();
        delay(30);
      }
      void sendTextMessage() {
        gsmSerial.print("AT+CMGF=1\r");
        delay(100);
        gsmSerial.println("AT+CMGS=\"+49XXXXXXXXX\"");
        delay(100);
        gsmSerial.print("Test vom Arduino");

        delay(100);
        gsmSerial.println((char)26);

      }
}

Dann erhalte ich in der Überprüfung folgende Meldung:

Arduino: 1.6.11 (Windows 10), Board: "Arduino Nano, ATmega328"

In function 'void loop()':

Sensor-experimental:130: error: 'sendTextMessage' was not declared in this scope

sendTextMessage();

^

Sensor-experimental:133: error: a function-definition is not allowed here before '{' token

void sendTextMessage() {

^

Sensor-experimental:147: error: 'else' without a previous 'if'

else

^

At global scope:

Sensor-experimental:175: error: expected declaration before '}' token

}

^

exit status 1
'sendTextMessage' was not declared in this scope

Invalid version found: 1.04

Gut...das Ei geht nicht so schnell auszubrüten.
Komisch ist, dass es bei dem Übertrag aus dem originalem Sketch nicht läuft.
Klammer zu übersehen oder zu vergessen ist eine Sache, aber das "was not declared in this scope" heißt doch eigentlich, dass es vorher irgendwie nicht definiert wurde, oder ?

Ich versuche mich da gerade langsam rein zu denken.

Viele Grüße

André

Fast richtig. :wink:

Die Funktion "sendTextMessage" must du komplett ans Ende außerhalb der if-Abfrage setzen.

Hi,

Danke für den Tipp mit ganz ans Ende setzen. Da hätte ich glaube ich wirklich länger dran gesessen.
Ich habe sie jetzt hinter das "else" der if-Abfrage gesetzt. Man könnte das doch auch ganz nach unten setzen, komplett außerhalb von den if-Blöcken, oder ?

Ich habe jetzt den Code so geändert:

{
        if (RELAIS8 == HIGH) {
          void sendTextMessage() {
            gsmSerial.print("AT+CMGF=1\r");
            delay(100);
            gsmSerial.println("AT+CMGS=\"+49XXXXXXXX\"");
            delay(100);
            gsmSerial.print("Test vom Arduino");

            delay(100);
            gsmSerial.println((char)26);

          }
        }
      }
    }
    else
    { digitalWrite(RELAIS8, LOW);  //Status:  Anzeige-LED (Gelb) - Erkennung negativ
     
      sendTextMessage();
      delay(30);

Nach der Überprüfung kommt folgendes dabei raus:

Arduino: 1.6.11 (Windows 10), Board: "Arduino Nano, ATmega328"

In function 'void loop()':

Sensor-experimental:130: error: a function-definition is not allowed here before '{' token

void sendTextMessage() {

^

Sensor-experimental:146: error: 'sendTextMessage' was not declared in this scope

sendTextMessage();

^

exit status 1
a function-definition is not allowed here before '{' token

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

Es wird langsam weniger. Was würde ich jetzt tun ?
Wenn ich bei "void sendTextMessage()" das "void" wegnehme, geht es weiter.
Aber das brauche ich doch für die Funktion.
Wenn er jetzt versucht zu kompilieren, kommt er bis
zu der Zeile "sendTextMessage();" nach dem else.

Da kommt dann folgendes:

Arduino: 1.6.11 (Windows 10), Board: "Arduino Nano, ATmega328"

In function 'void loop()':

Sensor-experimental:130: error: 'sendTextMessage' was not declared in this scope

sendTextMessage() {

^

Sensor-experimental:146: error: 'sendTextMessage' was not declared in this scope

sendTextMessage();

^

exit status 1
'sendTextMessage' was not declared in this scope

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

IDE findet auch immer was... :confused: . Aber nur so lernt man.
Für mich habe ich ein Gewissenskonflikt, wenn ich das "void" weglasse.
Es wird bis jetzt im Sketch immer weniger an Fehler was das kompilieren angeht.
Ich fühle mich nur irgendwie noch nicht wohl damit.

Es macht jetzt richtig Spaß, da etwas tiefer einzusteigen. Nur belästige ich euch damit
hier. Aber vieles lernt man halt erst in der Praxis.

Vielen Dank und VG

André

Es muss ganz nach unten, oder zwischen Setup() und Loop().
Und du musst auf die Klammern achten.
Das zeigt auch die Fehlermeldung.
Das void vor dem Funktionsname muss bleiben.

Gelesen, getan !

Ich habe jetzt den sendTextMessage () mit seinem delay ganz nach unten geschoben.
Da ist jetzt (erstmal) Ruhe.

Jetzt kommt er bei der Zeile " gsmSerial.print("AT+CMGF=1\r"); " mit folgender
Meldung ins Schwitzen:

Arduino: 1.6.11 (Windows 10), Board: "Arduino Nano, ATmega328"

In function 'void loop()':

Sensor-experimental:132: error: expected initializer before 'gsmSerial'

         gsmSerial.print("AT+CMGF=1\r");

         ^

Sensor-experimental:144: error: 'else' without a previous 'if'

   else

   ^

At global scope:

Sensor-experimental:172: error: expected declaration before '}' token

 }

 ^

exit status 1
expected initializer before 'gsmSerial'

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

Ich frage mich jetzt allerdings wirklich, was " expected initializer before 'gsmSerial' " heißt ?
Da komme ich ins stocken.

Gut...und ein Klammerproblem habe ich auch noch.

Das ist echt nicht ganz einfach.

Gute Nacht und besten Dank

André

Dann zeig doch noch mal den kompletten, aktuellen Sketch.

Schönen guten Abend allerseits,

hier nun der Code:

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
#include <SoftwareSerial.h>
SoftwareSerial gsmSerial(2, 3);
const int RELAIS10 = 10;
const int RELAIS9 = 9;
const int RELAIS8 = 8;
const int RELAIS7 = 7;
unsigned long previousMillis = 0;
unsigned long time;
// set the LCD address to 0x27 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address


/*-----( Declare Variables )-----*/


void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  gsmSerial.begin(9600);
  delay(2000);

  Serial.begin(9600);  // Used to type in characters
  Serial.println("Temperaturerkennungssystem startet...");
  mlx.begin();

  //Autostart des GSM-Moduls
  pinMode(6, INPUT);
  digitalWrite(6, LOW);
  pinMode(6, OUTPUT);
  delay(100);
  pinMode(6, INPUT);


  //Konfiguration des Relais-Outputs
  pinMode(RELAIS10, OUTPUT);
  pinMode(RELAIS9, OUTPUT);
  pinMode(RELAIS8, OUTPUT);
  pinMode(RELAIS7, OUTPUT);

  lcd.begin(20, 4);        // initialize the lcd for 20 chars 4 lines, turn on backlight

  // ------- Quick 3 blinks of backlight  -------------
  for (int i = 0; i < 3; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on

  // Intro und Boot-Vorgang auf LCD Display
  lcd.setCursor(0, 0); //Start at character 4 on line 0
  lcd.print("Temperaturerkennungssystem...");
  lcd.setCursor(0, 1);
  lcd.print("Version 1.0");
  lcd.setCursor(0, 3);
  lcd.print("by Stargazer");
  delay(5000);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("System bootet...");
  delay(2000);
  lcd.clear();


}/*--(end setup )---*/


void loop() {              /*----( LOOP: RUNS CONSTANTLY )----*/


  // Darstellung auf IDE-serieller Monitor

  Serial.print("Umgebungstemperatur = "); Serial.print(mlx.readAmbientTempC());
  Serial.print("*C\tSensortemperatur = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C");
  delay(500);     //Abtastrate für die MLX-Messung in ms


  // Darstellung auf LCD Display

  lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print ("Akt. Temperaturen:");
  lcd.setCursor(0, 2);
  lcd.print ("Umgebung = ");
  lcd.print (mlx.readAmbientTempC());
  lcd.setCursor(2, 4);
  lcd.print ("Himmel = ");
  lcd.print (mlx.readObjectTempC());





  //Schaltbedingung für die Relais 

  if (mlx.readObjectTempC() <= -8.0)
  {
    digitalWrite(RELAIS10, HIGH); // RELAIS anschalten
  }
  else
  {
    digitalWrite(RELAIS10, LOW); // RELAIS ausschalten
  }

  // Status des Sensors - LED Anzeige

  if (mlx.readObjectTempC() >= 100.00)
  {
    digitalWrite(RELAIS9, HIGH);  //Störungs-LED (Rot) An - Messung Defekt
    digitalWrite(RELAIS8, LOW);
    digitalWrite(RELAIS7, LOW);
  }

  else
  { digitalWrite(RELAIS9, LOW);

    if (mlx.readObjectTempC() >= 30.0)
    {
      digitalWrite(RELAIS8, HIGH);  //Status:  Anzeige-LED (Gelb) - Erkennung  positiv
      digitalWrite(RELAIS7, LOW);
    }
    {
      if (RELAIS8 == HIGH)
        void sendTextMessage()
        gsmSerial.print("AT+CMGF=1\r");
      delay(100);
      gsmSerial.println("AT+CMGS=\"+49XXXXXXXXX\"");
      delay(100);
      gsmSerial.print("Test vom Arduino");

      delay(100);
      gsmSerial.println((char)26);

    }
  }

  else
  { digitalWrite(RELAIS8, LOW);  //Status:  Anzeige-LED (Gelb) - Erkennung negativ

    if (mlx.readObjectTempC() >= -8.0)
    {
      digitalWrite(RELAIS7, HIGH);  //Status:  Sensor aktiv - Betriebs-LED (Grün) an
    }
    else
    { digitalWrite(RELAIS7, LOW);  //Status: Sensor aktiv - Betriebs-LED (Grün) aus


      // when characters arrive over the serial port...
      if (Serial.available())
      {
        // wait a bit for the entire message to arrive
        delay(100);
        // clear the screen
        lcd.clear();
        // read all the available characters
        while (Serial.available() > 0) {
          // display each character to the LCD
          lcd.write(Serial.read());
        }
      }
    }
  }
}
}

/* --(end main loop )-- */
sendTextMessage();
delay(30);

/* ( THE END ) */

So sieht es seit gestern Abend aus.

Viele Grüße

André

Stargazer_loehne:
So sieht es seit gestern Abend aus.

Was machst du denn da ?
Du machst den kompletten Sketch kaputt.

Wenn ich schreibe: "Du must die komplette Funktion ans Ende setzen, dann meine ich auch die komplette Funktion, inkl. der darin befindlichen Anweisungen.

Das hier gehört ans Ende:

      void sendTextMessage() {
        gsmSerial.print("AT+CMGF=1\r");
        delay(100);
        gsmSerial.println("AT+CMGS=\"+49XXXXXXXXX\"");
        delay(100);
        gsmSerial.print("Test vom Arduino");

        delay(100);
        gsmSerial.println((char)26);

      }

Und du must aus der Loop in deiner if-Abfrage diese Funktion aufrufen.

z.B. so:

sendTextMessage();

Bitte lerne die Grundlagen, was du machst ist nur Copy & Paste ohne zu wissen was du machst.

Setup()
{
// setup
}

void hierhin
{
// sms senden
}

Loop()
{
// loopen
}