Проблемы Arduino MySQL Connector только с select

первый вопрос, который я задаю, поэтому надеюсь, что это правильное место.

У меня возникла проблема с Arduino Uno и Arduino ESP8266WiFi Shiald от WangTongze при использовании этого руководства (https://www.instructables.com/id/ESP8266-ESP-12E-UART-Wireless-WIFI-Shield-TTL-Conv/) Мне удалось подключиться к моему Wi-Fi и разместить небольшой веб-сервер.

Затем с помощью примеров библиотеки коннекторов MySql я смог выполнить простую вставку в базу данных MySQL на сервере NAS. Однако я хочу иметь возможность выбрать значение из моей БД и распечатать его на экране по какой-то причине, курсор всегда возвращает ноль. Я смог выбрать со своего ПК, используя того же пользователя. и создал пользователя francis@%, чтобы хост не был проблемой. Обратите внимание, что этот же код с некоторыми изменениями работает для вставки записи в ту же таблицу. Есть ли что-то, что мне не хватает? Ниже приведен код:

//#include <WiFi.h> // Используйте это для WiFi вместо Ethernet.h
#include <WiFiEsp.h> //используем для ESP8266
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

// Эмулировать Serial1 на контактах 2/3, если они отсутствуют
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(2, 3); // прием, передача
#endif

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress server_addr(192,168,x,x); // IP сервера MySQL здесь
char user[] = "francis";
char password[] = "xxxxxx";

// Пример карты Wi-Fi
char ssid[] = "PintoLoco"; // SSID вашей сети (имя)
char pass[] = "xxxxxxxx"; // ваш сетевой пароль

//клиент WiFiClient; // Используйте это для WiFi вместо EthernetClient
WiFiEspClient client; // Используйте это для ESP8266
MySQL_Connection conn((Client *)&client);
MySQL_Cursor cur = MySQL_Cursor(&conn);

char query[] = "SELECT Value FROM Peceras.Parameters ";

void setup() {

  Serial.println("Starting....");
  Serial.begin(115200);
  // инициализируем модуль ESP
  WiFi.init(&Serial);
  Serial.println("Connecting to WiFi");

  // Начать раздел Wi-Fi
  int status = WiFi.begin(ssid, pass);
  while(status != WL_CONNECTED){
      status = WiFi.begin(ssid, pass);
    }
  // вывести информацию о соединении:

  Serial.println("Connected to network");
  IPAddress ip = WiFi.localIP();
  Serial.print("My IP address is: ");
  Serial.println(ip);

  // Завершить раздел Wi-Fi

  Serial.println("Connecting...");
  if (conn.connect(server_addr,3306,user,password)) {
  delay(1000);
  }
  else
  Serial.println("Connection failed.");
}
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
void loop() {
  row_values *row = NULL;
  long head_count = NULL;
column_names *cols = cur_mem->get_columns();
cur_mem->execute(query);
  // Выполнить запрос
  do {
    row = cur_mem->get_next_row();
    if (row != NULL) {
      for (int f = 0; f < cols->num_fields; f++) {
        head_count = atoi(row->values[f]);
          Serial.print("Ingestelde Temperatuur:  ");
          Serial.println(head_count);
        if (f < cols->num_fields-1) {
          Serial.println(',');

        }
      }
      Serial.println();
    }
  } while (row != NULL);
  // Удаление курсора также освобождает используемую память
  delete cur_mem;
  delay(2000);
}

, 👍1

Обсуждение

Я мало знаю о базах данных MySQL и абсолютно ничего не знаю о клиенте, который вы используете на своем Arduino. Так что мои подсказки - это всего лишь дикие догадки ;-): Вы не закончили оператор SQL точкой с запятой. Обычно это не проблема, потому что клиентская библиотека делает это за вас, но этот клиент может быть исключением. Вы определяете курсор cur, который никогда не используете. Возможно, клиентская библиотека может обрабатывать только один активный курсор. Вы выбираете только одно поле «Значение», но перебираете список полей. Это не проблема, если поле «Значение» существует. Возможно, вы могли бы попробовать: "SELECT * FROM Peceras.Parameters;", @Peter Paul Kiefer

Спасибо, Питер, за ваш ответ, я попробовал ваши советы и, к сожалению, получил тот же результат. База данных — это всего лишь одна таблица с 3 столбцами, а значение — одно. Я не уверен и думаю, что получение данных при выполнении команды может быть медленным? вне идей, @Francis Manuel Astley Richmond

Извините, я не понял, что вы использовали последовательный интерфейс для обычной связи Serial to USB, а также для подключения к экрану WIFI. Это не будет работать. Программа определяет «Serial1», который вы можете использовать для подключения к плате Shield, но вам необходимо соединить контакты TX и RX платы с контактами D2 и D3 Arduino с помощью проводов. (Это было описано в инструкциях, на которые вы ссылались). Я добавил ответ: для меня проще писать код, чем писать текст. ;-) Я тоже не понимал, что вы снова и снова закрываете курсор в цикле for, а открываете его только один раз., @Peter Paul Kiefer


1 ответ


1

У меня нет доступа к компилятору, поэтому могут быть ошибки.

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

#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(2, 3); // прием, передача
#endif

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress server_addr(192,168,x,x);
char user[] = "francis";
char password[] = "xxxxxx";

char ssid[] = "PintoLoco";
char pass[] = "xxxxxxxx";

WiFiEspClient client;
MySQL_Connection conn( (Client *) &client );
MySQL_Cursor *cur_mem = null;

// PPK: некоторые системы баз данных чувствительны к регистру
// поэтому Peceras.Parameters не совпадает с peceras.parameters
// проверяем, правильно ли названы таблицы и поля.
char query[] = "SELECT Value FROM Peceras.Parameters";

void setup() 
{
  Serial.begin( 115200 );
  Serial1.begin( 115200 ); 

  Serial.println( "Connecting to WiFi" );
  WiFi.init( &Serial1 );
  int status = WiFi.begin( ssid, pass );
  while( status != WL_CONNECTED )
  {
    status = WiFi.begin(ssid, pass);
  }

  Serial.println( "Connected to network" );
  IPAddress ip = WiFi.localIP();
  Serial.print( "My IP address is: " );
  Serial.println( ip );

  Serial.println( "Connecting DB ..." );
  if ( conn.connect( server_addr, 3306, user, password ) ) 
  {
    Serial.println( "DB connected." );
    cur_mem = new MySQL_Cursor( &conn );
    row_values *row = NULL;
    long head_count = NULL;
    column_names *cols = cur_mem->get_columns();

    cur_mem->execute(query);

    do 
    {
      row = cur_mem->get_next_row();
      if ( row != NULL ) 
      {
        for ( int f = 0; f < cols->num_fields; f++ ) 
        {
          head_count = atoi( row->values[f] );
          Serial.print( "Ingestelde Temperatuur:  ");
          Serial.println( head_count );
          if ( f < cols->num_fields - 1 ) 
          {
            Serial.println(',');
          }
        }
        Serial.println();
      }
    } while (row != NULL);

    // Удаление курсора также освобождает используемую память
    // PPK: я не уверен, что это хорошая идея, я не знаю
    delete cur_mem;
  }
  else
  {
    Serial.println( "DB Connection failed." );
  }
}

void loop() 
{
  // PPK: я бы порекомендовал сделать выбор в разделе настройки
  // Похоже, вы хотите запустить его только один раз
}

ОБНОВЛЕНО

Обратите внимание, что этот код работает только в том случае, если вы подключите последовательные контакты программного обеспечения D2, D3 к соответствующим контактам RX и TX на плате Shield. Вы должны согнуть контакты (P0-P3) экрана, чтобы отсоединить их от Arduino. Затем вы должны подключить D2 и D3 к P0 и P1. Это описано в шаге 1 инструкций, на которые вы ссылаетесь в вопросе. См. рисунок в конце шага 1. https:/ /www.instructables.com/id/ESP8266-ESP-12E-UART-Wireless-WIFI-Shield-TTL-Conv/

,

Спасибо Питер за ответ, я попробовал этот код, и теперь он не запускает модуль Esp, я получаю тайм-аут: [WiFiEsp] >>> TIMEOUT >>> [WiFiEsp] Не удается инициализировать модуль ESP., @Francis Manuel Astley Richmond