Communication PHP et Arduino avec Shield WiFi

Eléphanteau du PHP | 14 Messages

12 mars 2017, 10:49

Bonjour,

J'aurai besoin d'aide pour la communication entre PHP et Arduino.
L'Arduino étant le client et le site web le serveur.

Je voudrais, depuis une page en php qui contient une interface avec des boutons, envoyer des informations à mon Arduino pour qu'ensuite mon Arduino grâce à l'information puisse executer un programme destiné à commander un éclairage en DMX.

Il s'agit d'un projet et je dois me charger de la partie site web, la liaison doit être en WiFi.

Est-ce possible, en liaison WiFi de faire comme la vidéo 1, par exemple : Quand je clique sur le boutton de mon formulaire ça envoie un caractère à mon Arduino et mon Arduino ayant un programme avec une condition if/else exécute son programme lorsqu'il reçoit le caractère ?

Parce que la vidéo, si je ne me trompe pas, le montre avec une liaison ethernet.

Voici quelques liens de vidéos qui montre ce que je veux faire en gros :

Vidéo 1 : https://www.youtube.com/watch?v=qzPFmxzcMHE
Vidéo 2 : https://www.youtube.com/watch?v=6WALQCF34sk

Merci.

Mammouth du PHP | 1238 Messages

13 mars 2017, 13:50

d'aprés ce que tu décris et mes quelques connaissance avec Arduino, ce n'est pas comme cela que ca marche.

Si le serveur est ta page web, il faut que ton arduino consulte régulièrement le site (de préférence une version ultra simple pour faciliter le pârsing) afin de détecter les changements. cela induit forcement une latence de réaction dépendant de la complexité du projet.

J'ai fais des test avec un arduino YUN qui a sont propre serveur web et donc une interface avec le code arduino plus facile. mais le prix de départ n'est pas le même. (bien qu'en ajoutant celui du shield WIFI et un autre on arrive vite au prix du YUN)
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

13 mars 2017, 14:07

salut,

éclairer un peu la chose.

si le serveur web n'est pas sur le arduino il faut que celui puisse dialoguer avec lui.

donc soit tu utilises la solution de spols : le arduido fait des requêtes de temps en temps sur le serveur et regarde ce que ça donne (du coup latence importante vu que tu va pas faire des requêtes toute les demi seconde ;) ).

Soit le arduino est accessible sur le réseau ip (wifi ou pas même combat) et dans ce cas c'est ton serveur qui suite au clic sur le bouton du formulaire se connecte sur le arduino pour le faire bosser.

il faut voir comment ton arduino peux être contacter et la google aide pas mal
j'ai trouvé ce lien qui peux t'aider : https://openclassrooms.com/courses/perf ... seau-local (a priori avec un UNO)

La différence c'est que ton programme ne va pas créer de page web mais il va juste répondre à l'appel de ton serveur web (tu va créer une API REST FULL ;) )).
as toi de voir de quoi tu as besoin (je suppose que le parse du JSON risque de pas être simple).

vu ce que tu veux faire tu peux simplement passer des paramètres dans l'url, les récupère et ensuite les utilises comme tu veux.

je pense que c'est la solution la plus simple à utiliser, reste a voir si ton modèle le supporte.

Coté php, pour contacter ton arduino sur le réseau il y a plusieurs solutions
- file_put_contents : attention voir la configuration de php pour autoriser ce comportement http://php.net/manual/fr/filesystem.con ... -url-fopen
- utiliser curl
- connexion socket (point de départ : http://php.net/manual/fr/function.socket-create.php)

bon courage

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 14 Messages

13 mars 2017, 16:43

Merci pour vos infos.
Dans le projet il est convenu que l'arduino étant le client, fasse des requêtes pour obtenir le contenu de la page web. Mais (même si ce n'est pas à moi de la faire) comment l'arduino récupère et se sert que de certaines infos sur la page.
Je ne suis pas expert en php ni en html.
Donc coté page web, pour les boutons je créer des balises input avec comme method get pour faire passer par l'url. Mais où et comment j'écris l'info que je veux afficher quand je clique sur le bouton ? (Peut-être pas très clair :/ désolé).
Pour faire simple, j'aimerai une explication concrète au niveau du code.

