ESP8266 loopt vast

Software vragen voor ESP chip familie
Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: ESP8266 loopt vast

Berichtdoor nicoverduin » 05 Feb 2017, 10:52

Zet je laatste functie ff hier dan kijk ik wel ff.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Advertisement

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: ESP8266 loopt vast

Berichtdoor René » 05 Feb 2017, 18:13

Dit is de functie: heet nu nog String getTime2() dat moet natuurlijk ook wat anders worden maar wat is het alternatief voor String in dit geval?

Code: Alles selecteren
String getTime2() {
  WiFiClient client;
  while (!!!client.connect("www.google.com", 80)) {
    Serial.println("connection failed, retrying...");
  }
 
  client.print("HEAD / HTTP/1.1\r\n\r\n");
 
  while(!!!client.available()) {
     yield();
  }


char charArray[30];                        // ff ruim genomen

// uint8_t charArrayIndex[0] = '\0';       // string leeg oud
uint8_t charArrayIndex = 0;
charArray[0] = '\0';       // string leeg

while(client.available()){
    charArray[charArrayIndex] = client.read();    // lees teken in de tabel
   if (charArray[charArrayIndex] == '\r' ){         // blijven lezen tot er een return komt
     charArray[charArrayIndex] = '\0';                // en sluit te tekst af met een '\0'. De return halen we gelijk weg
     break;
   }
   charArrayIndex++;
}
client.stop();
//
// er is nu een string in gelezen. We zijn alleen geïnteresseerd in de feitelijke datum
// dus kijk ff of de eerste 7 tekens kloppen
//
if (strnstr(charArray, "\nDate: ", 7)) {
   //
   // het staat in de regel dus geef de rest terug de tekst vanaf positie 7 (bij een index vanaf 0) is de datum
   //
   return (&charArray[7]);
} else {
   return (char *) NULL;
}
 
 
}


Dit is de foutmelding:

Code: Alles selecteren
Arduino: 1.8.1 (Windows XP), Board:"Generic ESP8266 Module, 80 MHz, 40MHz, DIO, 115200, 1M (512K SPIFFS), ck, Disabled, None"

C:\Arduino\arduino-1.8.1\Portable\sketchbook\zonnepaneelversie_3\zonnepaneelversie_3.ino: In function 'String getTime2()':

zonnepaneelversie_3:431: error: 'strnstr' was not declared in this scope

 if (strnstr(charArray, "\nDate: ", 7)) {

                                     ^

exit status 1
'strnstr' was not declared in this scope

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.


Als de fout verdwijnt is er de volgende uitdaging:
charArray wordt gevuld met 1 regel. daat staat "HTTP/1.1 302 Found" in. De "Date : " staat pas in regel 5. Daar ben ik achter gekomen door de array groot te maken, het laatste stukje dat de fout veroorzaakt uit te zetten en een Serial.print(&charArray[0]); in te voegen na client.stop();

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: ESP8266 loopt vast

Berichtdoor nicoverduin » 05 Feb 2017, 18:56

cpp code
char * getTime2() {
char charArray[100]; // ff ruim genomen
charArray[0] = '\0';
uint8_t charArrayIndex = 0;
WiFiClient client;
while (!!!client.connect("www.google.com", 80)) {
Serial.println("connection failed, retrying...");
}
while(client.available()){
charArray[charArrayIndex] = client.read(); // lees teken in de tabel
if (charArray[charArrayIndex] == '\r' ){ // blijven lezen tot er een return komt
charArray[charArrayIndex] = '\0'; // en sluit te tekst af met een '\0'. De return halen we gelijk weg
//
// kijk of dit de datumregel is
//
char *startPositie;

startPositie = strstr(charArray, "\nDate: ");
//
// is dit is onze regel?
//
if (startPositie != NULL){
//
// yep dus skip 7 posities en we hebben het startpunt
//
startPositie = startPositie + 7;
client.stop();
return startPositie;
} else {
//
// niet de gewenste regel dus zet hem maar weer op 0
//
charArray[0] = '\0';
charArrayIndex = 0;
}
} else {
charArrayIndex++;'
}
}
//
// als je hier terecht komt heb je niet hetgene ontvangen wat je wilde
client.stop();
return (char *) NULL;
}

hij zal best nog wel piepen omdat je nu een char * teruggeeft en niet een String.

Tevens kan het zijn dat je boven in de sketch
cpp code
#include <string.h>

moet toevoegen voor die strstr().
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: ESP8266 loopt vast

Berichtdoor René » 05 Feb 2017, 19:12

je bent een tovenaar! ik ga het gelijk proberen

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: ESP8266 loopt vast

Berichtdoor René » 05 Feb 2017, 20:08

1 type foutje gevonden uint8_t charArray[0] = '\0'; uint8_t moet weg denk ik, geeft foutmelding. na verwijdering compileert het maar ik krijg geen resultaat Serial.print(&charArray[0]); blijft leeg.
Wat mij opvalt in de code moet de charArrayIndex niet worden opgehoogd? Ik mis charArrayIndex++;.
verder valt op dat je uint8_t regel = 0; declareert maar niet in de code gebruikt.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: ESP8266 loopt vast

Berichtdoor nicoverduin » 05 Feb 2017, 20:59

Goed gezien. regel was omdat ik eerst telde voor het juiste regelnummer. Later weer laten vervallen.
Ik heb dezelfde sketch/code aangepast dus je mag het nogmaals proberen. Als het goed is dan sloop ik wel die opmerkingen van jou en mij eruit.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: ESP8266 loopt vast

Berichtdoor René » 05 Feb 2017, 22:05

Wow het loopt maar.....ik moest nog wel eerst wat toevoegen bovenin.

client.print("HEAD / HTTP/1.1\r\n\r\n");

while(!!!client.available()) {
yield();
}

Ik begrijp dat yield() zo iets betekent als doe het maar rustig aan.
De eerste regel begrijp ik niet. Ik heb ze wel allebei nodig.

Ik begin een beetje Array's te begrijpen met de nadruk op beetje.
Hartelijk dank voor je bijdrage en vooral ook de toelichting erbij.

Ik heb nu de pulse interrupt functie zo kaal mogelijk gemaakt en de tijd functie als Array ipv String. Nu de rest nog:)) dat ga ik eerst zelf proberen. Waarna ik zeker weer hier terug kom voor hulp :lol:

