Okos otthon is fókuszban

Arduino kalandok

Arduino kalandok

Computherm Q8RF - Szoftver és teszt - part 4

2019. december 06. - denx

Eltert  pár hét és most beugrott, hogy nem fejeztem be a projekt publikálását!

Az előző részekben odáig jutottam, hogy sikerült megfejtenem a protokollt és találtam olyan adó és vevő eszközöket is, amikkel esélyesnek tűnt, hogy működni fog a dolog. Ami ezután jött, az a szoftver oldal próbálgatása és csiszolgatása.

A dologhoz hozzá tartozik, hogy míg az előző poszt 90%-os készültségben várta a publikálást, addig ezt most emlékezetből kell megírnom. Hogy is volt ez tavasszal?

Első próbálkozások - adás

Szóval az adás volt az elsődleges cél, ehhez pedig ahogy említettem merítettem más 433-as libekből. Mikrokontrolleres környezetben nem illik delay() függvényt használni, (talán ezt már korábban említettem, de ha nem akkor érdemes utánanézni miért is ellenjavallott) viszont itt az időzítés az elsődleges cél amikor OOK módon akarunk üzenetet küldeni. És mivel a delay() csak miliszekundum pontosságú, ezért az nekem nem ideális, szóval a megoldás a delayMicroseconds() függvény. A hivatalos leírás szerint 3 us-től felfelé elég pontos, nálam meg egy ütem a mérések alapján 220 us lett, szóval ez az én fegyverem! Csináltam is egy ilyen függvényt:

#define TICK_LENGTH 220

void sendPulse(uint8_t low_time, uint8_t high_time) {
  digitalWrite(OUTPUT_PIN, LOW);
  delayMicroseconds(low_time * TICK_LENGTH);
  if (high_time > 0) {
    digitalWrite(OUTPUT_PIN, HIGH);
    delayMicroseconds(high_time * TICK_LENGTH);
    digitalWrite(OUTPUT_PIN, LOW);
  }
}

 A fenti egyszerű kis kód csak annyit csinál, hogy adott ütemig alacsony szinten tartja a kimenetet, majd ha kell akkor adott ideig magasan. Erre épül a bit-küldő függvény:

void sendBit(uint8_t bit) {
  if (bit) {
    sendPulse(1, 2);
  } else {
    sendPulse(2, 1);
  }
}

Ez már jól mutatja, hogy ha 1-est akarok küldeni, akkor 1 alacsony után jön 2 magas ütem, ha 0-t, akkor meg 2 alacsony után jön 1 magas. Van még 2 speciális függvény:

void sendStop() {
  sendPulse(6, 0);
}


void sendSync() {
  sendPulse(3, 3);
  sendPulse(3, 3);
}

Ahogy azt korábban kiokumláltam, 6 ütemnyi szünet választja el egymástól az üzeneteket, majd 3 alacsony - 3 magas - 3 alacsony - 3 magas sorozat segíti a vevőt, hogy megtanulja milyen hosszú az adásunkban egy ütem, szóval ez maga a szinkronizáció.

Ezekből az építőkockákból már sikerült egy szinte tökéletes üzenetet összeraknom, amikor is az RTL-SDR rádióvevővel ellenőrizve arra kellett rájöjjek, hogy a legelső magasba húzás rendszerint elmarad (vagy a hossza lényegesen rövidebb, mint kellene). Hosszas töprengés és próbálgatás után arra jutottam, hogy fel kell ébreszteni a rádióadót a mély álomból. (Ha jól amlékszem ez le is van írva az alkatrész dokumentációjában.)  A megoldás pedig ez az igen rövidke függvény lett:

void wakeUpTransmitter() {
  digitalWrite(OUTPUT_PIN, HIGH);
  delayMicroseconds(TICK_LENGTH / 2);
  digitalWrite(OUTPUT_PIN, LOW);
}

Ezt minden alkalommal - amikor régen adtunk már adást - be kell bökni a legelső csomag elé, így már az első pillanattól kezdve tökéletes csomagok állnak össze. A próbálgatások során arra is rájöttem, hogy az emeleti termosztát, ami A és B csomagokat felváltva küldözget valszeg valamilyen bug miatt viselkedik ilyen furcsán és a Computherm vevőegysége arra reagál, amikor az A csomag megérkezik. Vagyis ha 8-szor megismétlem az A csomag küldését, az pont annyira jó neki, mintha az A-B párosokat küldözgetem - ahogy a termosztát is teszi.

A tesztek alapján a fenti részletekből össze lehet állítani egy tökéletesen működő adóegységet, ezt le is videóztam, csak sajnos nem találom azt a videót. :(

A bejegyzés trackback címe:

https://ardu.blog.hu/api/trackback/id/tr2615338030

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása