Questa è la configurazione di massima del sistema:
Ho un Arduino Nano con una serie di sensori per una stazione meteo.
Collegato a questo Arduino ho un modulo RTX HC-12 che trasmette i dati.
Questo è il codice usato:
char buf[200];
String postStr = "";
postStr+=String(C_temp); // Temperature
postStr+=",";
postStr+=String(humidity); // pressure
postStr+=",";
postStr+=String(pressure); // pressureUVIndex
postStr+=",";
postStr+=String(F_temp); // UVIndex
postStr+=",";
postStr+=String("field5"); // Wind Speed
postStr+=",";
postStr+=String("field6"); // Wind Direction
postStr+=",";
postStr+=String("field7"); // rainTicks
postStr+=",";
postStr+=String("field8"); // batteryVolt
postStr.toCharArray(buf,postStr.length()+1);
HC12.println(buf);
delay(5000);
La trasmissione funziona senza alcun problema oramai da giorni e senza errori, e nel frattempo monitoravo i consumi coasì da calibrare la cella fotovoltaica e la durata/ricarica della batteria.
Questi dati vengono ricevuti sempre con lo stesso modulo HC-12 da un ESP32 C3-F12, il quale ha il compito di ricevere le informazioni e di scriverle in un database MySQL in realtà un MariaDB presente nel NAS della rete LAN domestica.
I dati vengono ricevuti sempre senza errori e li posso visualizzare sul monitor seriale.
I test di collegamento al database funzionano senza problemi e funziona anche l'inserimento in un database di test (provato con due dati di esempio, impostati a mano).
Il problema attuale è che non riesco a costruire una query in grado di inserire i dati che ricevo dalla seriale.
Prima inviavo delle Stringhe ora sto provando con dei char, ma siccome sono una foca in C non sono in grado di convertire questi dati cosi da creare l'istruzione e poterli registrare nel database.
Qualche anima gentile è in grado di darmi una mano ?
Questo è il codice usato nel ESP32 (mi scuso per il pasticcio di rem presenti nel codice):
#include <MySQL_Generic.h>
#include "Credentials.h"
#define MYSQL_DEBUG_PORT Serial
// Debug Level from 0 to 4
#define _MYSQL_LOGLEVEL_ 1
IPAddress server(10,20,1,21);
uint16_t server_port = 3306; //3306;
char default_database[] = "meteo"; //"test_arduino";
char default_table[] = "meteo"; //"test_arduino";
const char* ntpServer = "it.pool.ntp.org";
const long gmtOffset_sec = 0;
const int daylightOffset_sec = 3600;
const long Latitude = 41.353333;
const long Longitude = 19.456667;
const long elevation = 10;
char created_at,field1,field2,field3,field4,field5,field6,field7,field8;
// Sample query
const char INSERT_SQL[] = "INSERT INTO meteo (created_at,field1,field2,field3,field4,field5,field6,field7,field8,latitude,longitude,elevation) VALUES (";
//('$created_at','$field1','$field2','$field3','$field4','$field5','$field6','$field7','$field8','$Latitude','$Longitude','$elevation') ");
MySQL_Connection conn((Client *)&client);
MySQL_Query *query_mem;
// Replace with your network credentials
const char* ssid = "MYHOME2"; // Input your wifi network name
const char* pass = "password"; // Input your wifi password
void runInsert() {
// Initiate the query class instance
MySQL_Query query_mem = MySQL_Query(&conn);
if (conn.connected()) {
//String INSERT_DATA = INSERT_SQL = INSERT_SQL + " (" + created_at + Data + Latitude + Longitude + elevation + ") ";
//MYSQL_DISPLAY(INSERT_DATA);
//Serial.println(INSERT_DATA);
// Execute the query
// KH, check if valid before fetching
/*
if ( !query_mem.execute(INSERT_DATA.c_str()) ) {
MYSQL_DISPLAY("Insert error");
}
else
{
MYSQL_DISPLAY("Data Inserted.");
}
*/
}
else
{
MYSQL_DISPLAY("Disconnected from Server. Can't insert.");
}
}
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
//Serial.println(&timeinfo,"%Y%m%d-%H%M%S");
char created_at[17];
strftime(created_at, 17, "%Y%m%d-%H%M%S", &timeinfo);
Serial.println(created_at);
}
void setup() {
Serial.begin(115200);
while (!Serial && millis() < 5000); // wait for serial port to connect
Serial1.begin(115200); // Serial port to HC12
while (!Serial1 && millis() < 5000); // wait for serial port to connect
// Connect to Wi-Fi network with SSID and password
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
MYSQL_DISPLAY0(".");
}
// Init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
MYSQL_DISPLAY1("\nStarting Basic_Insert_ESP on", ARDUINO_BOARD);
MYSQL_DISPLAY(MYSQL_MARIADB_GENERIC_VERSION);
// Begin WiFi section
MYSQL_DISPLAY1("Connecting to", ssid);
MYSQL_DISPLAY3("Connecting to SQL Server @", server, ", Port =", server_port);
MYSQL_DISPLAY5("User =", user, ", PW =", password, ", DB =", default_database);
}
//COM7
void loop() {
if (Serial1.available()) { // If HC-12 has data
//char Data[200];
char Data[200] = {(char)Serial1.read()};
//char X = INSERT_SQL + " (" + Data + ") ";
char INSERT_DATA[200];
strcpy(INSERT_DATA, INSERT_SQL);
strcat(INSERT_DATA, "20230805-121510,");
strcat(INSERT_DATA, Data);
strcat(INSERT_DATA, ") ");
Serial.write(INSERT_DATA); // Send the data to Serial monitor
Serial.println("");
/*
// Serial.write(Serial1.read());
Serial.println("");
printLocalTime(); // Print Time
Serial.println("");
MYSQL_DISPLAY("Connecting...");
if ( conn.connect(server, server_port, user, password) )
if ( conn.connectNonBlocking(server, server_port, user, password) != RESULT_FAIL) {
delay(500);
runInsert();
conn.close(); // close the connection
}
else
{
MYSQL_DISPLAY("\nConnect failed. Trying again on next iteration.");
}
*/
}
}