Arduino et Ethernet : serveur" d' @Eskimon

a marqué ce sujet comme résolu.

Bonjour à tous

nouveau sur le forum je poste ce nouveau sujet. J’utilise le tuto Arduino et Ethernet : serveur" d' @Eskimon (merci a lui pour ce travail ) je rencontre une difficulté et j’avoue ne plus trop savoir quoi faire et je vous demande de l’aide pour ca.

J’ai uploadé le code dans l’arduino J’ai créée la page html / Javascript sur mon hébergement

Lorsque je commande l’arduino via la page web cela fonctionne. (j’ai bien mon relais sur sortie D4 qui bascule) par contre il semble que la page web recoive une réponse vide de l’arduino Avez vous quelques pistes popur m’orienter ? Merci D’avance. Kaikido

J’ai uploadé le code dans l’arduino J’ai créée la page html / Javascript sur mon hébergement

Sur ton hébergement ? Comment ça ?

Sans le code que tu as téléverser sur l’arduino ça va être difficile de t’aider. :S

+0 -0

Salut Ache et merci pour ta réponse.

je te donne le lien que jutilise pour tester : atelier-sk.fr/dial.php c’est une hébergement privée qui m’appartient chez OVH.

voici le code complet dans l’arduino:

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 20 chars and 4 line display
LiquidCrystal_I2C lcd1(0x23, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

// Ces deux bibliothèques sont indispensables pour le shield
#include <SPI.h>
#include <Ethernet.h>

// L'adresse MAC du shield
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xA5, 0x7E };
// L'adresse IP que prendra le shield
IPAddress ip(192, 168, 0, 143);

// Initialise notre serveur
// Ce dernier écoutera sur le port 4200
EthernetServer serveur(4200);

// -------------------- Definition 74HC595 --------------------------------
int SER_Pin = 9;   //pin 14 on the 75HC595
int RCLK_Pin = 3;  //pin 12 on the 75HC595
int SRCLK_Pin = 2; //pin 11 on the 75HC595
#define number_of_74hc595s 3
//do not touch
#define numOfRegisterPins number_of_74hc595s * 8

boolean registers[numOfRegisterPins];

//How many of the shift registers - change this
#define number_of_74hc595s 3

//do not touch
#define numOfRegisterPins number_of_74hc595s * 8
void clearRegisters()
{
  for (int i = numOfRegisterPins - 1; i >=  0; i--) {
    registers[i] = LOW;
  }
}

//Set and display registers
//Only call AFTER all values are set how you would like (slow otherwise)

void writeRegisters()
{
  digitalWrite(RCLK_Pin, LOW);
  for (int i = numOfRegisterPins - 1; i >=  0; i--)
  {
    digitalWrite(SRCLK_Pin, LOW);
    int val = registers[i];
    digitalWrite(SER_Pin, val);
    digitalWrite(SRCLK_Pin, HIGH);
  }
  digitalWrite(RCLK_Pin, HIGH);
}

//set an individual pin HIGH or LOW

void setRegisterPin(int index, int value)
{
  registers[index] = value;
}
char *url = (char *)malloc(100); // L'url recu à stocker
//char url[100];
char index = 0; // index indiquant où l'on est rendu dans la chaîne
boolean etats[3] = {LOW, LOW, LOW}; // L'état des 3 sorties
unsigned char pwm = 0; // La valeur de la pwm


void setup()
{
  pinMode(SER_Pin, OUTPUT);
  pinMode(RCLK_Pin, OUTPUT);
  pinMode(SRCLK_Pin, OUTPUT);
  clearRegisters();
  writeRegisters();

  lcd.init();// initialize the lcd
  //lcd.init();
  lcd.clear();
  lcd.backlight();
  lcd1.init();
  lcd1.clear();
  lcd1.backlight();

  // On démarre la voie série pour déboguer
  // Serial.begin(9600);
  Ethernet.init(8);
  Ethernet.begin(mac);
  delay(1000);
  // On lance le serveur
  serveur.begin();
  lcd1.setCursor(0, 0);
  lcd1.print("IP: ");
  lcd1.print(Ethernet.localIP());

  pinMode(4, OUTPUT); digitalWrite(4, LOW);
  pinMode(5, OUTPUT); digitalWrite(5, LOW);
  pinMode(6, OUTPUT); analogWrite(6, 0);

}

