Premessa d’obbligo viste le mie limitatissime conoscenze del benamato non per me, ma naturalmente per voi: C o C++.
Quando ho un grande problema in corso cerco di dividerlo e risolverlo in sotto-problemi.
È per questo che sono partito nel descrivere all’inizio del mio topic solo la parte String.
A cosa mi serve tutto questo.
Sul -mio sito web- ho creato una pagina in html e php con lo scopo di poter comandare determinate cose.
Esse devono essere disponibili a me o ad altri usando una semplice connessione a internet e, non meno importante, poterlo fare da qualsiasi parte del globo.
Faccio alcuni esempi banali:
-
accendere le luci di casa
-
attivare un condizionatore o una caldaia
-
avvisare con una matrice LED che i campi in terra rossa non sono praticabili per la pioggia (es. tennis)
-
avvisare con una matrice LED gli orari di apertura di un negozio
-
aiutare con una matrice LED una persona disabile
-
attivare il sistema di irrigazione
-
avvisare con una matrice LED il pranzo è già pronto in frigorifero devi solo scaldarlo
-
ecc.
Banale? Credo proprio di no. Il mio progetto deve servire a più necessità.
Per cui avevo contemplato:
Qualcuno direbbe:
- Perché non hai fatto tutto su arduino o ESP compreso l’html e il php?
Rispondo semplicemente perché mi sono imbattuto in diversi ostacoli per poter trasformare una gestione local in global di un sever o client che sia (vedi Ngrok ecc. gestione del modem ecc.)
Ho un sito mio e lo gestisco a mio piacimento e, importante, è in rete disponibile ovunque io sia.
Espongo dall’inizio. Sono partito da qui per ricevere i dati dal web:
void getdata_web() {
if (wifiMulti.run() == WL_CONNECTED) {
HTTPClient http;
http.begin("http://esempio.xy/data.txt");
int httpCode = http.GET();
// Serial.println();
// Serial.print(F("HTTP code: "));
// Serial.println(httpCode);
if (httpCode > 0) {
if (httpCode == HTTP_CODE_OK) {
String data_web = http.getString();
Serial.println(data_web);
char data[data_web.length() + 1]; // +1 for the null terminator
data_web.toCharArray(data, data_web.length() + 1);
Serial.println(F("Caratteri"));
Serial.println(data); // Display the message on serial monitor
} else {
Serial.print(F("HTTP GET: Failed"));
Serial.println(http.errorToString(httpCode).c_str());
}
}
http.end();
}
}
Quello di seguito invece è il codice che ho elaborato per estrapolare i dati dal file di testo proveniente da internet salvo modifiche con vostri consigli e/o aiuti.
Chiedo cortesemente a voi se sia possibile migliorare il mio lavoro che credo sia molto elementare.
Le mie conoscenze purtroppo sono arrivate solo fino a questo.
Note aggiuntive:
Ho assegnato a tutti i testi una dimensione massima fissa di 35, per ora, poi deciderò in seguito valori diversi nel definitivo.
Ho deciso di impiegare gli array di char (non so se mi sono espresso bene) ed usare un ciclo for per la loro stampa.
Perché? Ho visto che questo sistema non mi ha creato problemi nella stampa dei testi con le matrici a led 64x64 usati per le insegne luminose.
Gli ultimi valori della stringa mi servono per i toggle switch ON - OFF che attiveranno i livelli logici delle porte di OUTPUT per attivazione di accensioni e spegnimenti vari.
Il sistema che ho usato per trasformare il carattere - 0 - zero che in realtà in ASCII è il 48 in numero reale (cioè 0) è orrendo anche se funziona.
Si tratta di questo: —> data7 = globaldata[a] - 48; <—-
Ditemi come posso fare meglio.
Ho dovuto cambiare il carattere separatore n\ della stringa e passare al - ; - punto e virgola perché mi creava dei crash continui, avrei preferito il ritorno a capo, c'è un modo per farlo?
char data1[35], data2[35], data3[35], data4[35], data5[35], data6[35];
int data7, data8, data9; // da convertire in numero
int dim_File = 0;
String data_web = "a - Testo dimensione variabile 1;b - Testo dimensione variabile 2;c - Testo dimensione variabile 3;Testo 1;Testo 2;Testo 3;1;0;1\0"; // 1;0;1 questi ultimi valori mi servono per i toggle switch ON - OFF
char globaldata[300];
void setup() {
Serial.begin(115200);
}
void loop() {
dim_File = data_web.length();
for (int a = 0; a < dim_File; a++) {
globaldata[a] = data_web[a];
}
Serial.println(F("Stringa "));
for (int k = 0; k < dim_File; k++) {
Serial.print(globaldata[k]);
}
Serial.println();
prova_stampa();
delay(2000);
}
void prova_stampa() {
int cambio_variabile = 1;
int b = 0;
for (int a = 0; a < dim_File; a++) {
if (globaldata[a] == 59) // 59 = ; carattere delimitatore
{
a = a + 1;
b = 0;
cambio_variabile++;
}
if (globaldata[a] == NULL)
{
break;
}
if (cambio_variabile == 1) {
data1[b] = globaldata[a];
b++;
}
if (cambio_variabile == 2) {
data2[b] = globaldata[a];
b++;
}
if (cambio_variabile == 3) {
data3[b] = globaldata[a];
b++;
}
if (cambio_variabile == 4) {
data4[b] = globaldata[a];
b++;
}
if (cambio_variabile == 5) {
data5[b] = globaldata[a];
b++;
}
if (cambio_variabile == 6) {
data6[b] = globaldata[a];
b++;
}
if (cambio_variabile == 7) {
data7 = globaldata[a] - 48; // è orrendo come posso fare per trasformare questo carattere in numero?
b++;
}
if (cambio_variabile == 8) {
data8 = globaldata[a] - 48; // è orrendo come posso fare per trasformare questo carattere in numero?
b++;
}
if (cambio_variabile == 9) {
data9 = globaldata[a] - 48; // è orrendo come posso fare per trasformare questo carattere in numero?
b++;
}
}
Serial.print(F("Data 1 "));
for (int k = 0; k < 35; k++) {
Serial.print(data1[k]);
}
Serial.println();
Serial.print(F("Data 2 "));
for (int k = 0; k < 35; k++) {
Serial.print(data2[k]);
}
Serial.println();
Serial.print(F("Data 3 "));
for (int k = 0; k < 35; k++) {
Serial.print(data3[k]);
}
Serial.println();
Serial.print(F("Data 4 "));
for (int k = 0; k < 35; k++) {
Serial.print(data4[k]);
}
Serial.println();
Serial.print(F("Data 5 "));
for (int k = 0; k < 35; k++) {
Serial.print(data5[k]);
}
Serial.println();
Serial.print(F("Data 6 "));
for (int k = 0; k < 35; k++) {
Serial.print(data6[k]);
}
Serial.println();
Serial.print(F("Data 7 "));
Serial.print(data7);
Serial.println();
Serial.print(F("Data 8 "));
Serial.print(data8);
Serial.println();
Serial.print(F("Data 9 "));
Serial.print(data9);
Serial.println();
}
In passato mi è stato detto che sono stato poco chiaro, così mi sembra di essere stato prolisso.
Un consiglio a chi aiuta…
Non sempre dietro un nickname c’è già una persona con una certa esperienza che forse ha bisogno solo di quel -quid- (abbastanza insignificante per gli esperti) per finire un progetto.
Il più delle volte (come ad esempio me e tanti altri) c’è un individuo che ha bisogno di qualcosa già fatto che gli servirà per capire il meccanismo, il concetto, il metodo per risolvere una determinata situazione.
Quando avrò completato anche la parte web ci risentiremo.
Buona giornata e grazie come sempre.