Go Down

Topic: Contrôler une LED par le web (IDE 1.0) (Read 10889 times) previous topic - next topic

Brisebee

Merci pour ta réponse Osaka,

Je me suis dit ça un moment, j'avais remis 1080 dans la partie de programme que tu m'as fourni ( ainsi que dans php), mais cela n'a rien donné, alors j'ai remis en 8888.
@+

osaka

#61
Aug 26, 2012, 02:49 pm Last Edit: Aug 26, 2012, 10:20 pm by osaka Reason: 1
Je viens de faire un rapide teste avec quelque modif et ça marche.
Je me suis d'abord charger du ntp et mis tout ce qui le concerne en local à une fonction comme utile qu'à l'initialisation.

Code: [Select]


#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>

byte mac[] = {  0x90, 0xA2, 0xDA, 0x00, 0x6D, 0x86 };  // mac adresse propre à l'arduino
byte ip[] = { 192,168,1,109 }; // ip locale propre à l'arduino

EthernetServer server(1080); // 1080 a remplacer si différent fonctionne également avec ???? => à modifier alors dans php

byte nb = 0;

void setup()
{
  Serial.begin(9600);

  Ethernet.begin(mac, ip);
  print_NTP_Time(NTP()); // on s'occupe d'abord de récupérer l'heure via serveur NTP+affichage
  server.begin(); // ensuite du serveur de socket
}

void loop()
{
  EthernetClient client = server.available();
 
  if (client)
  {
    nb++;
    if (client.connected())
    {
      while (client.available())
      {
        char c = client.read();
        Serial.write(c); //on affiche dans le monitor les caractère reçu

        if(!client.available())
        {
          client.write("j'ai bien reçu la requete "); //réponse avec write
          client.print(nb, DEC); // réponse avec print (nb = nombre de requêtes)
          delay(1);
         
          client.stop();
        }
      }
      Serial.println (); // retour à la ligne dans serial monitor après chaque réception des données
    }
  }
}

unsigned long NTP() // retourne le nombre de sec. depuis 1 Jan 1970. (Unix time)
{
  EthernetUDP Udp;
  IPAddress timeServer(192, 43, 244, 18); // time.nist.gov NTP server
   
  const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message
  byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
  memset(packetBuffer, 0, NTP_PACKET_SIZE); //initialise toute les "case" du tableau à 0
 
  //construction de la requete
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  Udp.begin(8888);    
  Udp.beginPacket(timeServer, 123); //NTP requests are to port 123
  Udp.write(packetBuffer,NTP_PACKET_SIZE);
  Udp.endPacket();

  delay(1000); 
  if ( Udp.parsePacket() )
  { 
    Udp.read(packetBuffer,NTP_PACKET_SIZE);
    Udp.stop();

    const unsigned long seventyYears = 2208988800UL;
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    unsigned long secsSince1900 = highWord << 16 | lowWord;
   
    return secsSince1900 - seventyYears;
  }
 
  return 0;
}

void print_NTP_Time(unsigned long epoch) // fonction utilitaire, affiche l'heure UTC
{
  Serial.print("Unix time = "); // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
  Serial.println(epoch); // print Unix time:                           

  // print the hour, minute and second:
  Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
  Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
  Serial.print(':'); 
  if ( ((epoch % 3600) / 60) < 10 ) // In the first 10 minutes of each hour, we'll want a leading '0'
  {
    Serial.print('0');
  }
  Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
  Serial.print(':');
  if ( (epoch % 60) < 10 ) // In the first 10 seconds of each minute, we'll want a leading '0'
  {
    Serial.print('0');
  }
  Serial.println(epoch %60); // print the second
}


Brisebee

Merci beaucoup Osaka,

Je vais  pouvoir tester cela ce soir.

@+

Brisebee

Je viens de tester, cela ne fonctionne pas chez moi.

- tel quel, NTP fonctionne, mais pas l'échange de données

- si je commente (/*   */) la partie suivante :

Code: [Select]
 
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    for(;;)
      ;
  }


j'obtiens :
Unix time = 0
The UTC time is 0:00:00
pseudo=a&frites=false&pays=france

Il semble y avoir un problème avec Ethernet.begin
Mais comme je n'y comprends pas grand-chose !
@+

osaka


- si je commente (/*   */) la partie suivante :

Code: [Select]
 
 if (Ethernet.begin(mac) == 0) {
   Serial.println("Failed to configure Ethernet using DHCP");
   for(;;)
     ;
 }


j'obtiens :
Unix time = 0
The UTC time is 0:00:00
pseudo=a&frites=false&pays=france



Mauvais copier coller de ma part, tu peux supprimer cette partie.
En faisant divers testes j'ai pu constater ce comportement, la gestion des différent socket tcp ou udp semble parfois chaotique.
Je réédite mon poste précédent pour être certain d'avoir mis le bon (fonctionnel chez moi).

Juste aux cas ou je suis sous core 1.0.1 .

Brisebee

J'ai toujours :
Unix time = 0
The UTC time is 0:00:00

Le reste fonctionne


Juste aux cas ou je suis sous core 1.0.1 .


Moi pareil

J'utilise un serveur local EasyPHP 5.3.9 est ce que cela peut venir de ça ?

osaka


J'utilise un serveur local EasyPHP 5.3.9 est ce que cela peut venir de ça ?


Je pense pas comme tout est fonctionnel de ce côté là, essaie une fois en ajoutant un petit delay :

Code: [Select]

  Ethernet.begin(mac, ip);
  delay(100);
  print_NTP_Time(NTP());

Brisebee

Ca y est, ça marche !!!

A force d'essayer des trucs, j'ai trouvé qu'en faisant :

Code: [Select]
 
  Ethernet.begin(mac);
  print_NTP_Time(NTP()); // on s'occupe d'abord de récupérer l'heure via serveur NTP+affichage
 
  Ethernet.begin(mac, ip);
  server.begin();


Cela fonctionne.

Je suis bien évidemment incapable de comprendre pourquoi !

Encore merci Osaka pour ton aide.
@+

osaka


Je suis bien évidemment incapable de comprendre pourquoi !


Je suis également incapable de dire pourquoi.  :smiley-mr-green:
C'est un peux comme faire un reset du shield wizenet en remettant à jour les données de configuration réseau (ip, mac), pourtant fonctionnel sans chez moi et surtout que le code ajouter n'est qu'à la suite du code posant problème.
Je soupçonne le besoin d'un petit delay que le code ajouter ajoute  :smiley-sweat:.

Enfin ça fonctionne  :smiley-mr-green: .

Brisebee


[Je soupçonne le besoin d'un petit delay que le code ajouter ajoute  :smiley-sweat:.


J'avais essayé de mettre des delay à peu près à toutes les étapes, sans effet.
@+

Go Up