void loop()
{
  // Regarde si un client est connecté et attend une réponse
  EthernetClient client = serveur.available();
  if (client)
  { // Un client est là ?
    lcd1.setCursor(0, 1);
    lcd1.print("CNX");
    url = ""; // on remet à zéro notre chaîne tampon
    index = 0;
    while (client.connected())
    {
      // Tant que le client est connecté
      if (client.available())
      {
        // A-t-il des choses à dire ?
        // traitement des infos du client
        char carlu = client.read(); //on lit ce qu'il raconte
        if (carlu != '\n')
        { // On est en fin de chaîne ?
          // non ! alors on stocke le caractère
          //Serial.print(carlu);
          url[index] = carlu;
          index++;
        }
        else
        {
          // on a fini de lire ce qui nous intéresse
          // on marque la fin de l'url (caractère de fin de chaîne)
          url[index] = '\0';
          boolean ok = interpreter(); // essaie d'interpréter la chaîne
          if (ok == true)
          {
            // tout s'est bien passé = on met à jour les broches
            action();

            // et dans tout les cas on répond au client
            repondre(client);
          }
          // on quitte le while
          break;
        }
      }
    }
    // Donne le temps au client de prendre les données
    delay(10);
    // Ferme la connexion avec le client
    client.stop();
    lcd1.setCursor(0, 1);
    lcd1.print("               ");
    //Serial.println("Pong !");
  }
}

void rafraichir()
{
  // Rafraichit l'etat des broches / PWM
  //digitalWrite(3, etats[0]);
  digitalWrite(4, etats[1]);
  digitalWrite(5, etats[2]);
  analogWrite(6, pwm);
}

void repondre(EthernetClient client)
{
  // La fonction prend un client en argument
  lcd.setCursor(0, 1);
  lcd.print("REPONDRE");
  //Serial.println("\nRepondre"); // debug
  // On fait notre en-tête
  // Tout d'abord le code de réponse 200 = réussite
  client.println("HTTP/1.1 200 OK");
  // Puis le type mime du contenu renvoyé, du json
  client.println("Content-Type: application/json");
  // Autorise le cross origin
  client.println("Access-Control-Allow-Origin: *");
  // Et c'est tout !
  // On envoi une ligne vide pour signaler la fin du header
  client.println();

  // Puis on commence notre JSON par une accolade ouvrante
  client.println("{");
  // On envoie la première clé : "uptime"
  client.print("\t\"uptime\": ");
  // Puis la valeur de l'uptime
  client.print(millis());
  //Une petite virgule pour séparer les deux clés
  client.println(",");
  // Et on envoie la seconde nommée "analog 0"
  client.print("\t\"A0\": ");
  client.print(analogRead(A0));
  client.println(",");
  // Puis la valeur de la PWM sur la broche 6
  client.print("\t\"pwm\": ");
  client.print(pwm, DEC);
  client.println(",");
  // Dernières valeurs, les broches (elles mêmes dans un tableau)
  client.println("\t\"broches\": {");
  // La broche 3
  client.print("\t\t\"3\": ");
  client.print(digitalRead(3));
  client.println(",");
  // La broche 4
  client.print("\t\t\"4\": ");
  client.print(digitalRead(4));
  client.println(",");
  // La broche 5
  client.print("\t\t\"5\": ");
  client.println(digitalRead(5));
  client.println("\t}");
  // Et enfin on termine notre JSON par une accolade fermante
  client.println("}");
}
boolean interpreter()
{
  // On commence par mettre à zéro tous les états
  etats[0] = LOW;
  etats[1] = LOW;
  etats[2] = LOW;
  pwm = 0;

  // Puis maintenant on va chercher les caractères/marqueurs un par un.
  index = 0; // Index pour se promener dans la chaîne (commence à 4 pour enlever "GET "
  while (url[index - 1] != 'b' && url[index] != '=') { // On commence par chercher le "b="
    index++; // Passe au caractère suivant
    if (index == 100)
    {
      // On est rendu trop loin !
      lcd.setCursor(0, 0);
      lcd.print("PB rech b=");
      return false;
    }
  }
  // Puis on lit jusqu’à trouver le '&' séparant les broches de pwm
  while (url[index] != '&') { // On cherche le '&'
    if (url[index] >= '3' && url[index] <= '5')
    {
      // On a trouvé un chiffre identifiant une broche
      char broche = url[index] - '0'; // On ramène ça au format décimal
      etats[broche - 3] = HIGH; // Puis on met la broche dans un futur état haut
    }
    index++; // Passe au caractère suivant
    if (index == 100)
    {
      // On est rendu trop loin !
      //Serial.println("Oups, probleme dans la lecture des broches");
      return false;
    }
    // NOTE : Les virgules séparatrices sont ignorées
  }
  // On a les broches, reste plus que la valeur de la PWM
  // On cherche le "p="
  while (url[index - 1] != 'p' && url[index] != '=' && index < 100)
  {
    index++; // Passe au caractère suivant
    if (index == 100)
    {
      // On est rendu trop loin !
      //Serial.println("Oups, probleme dans la recherche de 'p='");
      return false;
    }
  }
  // Maintenant, on va fouiller jusqu'a trouver un espace
  while (url[index] != ' ')
  { // On cherche le ' ' final
    if (url[index] >= '0' && url[index] <= '9')
    {
      // On a trouve un chiffre !
      char val = url[index] - '0'; // On ramene ca au format decimal
      pwm = (pwm * 10) + val; // On stocke dans la pwm
    }
    index++; // Passe au caractère suivant
    if (index == 100)
    {
      // On est rendu trop loin !
      //Serial.println("Oups, probleme dans la lecture de la pwm");
      return false;
    }
    // NOTE : Les virgules séparatrices sont ignorées
  }
  // Rendu ici, on a trouvé toutes les informations utiles !
  return true;
}

