แนะนำ 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 ยังไงหรอครับ
ผมไม่เข้าใจว่า esp มันเข้าไปเกี่ยวกับ firewall ยังไงหรอครับ
อันนี้คือกรณีโค้ตเขียน flow ไม่ดีไปขัดกันเองหรือมีบางฟังก์ชันทำงาน แล้วไปกวนกานจับ WiFi
ผมหมายถึงว่า ผมอาจจะปิดพอร์ตในไฟวอล ไว้เลยทำให้มันเข้าถึงดาต้าเบสไม่ได้ เลยขึ้นเออเร่อแบบนี้ เเต่สรุปคือเป็นที่ flow ของโค้ดตัวเอง
ลองปิด firewall ดูหรือยังครับ
เปิดพอร์ต 3306 ดูเเล้วครับ เเล้วก็ลองรันเเค่ตัวโค้ด connect database อย่างเดียวไม่รวมโค้ดตัวอื่นก็เหมือนเดิมเลยครับ
เป็นไงบ้างครับเคสนี้อัพเดทกันหน่อย
connect ไม่ได้ครับ TT
วางโค้ตล่าสุดให้ดูหน่อยครับ
ผมลองโค้ดด้านบนเลยครับ ลองกับ 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 เราเองได้รึป่าวตอนนี้