Merci

Mammouth du PHP | 1238 Messages

13 mars 2017, 16:54

Si tu le vois comme cela, il te faudra forcement un moyen de stockage de donnée
base de donnée , sqLite, fichier texte sur le serveur à toi de choisir.

Dans tous les cas, tu peux commencer par le formulaire html comme tu le veux, et ensuite il te faut une analyse des retours de ce formulaire par php pour stocker les modifications et les afficher dans ton formulaire. Impossible de te donner un code tout fait mais si tu le commence, nous pourrons probablement y jeter un coup d'oeil et t'aiguiller dans une bonne direction
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

13 mars 2017, 17:49

il faut que ton serveur web expose un fichier qui retourne l'info en fonction des paramètres de l'url
c'est simple il prendre ce que l'on donne en paramètre (dans le tableau $_GET) et retourne l'info voulue.
il peut la prendre dans la base de données.

Pour ce qui est de récupérer les données d'un formulaire : http://www.lephpfacile.com/cours/8-recu ... ormulaires



coté arduino il faut voir s'il peut faire une requête réseau. a priori il y a ce qu'il faut https://www.arduino.cc/en/Tutorial/HttpClient

Fonctionnellement c'est une ânerie, l'arduino est un esclave de la partie "supervision" du coup ce n'est pas a lui de prendre la décision de savoir s'il doit ou pas effectuer une tâche ;)


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 14 Messages

13 mars 2017, 23:30

Pour la base de données, j'en ai une avec deux tables, une pour stocker les pseudo et pass des inscriptions et une pour autre chose. Je vais vous copier le code de toutes les pages comme ça ce sera plus clair pour vous.

Inscription.php
<?php
/* Indique le bon format des entêtes (par défaut apache risque de les envoyer au standard ISO-8859-1)*/
header('Content-type: text/html; charset=UTF-8');

/* Initialisation de la variable du message de réponse*/
$message = null;

/* Récupération des variables issues du formulaire par la méthode post*/
$pseudo = filter_input(INPUT_POST, 'pseudo');
$pass = filter_input(INPUT_POST, 'pass');

/* Si le formulaire est envoyé */
if (isset($pseudo,$pass)) 
{   

    /* Teste que les valeurs ne sont pas vides ou composées uniquement d'espaces  */ 
    $pseudo = trim($pseudo) != '' ? $pseudo : null;
    $pass = trim($pass) != '' ? $pass : null;
   

    /* Si $pseudo et $pass différents de null */
    if(isset($pseudo,$pass)) 
    {
    /* Connexion au serveur : dans cet exemple, en local sur le serveur d'évaluation
    A MODIFIER avec vos valeurs */
    $hostname = "localhost";
    $database = "soundlight";
    $username = "root";
    $password = "";
    
    /* Configuration des options de connexion */
    
    /* Désactive l'éumlateur de requêtes préparées (hautement recommandé)  */
    $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
    
    /* Indique le charset */
    $pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";
    
    /* Connexion */
    try
    {
      $connect = new PDO('mysql:host='.$hostname.';dbname='.$database, $username, $password, $pdo_options);
      $connect -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	  echo '';
	}
    catch (PDOException $e)
    {
      echo 'Echec de la connexion : ' .$e->getMessage();
    }
        
    
    /* Requête pour compter le nombre d'enregistrements répondant à la clause : champ du pseudo de la table = pseudo posté dans le formulaire - Explication simple
	Cela vérifie si le pseudo n'est pas déjà existant*/
    $requete = "SELECT count(*) FROM membres WHERE pseudo = ?";
    
    try
    {
      /* préparation de la requête*/
      $req_prep = $connect->prepare($requete);
      
      /* Exécution de la requête en passant la position du marqueur et sa variable associée dans un tableau*/
      $req_prep->execute(array(0=>$pseudo));
      
      /* Récupération du résultat */
      $resultat = $req_prep->fetchColumn();
      
      if ($resultat == 0) 
      /* Résultat du comptage = 0 pour ce pseudo, on peut donc l'enregistrer */
      {
        /* Pour enregistrer la date actuelle (date/heure/minutes/secondes) on peut utiliser directement la fonction mysql : NOW()*/
        $insertion = "INSERT INTO membres(pseudo,pass,date_enregistrement) VALUES(:nom, :password, NOW())";
        
        /* préparation de l'insertion */
        $insert_prep = $connect->prepare($insertion);
        
        /* Exécution de la requête en passant les marqueurs et leur variables associées dans un tableau*/
        $inser_exec = $insert_prep->execute(array(':nom'=>$pseudo,':password'=>$pass));
        
        /* Si l'insertion s'est faite correctement...*/
        if ($inser_exec === true) 
        {
          /* Démarre une session si aucune n'est déjà existante et enregistre le pseudo dans la variable de session $_SESSION['login'] qui donne au visiteur la possibilité de se connecter.  */
          if (!session_id()) session_start();
          $_SESSION['login'] = $pseudo;
	
          
          /*redirection vers une page en cas de succès*/
          header ("location:confirmation_inscription.php");
          
        }   
      }
      else
      {   /* Le pseudo est déjà utilisé */
        $message = 'Pseudo déjà utilisé, changez-le';
      }
    }
    catch (PDOException $e)
    {
      $message = 'Problème dans la requête d\'insertion';
    }	
  }
  else 
  {    /* Au moins un des deux champs "pseudo" ou "mot de passe" n'a pas été rempli*/
    $message = 'Les champs "Pseudo" et "Mot de passe" doivent être remplis.';
  }
}
?>
	
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="aaa.css">
<title>Formulaire d'inscription - SoundLight</title>



