Я устанавливаю автоматическую систему взвешивания для контроля качества. Для этого я использую библиотеку MySQL Connector / Arduino .
Все готово, и у меня остались только следующие шаги:
Обратитесь к базе данных, которая является номером партии, которую я собираюсь оценить (номер партии хранится в VARCHAR
в таблице данных qcInsecta_get
).
Включите полученное выше значение в INSERT
со значением веса, которое датчик веса возвращает мне.
Я работал с примерами basic_insert и basic_select , предоставленными автором библиотеки. Вставка значений в таблицу данных у меня не было никаких проблем (я делал это раньше со значениями проб). Однако, когда я делаю SELECT, полученное значение всегда является числовым значением, если поле базы данных числовое, например, INT. Но если поле базы данных является VARCHAR, оно возвращает 0.
Я не эксперт в C-коде, но я видел его в примере:
head_count = atol(row->values[0]);
И atol
преобразует строку в ее числовое значение. Я пытался использовать другие формы или конвертеры, чтобы иметь возможность сделать SELECT и получить значение из базы данных, но это было невозможно для меня. Как я могу решить эту проблему?
Код, выполняющий SELECT с использованием платы NODEMCU V3:
#include <ESP8266WiFi.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
char ssid[] = ""; // SSID NAME
char pass[] = ""; // SSID PASSWORD
IPAddress server_addr(xxx, xxx, x, xxx);
char user[] = "";
char password[] = "";
char query[] = "SELECT batchnumber FROM registro.qcInsecta_get ORDER BY id DESC LIMIT 1";
WiFiClient client;
MySQL_Connection conn((Client *)&client);
void setup() {
delay(500);
Serial.begin(115200);
WiFi.begin(ssid, pass);
if (conn.connect(server_addr, 3306, user, password)) {
delay(100);
Serial.println(F("Connected"));
}
else {
Serial.println();
conn.close();
if (conn.connect(server_addr, 3306, user, password)) {
delay(500);
}
else {
Serial.println("...");
}
}
}
void loop() {
delay(1000);
row_values *row = NULL;
long head_count = 0;
Serial.println("1) Demonstrating using a cursor dynamically allocated.");
// Initiate the query class instance
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
// Execute the query
cur_mem->execute(query);
// Fetch the columns (required) but we don't use them.
column_names *columns = cur_mem->get_columns();
// Read the row (we are only expecting the one)
do {
row = cur_mem->get_next_row();
if (row != NULL) {
head_count = atol(row->values[0]);
}
} while (row != NULL);
// Deleting the cursor also frees up memory used
delete cur_mem;
// Show the result
Serial.print(" Batch number = ");
Serial.println(head_count);
delay(500);
}
О базе данных:
| qcInsecta | CREATE TABLE `qcInsecta` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`batchnumber` varchar(30) NOT NULL,
`weight` float NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `batchnumber` (`batchnumber`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 |
MariaDB [registro]> SELECT * FROM qcInsecta;
+----+-------------+--------+---------------------+
| id | batchnumber | weight | created_at |
+----+-------------+--------+---------------------+
| 5 | COL-01-05 | 35 | 2019-06-06 17:04:38 |
| 16 | COL-01-01 | 22 | 2019-06-06 18:57:02 |
| 17 | COL-01-01 | 22 | 2019-06-06 18:57:02 |
| 18 | COL-01-01 | 25 | 2019-06-06 21:52:02 |