Aller au contenu


buildrobot

Inscrit(e) (le) 30 oct. 2011
Déconnecté Dernière activité janv. 01 2019 07:51
-----

Messages que j'ai postés

Dans le sujet : Esp-wroom-32

27 juillet 2018 - 07:55

Je l'ai monté sur la carte comme sur ton lien.


Dans le sujet : Taille PROGMEM

13 juillet 2018 - 01:08

As tu essayé de mettre une taille de buffer plus importante ?

Au delà de 1200, la mémoire de l'Arduino est pleine


Dans le sujet : Taille PROGMEM

13 juillet 2018 - 01:03

J'ai oublier de préciser un point important...

byte Ethernet::buffer[1200]; // tcp/ip send and receive buffer
BufferFiller bfill;

void loop() {
  colors[0] = rgb_color(Green, Red, Blue);
  ledStrip.write(colors, LED_COUNT);


  // wait for an incoming TCP packet, but ignore its contents
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);

  if (pos) {
    delay(1);   // necessary for my system
    bfill = ether.tcpOffset();
    char *data = (char *) Ethernet::buffer + pos;

    if (strncmp("GET /", data, 5) != 0) {
      // Unsupported HTTP request
      // 304 or 501 response would be more appropriate
      bfill.emit_p(http_Unauthorized);
    }
    else {
      data += 5;
      Serial.print("data : ");
      Serial.print(data);
      if (data[0] == ' ') {
        // Return home page
        homePage();
      }
      if (strstr(data, "ledr=on")) {
        Serial.println("ledr=on dans data !");
        Red = 255;
        bfill.emit_p(http_Found);
      }
      if (strstr(data, "ledg=on")) {
        Serial.println("ledg=on dans data !");
        Green = 255;
        bfill.emit_p(http_Found);
      }
      if (strstr(data, "ledb=on")) {
        Serial.println("ledb=on dans data !");
        Blue = 255;
        bfill.emit_p(http_Found);
      }
      if (strstr(data, "n1s1")) {
        Serial.println("n1s1 dans data !");
        bfill.emit_p(http_Found);
      }
    }

    ether.httpServerReply(bfill.position());    // send http response
  }
}

J'ai également un buffer de taille 1200, qui va par la suite contenir tous les éléments de mon interface Web.

Il parait logique que si je mets trop de données dans ce buffer, l'Arduino ne va pas trop aimer...

 

Or, je ne peux déclarer qu'une seul "byte Ethernet::buffer[1200]"...

 

Y aurait-il une alternative à ce problème ?

 

Merci d'avance à vous tous de prendre le soin de me répondre :)


Dans le sujet : Taille PROGMEM

13 juillet 2018 - 12:46

Petites questions : 

1) que te dit le compilateur arduino au niveau de % d'utilisation mémoire quand ça marche ? Est ce que tu es proche des 100% ? 

2) est ce que si tu commentes d'autres partie de ton codes pour libérer un peu d'espace mémoire, tes deux lignes là peuvent être ajoutée ?  

Réponse à tes questions :

 

1) Concernant la mémoire, voilà ce que j'ai :


Le croquis utilise 10492 octets (32%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 1449 octets (70%) de mémoire dynamique, ce qui laisse 599 octets pour les variables locales. Le maximum est de 2048 octets. 

2) En commentant des parties du "code" (la partie HTML contenue dans les PROGMEM), mais deux lignes s'affichent bien.


Dans le sujet : Interface avec un ENC28J60

10 juillet 2018 - 07:49

J'ai réussi à faire mon interface web, mais dans ce cas ci, je n'arrive pas à contrôler mes différents éléments...

 

Voici mon code :

#include <EtherCard.h>

const char SSDP_RESPONSE[] PROGMEM = "HTTP/1.1 200 OK\r\nCACHE-CONTROL: max-age=1200\r\nEXT:\r\nSERVER:Arduino\r\nST: upnp:rootdevice\r\nUSN: uuid:abcdefgh-7dec-11d0-a765-7499692d3040\r\nLOCATION: http://"; //dont forget our mac adress USN: uuid:abcdefgh-7dec-11d0-a765-Mac addr
const char SSDP_RESPONSE_XML[] PROGMEM = "/??\r\n\r\n"; // here is the adress of xml file /?? in this exemple but you could use another /upnp.xml\r\n\r\n
const char XML_DESCRIP[] PROGMEM = "HTTP/1.1 200 OK\r\nContent-Type: text/xml\r\n\r\n<?xml version='1.0'?>\r<root xmlns='urn:schemas-upnp-org:device-1-0'><device><deviceType>urn:schemas-upnp-org:device:BinaryLight:1</deviceType><presentationURL>/</presentationURL><friendlyName>Arduino</friendlyName><manufacturer>Fredycpu</manufacturer><manufacturerURL>http://fredycpu.pro</manufacturerURL><serialNumber>1</serialNumber><UDN>uuid:abcdefgh-7dec-11d0-a765-7499692d3040</UDN></device></root>     ";
const char SSDP_NOTIFY[] PROGMEM = "NOTIFY * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nCACHE-CONTROL: max-age=1200\r\nNT: upnp:rootdevice\r\nUSN: uuid:abcdefga-7dec-11d0-a765-7499692d3040::upnp:rootdevice\r\nNTS: ssdp:alive\r\nSERVER: Arduino UPnP/1.0\r\nLOCATION: http://"; //dont forget our mac adress USN: uuid:abcdefgh-7dec-11d0-a765-Mac addr

static byte myip[] = {
  192, 168, 2, 177
};
static byte gwip[] = {
  192, 168, 2, 254
};
static byte ssdp[] = {
  239, 255, 255, 250
};
static byte mymac[] = {
  0x74, 0x99, 0x69, 0x2D, 0x30, 0x40
}; // if you change it you must update SSDP_RESPONSE and XML_DESCRIP

byte Ethernet::buffer[750]; // tcp ip send and receive buffer
unsigned long timer = 9999;
const char pageA[] PROGMEM =
  "HTTP/1.0 200 OK\r\n"
  "Content-Type: text/html\r\n"
  "\r\n"
  "<html>"
  "<head><title>"
  "multipackets Test"
  "</title></head>"
  "<body>"
  "<h1 style='text-align:center'> Game master </h1>"
  "<div style='border-style: solid; padding: 5px;'>"
  "<h2 style='text-align: center; margin: none'>Configuration</h2>"
  "Couleur led :"
  "<button>Rouge</button>"
  "<button>Vert</button>"
  "<button>Bleu</button><br>"
  "Difficulte :"
  "<button>1</button>"
  "<button>2</button>"
  "<button>3</button><br>"

  ;
const char pageB[] PROGMEM =
  "<ul>"
  "Nombre de sons par sequence :"
  "<li>Niveau 1</li>"
  "<ul>"
  "<li>Sequence 1 : <input type='number' min='0' max='20' step='1' value='5' size='6'> sons</li>"
  "<li>Sequence 2 : <input type='number' min='0' max='20' step='1' value='10' size='6'> sons</li>"
  "<li>Sequence 3 : <input type='number' min='0' max='20' step='1' value='15' size='6'> sons</li>"
  "</ul>"
  ;
const char pageC[] PROGMEM =
  "<li>Niveau 2</li>"
  "<ul>"
  "<li>Sequence 1 : <input type='number' min='0' max='20' step='1' value='5' size='6'> sons</li>"
  "<li>Sequence 2 : <input type='number' min='0' max='20' step='1' value='10' size='6'> sons</li>"
  "<li>Sequence 3 : <input type='number' min='0' max='20' step='1' value='15' size='6'> sons</li>"
  "</ul>"
  ;
const char pageD[] PROGMEM =
  "<li>Niveau 3</li>"
  "<ul>"
  "<li>Sequence 1 : <input type='number' min='0' max='20' step='1' value='5' size='6'> sons</li>"
  "<li>Sequence 2 : <input type='number' min='0' max='20' step='1' value='10' size='6'> sons</li>"
  "<li>Sequence 3 : <input type='number' min='0' max='20' step='1' value='15' size='6'> sons</li>"
  "</ul>"
  "</ul>"
  ;

const char pageE[] PROGMEM =
  "<button>Valider la configuration</button>"
  "</div>"
  "<br>"
  "<div style='border-style: solid; padding: 5px;''>"
  "<h2 style='text-align: center; margin: none'>Actions</h2>"
  "<button>Commencer le jeu</button><br>"
  "Jouer un son :"
  "<select>"
  "<option>Elephant</option>"
  "<option>Serpent</option>"
  "<option>Singe</option>"
  "<option>Lion</option>"
  "</select>"
  "<button>Jouer</button><br>"
  ;

const char pageF[] PROGMEM =
  "Ouvrir le coffre "
  "<ul>"
  "<li><button>Ouvrir</button> si victoire</li>"
  "<li><button>Ouvrir</button> si defaite</li>"
  "</ul><br>"
  "Niveau du jeu :"
  "<ol>"
  "<li><input type='checkbox'></li>"
  "<li><input type='checkbox'></li>"
  "<li><input type='checkbox'></li>"
  "</ol>"
  ;

//const char pageG[] PROGMEM =

void setup() {
  ether.begin(sizeof Ethernet::buffer, mymac , SS);// SS = 53 for the mega ethernet shield and  10 for normal ethernet shield
  ether.staticSetup(myip, gwip);
  ENC28J60::disableMulticast(); //disable multicast filter means enable multicast reception
  Serial.begin(115200);
}

void loop() {
wait:
  word pos = ether.packetLoop(ether.packetReceive());
  // check if valid tcp data is received
  if (pos) {
    char* data = (char *) Ethernet::buffer + pos;
    if (strncmp("GET / ", data, 6) == 0) {
      ether.httpServerReplyAck(); // send ack to the request
      memcpy_P(ether.tcpOffset(), pageA, sizeof pageA); // send first packet and not send the terminate flag
      ether.httpServerReply_with_flags(sizeof pageA - 1, TCP_FLAGS_ACK_V);
      memcpy_P(ether.tcpOffset(), pageB, sizeof pageB); // send second packet and not send the terminate flag
      ether.httpServerReply_with_flags(sizeof pageB - 1, TCP_FLAGS_ACK_V);
      memcpy_P(ether.tcpOffset(), pageC, sizeof pageC); // send thirdt packet and not send the terminate flag
      ether.httpServerReply_with_flags(sizeof pageC - 1, TCP_FLAGS_ACK_V);
      memcpy_P(ether.tcpOffset(), pageD, sizeof pageD); // send fourth packet and not send the terminate flag
      ether.httpServerReply_with_flags(sizeof pageD - 1, TCP_FLAGS_ACK_V);
      memcpy_P(ether.tcpOffset(), pageE, sizeof pageE); // send fourth packet and not send the terminate flag
      ether.httpServerReply_with_flags(sizeof pageE - 1, TCP_FLAGS_ACK_V);
      memcpy_P(ether.tcpOffset(), pageF, sizeof pageF); // send fourth packet and send the terminate flag
      ether.httpServerReply_with_flags(sizeof pageF - 1, TCP_FLAGS_ACK_V | TCP_FLAGS_FIN_V);
      goto wait;
    }
    if (strncmp("GET /??", data, 7) == 0) { // description of services (normaly an xml file but here .....)
      ether.httpServerReplyAck();
      memcpy_P(Ethernet::buffer + TCP_OPTIONS_P, XML_DESCRIP, sizeof XML_DESCRIP);
      ether.httpServerReply_with_flags(sizeof XML_DESCRIP - 1 , TCP_FLAGS_ACK_V | TCP_FLAGS_FIN_V);
      goto wait;
    }
    if (strncmp("M-SEARCH", data, 8) == 0) { // service discovery request comes here (udp protocol)
      ssdpresp();
      goto wait;
    }
  }
  if (((millis() - timer) > 50000) || (timer > millis())) {
    timer = millis();
    ssdpnotify();
  }
}

void ssdpresp() { //response to m-search
  byte ip_dst[IP_LEN];
  unsigned int port_dst = Ethernet::buffer[34] * 256 + Ethernet::buffer[35]; //extract source port of request
  for (  int i = 0; i < IP_LEN; i++) { //extract source IP of request
    ip_dst[i] = Ethernet::buffer[i + 26];
  }
  int udppos = UDP_DATA_P;

  EtherCard::udpPrepare(1900, ip_dst, port_dst);
  memcpy_P(Ethernet::buffer + udppos, SSDP_RESPONSE, sizeof SSDP_RESPONSE);
  udppos = udppos  + sizeof SSDP_RESPONSE - 1;
  addip(udppos);
}

void ssdpnotify() { //Notification
  int udppos = UDP_DATA_P;
  EtherCard::udpPrepare(1900, ssdp, 1900);
  memcpy_P(Ethernet::buffer + udppos, SSDP_NOTIFY, sizeof SSDP_NOTIFY);
  udppos = udppos  + sizeof SSDP_NOTIFY - 1;
  addip(udppos);
}

void addip(int udppos) { // add current ip to the request and send it
  int adr;
  for (int i = 0; i < IP_LEN; i++) { // extract the current ip of arduino
    adr = ether.myip[i] / 100;
    if (adr)  {
      Ethernet::buffer[udppos] = adr + 48;
      udppos++;
    }
    adr = (ether.myip[i] % 100) / 10;
    if (adr)  {
      Ethernet::buffer[udppos] = adr + 48;
      udppos++;
    }
    adr = ether.myip[i] % 10;
    Ethernet::buffer[udppos] = adr + 48;
    udppos++;
    Ethernet::buffer[udppos] = 46;
    udppos++; //"."
  }
  udppos--;//erase the last point
  memcpy_P(Ethernet::buffer + udppos, SSDP_RESPONSE_XML, sizeof SSDP_RESPONSE_XML);
  udppos = udppos  + sizeof SSDP_RESPONSE_XML;
  udppos--;
  EtherCard::udpTransmit(udppos - UDP_DATA_P); // send all to the computer who make the request on her ip and port who make the request
}

Celui-ci est écrit en brut, directement dans des const char PROGMEM alors que dans le code du premier post, j'utilisé une fonction (homepage() ) dans laquelle j'utilisé la fonction PSTR() me permettant de créer des chaines formatés et ainsi donc de pouvoir récupérer l'état du bouton sur lequel je cliqué.

 

Comment pourrai-je intégrer ces 2 codes en 1 ?

 

Je vous remercie de votre patiente et de votre aide ! :)

 

buildrobot.