Sommario:
2025 Autore: John Day | [email protected]. Ultima modifica: 2025-01-13 06:57
In questo tutorial spiegherò la lettura del contenuto di umidità nel suolo utilizzando esp32 e quindi l'invio dei valori alla piattaforma cloud IoT thingsio.ai.
Fase 1: COMPONENTI
Componenti hardware:
1. scheda di sviluppo esp32
2. Sensore del suolo
3. Cavi del ponticello
Software:
1. Arduino IDE
2. Thingsio.ai
Fase 2: CONNESSIONI
Sensore di umidità del suolo -----------------------Scheda esp32
VCC --------------------------3V3
GND --------------------------------------- GND
A0 --------------------------VP
Fase 3: CODIFICA:
#includere
#includere
#includere
int conteggio=0, i, m, j, k;
int t;
int pin_sensore = A0;
int valore;
//////////////////////////////////////// TUTTE LE DICHIARAZIONI
per CLOUD //////////////////////////////
const char* host = "api.thingsai.io"; // OPPURE host =
devapi2.thethingscloud.com
const char* post_url = "/devices/deviceData"; // O
/api/v2/thingscloud2/_table/data_ac
const char* time_server =
"baas.thethingscloud.com"; //questo serve per convertire il timestamp
const int httpPort = 80;
const int httpsPort = 443;
const char* server =
"api.thingsai.io"; // URL del server
char timestamp[10];
WiFi Multi WiFi Multi;
// Usa la classe WiFiClient per creare connessioni TCP
client WiFi Client;
////////////////////////////////////// ORARIO
Funzione CALCOLO//////////////////////////////////////
int GiveMeTimestamp()
{
unsigned lungo
timeout = millis();
//client WiFiClient;
mentre
(cliente.disponibile() == 0)
{
if (milli() -
timeout > 50000)
{
cliente.stop();
restituisce 0;
}
}
mentre (client.disponibile())
{
Linea di stringa =
client.readStringUntil('\r'); //indexOf() è una funzione per cercare smthng, restituisce -1 se non trovata
int pos =
line.indexOf("\"timestamp\""); //cerca "\"timestamp\"" dall'inizio della risposta ottenuta e copia tutti i dati dopo, sarà il tuo timestamp
if (pos >=
0)
{
intj = 0;for(j=0;j<10;j++)
{timestamp[j] = riga[pos + 12 + j];
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
configurazione nulla()
{Serial.begin(115200);Serial.println("Lettura dal sensore…");
ritardo (2000);
// Iniziamo da
connessione a una rete WiFi
WiFiMulti.addAP("Nome_Wifi", "Wifi_Password");
Serial.println();
Serial.println();Serial.print("Attendi WiFi… ");while(WiFiMulti.run() != WL_CONNECTED) {Serial.print(".");
ritardo (500);
}Serial.println("");Serial.println("WiFi connesso");
Serial.println( IP
indirizzo: );Serial.println(WiFi.localIP());
ritardo (500);
}
ciclo vuoto()
{
{
/////////////////////////////////////// INVIA LA DOMANDA E
RICEVERE LA RISPOSTA///////////////////////
valore=
analogRead(sensor_pin);
// valore =
mappa(valore, 550, 0, 0, 100);Serial.print("Mostra: ");Serial.print(valore);Serial.println("%");ritardo(1000);Serial.print("connessione a ");Serial.println(host); // rialzo definito: - host = devapi2.thethingscloud.com o 139.59.26.117
//////////////////////////////////// SNIPPET DI CODICE TIMESTAMP
/////////////////////////
Serial.println("inside ottieni timestamp\n");
Se
(!client.connect(time_server, {
Restituzione;
//*-*-*-*-*-*-*-*-*-*
}client.println("OTTIENI /api/timestamp HTTP/1.1"); //Cosa sta facendo questa parte, non l'ho capitoclient.println("Host: baas.thethingscloud.com");client.println("Cache-Control: no-cache");client.println("Token postino: ea3c18c6-09ba-d049-ccf3-369a22a284b8");
client.println();
GiveMeTimestamp();
// chiamerà la funzione che otterrà la risposta del timestamp dal server
Serial.println("timestamp ricevuto");
Serial.println(timestamp);Serial.println("dentro ThingsCloudPost");
Stringa PostValue =
"{"id_dispositivo\": 61121695918, \"id_slave\": 2";
PostValue =
PostValue + ", \"dts\":" + timestamp;
PostValue =
PostValue +", \"data\":{"MOIST\":" + value +"}"+"}";Serial.println(PostValue);
/* crea un'istanza di WiFiClientSecure */
client WiFiClientSecure;Serial.println("Connetti al server tramite la porta 443");
Se
(!client.connect(server, 443)){Serial.println("Connessione fallita!");
} altro {Serial.println("Connesso al server!");
/* crea
richiesta */client.println("POST /devices/deviceData HTTP/1.1");client.println("Host: api.thingsai.io");//client.println("Connessione: chiudi");client.println("Tipo di contenuto: application/json");
client.println( controllo cache:
senza cache");client.println("Autorizzazione: Portatore eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9. IjVhMzBkZDFkN2QwYjNhNGQzODkwYzQ4OSI.kaY6OMj5cYlkXNqC2PNTy);client.print("Lunghezza contenuto: ");
client.println(PostValue.length());client.println();client.println(PostValue);
/////////////////////////////////INSERIRE i dati sul
cloud è fatto e ora ottieni il modulo di risposta server cloud//////////////////
Serial.print( In attesa di risposta
);
mentre
(!client.disponibile()){
ritardo(50);
//Serial.print(".");
}
/* se i dati sono
disponibile quindi ricevi e stampa su Terminale */
mentre
(cliente.disponibile()) {
char c = client.read();Serial.write(c);
}
/* se la
server disconnesso, arresta il client */
Se
(!client.connected()) {Serial.println();Serial.println("Server disconnesso");
cliente.stop();
}
}
Serial.println( ////////////////////// FINE
///////////////////// );
ritardo (3000);
}
}
Fase 4: USCITA:
Viene visualizzato l'output del codice.
Passaggio 5: GRAFICO
Questa è la rappresentazione grafica dei valori che vengono letti dal sensore.
Passaggio 6:
Ecco il video completo del progetto. Grazie.