arduino praca s premennou

C,C++,C#

Moderátori: psichac, Moderátori

tomas73
Okoloidúci
Okoloidúci
Príspevky: 8
Dátum registrácie: 02 Jan 2016, 15:25

arduino praca s premennou

Príspevok od používateľa tomas73 » 02 Jan 2016, 15:36

prosím o pomoc mám načítané dáta v premennej a potrebujem ich upraviť

mám premennú data v nej je [A1:100,A2:123,A3:342,A4:343,A5:234]

je to vlastne výpis z webu ktorý načítam ,sú to namerane hodnoty senzorov

neviem tieto hodnoty načítať zvlášť a použiť ich

napríklad

A1 zobrazím ako premennú data_a1
A2 ako premennú data_a2
a tak ďalej

viete mi stým poradiť ? viem ,že to mám vyňať z tej premennej data len neviem ako

ďakujem , som začiatočník a s týmto si teda poradiť neviem.
0

martin63
Ultimate člen
Ultimate člen
Príspevky: 1738
Dátum registrácie: 11 Máj 2008, 00:00
Bydlisko: Námestovo
Vek: 34

Re: arduino praca s premennou

Príspevok od používateľa martin63 » 02 Jan 2016, 16:14

Mas to realne zapisane v poli takto [A1:100,A2:123,A3:342,A4:343,A5:234] alebo takto [100,123,342,343,234]?
0

tomas73
Okoloidúci
Okoloidúci
Príspevky: 8
Dátum registrácie: 02 Jan 2016, 15:25

Re: arduino praca s premennou

Príspevok od používateľa tomas73 » 02 Jan 2016, 17:08

v podstate to je jedno výpis viem upraviť hoci ako ,len čísla môžu byť aj napr. 1.10 , 12.1 alebo 123.1
0

NySher
Pokročilý člen
Pokročilý člen
Príspevky: 566
Dátum registrácie: 25 Aug 2009, 00:00
Bydlisko: ZH / ZA
Vek: 30

Re: arduino praca s premennou

Príspevok od používateľa NySher » 02 Jan 2016, 17:28

Ak som ťa dobre pochopil tak z arduina načítaš web... nejaký výpis z webu... a do čoho to načítaš? Toto vidím na string teda to je nejký JSON?
0
:)

tomas73
Okoloidúci
Okoloidúci
Príspevky: 8
Dátum registrácie: 02 Jan 2016, 15:25

Re: arduino praca s premennou

Príspevok od používateľa tomas73 » 02 Jan 2016, 17:42

ano načítam to z webu do premennej

použil som toto

String data = "";

void loop()
{
// vypíše text
Serial.println("Pripojuji...");

// když se podaří spojení se serverem tak....
// číslo 80 je sdandardní číslo portu pro html
if (client.connect("192.168.1.8", 80))
{
// vypíše text na serial monitor
Serial.println("Pripojeni probehlo v poradku");

// Požadavek na stránku GetData.aspx
client.print("GET http://192.168.1.8/display/vycitaj.php");
client.println(" HTTP/1.1");
client.println("Host:test.test.cz");
client.println("Connection: close");
client.println();
// čeká v limitu na odezvu
int timeout = TimeOut;
while ((!client.available()) && (timeout > 0))
{
delay(30);
timeout = timeout - 1;
}
if (timeout > 0)
{
Serial.print("Odezva serveru v case: ");
Serial.print(TimeOut - timeout);
Serial.println("ms");
}
else
{
Serial.println("Server neodpovida...");
}
// připraví proměnou pro případ když nalezneme naše řídící znaky
boolean nalez = false;
// dokud je stánka dostupná...
while (client.available())
{
//...do proměné c zapiš bajt odeslaný ze serveru
char c = client.read();



// když objevíš náš počátečný kontrolní znak
// tak nález bude true - pravda
// když konečný tak false
if (c == '[') nalez = true;
if (c == ']') nalez = false;

// toto můžete pro kontrolu odkomentovat
// vypíšou se všechny data
// Serial.print(c); // <--< tento řádek

// když je nález tak ukládej znaky do proměné data
// protože by se nám ukládal i první řídící znak tak,
// jen ukládej když je znak rozdílný od '<'
if (nalez && (c!='[')) data = data + c;


}

// .... když už není co číst a stránka není dostupná
// zastav připojení a vypiš na serial "Odpojeno"
client.stop();
client.flush();
Serial.println("Odpojeno...");
Serial.println();

// Zde nám vypíše jaká data jsme dostali
Serial.print("data ze serveru jsou: ");
// Na serial port vypíše získané hodnoty

Serial.println(data);

}
0

NySher
Pokročilý člen
Pokročilý člen
Príspevky: 566
Dátum registrácie: 25 Aug 2009, 00:00
Bydlisko: ZH / ZA
Vek: 30

Re: arduino praca s premennou

Príspevok od používateľa NySher » 02 Jan 2016, 18:09

No tak potom môžeš ten obsah stránky upraviť tak aby to bol regulárny JSON teda ["key":value,"key2":velue] a použiť nejakú knižnicu pre parsovanie JSONov pre Arduino... Alebo upraviť ten výpis tak aby to boli len čísla oddelené napr. čiarkou a potom pomocou cyklu vyčítavať tie čísla z toho Stringu do jednotlivých premenných napr. pomocou strtok http://www.cplusplus.com/reference/cstring/strtok/

Viac možností ako na to je napr. tu http://arduino.stackexchange.com/questi ... ing-string
0
:)

tomas73
Okoloidúci
Okoloidúci
Príspevky: 8
Dátum registrácie: 02 Jan 2016, 15:25

Re: arduino praca s premennou

Príspevok od používateľa tomas73 » 02 Jan 2016, 18:56

skúšam strtok , ale nejde mi to

premennu c mam v tvare 123.12,-4.22



pri kompilacii píše chybu

char str[] = c;

exit status 1
initializer fails to determine size of 'str'

nevieš prečo?
0

speed
Stály člen
Stály člen
Príspevky: 294
Dátum registrácie: 04 Dec 2007, 00:00
Bydlisko: Žilina

Re: arduino praca s premennou

Príspevok od používateľa speed » 02 Jan 2016, 19:15

Nemalo by byť medzi tými hranatými zátvorkami číslo z poľa? Alebo aspoň nejaký inkrement ?
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: arduino praca s premennou

Príspevok od používateľa peterple » 02 Jan 2016, 19:22

Chybová správa kompilátora je podľa mňa úplne jasná. Kompilátor nevie určiť dĺžku reťazca. Tvoj predpoklad že c obsahuje číslice oddelené čiarkami je úplne mimo. Ak teda platí ten program čo je nad tým (dávaj ho pre budúcnosť medzi Code značky)
c je deklarovaná ako char - to znamená znak. Teda v c sa v každom okamihu nachádza iba jediný znak (byte)

Kompilátor potrebuje v čase kompilácie vedieť aké dlhé má byť vytvorené pole znakov, preto ho nemôžeš inacializovať obsahom žiadnej premennej.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

tomas73
Okoloidúci
Okoloidúci
Príspevky: 8
Dátum registrácie: 02 Jan 2016, 15:25

Re: arduino praca s premennou

Príspevok od používateľa tomas73 » 02 Jan 2016, 19:34

prosim ta možeš mi to napísať ozaj neviem ako na to premennú data mam String keď ju zobrazím sú tam dva údaje oddelené čiarkou 0.05,10.2 prosím napíš mi príklad ako tie dve hodnoty dám do dvoch premenných
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: arduino praca s premennou

Príspevok od používateľa peterple » 02 Jan 2016, 19:41

Premenná data je niečo úplne iného, to je objekt String. To je úplne niečo iného ako je pole znakov, alebo znak. A prepáč žiadne hotové riešenie ti neponúknem. Chýbajú ti znalosti absolútnych základov v jazyku C. Myslím že pokiaľ na tom nezapracuješ je zbytočné ti tu dávať hotové riešenie.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

tomas73
Okoloidúci
Okoloidúci
Príspevky: 8
Dátum registrácie: 02 Jan 2016, 15:25

Re: arduino praca s premennou

Príspevok od používateľa tomas73 » 02 Jan 2016, 19:47

máš pravdu C nepoznám toto potrebujem súrne dokončiť , programujem v php , ok myslel som ,že mi tu niekto pomôže
0

NySher
Pokročilý člen
Pokročilý člen
Príspevky: 566
Dátum registrácie: 25 Aug 2009, 00:00
Bydlisko: ZH / ZA
Vek: 30

