Guten Abend liebe Arduino Gemeinde,
Bisher habe habe ich zu den stillen Lesern im Forum gezählt, doch nun brauche ich eure Ratschläge. Bitte lasst es mich wissen, wenn ich meine Frage an der falschen Stelle gepostet habe.
Um eins vorne weg zu nehmen: Ich bin noch etwas grün hinter den Ohren, was das Programmieren anbelangt. ![]()
Hardware:
-Arduino UNO
-GSM Shield 2
-2250mA Netzteil
Noch nicht verbaut:
-1x Relais
-1x RGB LED
Anforderungen:
-Das GSM-Modul soll per SMS:
-Speicher löschen Befehl: "#"
-Das Relais EIN/AUS schalten Befehl: "E"/ "0"
-Das Relais mit Zeitschaltfunktion EIN/AUS schalten Befehl: "Thhhmm"
-Statusmeldung an Absender zurückschicken, wenn angefordert Befehl: "S"
Jeweilige Statusanzeige per RGB LED
Bisherige Erfolge:
Nachricht senden sowie empfangen und mitsamt Absendernummer am Serial.Monitor ausgeben.
Problemstellung:
- Ich möchte das erste Zeichen der ankommenden Nachricht verwenden um mit der Funktion switch zwischen den oben genannten cases zu wählen, doch leider ist es mir bis anhin weder mit der Funktion atoi() noch mit anderen Methoden gelungen diese auszulesen. Könnt ihr mir einen Tipp geben?
2.Weiter möchte ich die fünf Stellen nach T also hhhmm der Nachricht "Thhhmm" verwenden um sie umzurechen und in der Zeitschaltfunktion case 'T' zu verwenden.
- Die Statusabfrage soll jederzeit, also auch während dem die Timerfunktion läuft angefordert werden können. Ist das mit meinem code, bzw. mit der Switch-Funktion überhaupt möglich?
Das ist mein code:
#include <GSM.h>
#define PINNUMBER "" //SIM-Karte ohne PIN > "" ; SIM-Karte mit PIN > "XXXX"
GSM gsmAccess;
GSM_SMS sms;
char senderNumber[20]; //Absendernummer
char data[8]; //Speicher Befehlsnachricht
int timerValue = 0; //Timerzeit
int caseValue = 1; //Fallmerker 1:AUS und BEREIT ; 2:PERMANENT EIN ; 3:TIMERFUNKTION AKTIV
unsigned long remainingMillis = 0; //Verbleibende Einschaltzeit Timer [Millisekunden]
unsigned long timerMillis = 0; //Befohlene Timerzeit [Millisekunden]
const int relayPin = 8; //RelaisPin
const int redLEDPin = 9; //PWM~ Rot RGB
const int greenLEDPin = 10; //PWM~ Grüne RGB
const int blueLEDPin = 11; //PWM~ Blaue RGB
void setup() {
for (int pinNumber = 8; pinNumber < 12; pinNumber++) {
pinMode(pinNumber, OUTPUT);
digitalWrite(pinNumber, LOW);
}
analogWrite(greenLEDPin, 255); //Zeichen Beginn Initialisierung
Serial.begin(9600);
while (!Serial) {
;
}
Serial.println("SMS Empf\344nger");
boolean notConnected = true;
while (notConnected) {
if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
notConnected = false;
digitalWrite(greenLEDPin, HIGH);
analogWrite(blueLEDPin, 255); //Signal blau FixWitch -READY
}
else {
Serial.println("Not connected");
delay(1000);
}
}
Serial.println("GSM initialisiert");
Serial.println("SCHALTMODUL - READY");
}
void loop() {
unsigned long currentMillis = millis(); //Zeit beim annkommen der Timerbefehls
char rx_byte = 0; //Gelesene Nachricht wird hier gespeichert
String rx_str = ""; //Gelesene Nachricht wird hierhin übergeben
if (sms.available()) //Abfrage ob SMS verfügbar
{
Serial.println("Befehl erhalten von :");
//Absendernummer erfassen
sms.remoteNumber(senderNumber, 20);
// Beispiel : +0791234567
//Serial.println(remoteNumber);
Serial.println(senderNumber);
if (sms.peek() == '#') // Nachrichten die nur "#" enthalten, bewirken die Löschung des Speichers
{
Serial.println("\nSMS-Speicher gelöscht\n");
sms.flush(); // Modem-Speicher löschen
}
while (rx_byte = sms.read())
{
rx_str += rx_byte;
}
int n;
if (rx_str.startsWith("0")) {
n = "0";
}
else if (rx_str.startsWith("E")) {
n = "E";
}
else if (rx_str.startsWith("T")) {
n = "T";
}
else if (rx_str.startsWith("T")) {
n = "S";
}
switch (n)
{
case '0':
caseValue = 1;
digitalWrite(8, LOW);
analogWrite(redLEDPin, 255);
Serial.println("\nFixWitch STOP\n");
delay(3000);
break;
case 'E':
caseValue = 2;
if (rx_byte == 'E')
digitalWrite(8, HIGH);
analogWrite(greenLEDPin, 255);
Serial.println("\nRELAIS PERMANENT EIN\n");
break;
case 'T':
caseValue = 3;
Serial.println("\nRELAIS TIMERFUNKTION\n");
currentMillis = millis();
remainingMillis = currentMillis + timerMillis;
boolean timeLeft = true;
while (timeLeft) {
digitalWrite(8, HIGH);
analogWrite(blueLEDPin, 255);
analogWrite(greenLEDPin, 255);
if (currentMillis < remainingMillis) {
timeLeft = true;
}
else {
timeLeft = false;
}
Serial.println("\nTimer abgelaufen!\n");
break;
case 'S':
Serial.println(data[0]);
sms.beginSMS(senderNumber);
sms.print("SCHALTMODUL:\nSTATUS:");
if (caseValue == 1) {
sms.print("\nAUS und BEREIT\n");
}
else if ( caseValue == 2) {
sms.print("\nPERMANENT EIN\n");
}
else {
sms.print("\nTIMER AKTIV\n");
}
sms.endSMS();
Serial.println("\nStatusnachricht versendet!\n");
break;
default:
sms.beginSMS(senderNumber);
sms.print("Falscher Befehl");
sms.print("0 = AUS");
sms.print("E = EIN");
sms.print("Thhhmm = TIMER");
sms.print("S = STATUS");
sms.endSMS();
break;
}
}
Serial.print(rx_str);
sms.flush();
rx_str = "";
delay(1000);
}
} //Finale Klammer void loop().
case 'T':
caseValue = 3;
Serial.println("\nRELAIS TIMERFUNKTION\n");
currentMillis = millis();
remainingMillis = currentMillis + timerMillis;
boolean timeLeft = true;
while (timeLeft) {
digitalWrite(8, HIGH);
analogWrite(blueLEDPin, 255);
analogWrite(greenLEDPin, 255);
if (currentMillis < remainingMillis) {
timeLeft = true;
}
else {
timeLeft = false;
}
Serial.println("\nTimer abgelaufen!\n");
break;
Bei folgender Zeile erhalte ich momentan eine Fehlermeldung:
boolean timeLeft = true;
Fehlermeldung:
receive_SMS_switch_case:108: error: crosses initialization of 'boolean timeLeft'
exit status 1
crosses initialization of 'boolean timeLeft'
Ich bedanke mich bereits jetzt für eure Vorschläge und eure Zeit!