2017-02-01 2 views
2

J'ai récemment acheté un Arduino Uno Wifi afin d'écrire des données de capteur directement de mon Arduino dans une base de données MySQL existante. Je pensais que puisqu'il y a quelques bibliothèques existantes (comme this) qui font exactement la même chose avec l'aide d'un bouclier Ethernet ou wifi, cela ne devrait pas être un gros problème. Le problème que j'ai découvert juste après avoir acheté le Uno Wifi, c'est que tous ont besoin de bibliothèques de leur (comme Ethernet.h ou Wifi.h). J'aurais besoin d'un bouclier supplémentaire pour les utiliser, ce qui n'a pas beaucoup de sens à mon avis, puisque j'ai déjà acheté un Arduino prêt pour le wifi. Je sais qu'il y a des choses comme ThingSpeak qui sont supportées, mais je ne veux pas perdre la flexibilité de ma propre base de données et je n'ai pas besoin de tous les services analytiques supplémentaires que ThingSpeak m'offre. Donc, ma question un peu désespérée est - est-il possible d'écrire des données avec une instruction INSERT INTO simple à une base de données existante avec mon (tout nouveau) Arduino Uno WIFI?Puis-je utiliser mon Arduno Uno Wifi pour écrire dans une base de données SQL?

EDIT:

J'ai essayé certaines choses aujourd'hui, c'est ce que je suis venu avec à ce jour:

#include <MySQL_Connection.h> 
#include <MySQL_Cursor.h> 
#include <UnoWiFiDevEd.h> 

IPAddress server_addr(88, 198, 61, 231); // IP of the MySQL *server* here 
char user[] = "USERxxxxxx";    // MySQL user login username 
char password[] = "xxxxxxxxx";  // MySQL user login password 

// Sample query 
char INSERT_SQL[] = "INSERT INTO `arduino_test`(`Humidity`, `Temperature`, `DateTime`) VALUES (60, 23, '2017-02-02 20:34:20')"; 

WiFiClient client; 
MySQL_Connection conn((Client *)&client); 

void setup() { 
    Serial.begin(9600); 
    while (!Serial); // wait for serial port to connect 

    Wifi.begin(); 

    Serial.println("Connecting"); 

    if (conn.connect(server_addr, 3306, user, password)) { 
    delay(5000); 
    Serial.println("Connection successful"); 
    } else { 
    Serial.println("Connection failed!"); 
    } 
} 


void loop() { 
    delay(2000); 

    Serial.println("Recording data."); 

    // Initiate the query class instance 
    MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn); 
    // Execute the query 
    cur_mem->execute(INSERT_SQL); 
    // Note: since there are no results, we do not need to read any data 
    // Deleting the cursor also frees up memory used 
    delete cur_mem; 
} 

Il en résulte du programme de ne pas être en mesure d'établir une connexion au serveur et juste impression constante "Connexion" au moniteur série.

EDIT 2:

je me suis dit quelque chose, grâce à @cagdas de vérifier la première connexion. Voici mon croquis en ce moment:

#include <MySQL_Connection.h> 
#include <MySQL_Cursor.h> 
#include <Wire.h> 
#include <UnoWiFiDevEd.h> 


IPAddress server_addr(88, 198, 61, 231); // IP of the MySQL *server* here 
char user[] = "USERxxxxxx";    // MySQL user login username 
char password[] = "xxxxxxx";  // MySQL user login password 

// Sample query 
char INSERT_SQL[] = "INSERT INTO `arduino_test`(`Humidity`, `Temperature`, `DateTime`) VALUES (60, 23, '2017-02-02 20:34:20')"; 

WifiData client; 
MySQL_Connection conn((Client *)&client); 

void setup() { 

    char* connector = "rest"; 
    char* server = "download.arduino.org"; 
    char* method = "GET"; 
    String resource = "/latest.txt"; 

    Serial.begin(9600); 
    Ciao.begin(); 

    pinMode(2, INPUT); 

    delay(5000); 
    doRequest(connector, server, resource, method); 

    Wifi.begin(); 

    Serial.println("Connecting"); 

    if (conn.connect(server_addr, 3306, user, password)) { 
    Serial.println("Connection successful"); 
    } else { 
    Serial.println("Connection failed!"); 
    } 
} 

void loop() { 
    delay(2000); 

    Serial.println("Recording data."); 

    // Initiate the query class instance 
    MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn); 
    // Execute the query 
    cur_mem->execute(INSERT_SQL); 
    // Note: since there are no results, we do not need to read any data 
    // Deleting the cursor also frees up memory used 
    delete cur_mem; 
} 

void doRequest(char* conn, char* server, String command, char* method) { 
    CiaoData data = Ciao.write(conn, server, command, method); 
    if (!data.isEmpty()) { 
    Ciao.println("State: " + String (data.get(1))); 
    Ciao.println("Response: " + String (data.get(2))); 
    Serial.println("State: " + String (data.get(1))); 
    Serial.println("Response: " + String (data.get(2))); 
    } 
    else { 
    Ciao.println ("Write Error"); 
    Serial.println ("Write Error"); 
    } 
} 

Si la connexion fonctionne ce doit imprimer « Etat: 200 » et « Réponse: 10709 ». Mais il en fait imprimé juste un 0. Si je retire ma boucle et juste écrire

void loop() {} 

il fonctionne très bien (mais ne peut évidemment pas écrire quoi que ce soit dans la base de données). Mettre le code de la boucle dans cette instruction if "if (conn.connect (adresse_serveur, 3306, utilisateur, mot de passe))" ne renvoie pas non plus le résultat correct. Donc, à ce stade, je ne sais toujours pas pourquoi ce code ne fonctionne pas, mais je pense que cela pourrait donner un aperçu plus profond d'une solution possible. également l'Arduino IDE me dit quelque chose comme ça

The sketch is using 50% of the memory

Global variables use 88% of the memory

There is only little RAM left -> stability issues possible (sorry, it's in german)

+0

ne la réponse est logique? – cagdas

+0

@cagdas Avez-vous une idée d'où vient ce comportement étrange? Ou n'importe quelle idée que faire ensuite? –

+0

Où sont vos identifiants de connexion Wi-Fi? – cagdas

Répondre

1

Vous êtes autorisé à utiliser le WiFiClient surchargé de ESP8266 en l'incluant.

#include <ESP8266WiFi.h> 
#include <MySQL_Connection.h> 
#include <MySQL_Cursor.h> 

WiFiClient client; 
MySQL_Connection conn((Client *)&client); 

Les clients du réseau ont supper sur les successions côté Arduino, donc WiFiClient besoin de mettre en œuvre les choses dont vous avez besoin.

Vous continuerez à votre code avec:

WiFi.begin(SSID,PASS); 
+0

Hey cagdas, merci pour votre réponse et désolé pour la réponse tardive. Je l'ai essayé et malheureusement ça ne marche pas vraiment pour moi. Le ESP8266WiFi.h jette l'exception "/Arduino/libraries/ESP8266WiFi/src/ESP8266WiFiType.h:26:19: erreur fatale: queue.h: Aucun fichier ou répertoire #include " –