arduino praca s premennou
Moderátori: psichac, Moderátori
arduino praca s premennou
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.
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
-
- 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
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
Re: arduino praca s premennou
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
-
- 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
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
Re: arduino praca s premennou
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);
}
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
-
- 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
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
Viac možností ako na to je napr. tu http://arduino.stackexchange.com/questi ... ing-string
0
Re: arduino praca s premennou
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?
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
Re: arduino praca s premennou
Nemalo by byť medzi tými hranatými zátvorkami číslo z poľa? Alebo aspoň nejaký inkrement ?
0
-
- 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
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.
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í.
Re: arduino praca s premennou
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
-
- 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
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í.
Re: arduino praca s premennou
máš pravdu C nepoznám toto potrebujem súrne dokončiť , programujem v php , ok myslel som ,že mi tu niekto pomôže
0
-
- 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
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é
BTW2: Ak projramuješ v PHP čo je veľmi podobné C++, niečo také ako rozparsovať String by mala byť predsa hračka nie?
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é
BTW2: Ak projramuješ v PHP čo je veľmi podobné C++, niečo také ako rozparsovať String by mala byť predsa hračka nie?
0
Naposledy upravil/-a NySher v 02 Jan 2016, 19:50, upravené celkom 1 krát.
-
- 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
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í.
-
- 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
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
Re: arduino praca s premennou
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 --
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
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 --
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čí.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...
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
-
- 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
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.
Č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í.
-
- 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
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
Re: arduino praca s premennou
ď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
-
- 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
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...
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
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok
-
- 4 Odpovedí
- 1204 Zobrazení
-
Posledný príspevok od používateľa lucky62
-
- 20 Odpovedí
- 1336 Zobrazení
-
Posledný príspevok od používateľa jankrizan
-
- 10 Odpovedí
- 876 Zobrazení
-
Posledný príspevok od používateľa budvar10
-
- 11 Odpovedí
- 2622 Zobrazení
-
Posledný príspevok od používateľa mirosne
-
- 12 Odpovedí
- 3540 Zobrazení
-
Posledný príspevok od používateľa Edgar