expected primary-expression before 'Meldung'

hallo!

Projekt mit UNO und DHT11 mit GPRS Shield ein SMS senden

die Zeile 48 bringt die Meldung „expected primary-expression before 'Meldung'“

die geänderte Zeile 48 if (sms.SendSMS("+4367712345678", Meldung)) bringt die Fehlermeldung 'no matching function for call to 'SMSGSM::SendSMS(const char [15], String&)'

ich ersuche um Hilfe, gibt es dazu eine Lösung?

vielen Dank

GSM_SMS.ino (1.18 KB)

Im geposteten Sketch steht

if (sms.SendSMS("+4367712345678", String Meldung))

Warum nicht in deinem Beispiel ?

Da fehlt wohl was.

du hast auch

if (sms.SendSMS("+4367712345678", String Meldung))

im Sketch ...

(edit - zu spät)

Entschuldigung, ich stelle das erste mal eine Frage im Forum und bin nicht versiert

zwei Zeilen aus dem angefügten Skript

String Meldung = "T="+stringTemperatur+" F="+stringFeuchte;

if(started) {
if (sms.SendSMS("+4367712345678", String Meldung))

verschiedene Versuche haben beim Compiling zu Fehlermeldungen geführt

vielen Dank
hartmut

// Arduino UNO
// GPRS Shield

#include <SoftwareSerial.h>
#include <SimpleDHT.h>
#include "sms.h"
SMSGSM sms;

int pinDHT11 = 4;
SimpleDHT11 dht11;

boolean started=false;

float floatTemperatur = 0;
char charTemperatur[10];
String stringTemperatur = "";
float floatFeuchte = 0;
char charFeuchte[10];
String stringFeuchte = "";

void setup()
{
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");

  byte temperature = 0;
  byte humidity = 0;
  byte data[12] = {0};
  if (dht11.read(pinDHT11, &temperature, &humidity, data)) {
    Serial.print("Read DHT11 failed");
  return;
  }
  float floatTemperatur = ((int)temperature);
  dtostrf(floatTemperatur, 5, 1, charTemperatur);
  stringTemperatur = charTemperatur;
  float floatFeuchte = ((int)humidity);
  dtostrf(floatFeuchte, 5, 0, charFeuchte);
  stringFeuchte = charFeuchte;
  String Meldung = "T="+stringTemperatur+" F="+stringFeuchte;
      
  if (gsm.begin(2400)) {
    Serial.println("\nstatus=READY");
    started=true;
    } 
    else Serial.println("\nstatus=IDLE");
     
  if(started) {
    if (sms.SendSMS("+4367712345678", String Meldung))
      Serial.println(Meldung);
      Serial.println("\nSMS sent OK");
    }
}

void loop()
{  
}

if (sms.SendSMS("+4367712345678", String Meldung)

Das "String" ist an der Stelle falsch. Die Variable wurde doch schon oben deklariert. Was soll das also da noch?

ohne String vor Meldung erhalte ich eine andere Fehlermeldung:
no matching function for call to 'SMSGSM::SendSMS(const char [15], String&)'

nach welcher Anleitung bist du vorgegangen bzw. mit welcher Library arbeitest du?

Wie sah der letzte Code aus, mit dem du erfolgreich eine SMS gesandt hast?

wenn ich 'Meldung' unter Anführungszeichen setzt erhalte ich am smartphone eine SMS in der steht Meldung aber keine Temperatur oder Luftfeuchtigkeit
if (sms.SendSMS("+4367712345678", "Meldung"))

Eine String Objekt ist falsch als zweiter Parameter. Wenn du den zu sendenden Text unbedingt als String zusammen basteln willst, solltest du mindestens die Methode c_str() kennen, und die dabei auftretenden Datentypen verstehen

vielen Dank
aber - das übersteigt wohl meine Möglichkeiten/Kenntnisse

Nach 30 Minuten schon kapituliert. Das zeigt, dass Du Dir nicht mal die Mühe gemacht hast, das Posting verstehen zu wollen.

Gruß Tommy

Danke für den "Rüffel", ich werde am Abend an der Sache weiter arbeiten,
vielleicht schaffe ich es doch,
nb: ich habe mich schon 3 Abende mit dem Thema beschäftigt,
werde versuchen Methode c_str() zu verstehen

Hallo,

ich kenne die Lib nicht und habe das alles nur überflogen. Eigentlich wären die kompletten Fehlermeldungen hier sehr interessant gewesen, da steht vermutlich in einer Zeile sowas wie:
möglich wäre SMSGSM::SendSMS(const char [15], *char)' oder so ähnlich.
Vermutlich gibt es nur eine Funktion, die Meldung als c-String bzw. Char-Array erwartet.

Wenn Meldung ein String ist wie bei Dir, kann man das mit Meldung.c_str() in einen c-String umwandeln.
Befasse Dich mit Variablentypen und der String Klasse beim Arduino, das schadet nie...

Gruß aus Berlin
Michael

amithlon:
Befasse Dich mit Variablentypen und der String Klasse beim Arduino, das schadet nie...

Auf "normalen"* Arduinos verzichtest du besser völlig auf die Benutzung der String Klasse,
der Speicher dieser Arduinos reicht einfach nicht aus.

  • mit normal meine ich Uno, Nano, Micro, Mini, Mega

Wenn Meldung ein String ist wie bei Dir, kann man das mit Meldung.c_str() in einen c-String umwandeln.

Umgewandelt wird da eigentlich nichts. Die String Klasse verwaltet intern einen C String (ein Null-terminiertes char Array). Die c_str() Methode liefert lediglich einen const Zeiger auf das interne Array

Danke an alle
c_str(): Tommy56 – eine sehr umfangreiche Arbeit, übersteigt meine Kenntnisse
toCharArray(): kein Erfolg, Meldung blieb leer
Whandall: was wäre deine Empfehlung für so ein Projekt

meine Lösung, die SMS liefert, sieht inzwischen so aus

// Arduino UNO
// GPRS Shield
// HX711
// DHT11

#include <SoftwareSerial.h>
#include <SimpleDHT.h>
#include "sms.h"
SMSGSM sms;

#include <Q2HX711.h>
const byte hx711_data_pin = A0;
const byte hx711_clock_pin = A1;
Q2HX711 hx711(hx711_data_pin, hx711_clock_pin);

int pinDHT11 = 4;
SimpleDHT11 dht11;

boolean started=false;

float offsetk = -0.50813008;
float offsetd = 416.1432927;
float scalefactor = 10000;

float floatGewicht = 0;
float floatTemperatur = 0;
float floatFeuchte = 0;
char charMeldung[10];

void setup()
{
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");

   byte temperature = 0;
  byte humidity = 0;
  byte data[12] = {0};
  if (dht11.read(pinDHT11, &temperature, &humidity, data)) {
    Serial.print("Read DHT11 failed");
  return;
  }

 //Durchschnitt mehrerer Wägungen
  float floatGewicht = 0;
  float floatGewicht1 = 0;
  floatGewicht = (hx711.read()/scalefactor);
  for (int j = 0; j < 10; j++) {
    floatGewicht1 = (hx711.read()/scalefactor);
    floatGewicht = (floatGewicht + floatGewicht1) / 2.0;
  }
  
  floatGewicht1 = (offsetk * floatGewicht)+offsetd;
  floatGewicht1 = (floatGewicht1 *10);
  floatGewicht = ((int)floatGewicht1);
  floatTemperatur = ((int)temperature);
  floatFeuchte = ((int)humidity);
  floatTemperatur = (floatTemperatur * 1000000);
  floatFeuchte =(floatFeuchte * 10000);
  float floatMeldung = (floatTemperatur + floatFeuchte + floatGewicht);
  dtostrf(floatMeldung, 9, 0, charMeldung); 
     
  if (gsm.begin(2400)) {
    Serial.println("\nstatus=READY");
    started=true;
    } 
    else Serial.println("\nstatus=IDLE");
     
  if(started) {
    if (sms.SendSMS("+43677123456", charMeldung ))
      Serial.println("\nSMS sent OK");
    }
}

void loop()
{  
}

Du benutzt eine merkwürdige Art von "Mittelwert".

Deine Konversion scheitert an den maximal 6-7 signifikanten Digits einer Float Zahl.

al49ois:
Whandall: was wäre deine Empfehlung für so ein Projekt

Etwas in der Art:

const byte waegungen = 11;
const float offsetk = -0.50813008;
const float offsetd = 416.1432927;
const float scalefactor = 10000;

class check {
  public:
    float read() {
      return 4200000;
    }
} hx711;

byte temperature = 23;
byte humidity = 45;
char meldung[16];

void setup() {
  Serial.begin(250000);
  // Durchschnitt mehrerer waegungen
  float floatGewicht = 0;
  for (byte j = 0; j < waegungen; j++) {
    floatGewicht += (hx711.read() / scalefactor);
  }
  floatGewicht /= waegungen;
  floatGewicht = (offsetk * floatGewicht + offsetd) * 10;
  sprintf(meldung, "%2d %2d %d", temperature, humidity, (int)(floatGewicht + 0.5));
  Serial.println(meldung);
}
void loop() {}
23 45 2027

eine merkwürdige Art von "Mittelwert"

Ein normaler gleitender Mittelwert, auch Tiefpass genannt, mit einem recht hohen Gewichtungsfaktor für neue Werte.
Oft findet man sowas wie
xm = (xm × 15 + x)/16;

michael_x:
Ein normaler gleitender Mittelwert, auch Tiefpass genannt, mit einem recht hohen Gewichtungsfaktor für neue Werte.

Die 50% Gewicht auf dem letzten Wert erscheinen mir sehr hoch.