Close

identifikace proměnných

Úvodní stránka Fórum Hardware Arduino identifikace proměnných

Označeno štítky: ,

  • 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 2 měsíci.
Aktuálně je na stránce zobrazeno 12 příspěvků - 1. až 12. (celkem z 12)
  • Autor
    Příspěvky
  • #2976
    tribal.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;

    #2977
    Zbyšek Voda
    Správce

    Dobrý 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.

    #2983
    tribal.cz
    Účastník

    S 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?

    #2986
    Luke_CZ
    Účastník

    Hoď 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.

    #2988
    tribal.cz
    Účastník

    tak ř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

    #2989
    Luke_CZ
    Účastník

    Chá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é hodnoty

    Pokud 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.4

    V 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]) : "";
    }
    #2993
    tribal.cz
    Účastník

    ok 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

    #3030
    Luke_CZ
    Účastník

    Když 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í.

    #3031
    tribal.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

    #3032
    tribal.cz
    Účastník

    Mohl by jsi mi sem dát nějaký příklad z tou tvojí funkcí?

    #3033
    Luke_CZ
    Účastník

    Písni na Skype: velky_ujezd

    #21734
    janzelenka
    Účastník

    Luke, 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 🙂

Aktuálně je na stránce zobrazeno 12 příspěvků - 1. až 12. (celkem z 12)
  • Pro reakci na toto téma se musíte přihlásit.