Novinky: Pridal som novú sekciu na webe - Turistika
Sitepoint logo

JDY-10, alebo ako sa trápiť s BLE

Do jedného projektu som potreboval BLE modul na sériový prenos dát. To som ešte nevedel aký boj ma čaká. Aby vývoj nebol drahý, kúpil som nejaký čínsky zázrak s menom JDY-10 a popis mlel niečo o kompatibilite s HM-11 a CC2541. Prvý problém bola dokumentácia – to málo čo som našiel bolo po čínsky, zvyšok po rusky 🙂

Nech sa páči, haraburda

Za prvé, haraburda nevie používať GPIO ktoré sú vyvedené po stranách! Za druhé, z množstva AT commandov ktoré sú vo firmware modulu HM-11 toto čudo pozná iba pár. Za ďalšie, ak je modul aktívny (GPIO D4 -> LOW), tak to žerie non-stop 8mA, čo zrovna teda BLE (low energy) nie je! Takže treba zabudnúť, že to bude fungovať ako iBeacon na CR2032 baterke 3 roky… Jediné využitie je, že MCU bude ovládať pin D4 a iba vtedy bude BLE aktívne.

Každopádne, napájanie je 3.3V, D4 treba pripojiť na GND, default rýchlosť UART je 115200 Bd. AT commandy akceptuje iba pokiaľ nie je na BLE pripojený klient. Čo sa dá nastaviť – viď datasheet, ale v skratke:

  • AT+VER – zobrazí verziu FW
  • AT+MAC – MAC BLE devicu
  • AT+NAME – BLE názov zariadenia, aspoň že si ho zapamätá aj po odpojení napájania!
  • AT+POWE – vysielací výkon, nemení sa spotreba modulu…
  • AT+BAUD – zmena rýchlosti UARTu
  • AT+ADVINT – advertising interval

Ešte aj posielanie dát po spojení je špeciálne – riadok musí byť ukončený nie len CR+LF (Serial.println), ale CR+LF+CR, takže v kóde treba použiť:

Serial.println("abrakadabra\r");
Serial.print("abrakadabra\r\n\r"); 

Dostať sa ku týmto sériovým dátam vo Windows je umenie, ideálne je použiť nejaký program na mobile, pre Android napríklad Serial Bluetooth Terminal. Ak teda chcete urobiť nejaké reálne zariadenie, čakajú vás muky zvané Java (či už pre Android alebo iOS). Preto iba malá vychytávka ako zobraziť teplotu z interného čidla na Arduino UNO, vo forme zmeny názvu BLE device 🙂

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.print("AT+NAMEt=");
  Serial.print(GetTemp());
  Serial.print("°C\r\n\r");
  delay(10000);
}

double GetTemp(void){
  unsigned int wADC;
  double t;
  ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
  ADCSRA |= _BV(ADEN);
  delay(20);
  ADCSRA |= _BV(ADSC);
  while (bit_is_set(ADCSRA,ADSC));
  wADC = ADCW;
  t = (wADC - 324.31 ) / 1.22;
  return (t);
}

A výsledok v nRF Connect aplikácii 🙂

Keď tak rozmýšľam, asi by sa to dalo použiť s nejakým ATtiny MCU ktoré by sa raz za nejaký interval zobudilo, prečítalo svoju teplotu, zaplo JDY-10, nastavilo názov a nechalo ho zapnuté na sekundu, a potom zase vyplo a uspalo sa 🙂


Categories:

Tags:


Comments

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *