我可以使用我的Arduno Uno Wifi写入SQL数据库吗?

时间:2017-02-01 22:12:49

标签: mysql wifi arduino-uno esp8266 arduino-ide

我最近买了一个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;稳定问题可能   (对不起,这是德语)

1 个答案:

答案 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);