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
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.
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";
}
Ein wichtiger Hinweis . 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.
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";
}