Voor deze fase Nico hartstikke bedankt!

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: ESP8266 loopt vast

Berichtdoor René » 07 Feb 2017, 13:41

tja...
van de functie char * getTime2() krijg ik nu (bijvoorbeeld) "Tue, 07 Feb 2017 11:01:07 GMT" terug.
Daar moet ik nu een tijd van maken "12:01" (uur later ivm GMT, zou eigenlijk ook rekening moeten houden met zomertijd!) en
een datum "20170207"
Ik kan dat maar dan moet ik het behandelen als een String "String stringOne = getTime();"

Nu wil ik geen String meer gebruiken maar heb geen idee hoe ik er een Array van maak en daar dan mijn juiste tijd en datum uit samenstel.
Ik heb geprobeerd getTime() in een Array te lezen maar krijg alleen maar rommel.
Verderop in de code zit ook nog een "String" waar ik nog niet aan toe ben gekomen:(
Graag nog een tipje van de sluier want mijn code loopt na een aantal uren toch nog vast.

de code waar het om gaat ziet er nu zo uit:
Code: Alles selecteren
String stringOne = getTime();
        dag =  stringOne.substring(5,7);
        maand = stringOne.substring(8,11);
        jaar = stringOne.substring(12,16);
        uur = stringOne.substring(17,19);
        minuut = stringOne.substring(20,22);
        // 1 uur tijdsverschil met gmt(wellicht gaat het mis met zomertijd moet slimmer kunnen!)
          if (uur == "00") uur = "01";
            else if (uur == "01") uur = "02";
            else if (uur == "02") uur = "03";
            else if (uur == "03") uur = "04";
            else if (uur == "04") uur = "05";
            else if (uur == "05") uur = "06";
            else if (uur == "06") uur = "07";
            else if (uur == "07") uur = "08";
            else if (uur == "08") uur = "09";
            else if (uur == "09") uur = "10";
            else if (uur == "10") uur = "11";
            else if (uur == "11") uur = "12";
            else if (uur == "12") uur = "13";
            else if (uur == "13") uur = "14";
            else if (uur == "14") uur = "15";
            else if (uur == "15") uur = "16";
            else if (uur == "16") uur = "17";
            else if (uur == "17") uur = "18";
            else if (uur == "18") uur = "19";
            else if (uur == "19") uur = "20";
            else if (uur == "20") uur = "21";
            else if (uur == "21") uur = "22";
            else if (uur == "22") uur = "23";
            else if (uur == "23") uur = "00";

        tijd = (uur + ":" + minuut);

          if        (maand == "Jan") maand = "01";
            else if (maand == "Feb") maand = "02";
            else if (maand == "Mar") maand = "03";
            else if (maand == "Apr") maand = "04";
            else if (maand == "May") maand = "05";
            else if (maand == "Jun") maand = "06";
            else if (maand == "Jul") maand = "07";
            else if (maand == "Aug") maand = "08";
            else if (maand == "Sep") maand = "09";
            else if (maand == "Oct") maand = "10";
            else if (maand == "Nov") maand = "11";
            else if (maand == "Dec") maand = "12";

        //Serial.print("connecting to ");
        //Serial.println(host);
        // Use WiFiClient class to create TCP connections
        WiFiClient client;
        const int httpPort = 80;
          if (!client.connect(host, httpPort)) {
            Serial.println("connection failed");
            return;
          }
        // We now create a URI for the request
        String url = "/service/r2/addstatus.jsp?";
        url += "key=";
        url += APIKey;
        url += "&sid=";
        url += SystemId;
        url += "&d=";
        url += jaar;
        url += maand;
        url += dag;
        url += "&t=";
        url += tijd;
        url += "&v1=";
        url += opbrengst;
        url += "&v2=";
        url += power;
        // This will send the request to the server
        client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
        unsigned long timeout = millis();
          while (client.available() == 0) {
            if (millis() - timeout > 5000) {
              //Serial.println(">>> Client Timeout !");
              client.stop();
              return;
            }
          }
        // Read all the lines of the reply from server and print them to Serial
          while(client.available()) {
            String line = client.readStringUntil('\r');
            //Serial.print(line);
         }

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: ESP8266 loopt vast

Berichtdoor nicoverduin » 07 Feb 2017, 14:48

Je weet dat de eerste ":" een deel is van de tijd. Daarvoor staan de uren en daarvoor weer een spatie. Dus eigenlijk heb je de substring nodig van 2 posities voor de ":" en 2 posities na de ":".
Weer ff uit het losse polsje...

cpp code
char tijdstring[30];      // ontvangst veld van getTime2. 
//
// leg de indeling van de uren en minuten over een 6 byte veld (5 voor de tijd + 1 byte voor de terminator ('\0')
union {
struct {
char urenAlsChar[2];
char dubbelePunt;
char minutenAlsChar[2];
char terminator;
}
tijdAlsCharArray[6];
} tijdIndeling;

//
// eerst het resultaat veilig stellen. Dit omdat de char array in de functie dynamisch is en zo kan verdwijnen
//
strcpy(tijdstring, getTime2()); // getTime2 geeft een pointer terug dus we kunnen die gelijk in de copy slag gebruiken
//
// nu nog ff de uren/minuten zoeken
//
char * pos = strstr(tijdstring, ":"); // we krijgen een char pointer terug waar de eerste : voorkwam in de array

if (pos != NULL) { // en die moet gevuld zijn
//
// nu 2 posities teruggaan en we hebben het begin van de uren
// deze kopieren we in de union tijdIndeling samen met de dubbele punt en minuten
//
pos = pos - 2;
strncpy(tijdIndeling, pos , 5);
//
// maak nu van uren en minuten elk een kleine char array
//
tijdIndeling.dubbelePunt = '\0';
tijdIndeling.terminator = '\0';
//
// beide kun je nu converteren in een uint8_t bijv.
//
uint8_t uren = atoi(tijdindeling.urenAlsChar);
uint8_t minuten = atoi(tijdindeling.minutenAlsChar);
} else {
//
// als je hier terecht zou komen dan heb je geen tijdstring ontvangen
//
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: ESP8266 loopt vast

Berichtdoor René » 07 Feb 2017, 15:36

Uit het losse polsje......:)
Ik vind het prachtig hoe jij de code uit je mouw schudt en je toelichting er bij maakt het erg leuk om het te (een beetje) te begrijpen.
Vol verwachting compileerde ik je oplossing. Je raadt het al: dat gaat nog niet in een keer goed. Helaas is de foutmelding voor mij nog niet te begrijpen. hier is hij:
Code: Alles selecteren
Arduino: 1.8.1 (Windows XP), Board:"Generic ESP8266 Module, 80 MHz, 40MHz, DIO, 115200, 1M (512K SPIFFS), ck, Disabled, None"

C:\Arduino\arduino-1.8.1\Portable\sketchbook\zonnepaneelversie_3\zonnepaneelversie_3.ino: In function 'void loop()':

zonnepaneelversie_3:109: error: cannot convert 'loop()::<anonymous union>' to 'char*' for argument '1' to 'char* strncpy(char*, const char*, size_t)'

    strncpy(tijdIndeling, pos , 5);

                                 ^

zonnepaneelversie_3:113: error: 'union loop()::<anonymous>' has no member named 'dubbelePunt'

    tijdIndeling.dubbelePunt = '\0';

                 ^

zonnepaneelversie_3:114: error: 'union loop()::<anonymous>' has no member named 'terminator'

    tijdIndeling.terminator   = '\0';

                 ^

zonnepaneelversie_3:118: error: 'tijdindeling' was not declared in this scope

    uint8_t uren       = atoi(tijdindeling.urenAlsChar);

                              ^

exit status 1
cannot convert 'loop()::<anonymous union>' to 'char*' for argument '1' to 'char* strncpy(char*, const char*, size_t)'

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

VorigeVolgende

Terug naar ESP Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 7 gasten