แนะนำ lib ที่ดึงค่าจาก Sql ที่ select ใน arduino

แนะนำ lib ที่ดึงค่าจาก Sql ที่ select ใน arduino เลย แบบไม่ต้องไปเขียนใน php ก่อนมีมั้ยครับ

ทำได้ครับ น่าสนใจนะ ลองดูข้อมูลที่ให้แล้วดูว่าได้ไหม เอามาอัพเดทกันด้วยนะครับ ผมก็อยากรู้ 555

โค้ตประมาณนี้

#include <ESP8266WiFi.h>
#include <SPI.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#define SS_PIN D4
#define RST_PIN D2
#include <stdlib.h>
#include <stdio.h>

#include "arduino_secrets.h"

// DEFINIÇÕES
int f;

// DECLARAÇÃO DE VARIÁVEIS PARA WIFI
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;        // your network password
int status = WL_IDLE_STATUS;      // status

// DECLARAÇÃO DE VARIÁVEIS PARA MySQL
IPAddress server_addr(85, 10, 205, 173);  // IP of the MySQL *server* here
char user[] = SECRET_USERDB;              // MySQL user login username
char password[] = SECRET_PASSDB;          // MySQL user login password

const char SELECT_POP[] = "SELECT altura FROM projrfid.Dados WHERE tag = '709'";
char query[128];

float variable;

// INSTANCIANDO OBJETOS
WiFiClient client;
MySQL_Connection conn((Client *)&client);
// Create an instance of the cursor passing in the connection
MySQL_Cursor cur = MySQL_Cursor(&conn);

// DECLARAÇÃO DE FUNÇÕES
void conectaWifi();

// ***************** INÍCIO DO SETUP *************************
void setup() {
  Serial.begin(115200);

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
 
  while (!Serial) {
    ; // ESPERA O SERIAL ESTAR PRONTO 
  }

  conectaWifi();

  // CONECTA NO MySQL
  while (!conn.connect(server_addr, 3306, user, password)) {
    Serial.println("Conexão SQL falhou.");
    conn.close();
    delay(1000);
    Serial.println("Conectando SQL novamente.");
  }
  Serial.println("Conectado ao servidor SQL.");
  digitalWrite(LED_BUILTIN, HIGH);
   
}
// ***************** FIM DO SETUP ***************************

// ***************** INÍCIO DO LOOP *************************
void loop() {
   delay(1000);
  
  // Initiate the query class instance
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  // Supply the parameter for the query
  // Here we use the QUERY_POP as the format string and query as the
  // destination. This uses twice the memory so another option would be
  // to allocate one buffer for all formatted queries or allocate the
  // memory as needed (just make sure you allocate enough memory and
  // free it when you're done!).
  sprintf(query, SELECT_POP, 9000000);
  // Execute the query
  cur_mem->execute(query);
  // Fetch the columns and print them
  column_names *cols = cur_mem->get_columns();
  
  // Read the rows and print them
  row_values *row = NULL;
  do {
    row = cur_mem->get_next_row();
    if (row != NULL) {
      for (f = 0; f < cols->num_fields; f++) {
        Serial.print(row->values[f]);
        
        float ftemp = atof(row->values[f]); //converte char* em float
        Serial.printf("conversao: %.2f",ftemp);
       
        if (f < cols->num_fields-1) {
          Serial.print(',');
        }
      }    
      Serial.println();
    }
  } while (row != NULL);
  // Deleting the cursor also frees up memory used
  delete cur_mem;
}
// ***************** FIM DO LOOP ***************************

void conectaWifi() {
  // check for the WiFi module:
  Serial.begin(115200);
  
  WiFi.begin(SECRET_SSID, SECRET_PASS);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(SECRET_SSID);

  WiFi.begin(SECRET_SSID, SECRET_PASS);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
}

สามารถใช้ sprintf เพื่อสร้างคำสั่ง select จริง

void setup()
{
  Serial.begin(57600);

  // variable to put in select statement
  int id = 709;

  // create a select statement with id included; caters for 10-digit number (or 9-digit with sign)
  char select[sizeof(SELECT_POP) + 10];
  sprintf(select, SELECT_POP, id);

  // show the select statement
  Serial.println(select);
}
const char SELECT_POP2[] = "SELECT altura FROM projrfid.Dados WHERE tag = ";

void setup()
{
  Serial.begin(57600);

  // variable to put in select statement
  int id = 709;

  // send select statement
  Serial.print(SELECT_POP2);
  Serial.print("'");
  Serial.print(id);
  Serial.print("'");
}

ลองตามไปดูตัวอย่างการใช้งานนะ

หาดาวน์โหลด lib arduino_secrets.h ไม่ได้เลยครับ

เราสร้างในโฟล์เดอร์เราก็ได้ครับ

สร้างเสร็จไปโยนใส่พาร์ท arduino/lib เลยมั้ยครับ

โยนเข้าโฟล์เดอร์เดียวกับโค้ตครับ

แปลกๆ เข้าถึงเซิฟเวอร์ไม่ได้ ไม่แน่ใจเพราะ firewall ปิดพอร์ตไว้ ตัว arduino ide นี้เปิด debug ยังไงหรอครับ


ภาพ error

ผมไม่เข้าใจว่า esp มันเข้าไปเกี่ยวกับ firewall ยังไงหรอครับ

อันนี้คือกรณีโค้ตเขียน flow ไม่ดีไปขัดกันเองหรือมีบางฟังก์ชันทำงาน แล้วไปกวนกานจับ WiFi

ผมหมายถึงว่า ผมอาจจะปิดพอร์ตในไฟวอล ไว้เลยทำให้มันเข้าถึงดาต้าเบสไม่ได้ เลยขึ้นเออเร่อแบบนี้ เเต่สรุปคือเป็นที่ flow ของโค้ดตัวเอง :sweat_smile:

ลองปิด firewall ดูหรือยังครับ

เปิดพอร์ต 3306 ดูเเล้วครับ เเล้วก็ลองรันเเค่ตัวโค้ด connect database อย่างเดียวไม่รวมโค้ดตัวอื่นก็เหมือนเดิมเลยครับ

เป็นไงบ้างครับเคสนี้อัพเดทกันหน่อย

connect ไม่ได้ครับ TT
image

วางโค้ตล่าสุดให้ดูหน่อยครับ

ผมลองโค้ดด้านบนเลยครับ ลองกับ php myadmin
ไฟล์ arduino_secrets.h ก็วางไว้ในที่เดียวกัน

#include <ESP8266WiFi.h>
#include <SPI.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#define SS_PIN D4
#define RST_PIN D2
#include <stdlib.h>
#include <stdio.h>

#include "arduino_secrets.h"

// DEFINIÇÕES
int f;

// DECLARAÇÃO DE VARIÁVEIS PARA WIFI
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;        // your network password
int status = WL_IDLE_STATUS;      // status

// DECLARAÇÃO DE VARIÁVEIS PARA MySQL
IPAddress server_addr(127, 0, 0, 1);  // IP of the MySQL *server* here
char user[] = "root";              // MySQL user login username
char password[] = "";          // MySQL user login password

const char SELECT_POP[] = "SELECT * FROM test";
char query[128];

float variable;

// INSTANCIANDO OBJETOS
WiFiClient client;
MySQL_Connection conn((Client *)&client);
// Create an instance of the cursor passing in the connection
MySQL_Cursor cur = MySQL_Cursor(&conn);

// DECLARAÇÃO DE FUNÇÕES
void conectaWifi();

// ***************** INÍCIO DO SETUP *************************
void setup() {
  Serial.begin(115200);

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
 
  while (!Serial) {
    ; // ESPERA O SERIAL ESTAR PRONTO 
  }

  conectaWifi();

  // CONECTA NO MySQL
  while (!conn.connect(server_addr, 3306, user, password)) {
    Serial.println("Conexão SQL falhou.");
    conn.close();
    delay(1000);
    Serial.println("Conectando SQL novamente.");
  }
  Serial.println("Conectado ao servidor SQL.");
  digitalWrite(LED_BUILTIN, HIGH);
   
}
// ***************** FIM DO SETUP ***************************

// ***************** INÍCIO DO LOOP *************************
void loop() {
   delay(1000);
  
  // Initiate the query class instance
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  // Supply the parameter for the query
  // Here we use the QUERY_POP as the format string and query as the
  // destination. This uses twice the memory so another option would be
  // to allocate one buffer for all formatted queries or allocate the
  // memory as needed (just make sure you allocate enough memory and
  // free it when you're done!).
  sprintf(query, SELECT_POP, 9000000);
  // Execute the query
  cur_mem->execute(query);
  // Fetch the columns and print them
  column_names *cols = cur_mem->get_columns();
  
  // Read the rows and print them
  row_values *row = NULL;
  do {
    row = cur_mem->get_next_row();
    if (row != NULL) {
      for (f = 0; f < cols->num_fields; f++) {
        Serial.print(row->values[f]);
        
        float ftemp = atof(row->values[f]); //converte char* em float
        Serial.printf("conversao: %.2f",ftemp);
       
        if (f < cols->num_fields-1) {
          Serial.print(',');
        }
      }    
      Serial.println();
    }
  } while (row != NULL);
  // Deleting the cursor also frees up memory used
  delete cur_mem;
}
// ***************** FIM DO LOOP ***************************

void conectaWifi() {
  // check for the WiFi module:
  Serial.begin(115200);
  
  WiFi.begin(SECRET_SSID, SECRET_PASS);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(SECRET_SSID);

  WiFi.begin(SECRET_SSID, SECRET_PASS);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
}

ตอนนี้ เชื่อม WiFi ได้ปกติใช่ไหม

เราเข้าหน้า Admin mySQL เราเองได้รึป่าวตอนนี้


ทดสอบ wi fi ปกติครับ
127, 0, 0, 1 ผมใส่ไปเพราะเป็น defual ของ localhost xampp หรือเปล่าครับถ้าผมจำไม่ผิด