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
07.12.2014, 20:22
Beitrag #25
RE: sprintf invalid operands of types
das mit dem flush
habe ich so und so probiert...

so sieht nun der loop aus

void loop() {

unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
delay(read_delay);
read_data();
delay(700);
client.flush();
Serial.println("ethernet client flush ok");
delay(700);
client.stop();
Serial.println("ethernet client stop ok");
}
}
hier der output im monitor
Connecting...
Connected to server version 5.5.35-0+wheezy1-log
Data read and recorded.
Disconnected.
ethernet client flush ok
ethernet client stop ok
Packet error.
Data read and recorded.
ethernet client flush ok
ethernet client stop ok

grüße sepp
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 20:36
Beitrag #26
RE: sprintf invalid operands of types
Hi,
lass mal das client.stop weg. ...oder Du musst das client.connect jedesmal vor dem read_data() machen. stop() schließt nämlich die Verbindung...
Bitte durchlesen und auswendig lernen: http://arduino.cc/en/Reference/Ethernet.
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, 21:12 (Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2014 21:37 von sepp01.)
Beitrag #27
RE: sprintf invalid operands of types
Hallo Thorsten,

das bringt leider auch nichts

habe den stop weggelassen
hier der output
Connecting...
Connected to server version 5.5.35-0+wheezy1-log
Error: 56 = Column count doesn't match value count at row 1.
Data read and recorded.
Disconnected.
ethernet client flush ok
Packet error.
Data read and recorded.
ethernet client flush ok

Grüße sepp

Ps. das mit dem column ist erledigt... das hatte ich in diesem sketch vergessen. Das war aber nicht das Problem!
ich hatte nur zwei Felder in der DB hinzugefügt und im sketch vergessen

hier der komplette code

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 <Wire.h>
#include <RTClib.h>
#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";
EthernetClient client;
  //wartezeit des Ethernetshiels bis Neuafbau setzen
  long previousMillis = 0;
  long interval = 10000;
  
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 */

// RTC Clock initialisieren
RTC_Millis RTC;


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, Null, Null)",
                   myDHT22.getTemperatureCInt()/10,
                   abs(myDHT22.getTemperatureCInt()%10),
                   myDHT22.getHumidityInt()/10,
                   myDHT22.getHumidityInt()%10),
                   sensors.getTempCByIndex(0)/10,
                   sensors.getTempCByIndex(0)%10;
      */
        char temp_val[6];
dtostrf(sensors.getTempCByIndex(0), 5, 2,temp_val);
char buf[128];
sprintf(buf,"INSERT INTO dht22_test.temp_humid VALUES (NULL,%hi.%01hi,%i.%01i,%s, Null, Null)",
              myDHT22.getTemperatureCInt()/10,
              abs(myDHT22.getTemperatureCInt()%10),
              myDHT22.getHumidityInt()/10,
              myDHT22.getHumidityInt()%10,
              temp_val);
      my_conn.cmd_query(buf);
      Serial.println("Data read and recorded.");
      my_conn.disconnect();
      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() {  
  RTC.begin(DateTime(__DATE__, __TIME__));
  DateTime now = RTC.now();
  int day1   = now.day();
  int month  = now.month();
  int year   = now.year();
  int minute = now.minute();
  int hour   = now.hour();
  int second = now.second();
  
  //char date =
  
  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() {

  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
    delay(read_delay);
     //client.connect();
      Serial.println("ethernet client.connect ok vor read_date");
       read_data();
       /*
       delay(700);
      client.flush();
      Serial.println("ethernet client flush ok");
      delay(700);
      client.stop();
      Serial.println("ethernet client stop ok");
      */
}
}

(07.12.2014 20:11)Thorsten Pferdekämper schrieb:  Zum Thema Uhr: Wenn Du eh einen RasPi laufen hast, dann würde ich das den RasPi machen lassen.
Ich würde sowieso das meiste im RasPi machen. Dort könnte einfach ein Programm laufen, welches den Arduino abfragt und dann die Daten in die DB schreibt. Der Arduino wäre dann ein kleiner Webserver. Ich glaube, dass es so herum einfacher wäre.

