Variable ändern durch sms nachricht

Hallo zusammen
Ich habe nicht viel Erfahrung mit programmieren. Ich versuche mit meinem Arduino mkr gsm 1400 und 4 load cells eine Benachrichtigung per SMS an ein Mobiltelefon zu schicken, wenn der Füllstand eines Tanks zu tief ist. Dieser Teil des Codes funktioniert auch. Nun möchte ich aber das Füllstandniveau ab dem die Benachrichtigung geschickt wird, per SMS ändern. Wie geht das?
Die Empfängernummer der Benachrichtigungen per SMS zu wechseln funktioniert, dank der Hilfe von pylon aus diesem Forum. Der gleiche Code funktioniert aber nicht für das Füllstandniveauproblem. Und ich weiss nicht wie ich diesen Code anpassen muss damit es funktionieren würde.

Ich bin froh um Hilfe.

Mein Code:

// include the GSM library
#include <MKRGSM.h>

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

const char adminnummer[20] = "+********"; //Adminnummer für Diagnose
char nummer[20] = "+*****";            //Empfänger nummer definieren
int fuellstand;                         //Füllstand variable definieren

// Array to hold the number a SMS is retreived from
char senderNumber[20];

#include "HX711.h"

HX711 scale(7, 9); //7-> DOUT, 9->SCK

float calibration_factor = -21.825;
int units;
float ounces;
int warnung1 = 150; //in Gramm
int warnung2 = 100;
int warnung3 = 50;
int warnung4 = 20;
int sms1geschickt;
int sms2geschickt;
int sms3geschickt;

void setup() {
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.println("Milchautomat Fuellstand Benachrichtigung");

  // connection state
  bool connected = false;

  // Start GSM connection
  while (!connected) {
    if (gsmAccess.begin("****") == GSM_READY) {
      connected = true;
    } else {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("GSM initialized");
  
  scale.set_scale(calibration_factor);//für die Waage
  scale.tare();
}

void loop(){
  int c;//Variable für nachricht

  Serial.print("Messung:");
  units = scale.get_units(),10;
  if (units < 0){
    units = 0.00;
  }
  ounces = units * 0.035274;
  Serial.print(units);
  Serial.println(" Gramm");
  fuellstand = units - 0; // Gewicht 50L Milchkanne tief

  //wenn zwischen 15L und 10L
  if (fuellstand <= warnung1 && fuellstand > warnung2 && sms1geschickt == 0 && sms2geschickt == 0 && sms3geschickt == 0){ 
    sms.beginSMS(nummer);
    sms.print("Milchmenge ca.: ");
    sms.print(fuellstand);
    sms.print(" ml");
    sms.endSMS();
    Serial.println("Warnung 1 gesendet");
    sms1geschickt = 1;
    //wenn zwischen 10L und 5L
  } else if (fuellstand <= warnung2 && fuellstand > warnung3 && sms2geschickt == 0 && sms3geschickt == 0){
      sms.beginSMS(nummer);
      sms.print("Milchmenge ca.: ");
      sms.print(fuellstand);
      sms.print(" ml");
      sms.endSMS();
      Serial.println("Warnung 2 gesendet");
      sms2geschickt = 1;
      //wenn zwischen 5L und 0L
    } else if (fuellstand <= warnung3 && fuellstand > 0 && sms3geschickt == 0){
        sms.beginSMS(nummer);
        sms.print("Warnung! Fuellstand ca.: ");
        sms.print(fuellstand);
        sms.print(" ml");
        sms.endSMS();
        Serial.println("Warnung 3 gesendet");
        sms3geschickt = 1;
      } else if (fuellstand > warnung1) {
          sms1geschickt = 0;
          sms2geschickt = 0;
          sms3geschickt = 0;
          Serial.println("sms1-3geschickt auf 0 gestellt");
      }
    
  if (sms.available()) {     // If there are any SMSs available()
    Serial.println("Message received from:");

    // Sender nummer in monitor ausgeben
    sms.remoteNumber(senderNumber, 20);
    Serial.println(senderNumber);
    
    // wenn nachricht mit "+" dann text zurück schicken: "Nummer wechseln zu:"
    if (sms.peek() == '+') {
      sms.beginSMS(senderNumber);
      uint8_t ind = 0;
        while ((c= sms.read()) != -1 && ind < 19) {
        nummer[ind++] = c;
      }
      nummer[ind] = 0;
      sms.print("Empfaengernummer gewechselt zu: ");
      sms.print(nummer);
      sms.endSMS();
      Serial.println("Empfaengernummer gewechselt zu: ");
      Serial.println(nummer);
      
      } else if (sms.peek() == 'f') { //schick den Füllstand
        sms.beginSMS(senderNumber);
        sms.print("Fuellstand: ");
        sms.print(fuellstand);
        sms.print(" ml");
        sms.endSMS();
        Serial.println("Fuellstand auf Anfrage geschickt");
        
      } else if (sms.peek() == 'a') {       // ändere Warnung 1
        sms.beginSMS(senderNumber);
        sms.print("Warnung 1 ist im Moment bei: ");
        sms.print(warnung1);
        sms.print("ml.");
        sms.print(" Wann soll in Zukunft Warnung 1 gesendet werden? (Du hasst 30s Zeit fuer eine Antwort, Antwort in ml!)");
        sms.endSMS();
        delay(30000);     
        if (sms.available()) {
          
         //Hier brauche ich Hilfe

          sms.beginSMS(senderNumber);
          sms.print("Warnung 1 wurde geaendert zu: ");
          sms.print(warnung1);
          sms.endSMS();
          Serial.println("Warnung 1 wurde geaendert zu: ");
          Serial.println(warnung1);
                 
          } else {
            sms.beginSMS(senderNumber);
            sms.print("30s abgelaufen, Warnung 1 wurde nicht geaendert");
            sms.endSMS();
        }
        
      } else if (sms.peek() == 'b') {       // ändere Warnung 2
        
        Serial.println("Warnung 2 angepasst");
        
      } else if (sms.peek() == 'c') {       // ändere Warnung 3
        
        Serial.println("Warnung 3 angepasst");
        
      } else { // wenn falscher SMS Befehl
        sms.beginSMS(nummer);
        sms.print("Falscher Befehl");
        sms.endSMS(); 
        Serial.println("Empfänger SMS geschickt: Falscher Befehl");
        sms.beginSMS(adminnummer);
        sms.print("Falscher Befehl. Nachricht: ");
        while ((c = sms.read()) != -1) {
          sms.print((char)c);
          }
        sms.endSMS();
        Serial.println("Admin SMS geschickt: Falscher Befehl");
      }
 
    // Delete message from modem memory
    sms.flush();
    Serial.println("MESSAGE DELETED");
    delay(5000);
  }
}

was ist das für eine Rechtschreibung?

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.

wozu 30 Sekunden warten für noch eine SMS wenn schon die erste kann Daten für Füllstand enthalten? hab ich Recht?

1 Like

Wofür soll es gut sein, einen neuen Thread zum gleichen Thema zu eröffnen und nicht im Bestehenden Thread zu bleiben?

Gruß Tommy


deshalb

Dann solltest Du Dir mal die Forenregeln durchlesen. Besonders diesen Abschnitt.

Gruß Tommy

Wenn du ein anderes Problem hast, erstelle bitte stattdessen ein neues Thema

man kann auch Esc drücken oder Kreuz klicken, da du das gleich Problem hast.

wie lang ist die Zahl dass du nach "a" schreibst? 3-4 Symbole?
vermutlich willst du nachher auch warnung2 u.s.w. ändern können.
ich schlage vor nach "a" eine Zahl schreiben, dass "warnung" Nummer dar stellt und weitere 4 den eigentlichen Wert. OK?

1 Like

Also ich sag mal so...
Ich würde mich freuen, wenn das zusammenhängend in dem Thread bleibt.
Es ist kein Verbrechen, das Solution wieder zu entfernen; ich hoffe @pylon erschlägt mich jetzt nicht dafür. Aber das Thema ist noch immer das gleiche: Du willst mit einer SMS eine Variable ändern.
Es ist wurscht, ob das die Zielrufnummer oder der Zielwert der Waage ist. Es ist das selbe Thema
Schau mal hier, da haben wir (fast) eine ganze rennbahn neu gemacht. Wenn wir da jedes mal nen neuen aufgemacht hätten....

Aber nu. Ist halt meine Einstellung.

Achso: Wenn Du Dich dafür entscheidest:
Mit der Flagge
grafik
zweites Symbol von links, kannst Du einen Mod um ein "please merge & append" bitten-> bitte den Link zum Ursprungsthread https://forum.arduino.cc/t/variable-durch-empfangenes-sms-andern/1156283/32 mit angeben, damit die wissen um was es geht.

danke. habe ich gemacht

schicke "a10" für Abfrage des ersten Warnungswertes, für Setzen ändere "0" auf gewünschten Wert.

// include the GSM library
#include <MKRGSM.h>

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

const char adminnummer[20] = "+********"; //Adminnummer für Diagnose
char nummer[20] = "+*****";            //Empfänger nummer definieren
int fuellstand;                         //Füllstand variable definieren

// Array to hold the number a SMS is retreived from
char senderNumber[20];

#include "HX711.h"

HX711 scale(7, 9); //7-> DOUT, 9->SCK

const float calibration_factor = -21.825;
int units;

int warnung[4] = {0, 150, 100, 50}; //in Gramm

bool sms1geschickt = false;
bool sms2geschickt = false;
bool sms3geschickt = false;

void setup() {
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);

  Serial.println("Milchautomat Fuellstand Benachrichtigung");

  // connection state
  bool connected = false;

  // Start GSM connection
  while (!connected) {
    if (gsmAccess.begin("****") == GSM_READY) {
      connected = true;
    } else {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("GSM initialized");

  scale.set_scale(calibration_factor);//für die Waage
  scale.tare();
}

void loop() {
  int c;//Variable für nachricht

  Serial.print("Messung:");
  units = scale.get_units(10) ;

  Serial.print(units);
  Serial.println(" Gramm");
  fuellstand = units - 0; // Gewicht 50L Milchkanne tief

  //wenn zwischen 15L und 10L
  if (fuellstand <= warnung[1] && fuellstand > warnung[2] && !sms1geschickt ) {
    sms.beginSMS(nummer);
    sms.print("Milchmenge ca.: ");
    sms.print(fuellstand);
    sms.print(" ml");
    sms.endSMS();
    Serial.println("Warnung 1 gesendet");
    sms1geschickt = true;
    //wenn zwischen 10L und 5L
  } else if (fuellstand <= warnung[2] && fuellstand > warnung[3] && !sms2geschickt) {
    sms.beginSMS(nummer);
    sms.print("Milchmenge ca.: ");
    sms.print(fuellstand);
    sms.print(" ml");
    sms.endSMS();
    Serial.println("Warnung 2 gesendet");
    sms2geschickt = true;
    //wenn zwischen 5L und 0L
  } else if (fuellstand <= warnung[3] && fuellstand > 0 && !sms3geschickt) {
    sms.beginSMS(nummer);
    sms.print("Warnung! Fuellstand ca.: ");
    sms.print(fuellstand);
    sms.print(" ml");
    sms.endSMS();
    Serial.println("Warnung 3 gesendet");
    sms3geschickt = true;
  } else if (fuellstand > warnung[1]) {
    sms1geschickt = 0;
    sms2geschickt = 0;
    sms3geschickt = 0;
    Serial.println("sms1-3geschickt auf 0 gestellt");
  }

  if (sms.available()) {     // If there are any SMSs available()
    Serial.println("Message received from:");

    // Sender nummer in monitor ausgeben
    sms.remoteNumber(senderNumber, 20);
    Serial.println(senderNumber);

    // wenn nachricht mit "+" dann text zurück schicken: "Nummer wechseln zu:"
    if (sms.peek() == '+') {
      sms.beginSMS(senderNumber);
      uint8_t ind = 0;
      while ((c = sms.read()) != -1 && ind < 19) {
        nummer[ind++] = c;
      }
      nummer[ind] = 0;
      sms.print("Empfaengernummer gewechselt zu: ");
      sms.print(nummer);
      sms.endSMS();
      Serial.println("Empfaengernummer gewechselt zu: ");
      Serial.println(nummer);

    } else if (sms.peek() == 'f') { //schick den Füllstand
      sms.beginSMS(senderNumber);
      sms.print("Fuellstand: ");
      sms.print(fuellstand);
      sms.print(" ml");
      sms.endSMS();
      Serial.println("Fuellstand auf Anfrage geschickt");

    } else if (sms.peek() == 'a') {       // ändere Warnung 1
      sms.beginSMS(senderNumber);
      uint8_t ind = 0;
      sms.read();
      int WarnungsNummer = sms.read() - 48;
      while ((c = sms.read()) != -1 && ind < 19) {
        nummer[ind++] = c;
      }
      nummer[ind] = 0;
      int Wert = atoi(nummer);
      sms.print("Warnung ");
      sms.print(WarnungsNummer);
      sms.print(" ist im Moment bei: ");
      sms.print(warnung[WarnungsNummer]);
      sms.print("ml.");
      if (nummer) {
        warnung[WarnungsNummer] = Wert;
        sms.print(" und wird auf: ");
        sms.print(Wert);
        sms.print("gesetzt.");
      }
      sms.endSMS();

    }  else { // wenn falscher SMS Befehl
      sms.beginSMS(nummer);
      sms.print("Falscher Befehl");
      sms.endSMS();
      Serial.println("Empfänger SMS geschickt: Falscher Befehl");
      sms.beginSMS(adminnummer);
      sms.print("Falscher Befehl. Nachricht: ");
      while ((c = sms.read()) != -1) {
        sms.print((char)c);
      }
      sms.endSMS();
      Serial.println("Admin SMS geschickt: Falscher Befehl");
    }

    // Delete message from modem memory
    sms.flush();
    Serial.println("MESSAGE DELETED");
    delay(5000);
  }
}
1 Like

Danke viel Mal. Das hilft mir schon viel weiter. Es gibt aber noch ein Problem:

int WarnungsNummer = sms.read();

Hier wird WarnungsNummer zu 49, obwohl ich im SMS "a17650" geschrieben habe.
Wie kann man das lösen?

ah, stimmt, ich musste wissen.
dann:

int WarnungsNummer = sms.read() - '0';
1 Like

Danke. Das hat geklappt.

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