INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
sprintf invalid operands of types
06.12.2014, 22:35 (Dieser Beitrag wurde zuletzt bearbeitet: 06.12.2014 22:39 von sepp01.)
Beitrag #1
sprintf invalid operands of types
Hallo,

habe hier einen Beispielcode erweitert für die Nutzung des mysql_connectors.
Dieser benötigt für seinen mysql-string alles aufbereitet mit sprintf.

Ich habe unten die Zeilen fett markiert die ich hinzufügte (ohne diese ging es)

jetzt bringt er mir die Fehlermeldung

dht22-und-DS18S20.ino: In function 'void read_data()':
dht22-und-DS18S20.ino:53: error: invalid operands of types 'float' and 'int' to binary 'operator%'

kann mir ddas jemand kurz erkläern was ihm da nicht passt?

Grüße sepp


/**
Sensor Networks Example Arduino DHT22 Sensor

This project demonstrates how to receive sensor data from
a DHT22 sensor saving the samples in a MySQL
database.

It uses an Arduino with an Ethernet shield installed.
*/
#include <SPI.h>
#include <Ethernet.h>
#include <sha1.h>
#include "mysql.h"
#include <DHT22.h>
#include <OneWire.h>
#include <DallasTemperature.h>


byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server_addr(192, 168, 2, 102);
char user[] = "root";
char password[] = "xyz";

Connector my_conn; // The Connector/Arduino reference

// Luft/Feuchtigkeits-Sensor DHT22 definieren
#define DHT22_PIN 8 // DHT2 data is on pin 7
#define read_delay 5000 // 5 seconds
DHT22 myDHT22(DHT22_PIN); // DHT22 instance

// Temp-Sensor Wasser DS18S20 definieren
#define ONE_WIRE_BUS_1 7 /* Digitalport Pin 2 definieren */
OneWire ourWire_1(ONE_WIRE_BUS_1); /* Ini oneWire instance */
DallasTemperature sensors(&ourWire_1);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */




void read_data() {
DHT22_ERROR_t errorCode;
sensors.begin();/* Inizialisieren der Dallas Temperature library */
sensors.requestTemperatures(); // Temp abfragen
errorCode = myDHT22.readData();
sensors.getTempCByIndex(0);
switch(errorCode)
{
case DHT_ERROR_NONE:
char buf[128];
sprintf(buf, "INSERT INTO dht22_test.temp_humid VALUES (NULL, %hi.%01hi, %i.%01i, %hi.%01hi)",
myDHT22.getTemperatureCInt()/10,
abs(myDHT22.getTemperatureCInt()%10),
myDHT22.getHumidityInt()/10,
myDHT22.getHumidityInt()%10),
sensors.getTempCByIndex(0)/10,
sensors.getTempCByIndex(0)%10
;
my_conn.cmd_query(buf);
Serial.println("Data read and recorded.");
break;
case DHT_ERROR_CHECKSUM:
Serial.print("check sum error ");
Serial.print(myDHT22.getTemperatureC());
Serial.print("C ");
Serial.print(myDHT22.getHumidity());
Serial.println("%");
break;
case DHT_BUS_HUNG:
Serial.println("BUS Hung ");
break;
case DHT_ERROR_NOT_PRESENT:
Serial.println("Not Present ");
break;
case DHT_ERROR_ACK_TOO_LONG:
Serial.println("ACK time out ");
break;
case DHT_ERROR_SYNC_TIMEOUT:
Serial.println("Sync Timeout ");
break;
case DHT_ERROR_DATA_TIMEOUT:
Serial.println("Data Timeout ");
break;
case DHT_ERROR_TOOQUICK:
Serial.println("Polled too quick ");
break;
}
}

void setup() {
Ethernet.begin(mac_addr);
Serial.begin(115200);
delay(1000);
Serial.println("Connecting...");
if (my_conn.mysql_connect(server_addr, 3306, user, password))
delay(500);
else
Serial.println("Connection failed.");
}

Code:
/**
  Sensor Networks Example Arduino DHT22 Sensor
  
  This project demonstrates how to receive sensor data from
  a DHT22 sensor saving the samples in a MySQL
  database.

  It uses an Arduino with an Ethernet shield installed.
*/
#include <SPI.h>
#include <Ethernet.h>
#include <sha1.h>
#include "mysql.h"
#include <DHT22.h>
#include <OneWire.h>
#include <DallasTemperature.h>

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server_addr(192, 168, 2, 102);
char user[] = "root";
char password[] = "xyz";

Connector my_conn;        // The Connector/Arduino reference

// Luft/Feuchtigkeits-Sensor DHT22 definieren
#define DHT22_PIN 8       // DHT2 data is on pin 7
#define read_delay 5000   // 5 seconds
DHT22 myDHT22(DHT22_PIN); // DHT22 instance

// Temp-Sensor Wasser DS18S20 definieren
#define ONE_WIRE_BUS_1 7 /* Digitalport Pin 2 definieren */
OneWire ourWire_1(ONE_WIRE_BUS_1); /* Ini oneWire instance */
DallasTemperature sensors(&ourWire_1);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */



void read_data() {
  DHT22_ERROR_t errorCode;
  sensors.begin();/* Inizialisieren der Dallas Temperature library */
   sensors.requestTemperatures(); // Temp abfragen
  errorCode = myDHT22.readData();
  sensors.getTempCByIndex(0);
  switch(errorCode)
  {
    case DHT_ERROR_NONE:
      char buf[128];
      sprintf(buf, "INSERT INTO dht22_test.temp_humid VALUES (NULL, %hi.%01hi, %i.%01i, %hi.%01hi)",
                   myDHT22.getTemperatureCInt()/10,
                   abs(myDHT22.getTemperatureCInt()%10),
                   myDHT22.getHumidityInt()/10,
                   myDHT22.getHumidityInt()%10),
                   sensors.getTempCByIndex(0)/10,
                   sensors.getTempCByIndex(0)%10;
      my_conn.cmd_query(buf);
      Serial.println("Data read and recorded.");
      break;
    case DHT_ERROR_CHECKSUM:
      Serial.print("check sum error ");
      Serial.print(myDHT22.getTemperatureC());
      Serial.print("C ");
      Serial.print(myDHT22.getHumidity());
      Serial.println("%");
      break;
    case DHT_BUS_HUNG:
      Serial.println("BUS Hung ");
      break;
    case DHT_ERROR_NOT_PRESENT:
      Serial.println("Not Present ");
      break;
    case DHT_ERROR_ACK_TOO_LONG:
      Serial.println("ACK time out ");
      break;
    case DHT_ERROR_SYNC_TIMEOUT:
      Serial.println("Sync Timeout ");
      break;
    case DHT_ERROR_DATA_TIMEOUT:
      Serial.println("Data Timeout ");
      break;
    case DHT_ERROR_TOOQUICK:
      Serial.println("Polled too quick ");
      break;
  }
}

void setup() {  
  Ethernet.begin(mac_addr);
  Serial.begin(115200);
  delay(1000);
  Serial.println("Connecting...");
  if (my_conn.mysql_connect(server_addr, 3306, user, password))
    delay(500);
  else
    Serial.println("Connection failed.");
}

void loop() {  
  delay(read_delay);
  read_data();
}
void loop() {
delay(read_delay);
read_data();
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.12.2014, 23:17
Beitrag #2
RE: sprintf invalid operands of types
Irgendwo ist links vom "% 10" ein float. Das geht aber nicht.
"%" geht wohl nur für ganze Zahlen.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.12.2014, 23:53
Beitrag #3
RE: sprintf invalid operands of types
Hallo

ja , in seinem Beispielscript hatte er mit dem DT22 Integer Zahlen.
Ich hab nun das Problem das ich in den mysql-string der zwangsweise mit sprintf aufbereitet werden muss einen float Datentyp habe.
Weis aber nicht ich den übergeben muss

Grüße Sepp
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 00:04
Beitrag #4
RE: sprintf invalid operands of types
(int) davorschreiben, dann wird's ein int.

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 00:12 (Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2014 00:13 von sepp01.)
Beitrag #5
RE: sprintf invalid operands of types
Hallo,

wie meinst Du das ?

ich habe es so davor geschrieben

passt ihm aber nicht

Code:
sprintf(buf, "INSERT INTO dht22_test.temp_humid VALUES (NULL, %hi.%01hi, %i.%01i, %hi.%01hi)",
                   myDHT22.getTemperatureCInt()/10,
                   abs(myDHT22.getTemperatureCInt()%10),
                   myDHT22.getHumidityInt()/10,
                   myDHT22.getHumidityInt()%10),
                   int sensors.getTempCByIndex(0)/10,
                   int sensors.getTempCByIndex(0)%10;

Noch eine Frage:
Bei solchen Stringverkettungen "%hi.%01hi, %i.%01i, %hi.%01hi"

wird das dann nach der Reihe abgearbeitet?
also alles was dann
mit

myDHT22.getTemperatureCInt()/10,
abs(myDHT22.getTemperatureCInt()%10),
myDHT22.getHumidityInt()/10,

usw.
kommt wird nach der Reihe abgearbeitet bzw. so zusammengesetzt?

Grüße Sepp

ps was ich noch nicht begreife ist auch

int sensors.getTempCByIndex(0)/10,
int sensors.getTempCByIndex(0)%10;

was das /10 und %10 soll

wird da was durch 10 dividiert?
und bei %10 ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 10:21
Beitrag #6
RE: sprintf invalid operands of types
Hi,
also eigentlich sollte ich ja nicht mehr helfen...
Lies Dir mal den Kram hier durch:
http://www.cplusplus.com/reference/cstdio/sprintf/
http://www.cplusplus.com/reference/cstdio/printf/
http://de.wikibooks.org/wiki/C%2B%2B-Pro...umwandlung
http://de.wikibooks.org/wiki/C%2B%2B-Pro...Operatoren
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 11:23
Beitrag #7
RE: sprintf invalid operands of types
Moin sepp,
Zitat:Ich hab nun das Problem das ich in den mysql-string der zwangsweise mit sprintf aufbereitet werden muss einen float Datentyp habe.
Damit klar wird was du eigentlich erreichen möchtest, solltest du vielleicht Fragen beantworten:
- wie sieht deine SQL-Tabelle aus? Welche Spalten mit welchen Formaten?
- warum benutzt du für das INSERT nicht einfach einen vordefinierten String, der den immer wiederkehrenden Teil enthält, und erweiterst diesen um die jeweiligen Wertangaben? Da sparst du dir das sprintf.
- Warum willst du auf float überhaupt Modulo anwenden?
Der DHTxx bringt nun mal float Werte raus. Auf float Werte kann der Arduino (und auch jede andere Mathematik?) nun mal Modulo nicht anwenden.
Zitat:Calculates the remainder when one integer is divided by another.
Grüße Ricardo
PS: guckt dir man dies an: http://www.arduinoforum.de/arduino-Threa...r-ohne-PHP

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 11:34
Beitrag #8
RE: sprintf invalid operands of types
(07.12.2014 10:21)Thorsten Pferdekämper schrieb:  Hi,
also eigentlich sollte ich ja nicht mehr helfen...
Lies Dir mal den Kram hier durch:
http://www.cplusplus.com/reference/cstdio/sprintf/
http://www.cplusplus.com/reference/cstdio/printf/
http://de.wikibooks.org/wiki/C%2B%2B-Pro...umwandlung
http://de.wikibooks.org/wiki/C%2B%2B-Pro...Operatoren
Gruß,
Thorsten

Hallo Thorsten,
vielen Dank für die Links. Die haben mir nun etwas Licht ins Dunkle gebracht.
Die Seiten sind sehr gut vor allem die wikibooks.

was ich aber immer noch nicht verstehe,
wenn ich enen Datentyp float habe und den auch benötige und ihn umwandeln soll in eine Integer damit sprintf damit umgehen kann, so würde doch normal dann eine Ganzzahl dabei rumkommen oder?

sorry, ich weiss das es für einen Programmierer f+ür den das alles logisch ist nervig sein muss, aber ich brauch etwas Zeit bzw. Schuppser damit ich mich reinfinden kann

Grüße Sepp
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Probleme mit sprintf() und dtostrf() GMBU 11 815 22.06.2016 10:52
Letzter Beitrag: GMBU
  invalid conversion from 'const char*' to 'char' toto1975 8 881 31.03.2016 12:49
Letzter Beitrag: hotsystems
  sprintf() plus scanf() : ständig Fehler, warum? HaWe 15 1.826 28.02.2015 15:31
Letzter Beitrag: HaWe
  Funktion ähnlich variabel definieren wie sprintf HaWe 21 1.800 24.02.2015 11:12
Letzter Beitrag: HaWe
  sprintf formatiert völlig falsch ! HaWe 15 1.585 13.12.2014 10:04
Letzter Beitrag: HaWe

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste