Envoi de données vers un serveur

Bonjour,

Je souhaite récupérer des données d’un capteur et les envoyer via GSM pour les enregister sur une base de données. Je ne souhaite pas qu’à terme l’arduino soit connecté à un ordinateur.
J’aimerais savoir si en faisant une requête HTTP avec client.print et client.write, j’obtiendrai ce que je veux.
Je n’ai pas encore l’hébergement pour mon serveur et la carte sim. J’aimerais valider mon code pour que tout soit prêt dès que je les aurais. Je possède un arduino uno et un shield GSM.

N’hésitez pas à faire des remarques sur mon code, je ne sais pas s’il est bien optimisé.

Voici mon code :

#include <TimeLib.h>
#include "arduino_secrets.h" 
#include <GSM.h>
#include <Ethernet.h>
#include <SPI.h>


int temps= minute();
int duree= second();
int i;
float somDeb ;
float moyDeb;
int pinContact = 10;
boolean connected = false;
boolean Contact=digitalRead(pinContact);
EthernetClient client;


//envoi
// PIN Number
const char PINNUMBER[]     = SECRET_PINNUMBER;

// APN data, données orange
const char GPRS_APN[]      = SECRET_GPRS_APN;
const char GPRS_LOGIN[]    = SECRET_GPRS_LOGIN;
const char GPRS_PASSWORD[] = SECRET_GPRS_PASSWORD;

//Données du serveur
char writeAPIKey[]      = SECRET_WRITE_APIKEY;
char readAPIKey[]       = SECRET_READ_APIKEY;
char channelID[]        = SECRET_CHANEL_ID;

// initialize the library instance
//GSMSSLClient client;
GSM gsmAccess;
GPRS gprs;
GSMScanner scanner; 

// Domain name and port that we will connect too (for example: api.thingspeak.com)
char server[] = "api.thingspeak.com";
int port = 443; // port 443 is the default for HTTPS


void setup() {

 
  Serial.begin(9600); // initialisation de la connexion série
  somDeb = 0;
  i = 0;

}

void loop() {

   while (!connected) 
  {
    if ((gsmAccess.begin(pinContact) == GSM_READY) &&
        (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) == GPRS_READY)) 
    {
      connected = true;
    } 
    else 
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  if (Contact)
    {
    if (duree>59)
    {
      duree= 1+ minute();
      float debit= 0.1/((duree*60)/3600);
      Serial.println("duree:"); 
      Serial.println(duree*60);//renvoi le temps si contact
      Serial.println("debit:");
      Serial.println(debit);
      somDeb = somDeb + debit ;
      i = i+1;
      delay (1000);
      duree= 0; 
    }

    else {
      float debit= 0.1/(duree/3600);
      Serial.println("duree:"); 
      Serial.println(duree);//renvoi le temps si contact
      Serial.println("debit:");
      Serial.println(debit);
      somDeb = somDeb + debit ;
      i = i+1;
      delay (1000);
      duree=0;
  }}
    else {
    Serial.println("Pas de contact");
    }
    
 if (temps=10){
      moyDeb = somDeb/i;
     // Make a HTTP request:
    client.print("GET ");
    //client.print(path);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(server);
    client.println("Connection: close");
    client.println();
 }    else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
 }

     if (client.available()) {
      client.write(moyDeb);
      Serial.print(moyDeb);
      temps=0; 
      somDeb=0;
      i=0;
      moyDeb=0;
     
     }
     
}

Merci d’avance pour vos réponses.

quelle est la librairie #include <Ethernet.h> que vous souhaitez utiliser? gère-t-elle votre GSM où est-ce celle qui est prévue pour un shield Ethernet ?

Dans le second cas ça ne va bien sûr pas fonctionner, il n’y a pas un OS sur votre arduino qui fait une couche d’abstraction entre un service transport et la couche physique…

Votre code devra utiliser le GSM pour ouvrir une session TCP et balancer une requête.

Merci pour votre réponse. J'utilise la librairie ethernet pour pouvoir utiliser la fonction "client". C'est la seule fonction que j'ai trouvé afin d'interagir avec un serveur. Je ne sais pas si elle peut fonctionner sans connection ethernet.

Connaissez-vous une autre fonction afin d'écrire dans un serveur spécialement pour le GSM?

En effet, je viens de voir qu’elle est censée fonctionner avec un shield ethernet donc ça ne marcherait pas pour moi. Mais j’ai aussi vu qu’il y avait la fonction client.read et client.write dans la librairie GSM donc je vais utiliser ça.

il y a plein de librairies GSM différentes en fonction des types de modem - faudrait savoir laquelle vous utilisez

J'utilise le shield suivant :https://www.gotronic.fr/art-shield-gprs-iot-tel0089-25733.htm

donc le module est un SIM800C faites une recherche de librairie IP pour ce module GPRS

par exemple j’ai vu ce post là qui envoie par HTPP des données de capteurs…

ça ressemble à votre projet…

Bonsoir
Pour ce module et l'application envisagée voir du côte de la librairie TinyGSM (=sous-traiter les commandes AT !!)
Deux exemples peuvent servir de base à l'envoi de données vers ThingSpeak :
HTTPClient
MQTTClient
puisque l'API de ThingSpeak accepte les 2 méthodes.

pas encore testé de mon côté, ça parait faisable, voir içi un code pour un projet de traçage GPS

Merci pour vos réponses.
La librairie TinyGSM a l'air intéressante pour mon projet. Je me renseigne dessus.

Donc "client.write" ne permet pas d'écrire des données sur un serveur? Que fait-il alors ?
Est-il possible de faire une requête HTTPS pour avoir plus de sécurité ?