Close

Komunikace na 433Mhz

Úvodní stránka Fórum Hardware Arduino Komunikace na 433Mhz

  • Toto téma obsahuje celkem 3 odpovědi. Do diskuze (3 diskutující) se naposledy zapojil uživatel bot a poslední změna proběhla před 6 roky a 1 měsícem.
Aktuálně jsou na stránce zobrazeny 4 příspěvky - 1. až 4. (celkem z 4)
  • Autor
    Příspěvky
  • #8554
    bot
    Účastník

    Dobrý den,

    chci pochopit a zprovoznit komunikaci pomocí těchto modulů MX-FS-03V & MX-05.

    Myslím, že tuto problematiku do určité míry chápu, zatím to zkouším na primitivním programu:

    Vysílač:

    void setup() {
      pinMode(2, OUTPUT);
      pinMode(3, INPUT);
      digitalWrite(3, LOW);
    }
    
    void loop() {
      if (digitalRead(3)){
        String packet = "10011100";
        sendOneByte(packet);
      }
    }
    
    void sendOneByte(String message){
      for(int i = 0; i < 8; i++){
        if (message[i] == '0'){
          digitalWrite(2, HIGH);    // 0
          delayMicroseconds(400);
          digitalWrite(2, LOW);     // break
          delayMicroseconds(600);
        } else {
          digitalWrite(2, HIGH);    // 1
          delayMicroseconds(1000);
          digitalWrite(2, LOW);     // break
          delayMicroseconds(600);
        }
      }
    
      digitalWrite(2, LOW);     // One byte break
      delayMicroseconds(1500);
    }

    Přijímač:

    volatile byte packet;
    
    void setup() {
      pinMode(13, OUTPUT);
      digitalWrite(13, LOW);
    
      pinMode(2, INPUT_PULLUP);
      attachInterrupt(digitalPinToInterrupt(2), flash, CHANGE);
    }
    
    void loop() {
      if (packet == 0b10011100){
        digitalWrite(13, HIGH);
        delay(2000);
        digitalWrite(13, LOW);
        packet = 0b00000000;
      }
    }
    
    void flash(){
      if(pulseIn(2, HIGH) > 500){
        packet <<= 1;         // 1
        packet |= 0b00000001;
      } else {
        packet <<= 1;         // 0
        packet &= 0b11111110;
      }
    }

    Pokud odešlu byte, ledka(pin 13) se rozsvítí, ale arduino jako by se zaseklo a lediodu nevypne, i když dle mého by mělo, ať se děje co se děje.

    Nevíte prosím, kde by mohla být chyba?

    Děkuji.

    #8557
    Zbyšek Voda
    Správce
    #8558
    posjirka
    Účastník

    jak píše Zbyšek je vhodné vyzkoušet nějáký prověřený řešení a ideálně s použitím knihoven virtualwire nebo LW. chybu v tvem kodu nevidím, ale určitě bych použil i nulování proměnné , když tlačítko není stisknuté. Už jen pro test co to udělá.

    Jinak jestli chceš něco česky:

    http://arduino8.webnode.cz/news/lekce-20-arduino-a-vyuziti-433-92-mhz/

    #8579
    bot
    Účastník

    Děkuji za Vaše rady.

    Pomocí těchto návodů jsem to již předtím zprovoznil.

    Teď bych si chtěl napsat něco svého jednoduchého, jelikož to poté chci přepsat do Cečka pro attiny13a. Potřebuji spínat vysílačem 3 nezávislé relé(každé bude mít svůj přijímač). Tedy dle sepnutého tlačítka se odešle patřičný paket, který dešifruje jeden zvolený přijímač (jedno relé). Vesměs jsem našel i hotové řešení a odzkoušené na attiny13a, ale mě zcela nefunguje korektně (vysílač musím držet v prstech ve správné poloze, až poté začne vysílat)

    Co jsem tak zkoušel, tak je problém s funkcí delay(). Po odstranění, se již arduino „nezasekne“, ale i tak se chová divně. Nehledě na to, že by měla fungovat bez problému pokud se nepoužije přímo v ISR.
    Zkoušel jsem vypnout i přerušení poté co přijme správný packet(„10011100“) a opět ho poté zapnout. To bohužel také nezabralo. Zdá se mi, že je problém s časovači, nejspíše někde přetečou, a proto se arduino chová divně(náhodně), ale vůbec se v tom nevyznám a nevím, kde může být chyba.
    Vysílač je dle mě správný, oba signály (z vysílače i přijímače) sleduji na osciloskopu – paket se vždy odešle a přijme správně, ale problém je se zpracováním(u přijímače).

Aktuálně jsou na stránce zobrazeny 4 příspěvky - 1. až 4. (celkem z 4)
  • Pro reakci na toto téma se musíte přihlásit.