void action()
{
  lcd.setCursor(4, 0);
  lcd.print("ACTION");
  // On met à jour nos broches
  digitalWrite(3, etats[0]);
  digitalWrite(4, etats[1]);
  digitalWrite(5, etats[2]);
  // Et la PWM
  analogWrite(6, pwm);
  EthernetClient client;
  repondre(client);
}

le code html /javascript sur mon hébergement (OVH)

<!DOCTYPE html>
<html lang="fr"> 

  <head>

    <meta charset="utf-8">
    <title>Interface de pilotage Arduino</title>
	
  </head> 
  <script type="text/javascript">
var broches = []; // Tableau de broches
var etats = []; // Tableau d'etat des broches
var pwm;
var a0;
var millis;
var adresse = "http://90.113.171.59:4200/"; // L'url+port de votre shield

document.addEventListener('DOMContentLoaded', setup, false);

function setup()
{
    // fonction qui va lier les variables à leur conteneur HTML
    broches[3] = document.getElementById("broche3");
    broches[4] = document.getElementById("broche4");
    broches[5] = document.getElementById("broche5");
    etats[3] = document.getElementById("etat3");
    etats[4] = document.getElementById("etat4");
    etats[5] = document.getElementById("etat5");
    pwm = document.getElementById("pwm");
    a0 = document.getElementById("a0");
    millis = document.getElementById("millis");
    
    // La fonction concernant le bouton
    var bouton = document.getElementById("envoyer");
    bouton.addEventListener('click', executer, false);
}




function executer()
{
    // Fonction qui va créer l'url avec les paramètres puis
    // envoyer la requête
    var requete = new XMLHttpRequest(); // créer un objet de requête
    var url = adresse;
    url += "?b=";
    for(i=3; i <= 5; i++) { // Pour les broches 3 à 5 de notre tableau
        if(broches[i].checked) // si la case est cochée
            url += i + ",";
    }
    // enlève la dernière virgule si elle existe
    if(url[url.length-1] === ',')
        url = url.substring(0, url.length-1);
    // Puis on ajoute la pwm
    url += "&p=" + pwm.value;
    console.log(url) // Pour debugguer l'url formée   
		//alert(url);
    requete.open("GET", url, true); // On construit la requête
    requete.send(null); // On envoie !
    requete.onreadystatechange = function()
	{ // on attend le retour
        if (requete.readyState == 4)
			{ // Revenu !
            if (requete.status == 200)
			{// Retour s'est bien passé !
                // fonction d'affichage (ci-dessous)
				console.log(requete.responseText);
				alert("on y est");
                afficher(requete.responseText);				
            }
			else
			{ // Retour s'est mal passé :(
                alert("faux");
				//alert(requete.status, requete.statusText);
            }
        }
    }
}

function afficher(json)
 {
    alert("afficher");
	alert(json);
	
	// Affiche l'état des broches/pwm/millis revenu en json
    donnees = JSON.parse(json);
    console.log(donnees);
    
    for(i=3; i <= 5; i++) { // Pour les broches 3 à 5 de notre tableau
        etats[i].checked = donnees["broches"][i];
    }
    pwm.value = parseInt(donnees["pwm"]);
    a0.value = parseInt(donnees["A0"]);
    millis.textContent = donnees["uptime"];
}

</script>

  <body>
    <div class="main">
      <p>
        Adresse publique du shield : <br />
        http://<input type="text" id="ip" value="90.113.171.59" size="15"/>
        : <input type="text" id="port" value="4200" size="5"/>
      </p>
      <hr />
      <p>
        <input type="checkbox" id="broche3" name="broche3" />
        <label for="broche3">Activer Broche 3.</label>
        Etat : <input type="radio" id="etat3" disabled />
      </p>
      <p>
        <input type="checkbox" id="broche4" name="broche4" />
        <label for="broche4">Activer Broche 4.</label>
        Etat : <input type="radio" id="etat4" disabled />
      </p>
      <p>
        <input type="checkbox" id="broche5" name="broche5" />
        <label for="broche5">Activer Broche 5.</label>
        Etat : <input type="radio" id="etat5" disabled />
      </p>
      <p>
        PWM : 0<input type="range" min="0" max="255" id="pwm" />255
      </p>
      <p>
        A0 : <meter min="0" max="1023" id="a0" />
      </p>
      <button id="envoyer">Executer !</button>
      <p>
        Millis : <span id="millis">0</span> ms
      </p>
    </div>
  </body>
</html>

j’ai un peu modifié et mis des "alert" dans le code java pour voir ou ca bloque.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte