identifikace proměnných
Úvodní stránka › Fórum › Hardware › Arduino › identifikace proměnných
- Toto téma obsahuje celkem 11 odpovědí. Do diskuze (4 diskutující) se naposledy zapojil uživatel janzelenka a poslední změna proběhla před 7 měsíci a 4 týdny.
-
AutorPříspěvky
-
11.4.2015 v 15:56 #2976tribal.czÚčastník
Zdravím potřeboval bych poradit s problémem identifikace proměnných při propojení dvou a více arduin zatím to testuji na arduino uno a arduino mega. s tím že mega data zpracuje a odešle výslednou hodnotu do seriové linky kde je uno převezme. Data pocházejí z čidla RHT03 neboli DHT22. problém je že když dám data která arduino přijme vypsat vypíše se vše. Pro mé účeli je ale potřeba data vypisovat jinak než přijdou do una resp. mezi nimi přepínat
proměnné které odesílám z megy jsou:
– int temperature = sensor.temperature;
– humidity = sensor.humidity;12.4.2015 v 10:03 #2977Zbyšek VodaSprávceDobrý den,
když pošlete po sériové lince například:
Serial.println(hodnotaA) Serial.println(hodnotaB)
tak zařízení, které tyto hodnoty čte nemá šanci poznat, že se jednalo ho proměnné hodnotaA a hodnotaB. Přijatá data jsou to pro něj jenom série nul a jedniček (resp. bytů).
Při sériové komunikaci se většinou postupuje tak, že za číslem vždy následuje nějaký nečíselný znak. Na tento znak čeká program přijímající data. Podle toho pozná, že už číslo přišlo celé a z přijatých bytů poté poskládá přijaté číslo.
Druhou (a jednodušší) možností je použití Serial.parseInt(). Z Arduina, které data odesílá se pošle např.
Serial.print(hodnotaA); Serial.print('a') Serial.print(hodnotaB); Serial.print('a')
Kdy na místě ‚a‘ může být libovolný nečíselný znak.
Funkce Serial.parseInt() čeká, dokud neobdrží nějaký nečíselný znak a po jeho přijetí poskládá číslo z bytů přijatých před ním. Tedy v programu Arduina, které data přijímá by mělo být něco jako:int hodnotaA = Serial.parseInt() int hodnotaB = Serial.parseInt()
Každopádně bych ale asi zvážil, jestli je opravdu vhodné použití sériové linky v případě, když budete mít propojeno více Arduin než dvě. Někdy to nemusí vadit, ale mohlo by to dělat problémy. Možná by bylo lepší použít sběrnici i2c. Ta umožňuje přímé adresování jednotlivých desek.
12.4.2015 v 13:32 #2983tribal.czÚčastníkS i2c nemám moc zkušenosti ale jak koukám na článek který si dal do odpovědi bude to lepší. Jen je zde co se I2C týče pro mne pár nejasností. Takže předpokládám že I2c sběrnice zvládne třeba 10 zařízení najednou z toho dvě desky + mega a další třeba displej, hodinový modul atd. le problém vydím v připojení více zařízení na pin scl a sda samozřejmě se dá vše řešit pomocí nepájivého pole kde scl asd napojím na řady 1 a 2 a ty náledně rozvedu do několika dalších chápu to takhle správně pro zjednodušení přiložím obrázek.
https://drive.google.com/file/d/0B_QUj2kCn2H3NGpEeE5Jajd4M1E/view?usp=sharing
budu vycházet nyní z tohoto prikladu
ve zdrojaku budu mit
/* nejedna se o proměnné ale pouze poznámku czech = 1 london = 2 */ komunikaci nastaruji, odešlu proměnnou a ukončím takto Wire.beginTransmission(1); Wire.write(czech); Wire.endTransmission(); Wire.beginTransmission(2); Wire.write(london); Wire.endTransmission(); a na jedné z desek přijmu while(!Wire.available()){ a = Wire.read(); }
Následně proměnnou a vypíši. Ale nebudu se potýkat s obdobným problémem v případě že po itc mezi dvěma arduiny pošlu hodnotu třeba z pěti senzorů stále nebudu vědět co je co takže opět budu muset přidat nějaký nečíselný znak nebo se pletu?
12.4.2015 v 13:47 #2986Luke_CZÚčastníkHoď sem nějakou malůvku, jak to chceš mít zapojený a co to má dělat. Jinak ti nikdo nedokáže dobře poradit.
12.4.2015 v 14:00 #2988tribal.czÚčastníktak řekněme dvě dht22 jedna mega a dvě una spodní uno zobrazuje pouze teplotu z pravého sensoru a horní uno zobrazuje teplotu i vlhkost z levého sensoru.
ve výsledku půjde úplně o jiné zařízení ale pro příklad je následující situace více než dostačujícíhttps://drive.google.com/file/d/0B_QUj2kCn2H3U0lfZFFjNzlUWE0/view?usp=sharing
12.4.2015 v 14:31 #2989Luke_CZÚčastníkChápu-li to dobře, tak:
1, Mega bude číst data ze senzorů a ty posílat do dvou UNO
2, na UNO budeš číst sériová data a zobrazovat pouze vybrané hodnotyPokud to tak je, tak poskládej v MEGA načtená data do řetězce např:
#teplota1#teplota2#vlhkost1#vlhkost2 = na port pošleš tedy řetězec #20.5#21.4#62.7#58.4V každém UNO potom načteš z RX celej řetězec a ten zase rozebereš na jednotlivé hodnoty. Potom si jen zobrazíš ty, které budeš chtít.
Tady máš na to funkci:
String getValue(String data, char separator, int index) { int found = 0; int strIndex[] = { 0, -1 }; int maxIndex = data.length()-1; for(int i=0; i<=maxIndex && found<=index; i++){ if(data.charAt(i)==separator || i==maxIndex){ found++; strIndex[0] = strIndex[1]+1; strIndex[1] = (i == maxIndex) ? i+1 : i; } } return found>index ? data.substring(strIndex[0], strIndex[1]) : ""; }
12.4.2015 v 15:54 #2993tribal.czÚčastníkok takže cele to bude vypadat nějak takto
mega
#include <Wire.h> #include <dht.h> dht sensor String vystup; int dht[] = {7, 8}; int temp1; int temp2; int hum1; int hum2; void setup() { Serial.begin(9600); Wire.begin(); } void loop() { sensor.read(dht[0]); temp1 = sensor.temperature; hum1 = sensor.humidity; sensor.read(dht[1]); temp2 = sensor.temperature; hum2 = sensor.humidity; Wire.beginTransmission(1) // prvni uno Wire.write(temp1#hum1); Wire.endTransmission(); Wire.beginTransmission(2) // Druhe uno Wire.write(temp2#hum2); Wire.endTransmission(); }
uno
#include <Wire.h> string value; int tempghum[]; void setup(){ Wire.begin(1); } void loop(){ while(!Wire.available()) { } value = Wire.read(); // do proměnné value se uloží příchozí hodnoty tedy teplota a vlhkost z jednoho ze senzorů getValue(var, '#', tempghum ) TFTscreen.println (tempghum[0]); //a zobrazíme pouze teplotu pro obě hodnoty... TFTscreen.print (tempghum[0]); TFTscreen.println (tempghum[1]); } String getValue(String data, char separator, int index) { int found = 0; int strIndex[] = { 0, -1 }; int maxIndex = data.length()-1; for(int i=0; i<=maxIndex && found<=index; i++){ if(data.charAt(i)==separator || i==maxIndex){ found++; strIndex[0] = strIndex[1]+1; strIndex[1] = (i == maxIndex) ? i+1 : i; } } return found>index ? data.substring(strIndex[0], strIndex[1]) : ""; }
příklad píšu jen pro to zda jsem správně pochopil tvojí funkci, takže jako parametry tovjí funkce je řetězec přijatý z megy, následně znak kterým původní proměnné odděluji a poslední parametr je výstupní proměnná do které se vše uloží resp do pole. Výsledné hodnoty potom poté mohu zobrazit například na displeji. je mi jasné že program na unu nejspíš ani nebude fungovat napsal sem to jen jako ukázku. Býval bych to hned vyzkoušel ale bohužel momentálně nejsem doma takže nemám přístup k arduinu. Pokud se pletu prosím oprav mne
18.4.2015 v 11:28 #3030Luke_CZÚčastníkKdyž už jsme u toho,tak na to, abys zobrazoval různé hodnoty na LCD, tak nepotřebuješ TŘI arduina, ale stačí ti naprosto jedno na který pověsíš x kusů I2C LCD, na těch se dá měnit I2C adresa. Navíc I2C má velmi limitovanou délku propojení.
18.4.2015 v 14:25 #3031tribal.czÚčastníkŠlo pouze o teorii jinak je mi jasný že výsledek bude vypadat jinak teorie byla toto => jedno centrální zařízení (mega) a tři klientské (uno) každé přijímá z centrály data ty pak vypisuje na svůj displej + centrála vše ukládá na sd a zobrazuje na svém displeji jako celkový přehled toť vše
18.4.2015 v 14:58 #3032tribal.czÚčastníkMohl by jsi mi sem dát nějaký příklad z tou tvojí funkcí?
18.4.2015 v 15:43 #3033Luke_CZÚčastníkPísni na Skype: velky_ujezd
20.2.2024 v 22:20 #21734janzelenkaÚčastníkLuke, píšu na Skype, ale žádná odpověď. Zřejmě už tam nejsi? Místo luke se mi ukazuje andělská čísla 1717 a nějaký obrázke ufouna 🙂
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.