Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Väike abi koodiga märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 10.05.2018 19:27:39 Väike abi koodiga vasta tsitaadiga

ARduino laadse kontrolleriga on tehtud temp display ning see loeb väärtuse netist ning kuvab ekraanile.
See koht kus ta netist väärtust loeb muutis oma formaati kergelt ning hetkel ei loa mu kood seda temp väärtust enam korrektselt välja.

Vajalik osa koodist:


    request.hostname = "api.thingspeak.com";
    request.port = 80;
    request.path = "/channels/24877/fields/1/last.json?key=GOKBGDF6332V45P3";
    http.get(request, response, headers);
   
    if(response.status == 200){



   
       
        String web = response.body;
       // Serial.println(response.body);
        int Zpos = web.indexOf('Z'); // otsib Z pos stringis (kohe peale kellaja lõppu).

        String aeg2 = web.substring(Zpos-6,Zpos); // lõikab välja :min:sek osa
        String aeg1 = web.substring(Zpos-8,Zpos-6); // lõikab välja hh osa

        int gmt = atof(aeg1.c_str());
        int tund;
        if (Time.isDST()==1){
            tund = gmt +3;
        }
        else{
            tund = gmt +2;   
        }
         
        timeStr = "";
        if(tund<10){timeStr += " ";}
        timeStr += tund;
        timeStr += aeg2;
        timeStr += "";
       
        int tempPos = web.indexOf('field1'); // = 3 rida stringis?
        int tempPos2 = web.indexOf('"', tempPos); // = esimesed " peale field1 saadus pos väärtust
        int enne = web.indexOf('"', tempPos2+1 ); // Otsib " peale tempos omasid
        int parast = web.indexOf('"',enne+1); // otsib " peale parast väärtust.
        String result = web.substring(enne+1, parast); // võtab temp väärtuse kahe " vahel.
        hetkeTemp = atof(result.c_str());
        //{"field1":"-5.0","created_at":"2018-03-03T16:10:37Z","entry_id":1555170} <- loetava näidis eelnev formaat - see töötas
        //{"created_at":"2018-05-10T17:17:30Z","entry_id":1652165,"field1":"20.4"} <- kuidas nüüd on ning ei tööta
        update = 1;
    }

hetkeTemp väärtusesse ei saa seda 20.4

Kirjutan koodi väga harva ning suure vaevaga, kes asjaga pidevalt tegeleb näeb vea kindlasti kohe ära.

_________________
Väiksemagabariidilised trei, frees ning keevitustööd. PS.
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 10.05.2018 20:21:57 vasta tsitaadiga

Muudel muutujatel on tüüp ees, kus on hetkeTemp defineeritud?
Asjatult palju otsid jutumärke muidu, leiad field1 üles, siis pane vastav arv tähemärke otsa ja saad kohe numbri alguse, pärast seda vaid lõpu jutumärgid vaja leida. Seda kas selle indexOf-i või lihtsalt while loopiga charactere otsa liites.
Kontrolli stringi väärtus ka üle enne floatiks parsemist atof() funktsiooniga.
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ohohh
Kreisi kasutaja
Ohohh

liitunud: 13.09.2003




sõnum 10.05.2018 23:06:57 vasta tsitaadiga

Funktsiooni "substring" teine parameeter on tõenäoliselt pikkus, mitte positsioon.

Proovi nii:
String result = web.substring(enne+1, parast - (enne + 1));
Kommentaarid: 6 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 6
tagasi üles
vaata kasutaja infot saada privaatsõnum
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 11.05.2018 16:54:10 vasta tsitaadiga

Tegin väikest debugi ning ei saa aru kuidas ta sellised positsioonid saab:
//tempPos = 17
//tempPos2 = 35
//enne = 37
//parast = 46



    request.hostname = "api.thingspeak.com";
    request.port = 80;
    request.path = "/channels/24877/fields/1/last.json?key=GOKBGDF6332V45P3";
    http.get(request, response, headers);
   
    if(response.status == 200){



   
       
        String web = response.body;
       // Serial.println(response.body);
        int Zpos = web.indexOf('Z'); // otsib Z pos stringis (kohe peale kellaja lõppu).

        String aeg2 = web.substring(Zpos-6,Zpos); // lõikab välja :min:sek osa
        String aeg1 = web.substring(Zpos-8,Zpos-6); // lõikab välja hh osa

        int gmt = atof(aeg1.c_str());
        int tund;
        if (Time.isDST()==1){
            tund = gmt +3;
        }
        else{
            tund = gmt +2;   
        }
         
        timeStr = "";
        if(tund<10){timeStr += " ";}
        timeStr += tund;
        timeStr += aeg2;
        timeStr += "";
       
        int tempPos = web.indexOf('field1'); // = 3 rida stringis?
        int tempPos2 = web.indexOf('"', tempPos); // = esimesed " peale field1 saadus pos väärtust
        int enne = web.indexOf('"', tempPos2+1 ); // Otsib " peale tempos omasid
        int parast = web.indexOf('"',enne+1); // otsib " peale parast väärtust.
        String result = web.substring(enne+1, parast - (enne + 1));
        //String result = web.substring(enne+1, parast); // võtab temp väärtuse kahe " vahel.
        hetkeTemp = tempPos2;
       
        //tempPos = 17
        //tempPos2 = 35
        //enne = 37
        //parast = 46
        //hetkeTemp = atof(result.c_str());
        //{"field1":"-5.0","created_at":"2018-03-03T16:10:37Z","entry_id":1555170} <- loetava näidis, eelnev formaat - see töötas
        //{"created_at":"2018-05-10T17:17:30Z","entry_id":1652165,"field1":"20.4"} <- kuidas nüüd on ning ei tööta
        // link kust loeb: api.thingspeak.com/channels/24877/fields/1/last.json?key=GOKBGDF6332V45P3
        update = 1;
    }

_________________
Väiksemagabariidilised trei, frees ning keevitustööd. PS.
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
aseesimees
HV vaatleja

liitunud: 16.08.2004



Autoriseeritud ID-kaardiga

sõnum 11.05.2018 18:22:15 vasta tsitaadiga

int tempPos = web.indexOf('field1');
peaks olema
int tempPos = web.indexOf("field1");

Praegu leiad chari '1' esimese asukoha stringi "field1" asemel.

substring() funktsioon tahab siiski saada positsiooni teise parameetrina, mitte pikkust, ehk enne oli õige.
Kommentaarid: 12 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 11
tagasi üles
vaata kasutaja infot saada privaatsõnum
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 11.05.2018 18:53:22 vasta tsitaadiga

Ja asi funkab jälle thumbs_up.gif
_________________
Väiksemagabariidilised trei, frees ning keevitustööd. PS.
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Väike abi koodiga
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.