SMS Versenden mit Siemens TC 35 + DHT11

Hallo Zusammen, aktuell bastell ich an einem Code für den Siemens TC 35.

Ich würde gerne anhand einer Temperaturabfrage ab einem bestimmten Wert automatisch eine SMS versenden. Der folgende Code funktioniert einwandfrei leider aber nur über den Seriellen Monitor wenn man einen Befehl gefolgt von einem Punkt(.) eingibt. (ohne Einbindung DHT11)

Wie und wo setzte ich jetzt die If Schleife? für den bestimmten wert X des DHT11 Sensors.... eine Variabel t für den Temperaturwert habe ich bereits im DHT11 Code vergeben.
Ich bin leider brutaler Anfänger, von daher Danke für jegliche Infos :slight_smile:

Anbei nur der Code vom Siemens TC 35 Modul:

#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3
 
SoftwareSerial gsmSerial(rxPin, txPin);
char recu[150];    // Array for message
String message = "";
int i;
 
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
 
  Serial.begin(9600);
  while(!Serial) {}
 
  //--- turn on TC35 ---
  // wire pin 8 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(8, INPUT);
  digitalWrite(8, LOW);
  pinMode(8, OUTPUT);
  delay(100);
  pinMode(8, INPUT); 
 
  gsmSerial.begin(9600);
  delay(5000);
  Serial.println("Ready");
}
 
void loop() {
  i = 0;
  while (Serial.available() > 0) {
    recu[i] = Serial.read();
    if ((recu[i] != 46) && (recu[i] != 13) && (recu[i] != 10))
    {
      message += char(recu[i]);
    }
    i++;
    // 46 is ASCII code for "."
    if (recu[i - 1] == 46) {
      SendTextMessage();
      ShowSerialData();
      delay(1000);
      message = "";
      i = 0;
    }
  }
}
 
void SendTextMessage() {
  digitalWrite(13, HIGH);
  Serial.println("Sende SMS...");
 
  gsmSerial.println("AT+CMGF=1");
  delay(500);
  gsmSerial.print("AT+CMGS=\"+49178...\"\r");
  delay(500);
  gsmSerial.print(message);
  delay(500);
  gsmSerial.println((char)26); // ASCII Ctrl-Z
  delay(500);
 
  Serial.println("SMS gesendet.");
  digitalWrite(13, LOW);
}
 
void ShowSerialData() {
  while(gsmSerial.available() > 0) {
    Serial.write(gsmSerial.read());
  }
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Mein Tipp:
Suche mal hier im Forum nach TC35, da wirst du fündig, da es schon mehrere Beiträge mit diesem Teil hier gibt.

Mal exemplarisch ein Beispiel. Evtl. Fehler beim Einlesen der Temperatur werden nicht behandelt. Ob die Lib für den DHT11 mit Deiner verwendeten übereinstimmt, weiß ich nicht. Aber es geht ja wohl mehr um den Aufbau in der loop Funktion:

#include <Adafruit_Sensor.h>
#include <SoftwareSerial.h>
#include <DHT.h>
#include <DHT_U.h>

// Konstanten
constexpr byte rxPin {2};
constexpr byte txPin {3};
constexpr byte dhtPin {4};     // Digital pin connected to the DHT sensor
constexpr byte igtPin {8};
 
// Globale Variablen/Objekte 
SoftwareSerial gsmSerial(rxPin, txPin);
DHT_Unified dht(dhtPin, DHT11);
String message;

// Forward-Deklarationen
double getTemperature(void);
void buildTemperatureMsg(String&, double);

void setup() {
  Serial.begin(9600);
  while(!Serial) {}

  message.reserve(150);
 
  pinMode(LED_BUILTIN, OUTPUT);
  //--- turn on TC35 ---
  // wire pin 8 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(igtPin, INPUT);
  digitalWrite(igtPin, LOW);
  pinMode(igtPin, OUTPUT);
  delay(100);
  pinMode(igtPin, INPUT); 
  gsmSerial.begin(9600);
  dht.begin();

  delay(5000);
  Serial.println("Ready");
}
 
void loop() {
  double temp = getTemperature();
  if (temp > 30.00) {                        // Nur eine Nachricht senden, wenn die 
    buildTemperatureMsg(message,temp);       // Temperatur > 30°C ist.
    SendTextMessage(message);
  }  
  delay(2000);
}
 
void SendTextMessage(String& msg) {
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.println("Sende SMS...");
  gsmSerial.println("AT+CMGF=1");
  delay(500);
  gsmSerial.print("AT+CMGS=\"+49178...\"\r");
  delay(500);
  Serial.println(msg);  
  gsmSerial.print(msg);
  delay(500);
  gsmSerial.println((char)26); // ASCII Ctrl-Z
  delay(500);
  Serial.println("SMS gesendet.");
  digitalWrite(LED_BUILTIN, LOW);
}
 
void ShowSerialData() {
  while(gsmSerial.available() > 0) {
    Serial.write(gsmSerial.read());
  }
}

double getTemperature() {
  sensors_event_t event;
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println(F("Error reading temperature!"));
  }
  return event.temperature;
}

void buildTemperatureMsg(String& msg, double temp) {
  msg = "Hitzealarm!\nTemperatur: " + String(temp,2) + "°C";
}
1 Like

evtl. nur einmal bei überschreiten des Grenzwertes ein SMS senden.
Sonst ist die Wertkarte ruck zuck leer...
ungetestet

#include <Adafruit_Sensor.h>
#include <SoftwareSerial.h>
#include <DHT.h>
#include <DHT_U.h>

// Konstanten
constexpr byte rxPin {2};
constexpr byte txPin {3};
constexpr byte dhtPin {4};     // Digital pin connected to the DHT sensor
constexpr byte igtPin {8};
 
// Globale Variablen/Objekte 
SoftwareSerial gsmSerial(rxPin, txPin);
DHT_Unified dht(dhtPin, DHT11);
String message;   

bool previousState = LOW;  // was war der letzte Status

// Forward-Deklarationen
double getTemperature(void);
void buildTemperatureMsg(String&, double);

void setup() {
  Serial.begin(9600);
  while(!Serial) {}

  message.reserve(150);
 
  pinMode(LED_BUILTIN, OUTPUT);
  //--- turn on TC35 ---
  // wire pin 8 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(igtPin, INPUT);
  digitalWrite(igtPin, LOW);
  pinMode(igtPin, OUTPUT);
  delay(100);
  pinMode(igtPin, INPUT); 
  gsmSerial.begin(9600);
  dht.begin();

  delay(5000);
  Serial.println("Ready");
}
 
void loop() {
  double temp = getTemperature();
  if (temp > 30.00 && previousState == LOW) {                        // Nur eine Nachricht senden, wenn die 
    buildTemperatureMsg(message,temp);       // Temperatur > 30°C ist.
    SendTextMessage(message);
    previousState == HIGH;
  }
  else if (temp < 29.50 && previousState == HIGH)
  {
    // zurücksetzen
    previousState == LOW;
  }
  delay(2000);
}
 
void SendTextMessage(String& msg) {
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.println("Sende SMS...");
  gsmSerial.println("AT+CMGF=1");
  delay(500);
  gsmSerial.print("AT+CMGS=\"+49178...\"\r");
  delay(500);
  Serial.println(msg);  
  gsmSerial.print(msg);
  delay(500);
  gsmSerial.println((char)26); // ASCII Ctrl-Z
  delay(500);
  Serial.println("SMS gesendet.");
  digitalWrite(LED_BUILTIN, LOW);
}
 
void ShowSerialData() {
  while(gsmSerial.available() > 0) {
    Serial.write(gsmSerial.read());
  }
}

double getTemperature() {
  sensors_event_t event;
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println(F("Error reading temperature!"));
  }
  return event.temperature;
}

void buildTemperatureMsg(String& msg, double temp) {
  msg = "Hitzealarm!\nTemperatur: " + String(temp,2) + "°C";
}
1 Like

Ein wichtiger Hinweis :+1: . Ich hab. ich bei der Antwort nur auf die „IF“ Frage beschränkt.

Evtl. soll ja auch eine Nachricht gesendet werden, wenn eine bestimmte Temperatur nicht mehr überschritten wird. Spätestens dann muss man sich um bestimmte Zustände kümmern.

In Anlehnung an #5 noch mit Wiederholfunktion, wenn die Temperatur weiterhin hoch bleibt.

@noiasca
previousState == LOW; (und HIGH auch) :wink:

#include <Adafruit_Sensor.h>
#include <SoftwareSerial.h>
#include <DHT.h>
#include <DHT_U.h>

// Konstanten
constexpr byte rxPin {2};
constexpr byte txPin {3};
constexpr byte dhtPin {4};     // Digital pin connected to the DHT sensor
constexpr byte igtPin {8};

// Globale Variablen/Objekte
SoftwareSerial gsmSerial(rxPin, txPin);
DHT_Unified dht(dhtPin, DHT11);
String message;

bool previousState = LOW;  // was war der letzte Status
const uint32_t repeatTime = 1000UL * 60 * 30;
uint32_t lastSend;

// Forward-Deklarationen
double getTemperature(void);
void buildTemperatureMsg(String &, double);

void setup()
{
  Serial.begin(9600);
  while (!Serial) {}
  message.reserve(150);
  pinMode(LED_BUILTIN, OUTPUT);
  //--- turn on TC35 ---
  // wire pin 8 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(igtPin, INPUT);
  digitalWrite(igtPin, LOW);
  pinMode(igtPin, OUTPUT);
  delay(100);
  pinMode(igtPin, INPUT);
  gsmSerial.begin(9600);
  dht.begin();
  delay(5000);
  Serial.println("Ready");
}

void loop()
{
  double temp = getTemperature();
  if (temp > 30.00)                             // Wenn Temperatur > 30°C ist
  {
    if (previousState == LOW ||                 // Nachricht senden, wenn vorher noch nicht
        millis() - lastSend > repeatTime)       // ODER Zeit abgelaufen
    {
      buildTemperatureMsg(message, temp);       
      SendTextMessage(message);
      previousState = HIGH;
      lastSend = millis();
    }
  }
  else if (temp < 29.50)
  {
    // zurücksetzen
    previousState = LOW;
  }
  delay(2000);
}
void SendTextMessage(String &msg)
{
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.println("Sende SMS...");
  gsmSerial.println("AT+CMGF=1");
  delay(500);
  gsmSerial.print("AT+CMGS=\"+49178...\"\r");
  delay(500);
  Serial.println(msg);
  gsmSerial.print(msg);
  delay(500);
  gsmSerial.println((char)26); // ASCII Ctrl-Z
  delay(500);
  Serial.println("SMS gesendet.");
  digitalWrite(LED_BUILTIN, LOW);
}
void ShowSerialData()
{
  while (gsmSerial.available() > 0)
  {
    Serial.write(gsmSerial.read());
  }
}
double getTemperature()
{
  sensors_event_t event;
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature))
  {
    Serial.println(F("Error reading temperature!"));
  }
  return event.temperature;
}
void buildTemperatureMsg(String &msg, double temp)
{
  msg = "Hitzealarm!\nTemperatur: " + String(temp, 2) + "°C";
}
1 Like

Danke für die Zahlreiche Rückmeldung :slight_smile: Habs !

Zur Info der Finalen Version: Der String der als SMS - versendet wird, darf nicht zu lang sein. meine Anfangs-Nachricht: Temperaturanstieg inkl. Grad kam bei mir keinmal an. Hab mich jetzt beschränkt auf "SOS" damit funktioniert es in 80% der Fälle.

#include <Adafruit_Sensor.h>
#include <SoftwareSerial.h>
#include <DHT.h>
#include <DHT_U.h>

// Konstanten
constexpr byte rxPin {2};
constexpr byte txPin {3};
constexpr byte dhtPin {4};     // Digital pin connected to the DHT sensor
constexpr byte igtPin {8};
 
// Globale Variablen/Objekte 
SoftwareSerial gsmSerial(rxPin, txPin);
DHT_Unified dht(dhtPin, DHT22);
String message;   

bool previousState = LOW;  // was war der letzte Status

// Forward-Deklarationen
double getTemperature(void);
void buildTemperatureMsg(String&, double);

void setup() {
  Serial.begin(9600);
  while(!Serial) {}

  message.reserve(150);
 
  pinMode(LED_BUILTIN, OUTPUT);
  //--- turn on TC35 ---
  // wire pin 8 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(igtPin, INPUT);
  digitalWrite(igtPin, LOW);
  pinMode(igtPin, OUTPUT);
  delay(100);
  pinMode(igtPin, INPUT); 
  gsmSerial.begin(9600);
  dht.begin();

  delay(2000);
  Serial.println("Ready");
}
 
void loop() {
  double temp = getTemperature();
  if (temp > 28.00 && previousState == LOW) { // Nur eine Nachricht senden, wenn die 
    buildTemperatureMsg(message,temp);        // Temperatur > 30°C ist.
    SendTextMessage(message);
    previousState == HIGH;
  }
  else if (temp < 27.50 && previousState == HIGH)
  {
    // zurücksetzen
    previousState == LOW;
  }
  delay(2000);
}

 
void SendTextMessage(String& msg) {
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.println("Sende SMS...");
  gsmSerial.println("AT+CMGF=1");
  delay(500);
  gsmSerial.print("AT+CMGS=\"+4915736526239\"\r");
  delay(500);
  Serial.println(msg);  
  gsmSerial.print("SOS");
  delay(500);
  gsmSerial.println((char)26); // ASCII Ctrl-Z
  delay(500);
  Serial.println("SMS gesendet.");
  digitalWrite(LED_BUILTIN, LOW);
}
 
void ShowSerialData() {
  while(gsmSerial.available() > 0) {
    Serial.write(gsmSerial.read());
  }
}

double getTemperature() {
  sensors_event_t event;
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println(F("Error reading temperature!"));
  }
  return event.temperature;
}

void buildTemperatureMsg(String& msg, double temp) {
  msg = "Hitzealarm!\nTemperatur: " + String(temp,2) + "°C";
}

Der Sketch macht nicht, was Du willst.
Du hast den Fehler mit übernommen, den ich angemerkt hatte.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.