</head>
<body>

<header id="logo_titre">

<a href="connexion.php"><img src="logo_titre.png"></a>

</header>


<div class="form-style-8">
  <h2>Inscription</h2>
  <form action = "#" method = "post">
    <input class="couleur_text_form" type="text" name="pseudo" placeholder="Pseudo" />
    <input class="couleur_text_form" type="password" name="pass" placeholder="Mot de passe" />
    <input class="couleur_text_form" type="submit" value="S'inscrire"/>
	</form>
	<p id = "messageform_pieddepage"><?= $message?:'' ?></p>
	<p id="messageform_pieddepage">Déjà inscrit ? Connectez-vous <a href="connexion.php">ICI</a></p>
    <p id="messageform_pieddepage">SoundLight 2017 ©</p>
</div>


</body>
</html>
confirmation_inscription.php
<html class="confirmation_inscription">

<head>
	<meta charset="utf-8">
	<link rel="stylesheet" type="text/css" href="aaa.css">
	<title>Vous êtes inscrit !</title>
</head>

<header id="logo_titre">

<a href="connexion.php"><img src="logo_titre.png"></a>

</header>

<body>

<body>
<a href="connexion.php"><img src="pouce.png"></a>
<h2> Vous êtes désormais inscrit ! Cliquez sur l'icône ci-dessus pour vous connecter </h2>


<footer>
    <p>SoundLight 2017 ©</p>
</footer>

</body>



</html>
connexion.php
<?php
/* Indique le bon format des entêtes (par défaut apache risque de les envoyer au standard ISO-8859-1)*/
header('Content-type: text/html; charset=UTF-8');

/* Initialisation de la variable du message de réponse*/
$message = null;

/* Récupération des variables issues du formulaire par la méthode post*/
$pseudo = filter_input(INPUT_POST, 'pseudo');
$pass = filter_input(INPUT_POST, 'pass');
$numéro = filter_input(INPUT_POST, 'numéro');
$date = filter_input(INPUT_POST, 'date');

/* Si le formulaire est envoyé*/
if (isset($pseudo,$pass,$numéro,$date)) 
{
    
    /* Teste que les valeurs ne sont pas vides ou composées uniquement d'espaces */  
    $pseudo = trim($pseudo) != '' ? $pseudo : null;
    $pass = trim($pass) != '' ? $pass : null;
    $numéro = trim($numéro) != '' ? $numéro : null;
    $date = trim($date) != '' ? $date : null;
	
  /* Si $pseudo et $pass et $modèle différents de null */
  if(isset($pseudo,$pass,$numéro,$date)) 
  {
    /* Connexion au serveur : dans cet exemple, en local sur le serveur d'évaluation
    A MODIFIER avec vos valeurs */
    $hostname = "localhost";
    $database = "soundlight";
    $username = "root";
    $password = "";
    
    /* Configuration des options de connexion */
    
    /* Désactive l'éumlateur de requêtes préparées (hautement recommandé) */
    $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
    
    /* Active le mode exception */
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    
    /* Indique le charset */
    $pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";
    
    /* Connexion */
    try
    {
      $connect = new PDO('mysql:host='.$hostname.';dbname='.$database, $username, $password, $pdo_options);
    }
    catch (PDOException $e)
    {
      exit('problème de connexion à la base');
    }    
    
    /* Requête pour récupérer les enregistrements répondant à la clause : champ du pseudo et champ du mdp de la table = pseudo et mdp posté dans le formulaire */
    $requete = "SELECT * FROM membres WHERE pseudo = :nom AND pass = :password";  
	$requete2 = "SELECT * FROM modèles WHERE numéro = :num AND date_construction = :date";
    
    try
    {
      /* Préparation de la requête*/
      $req_prep = $connect->prepare($requete);
	  $req_prep2 = $connect->prepare($requete2);
      
      /* Exécution de la requête en passant les marqueurs et leur variables associées dans un tableau*/
      $req_prep->execute(array(':nom'=>$pseudo,':password'=>$pass));
	  $req_prep2->execute(array(':num'=>$numéro, ':date'=>$date));
      
      /* Création du tableau du résultat avec fetchAll qui récupère tout le tableau en une seule fois*/
      $resultat = $req_prep->fetchAll(); 
	  $resultat2 = $req_prep2->fetchAll();
      
      $nb_result = count($resultat);
	  $nb_result2 = count($resultat2);
      $nb_result_utile = $nb_result and $nb_result2;
	  
      if ($nb_result_utile == 1)
      {
        /* Démarre une session si aucune n'est déjà existante et enregistre le pseudo dans la variable de session $_SESSION['login'] qui donne au visiteur la possibilité de se connecter.  */
        if (!(session_id())) session_start();
        $_SESSION['login'] = $pseudo;
		$_SESSION['pass'] = $pass;
		$_SESSION['numéro'] = $numéro;
		$_SESSION['date'] = $date;
		
            
        header("location: membre.php");
        /*ou redirection vers une page en cas de succès ex : menu.php*/
        /*header("Location: menu.php");
        exit();*/
        
        /* Si vous voulez récupérer les données elles se trouvent dans la première et unique ligne du tableau $resultat par exemple */
        /* $result = $resultat[0];
        echo $result['pseudo'];
        echo $result['date_enregistrement'];
        */
      }
      else if ($nb_result > 1)
      {
        /* Par sécurité si plusieurs réponses de la requête mais si la table est bien construite on ne devrait jamais rentrer dans cette condition */
        $message = 'Problème de d\'unicité dans la table';
      }
      else
      {   /* Le pseudo ou le mot de passe sont incorrect */
        $message = 'Un ou plusieurs champs sont incorrects';
      }
    }
    catch (PDOException $e)
    {
      $message = 'Problème dans la requête de sélection';
    }	
  }
  else 
  {/*au moins un des deux champs "pseudo" ou "mot de passe" n'a pas été rempli*/
    $message = 'Tous les champs doivent être remplis.';
  }
}
?>


<html>

<head>
	<meta charset="utf-8">
	<title>SoundLight</title>
	<link rel="stylesheet" type="text/css" href="aaa.css">
</head>

<header id="logo_titre">

<a href="connexion.php"><img src="logo_titre.png"></a>

</header>

<body>


<div class="form-style-8">
  <h2>Connexion</h2>
  <form action = "#" method = "post">
    <input class="couleur_text_form" type="text" name="pseudo" placeholder="Pseudo" />
    <input class="couleur_text_form" type="password" name="pass" placeholder="Mot de passe" />
	<input class="couleur_text_form" type="text" name="numéro" placeholder="N° Modèle" />
	<input class="couleur_text_form" type="date" name="date" placeholder="Date de construction" />
    <input class="couleur_text_form" type="submit" value="Se connecter" />
  </form>
  <p id="messageform_pieddepage"><?= $message?:'' ?></p>
  <p id="messageform_pieddepage">Pas encore inscrit ? Inscrivez-vous <a href="inscription.php">ICI</a></p>
  <p id="messageform_pieddepage">SoundLight 2017 ©</p>
</div>


</body>



</html>
membre.php c'est la page d'interface de contrôle, là ou il y a les boutons de commande
<?php
session_start();
if(!isset($_SESSION['login'])) {die('Vous devez être enregistré pour accéder à cette partie du site');}
?>

<html>

<head>
<meta charset="utf-8">
<title>SoundLight - Espace membre</title>
<link rel="stylesheet" type="text/css" href="aaa.css">
</head>

<header id="logo_titre">

<img src="logo_titre.png">

</header>

<body>

<div class="info_membre">
<h2>BIENVENUE </br> <?php echo ucfirst($_SESSION['login']) ?> </h2><br />
<p>N° Modèle: <?php echo ($_SESSION['numéro']) ?> <p/>
<p>Date de construction: <?php echo ($_SESSION['date']) ?> </p>
<a href="deconnexion.php">Se déconnecter</a>
<p id="soundlight_info_membre">SoundLight 2017 ©</p>
</div>

<div id="interface">
<h1 id="titre_interface">INTERFACE DE CONTRÔLE</h1>
<input class="boutons_interface" type="button" value="Allumer" /> <br />
<input class="boutons_interface" type="button" value="Eteindre" /> <br />
<input class="boutons_interface" type="button" value="Rouge" /> <br />
<input class="boutons_interface" type="button" value="Bleu" /> <br />
<input class="boutons_interface" type="button" value="Vert" /> <br />
<input class="boutons_interface" type="button" value="Clignoter" /> <br />
</div>


</body>

</html>
Pour les boutons j'utilise onclik ? Je suis désolé, j'arrive pas à voir ce qu'il faut écrire. En fait c'est pas clair pour moi les requêtes.

deconnexion.php
<?php
session_start();
session_unset();
session_destroy();
header('Location: connexion.php');
exit();
?>

Eléphanteau du PHP | 14 Messages

14 mars 2017, 01:24

J'ai réussi a utilisé la technique d'écrire dans un fichier .txt

Je vous montre le code de membre.php
<?php
session_start();
if(!isset($_SESSION['login'])) {die('Vous devez être enregistré pour accéder à cette partie du site');}
?>

<html>

<head>
<meta charset="utf-8">
<title>SoundLight - Espace membre</title>
<link rel="stylesheet" type="text/css" href="aaa.css">
</head>

<header id="logo_titre">

<img src="logo_titre.png">

</header>

<body>

<div class="info_membre">
<h2>BIENVENUE </br> <?php echo ucfirst($_SESSION['login']) ?> </h2><br />
<p>N° Modèle: <?php echo ($_SESSION['numéro']) ?> <p/>
<p>Date de construction: <?php echo ($_SESSION['date']) ?> </p>
<a href="deconnexion.php">Se déconnecter</a>
<p id="soundlight_info_membre">SoundLight 2017 ©</p>
</div>


<div id="interface">
     <h1 id="titre_interface">INTERFACE DE CONTRÔLE</h1>
	 
     <form action="traitement_allumer.php" method="get">
         <input class="boutons_interface" type="submit" name="allumer" value="Allumer" /> <br />
     </form>
	 
	 <form action="traitement_eteindre.php" method="get">
         <input class="boutons_interface" type="submit" name="eteindre" value="Eteindre" /> <br />
	 </form>

     <form action="traitement_rouge.php" method="get">	 
         <input class="boutons_interface" type="submit" name="rouge" value="Rouge" /> <br />
	 </form>

     <form action="traitement_bleu.php" method="get">	 
         <input class="boutons_interface" type="submit" name="bleu" value="Bleu" /> <br />
	 </form>
	 
	 <form action="traitement_vert.php" method="get">
         <input class="boutons_interface" type="submit" name="vert" value="Vert" /> <br />
     </form>
	 
	 <form action="traitement_clignoter.php" method="get">
         <input class="boutons_interface" type="submit" name="clignoter" value="Clignoter" /> <br />
     </form>
</div>


</body>

</html>
et je vous montre également une des pages de traitement
<?php
$_GET["allumer"] = "allumer";
$fp = fopen ("donnees.txt", "w");
$ordre_allumer = fputs ($fp, $_GET["allumer"]);
fclose ($fp);
header('location:membre.php');
?>
Donc qu'est-ce qu'il faut changer pour que ce soit plus simple ?
Est-ce qu'il y a un moyen de faire qu'avec une page de traitement sans que quand on appui juste sur un bouton ça envoie les infos de tous les autres boutons ? Je sais pas si je me fais bien comprendre. Mais en essayant de le faire avec une seule page de traitement et en mettant tous mes boutons dans le même formulaire ça m'envoie les infos de tous les boutons dans le fichier donnees.txt alors que je clique seulement sur un bouton.

Pouvez-vous me dire comment on procède pour n'utiliser qu'une page de traitement sans qu'il y est ce problème ça serait beaucoup plus simple après coté arduino.

Après pour l'arduino il envoie une requête commençant par : GET /donnees.txt HTTP/1.1 pour obtenir les infos ?

Eléphanteau du PHP | 14 Messages

14 mars 2017, 23:22

Comment le Arduino trie les infos dans le fichier .txt ? Et comment on fait pour mettre des séparateurs entre les données, on se fait le protocole qu'on veut ?

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

15 mars 2017, 13:14

oui tu fait ce que tu veux.
en ce moment le plus classique c'est d'utiliser du json pour transmettre de données, mais tu peux faire ce que tu veux, un classique csv (ou un séparateur quelconque, généralement , ; | mais n'importe qu'elle autre caractère qui ne sera pas dans tes chaines de caractères).

tu peux aussi utiliser les classique clef / valeur (clef=valeur)

pour le json j'ai demandé à google [/google] et l'on tombe sur une lib
https://github.com/bblanchon/ArduinoJson (1er lien)
qui est référencée dans le 3ème lien (un tuto et en français ;) )http://nawrasg.fr/html/arduino/json.php

bonne lecture ;)

ps en php utilise [url=http://php.net/json_encode]json_encode


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 14 Messages

17 mars 2017, 23:15

Le JSON c'est seulement lorsque l'arduino envoie des infos non ? Moi dans mon cas c'est l'Arduino qui reçoit les infos.

Eléphanteau du PHP | 14 Messages

18 mars 2017, 22:44

J'ai cherché un peu sur google par rapport aux séparateurs, j'ai trouvé fscanf, strtok. Mais comment on fait pour utiliser ces fonctions je comprends pas malgré les explications sur internet.

Eléphanteau du PHP | 14 Messages

22 mars 2017, 00:57

J'ai finalement utilisé une seule page de traitement qui écrit dans donnees.txt et j'ai utilisé des boutons radios à la place des checkbox. Mais je reste toujours bloqué pour séparer les donnés que l'arduino reçoit. Si quelqu'un se débrouille en arduino et comprend les tableaux etc...

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

22 mars 2017, 09:54

alors pour le JSON, la lib indiquée permet de "lire" ou de créer du JSON. Donc a partir du moment où tu sais faire ton appel http et récupérer le JSON tu peux le parser et employer le résultat dans ton code.

ensuite pour du texte structuré type csv il faut demander à google il y a plein de chose sur le sujet, comme https://github.com/greiman/SdFat/blob/m ... eadCSV.ino

@+
Il en faut peu pour être heureux ......