Close

I2C

  • Toto téma obsahuje celkem 10 odpovědí. Do diskuze (2 diskutující) se naposledy zapojil uživatel rakocid a poslední změna proběhla před 8 roky a 6 měsíci.
Aktuálně je na stránce zobrazeno 11 příspěvků - 1. až 11. (celkem z 11)
  • Autor
    Příspěvky
  • #6390
    rakocid
    Účastník

    Prosím Vás nemal niekto skúsenosť s i2c komunikáciou medzi dvomi arduinami? Využívam jeden ako Master-reader a druhy Slave-writer… Master mi po čase stále zamrzne pri komunikácií, nabehne až keď Slave reštartujem. Riešim to už dlhu dobu a neviem si stým radi :/

    #6391
    posjirka
    Účastník

    hod se kod a zapojení … ale to jak to máš opravduzapojené, né stažené z netu 🙂

    #6392
    rakocid
    Účastník

    MASTER:
    #include <DS3231.h>
    #include <Wire.h>

    DS3231 Clock;
    bool Century=false;
    bool h12;
    bool PM;
    byte ADay, AHour, AMinute, ASecond, ABits;
    bool ADy, A12h, Apm;
    byte year, month, date, DoW, hour, minute, second;
    int c[18] ;
    float humid, templ = 20, humid_2, temp2 = 20,humid_3, temp3 = 20,humid_4, temp4 = 20,humid_5, temp5 = 20, humid_6, temp6 = 20;

    void setup()
    {
    Wire.begin();
    }

    void loop()
    {
    Wire.requestFrom(44, 18);
    int x = 0;

    while (Wire.available())
    {
    c[x] = Wire.read();
    x++;
    }

    if(c[0] < 35 && c[0] > 5){
    humid_5 = c[2];
    temp5 = (c[0]*10)+(c[1]/10);
    temp5 = temp5/10;}

    if(c[3] < 35 && c[3] > 5){
    humid_4 = c[5];
    temp4 = (c[3]*10)+(c[4]/10);
    temp4 = temp4/10;}

    if(c[6] < 35 && c[6] > 5){
    humid = c[8];
    templ = (c[6]*10)+(c[7]/10);
    templ = templ/10;}

    if(c[9] < 35 && c[9] > 5){
    humid_2 = c[11];
    temp2 = (c[9]*10)+(c[10]/10);
    temp2 = temp2/10;}

    if(c[12] < 35 && c[12] > 5){
    humid_3 = c[14];
    temp3 = (c[12]*10)+(c[13]/10);
    temp3 = temp3/10;}

    if(c[15] < 35 && c[15] > 5){
    humid_6 = c[17];
    temp6 = (c[15]*10)+(c[16]/10);
    temp6 = temp6/10;}

    Serial.println(templ);
    Serial.println(temp2);
    Serial.println(temp3);
    Serial.println(temp4);
    Serial.println(temp5);
    Serial.println(temp6);

    Serial.print(Clock.getHour(h12, PM), DEC);
    Serial.print(‚ ‚);
    Serial.print(Clock.getMinute(), DEC);
    Serial.print(‚ ‚);
    Serial.print(Clock.getSecond(), DEC);

    delay(2000);
    }

    SLAVE:
    #include <Wire.h>
    byte c[18] ;

    void setup() {
    Wire.begin(44);
    Wire.onRequest(requestEvent);
    }

    void loop() {
    //…
    }

    void requestEvent()
    {
    Wire.write(c,18);
    }

    Program je dosť dlhý prepísal som základ toho ako využívam wire, dufam že len vtom budem mať neaku chybu, mam to zapojene na testovanie takto… používam aj ethernet modul, pretože udaje posielam po sieti. Odpory používam 4,7 kOhm

    Attachments:
    #6395
    rakocid
    Účastník

    odkaz na fotky:
    zapojenie

    schema

    #6410
    posjirka
    Účastník

    ještě jak to máš od sebe vzdálené, Někdy to blbne když je to daleko. Pak se snižuje odpor PULL UP třeba na 2k2 nebo 1k0 … Kdyžtak to zkus a jak budu mít chvilku tak se na to já nebo někdo jiný podívá …

    #6414
    rakocid
    Účastník

    musím použivať odpory?, keď mam na wire zbernicu pripojene ds3231? myslím že už ds3231 obsahuje odpory. Skúsil som to snimi aj bez nich ale správalo sa to rovnako. mohlo by pomocť vyradiť z ds3231 interne rezistory a pridať externe s nižsím odpor?

    Alebo som rozmýšľal neposielať naraz 18 bytov ale rozdeliť to. Pýtať si napríklad po troch postupne. Nieje to veľa? Ale neviem ako sa to robí, či sa to dá. DS3231 knižnica funguje tak že si pýta stále len to čo potrebuje s funkciami (getSecond(); getMinute();…). Dalo by sa takéto slave zariadenie urobiť aj z arduino nano?

    Ďakujem za radi

    #6417
    posjirka
    Účastník

    co spíš použít formu dotaz/odopvěď.
    Můžeš si říct, že char(2) je dotaz na minutu, char(3) dotaz na hodinu, …
    tím pádem nebudeš posílat 18 bytů (bitu?) v základu je I2C (TWI) navržena pro komunikaci po 8 bitech + adresa + start/stop bity.
    Zkus si poslat jednoduché informace : … posílej si stále dokola číslo po každém přijmuti jej zvyš o 1.je to super pro monitorování stability komunikace. Při každé přijmuté odpovědi si můžeš ověřit, že jsi dostal správné data, případně si nechat rozsvítit LED diodu jako chybu .

    #6460
    rakocid
    Účastník

    vyskúšal som posielať 3 bajty, vzdialenosť minimálna, zdroj som zvýšil na 2 ampere, nikdy to nevydrží dlhšie ako hodinu.

    #6472
    posjirka
    Účastník

    a po 2 hodinách se ti zhroutí komunikace nebo resetuje arduno?
    Pokud linka videl bych to na zahlcený buffer, pokud reset arduna tak chyba v čipu.
    zkoušel jsi i jiný arduino?
    Stačil by čip s ledkou…

    #6484
    rakocid
    Účastník

    Arduino nano som vymenil, nepomohlo.
    Program zamrzne v casti ked komunikuje cez zbernicu wire.
    Zacne pracovat az po restartovani arduino nano (slave). Restartovanie len mastra nepomaha.
    Co by znamenalo keby bol zahlceny buffer?

    #6508
    rakocid
    Účastník

    Problem vyrieseny. Dakujem za rady.
    Hodnoty ktore som posielal boli prijate pomocou bezdrotoveho priimaca nrf24. Ked boli na väcsiu vzdialenost niektore hodnoty boli na tolko skreslene ze ich nedokazalo poslat dalej.Bohužial som sem ani tu cast programu nenapisal. Wire zbernica funguje skvele.

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