我最近买了一个Arduino Uno Wifi,以便将传感器数据从我的Arduino写入现有的MySQL数据库。我想是因为有一些现有的库(比如this一个)在以太网或wifi屏蔽的帮助下做同样的事情,它应该不是一个大问题。我在购买Uno Wifi之后发现的问题是,所有这些都需要它们的库(如Ethernet.h或Wifi.h)。我需要一个额外的盾牌来使用它们在我看来没有多大意义,因为我已经购买了一个支持wifi的Arduino。我知道有一些像ThingSpeak这样的东西得到支持,但我不想放弃我自己的数据库的灵活性,也不需要ThingSpeak为我提供的所有额外的分析服务。
所以我有点绝望的问题是 - 有没有办法用我的(全新的)Arduino Uno WIFI将简单的INSERT INTO语句写入现有数据库?
修改
我今天尝试了一些东西,这是我到目前为止所提出的:
#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;
}
这导致程序无法建立与服务器的连接,只是不断地打印“连接”到串行监视器。
编辑2:
由于@cagdas的想法首先检查连接,我想出了一些东西。 这是我的草图:
#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");
}
}
如果连接有效,则应打印出“State:200”和“Response:10709”。但它实际上只打印了0.如果我删除了我的循环而只是写
void loop() {}
它工作正常(但显然不会在数据库中写入任何内容)。将循环中的代码放入此if语句“if(conn.connect(server_addr,3306,user,password))”也不会返回正确的结果。 所以在这一点上我仍然无能为力,为什么这段代码不起作用,但我认为它可能会更深入地了解可能的解决方案。 Arduino IDE也告诉我这样的事情
草图使用了50%的内存
全局变量使用88%的内存
只剩下少量内存 - &gt;稳定问题可能 (对不起,这是德语)
答案 0 :(得分:1)
您有资格使用ESP8266的重载WiFiClient。
#include <ESP8266WiFi.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
WiFiClient client;
MySQL_Connection conn((Client *)&client);
网络客户端在Arduino方面有超级继承,因此WiFiClient需要实现您需要的东西。
您将继续使用以下代码:
WiFi.begin(SSID,PASS);