Einfacher?
phooo, ich dachte eigentlich das es einfacher ist wenn ich dem Arduino der eh schon die ganzen Werte ermittelt alles in die DB schreiben lasse.
Er muss ja auch von der DB aus lesen z.B. Uhrzeit Lampen an/aus. Pumpen an/aus.

All das wollte ich in der mysql-db gespeichert haben da ich es via webinterface schön und einfach ändern kann und der Arduino holt sich dann nur seien Daten aus der DB , macht aktionen und ermittelt werte die er in die DB wieder schreibt.

Jetzt bin ich zwar am Anfang aber ich müsste komplett umdenken...
ich weiss nicht ob das leichter ist

oder?

Grüße Sepp

ps. es muss was mit dem my_con.disconnect() zu tun haben.
ich habe es jetzt auskommentiert und schon kommt kein paket error mehr.
ich vermute aber das es dann später im Betrieb wenn das Teil permament läuft wieder auftauchen kann.

Was kann das sein?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 21:48
Beitrag #28
RE: sprintf invalid operands of types
Hi,
nur den stop() weglassen, der flush() soll schon bleiben. Danach ein bisschen delay() schadet auch erstmal nicht.
Außerdem machst Du mysql.disconnect und danach keinen connect mehr. Dann ist es kein Wunder, dass da was schief geht. Das sollte schon klar sein, oder?
Was auch immer Du tust, Du musst Deine Verbindungen offen haben, wenn Du was damit machen willst.
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, 22:05
Beitrag #29
RE: sprintf invalid operands of types
Hallo,

in der class my_conn (Referenz) bzw. in der Connector gibt es kein connect bzw. connected

ich habe keine Ahnung was C. Bell damit meint wenn man disconnected() schreiben soll. Das gibt es in der Class Connector.
alles andere wird dort wohl über den client.connect gelöst oder sehe ich das falsch?

Hier was in der mysql.h steht (auszug)

Code:
class Connector
{
  public:
    Connector();
    boolean mysql_connect(IPAddress server, int port,
                          char *user, char *password);
    void disconnect();
    boolean cmd_query(const char *query);
    boolean cmd_query_P(const char *query);
    int is_connected () { return client.connected(); }
    const char *version() { return VERSION_STR; }
#if defined WITH_SELECT
    column_names *get_columns();
    row_values *get_next_row();
    void free_columns_buffer();
    void free_row_buffer();
    void show_results();
#endif
  private:
    byte *buffer;
    char *server_version;
    byte seed[20];
    int packet_len;
#if defined WITH_SELECT
    column_names columns;
    boolean columns_read;
    int num_cols;
    row_values row;
#endif

    // Determine if WiFi shield is used
    #if defined WIFI
      WiFiClient client;
    #else
      EthernetClient client;
    #endif

    // Methods for handling packets
    int wait_for_client();
    void send_authentication_packet(char *user, char *password);
    void read_packet();
    void parse_handshake_packet();
    int check_ok_packet();
    void parse_error_packet();
    boolean run_query(int query_len);

    // Utility methods
    boolean scramble_password(char *password, byte *pwd_hash);
    int get_lcb_len(int offset);
    int read_int(int offset, int size=0);
    void store_int(byte *buff, long value, int size);
#if defined WITH_SELECT
    char *read_string(int *offset);
    int get_field(field_struct *fs);
    int get_row();
    boolean get_fields();
    boolean get_row_values();
    column_names *query_result();
#endif

    // diagnostic methods
#if defined WITH_DEBUG
    void print_packet();
#endif

    void print_message(const char *msg, bool EOL = false) {
      char pos;
      while ((pos = pgm_read_byte(msg))) {
        Serial.print(pos);
        msg++;
      }
      if (EOL)
        Serial.println();
    }
};
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 22:18
Beitrag #30
RE: sprintf invalid operands of types
Hi,
Du rufst doch selbst my_conn.disconnect(); auf. Ich verstehe Deine Verwunderung nicht...
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
08.12.2014, 09:33
Beitrag #31
RE: sprintf invalid operands of types
Moin sepp,
Anfang Februar hat C. Bell eine neue Version des Connectors raus gebracht. Diese Version behandelt genau die von dir genannten Probleme in besserer Manier. Hast du diese Version am laufen? Guck dir mal diesen Artikel an: http://drcharlesbell.blogspot.de/2014/02...ino-1.html