Re: arduino praca s premennou

Príspevok od používateľa NySher » 02 Jan 2016, 19:48

Pole charov (char str[]) nemôžeš deklarovať tak ako to robíš pretože kompilátor pri kompilácii nepozná dĺžku premennej c. Funguje to iba ak je obsah zadaný konštantne pri kompilácii (char str[] = "Bla bla"). Predpokladám že to c je premenná typu String. V tom prípade nevyváraj pole charov zbytočne by si duplikoval to isté v pamäti... Vytvor len pointer na pole charov char *str = c.c_str(); Tak isto aj parametre funkcie strtok() sú pointre na pole charov...

BTW: Skôr by som si asi pozrel na nejaký kurz C/C++ pred tým ako idem programovať niečo v C/C++. Keďže Arduino má kompilátor pre C++ tak skôr na C++ ale základy C nie sú nikdy zlé :wink:

BTW2: Ak projramuješ v PHP čo je veľmi podobné C++, niečo také ako rozparsovať String by mala byť predsa hračka nie? :roll:
0
Naposledy upravil/-a NySher v 02 Jan 2016, 19:50, upravené celkom 1 krát.
:)

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: arduino praca s premennou

Príspevok od používateľa peterple » 02 Jan 2016, 19:50

fúha, v čom sa až tak líši PHP od C? Možno ti tu niekto dá hotové riešenie. Ja som ochotný iba odpovedať na otázky ktorými si budeš chcieť vyjasniť situáciu.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

NySher
Pokročilý člen
Pokročilý člen
Príspevky: 566
Dátum registrácie: 25 Aug 2009, 00:00
Bydlisko: ZH / ZA
Vek: 30

Re: arduino praca s premennou

Príspevok od používateľa NySher » 02 Jan 2016, 19:55

A ak je to už taký sakra problém z mne neznámeho dôvodu tak si to sprav v PHP čo ja viem cez GET .../vycitaj.php?senzor=1 a vypíš len blbé číslo ktoré ulož do jednej premennej float cez konverziu String na float...
0
:)

tomas73
Okoloidúci
Okoloidúci
Príspevky: 8
Dátum registrácie: 02 Jan 2016, 15:25

Re: arduino praca s premennou

Príspevok od používateľa tomas73 » 02 Jan 2016, 20:02

v php robím bez deklarovania premenných , je to o dosť jednoduchšie ,toto konkrétne potrebujem k diaľkovému zobrazeniu údajov na lcd, momentálne to je riešené cez php a tablet , len každý prehliadač sa po týždni sekne a zamrzne to , je to takto nepoužiteľné .

Zatiaľ som sa všetko naučil sám ,len momentálne nemám toľko času , Ďakujem teda aspoň za po postrčenie.

-- Spojený príspevok 02 Jan 2016, 21:07 --
NySher napísal:A ak je to už taký sakra problém z mne neznámeho dôvodu tak si to sprav v PHP čo ja viem cez GET .../vycitaj.php?senzor=1 a vypíš len blbé číslo ktoré ulož do jednej premennej float cez konverziu String na float...
ano takto to mám ,len ja potrebujem vyčítať cez 20 údajov a dosť dlho trvá to takto vyčítať po jednom , ja to čítam z 6 zariadení po sieti, mám urobený php script ktorý to všetko vyčíta a už jemu to trvá dosť dlho pokial to dokončí.


viem to urobiť cez cron ktorý údaje načítata a uloží do txt odtiaľ to už pôjde rýchlo vyčítať ,ale toto riešenie sa mi nepáči
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: arduino praca s premennou

Príspevok od používateľa peterple » 02 Jan 2016, 20:13

No už z prvej otázky to navodzovalo že si samouk, lebo o vynímaní z premenej som zatiaľ nepočul, iba v matematike sa vynímalo pred zátvorku. Ja osobne by som to neriešil cez strtok, nakoľko na arduine tej pamete nebude bohvie koľko. A ten strtok to duplikovanie reťazcov asi spraviť bude musieť. Pri takom krátkom by to nevadilo ale stačí aby sa niečo pototo a ak miesto korektnej odpovede dostaneš nejaký blud, bude problém.
Čo tak nájsť si v reťazci znak ':' a potom previesť od nasledujúcej pozície to číslo. To opakovať koľko krát treba. Lenže tu na mcu treba vedieť ako to vo vnútri naozaj pracuje. Tu sa premenné len tak sami nezjavia a nezmiznú. Keď máš 2KiBy SRAM tak to nie je len tak šaj buj.

-- Spojený príspevok 02 Jan 2016, 20:19 --

Respektíve by som to parsoval už pri ukladaní. Teda začal by som ukladať za dvobodkou, a pri čiarke by som previedol reťazec na číslo. Nič zložitého na tom nevidím.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

NySher
Pokročilý člen
Pokročilý člen
Príspevky: 566
Dátum registrácie: 25 Aug 2009, 00:00
Bydlisko: ZH / ZA
Vek: 30

Re: arduino praca s premennou

Príspevok od používateľa NySher » 02 Jan 2016, 23:37

Vyskúšal som to len na PC v Qt, kde mi to ide tak veľa zdaru...

Kód: Vybrať všetko

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#define SENSORS_COUNT 5 //Predpokladám známy počet senorov a teda známy počet prijatých hodnôt

int main(int argc, char *argv[])
{
    String data = "12.5,15.86,1.25,132.45,88.5"; //Nejaké fake hodnoty
    float sensorsValues[SENSORS_COUNT]; //Pole so skonvertovanými hodnotami
    unsigned char i;

    for(i = 0; i < SENSORS_COUNT; i++)
    {
        char *ptr_val;
        if(i == 0) ptr_val = strtok(data.c_str(), ",");
        else ptr_val = strtok(NULL, ",");

        if(ptr_val != NULL)
        {
            sensorsValues[i] = atof(ptr_val); //Skonvertuj do čoho potrebuješ
            printf("%f\n", sensorsValues[i]); //Vypis pre test
        }
        else break; //Dačo je zle
    }

    return 0;
}
0
:)

tomas73
Okoloidúci
Okoloidúci
Príspevky: 8
Dátum registrácie: 02 Jan 2016, 15:25

Re: arduino praca s premennou

Príspevok od používateľa tomas73 » 03 Jan 2016, 16:03

ďakujem ,ale nefunguje to

Kód: Vybrať všetko

 (i == 0) ptr_val = strtok(data.c_str(), ",");

error:   initializing argument 1 of 'char* strtok(char*, const char*)' [-fpermissive]

 extern char *strtok(char *, const char *);

              ^

exit status 1
invalid conversion from 'const char*' to 'char*' [-fpermissive] 
0

NySher
Pokročilý člen
Pokročilý člen
Príspevky: 566
Dátum registrácie: 25 Aug 2009, 00:00
Bydlisko: ZH / ZA
Vek: 30

Re: arduino praca s premennou

Príspevok od používateľa NySher » 03 Jan 2016, 17:10

Jop ja som to skúšal s char* lebo v Qt niečo ako String arduinovský nie je... Takto by to už malo ísť, treba skopírovať ten String do char* poľa lebo strtok prepisuje pôvodnú premennú... Bolo by to možné aj pretypovaním c_str() ale... :wink:

Kód: Vybrať všetko

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#define SENSORS_COUNT 5 //Predpokladám známy počet senorov a teda známy počet prijatých hodnôt

int main(int argc, char *argv[])
{
    String data = "12.5,15.86,1.25,132.45,88.5"; //Nejaké fake hodnoty
    float sensorsValues[SENSORS_COUNT]; //Pole so skonvertovanými hodnotami
    unsigned char i;

    char* ptr_string = (char*)malloc((data.length() + 1) * sizeof(char));
    if(ptr_string != NULL)
    {
        strcpy(ptr_string, data.c_str());
        for(i = 0; i < SENSORS_COUNT; i++)
        {
            char *ptr_val;
            if(i == 0) ptr_val = strtok(ptr_string, ",");
            else ptr_val = strtok(NULL, ",");

            if(ptr_val != NULL)
            {
                sensorsValues[i] = atof(ptr_val); //Skonvertuj do čoho potrebuješ
                printf("%f\n", sensorsValues[i]); //Vypis pre test
            }
            else break; //Dačo je zle
        }
        free(ptr_string);
    }
    return 0;
}
0
:)

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok