Aller au contenu


Photo
- - - - -

Taille PROGMEM


  • Veuillez vous connecter pour répondre
5 réponses à ce sujet

#1 buildrobot

buildrobot

    Membre occasionnel

  • Membres
  • Pip
  • 89 messages
  • Gender:Male

Posté 13 juillet 2018 - 11:14

Bonjour, voulant créer un interface web pour contrôler mon arduino avec un Shield Ethernet ENC28J60.

Pour la créer, j'utiliser la librairies EtherCard.h.

 

Je créer ma page comme suis :

const char http_OK[] PROGMEM =
  "HTTP/1.0 200 OK\r\n"
  "Content-Type: text/html\r\n"
  "Pragma: no-cache\r\n\r\n";

const char http_Found[] PROGMEM =
  "HTTP/1.0 302 Found\r\n"
  "Location: /\r\n\r\n";

const char http_Unauthorized[] PROGMEM =
  "HTTP/1.0 401 Unauthorized\r\n"
  "Content-Type: text/html\r\n\r\n"
  "<h1>401 Unauthorized</h1>";

const char title[] PROGMEM =
  "<html>"
  "<head>"
  "<title>Escape Dimension</title>"
  "</head>";

const char colorLed[] PROGMEM =

  "Couleur led :"
  "<input type='checkbox' name='ledr' value='on'> Rouge"
  "<input type='checkbox' name='ledb' value='on'> Bleu"
  "<input type='checkbox' name='ledg' value='on'> Vert<br>"
  ;

const char difficulte[] PROGMEM =
  "Difficulte :"
  "<input type='checkbox' name='diff1' value='1'> 1"
  "<input type='checkbox' name='diff2' value='2'> 2"
  "<input type='checkbox' name='diff3' value='3'> 3<br>"
  ;

const char niveau1[] PROGMEM =
  "Nombre de sons par sequence :"
  "<li>Niveau 1</li>"
  "Sequence 1 : <input type='number' min='0' max='20' step='1' name='n1s1' value='5' size='5' required> sons<br>"
//  "Sequence 1 : <input type='number' min='0' max='20' step='1' name='n1s2' value='5' size='10' required> sons<br>"
//  "Sequence 1 : <input type='number' min='0' max='20' step='1' name='n1s3' value='5' size='15' required> sons<br>"
  ;

void homePage()
{
  bfill.emit_p(PSTR(
                 "$F"
                 "$F"
                 "<h1 style='text-align:center'> Game master </h1>"
                 "<div style='border-style: solid; padding: 5px;'>"
                 "<h2 style='text-align: center; margin: none'>Configuration</h2>"

                 "<form method='get'>"
                 "$F"
                 "$F"
                 "$F"
                 "<input type='submit' value='Submit'>"
                 "</form>"
               ),
               http_OK,
               title,
               colorLed,
               difficulte,
               niveau1
              );
}

 

 

Lorsque je veut rajouter 2 lignes supplémentaire (dans mon niveau1[] PROGMEM), plus rien ne fonctionne.

J'ai du mal à comprendre l'utilisation de PROGMEM. Il me semble que l'on ne peut pas dépasser un certain nombre de caractère dans la mémoire de l'Arduino ?

 

Je vous remercie d'avance de votre bonne foi pour toutes vos réponses ! :)

 

PS : n'hésitez pas à me demander plus de code pour plus de clarté ;)



#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 959 messages
  • Gender:Male
  • Location:Anglet

Posté 13 juillet 2018 - 11:26

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 ?  


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 buildrobot

buildrobot

    Membre occasionnel

  • Membres
  • Pip
  • 89 messages
  • Gender:Male

Posté 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.



#4 buildrobot

buildrobot

    Membre occasionnel

  • Membres
  • Pip
  • 89 messages
  • Gender:Male

Posté 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 :)



#5 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 959 messages
  • Gender:Male
  • Location:Anglet

Posté 13 juillet 2018 - 01:06

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


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#6 buildrobot

buildrobot

    Membre occasionnel

  • Membres
  • Pip
  • 89 messages
  • Gender:Male

Posté 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






0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users