Zum Thema Timestamp würde ich auch eher die Zeit vom RPi benutzen. Abhängig von der MySql-Version kann es ziemlich tricky sein die Timestamps richtig zusammenzusetzen um sie dann an die DB zu übergeben.Siehe hier: http://dev.mysql.com/doc/refman/5.6/en/d...erals.html

Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2014, 10:04
Beitrag #32
RE: mysql string was ist daran falsch
hallo,

habe ein Problemchen mit einem mysql-string

sorry, ich hoffe ich nere hier nicht zu arg, habe aber gestern die halbe Nacht gegoogelt und keine brauchbare Hilfe dazu gefunden.

Ich habe aus einem RTC-Modul was die Daten wohl in
uint8_t month() const
Format übergibt
die Werte in einen String zusammengesetzt und will diese nun in die DB schreiben.
Da bringt er entweder Fehler in der mysql-syntax oder er füllt die Felder mit ganz falschen Werten

hier der Code.


Code:
INSERT INTO dht22_test.temp_humid VALUES (NULL,18.9,45.4,19.50,2014-12-08,01:28:11)

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':28:11)' at line 1

irgend etwas scheint ihm an meinem Feld Time nicht zu passen.
Als ich mit NULL, NULL die Felder Date und das Feld Time gefüttert habe hat er den String ausgeführt.
Als ich nun das Datum und die Uhrzeit übertrage kracht es.
Dabei sind die Felder mit Date und Time mit dem Format DATE und TIME in der mysql-db angelegt.

hier ist der arduino-code-Ausschnitt

Code:
void read_data() {
  DHT22_ERROR_t errorCode;
  sensors.begin();/* Inizialisieren der Dallas Temperature library */
  sensors.requestTemperatures(); // Temp abfragen
  errorCode = myDHT22.readData();
  sensors.getTempCByIndex(0);
  
  RTC.begin(DateTime(__DATE__, __TIME__));
  DateTime now   = RTC.now();

  const char DATEFORMAT[20] = "%04u-%02u-%02u";
  static char dateString[20];
  sprintf(dateString, DATEFORMAT, now.year(), now.month(), now.day());
  Serial.print("das ist das Datum : ");
  Serial.print(dateString);
   Serial.print('/');
  
  const char HOURFORMAT[20] = "%02u:%02u:%02u";
  static char hourString[20];
  sprintf(hourString, HOURFORMAT, now.hour(), now.minute(), now.second());
     Serial.print("das ist die Uhrzeit : ");
  Serial.print(hourString);
   Serial.print('/');
  
  switch(errorCode)
  {
    case DHT_ERROR_NONE:

        char temp_val[6];
dtostrf(sensors.getTempCByIndex(0), 5, 2,temp_val);
char buf[128];
sprintf(buf,"INSERT INTO dht22_test.temp_humid VALUES (NULL,%hi.%01hi,%i.%01i,%s,%s,%s)",
              myDHT22.getTemperatureCInt()/10,
              abs(myDHT22.getTemperatureCInt()%10),
              myDHT22.getHumidityInt()/10,
              myDHT22.getHumidityInt()%10,
              temp_val,
              dateString,
              hourString);
      my_conn.cmd_query(buf);
      Serial.println("Data read and recorded.");
      //my_conn.disconnect();
      break;
    case DHT_ERROR_CHECKSUM:

Ändere ich den String ab und ersetze die Uhrzeit mit "NULL" so trägt er zwar den Datensatz ein, jedoch das Datums-Feld wird mit 0000-00-00 gefüllt.
ID temp_c real_humid temp_water_1 date time
6437 19 45.1 19.5 0000-00-00

der String sieht dabei so aus.
Code:
INSERT INTO dht22_test.temp_humid VALUES (NULL,19.0,45.2,19.50,2014-12-08,NULL)

Irgendwie scheint ihm mein Format %s nicht zu gefallen.
oder?

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 818 22.06.2016 10:52
Letzter Beitrag: GMBU
  invalid conversion from 'const char*' to 'char' toto1975 8 885 31.03.2016 12:49
Letzter Beitrag: hotsystems
  sprintf() plus scanf() : ständig Fehler, warum? HaWe 15 1.830 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.598 13.12.2014 10:04
Letzter Beitrag: HaWe

Gehe zu:


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