Modul penerima MR1132 nooLite baru untuk Arduino

gambar

Artikel ini akan membahas modul penerima sinyal nooLite baru untuk Arduino dan mikrokontroler. Apa yang luar biasa tentang modul ini? Sampai sekarang, tidak ada cara untuk menerima informasi dari sensor dan untuk mengontrol transmisi sinyal dari remote control sistem nooLite pada mikrokontroler dan Arduino, kemungkinan ini hanya ada untuk komputer yang menggunakan adaptor USB khusus.

Sekarang, dengan dirilisnya modul MR1132, sekarang dimungkinkan untuk menerima data tentang suhu, kelembaban, pencahayaan, dan keberadaan orang-orang di ruangan dari sensor nirkabel sistem nooLite dalam sketsa Anda di Arduino, kemampuan untuk melacak perintah yang dikeluarkan ke unit daya nooLite dengan sakelar kendali jarak jauh dan banyak lagi yang sebelumnya tidak tersedia.

Pada artikel ini saya akan memberi tahu Anda tentang pengoperasian modul ini dan memberikan sketsa yang berfungsi, yang dengannya Anda dapat dengan mudah membuat perangkat di MR1132. Dalam artikel selanjutnya saya akan berbicara tentang integrasi modul ini dengan sistem Arduino Mega Server yang populer dan tentang fitur-fitur luar biasa yang akan muncul sehubungan dengan integrasi ini.

Modul


Modul MR1132 sangat mirip dengan saudaranya, modul MT1132 (yang sudah ada siklus artikel di Gimetays satu , dua , tiga ). Perbedaannya adalah bahwa modul MT1132 adalah pemancar, dan modul MR1132 adalah penerima dan efek terbesar dapat diperoleh ketika mereka digunakan bersama.

Poin penting lainnya adalah bahwa pemancar MT1132 bersifat universal dan bekerja baik dari 3,3 V dan dari 5 V (yang berarti bekerja dengan pengontrol 3,3 volt dan dengan 5 volt), dan penerima hanya dari 5 V. Ini harus diperhitungkan saat merancang perangkat Anda dan, jika perlu, gunakan koordinator level logis.

gambar

Koneksi sesederhana modul MT1132 - tegangan suplai, arde dan dua kontak RX dan TX. RTS dapat ditarik ke tegangan suplai, tetapi semuanya bekerja untuk saya bahkan tanpa menghubungkan output ini.

Bekerja


Modul beroperasi melalui antarmuka serial dengan kecepatan 9600. Modul menerima perintah dari pengontrol dan, pada gilirannya, mengeluarkan data yang diterima dari udara (dari sensor dan remote nooLite).

Mari kita lihat lebih dekat pada poin ini, sehingga Anda memiliki pemahaman yang jelas tentang cara kerja modul ini.

Semua perintah yang dapat dikirim oleh pengontrol ke modul melalui antarmuka serial terkait dengan perangkat nooLite “binding” atau “unying”, yang darinya modul akan menerima data. Tidak ada lagi perintah kontrol untuk modul ini. Misalnya, Anda mengikat sensor suhu nooLite PT112 pada saluran nol (total 32 saluran, yang tercermin dalam nama modul) dan setelah itu modul akan mulai menerima data dari sensor ini dan menampilkannya ke antarmuka serial (di mana tugas kami adalah untuk "menangkap" dan menggunakannya untuk tujuan).

Jika kita tidak perlu lagi menerima data dari sensor apa pun, maka kita dapat mengirim perintah decoupling (dalam hal ini, pada saluran nol) dan penerima tidak akan lagi memberikan informasi kepada pengontrol dari sensor ini.

Adapun informasi yang diterima oleh modul MR1132 dari perangkat nooLite, ada dokumen terpisah yang menjelaskan format semua perintah yang mungkin. Kami, dalam konteks narasi ini, dari daftar luas ini akan tertarik pada tim sensor suhu, kelembaban dan gerak. Perintah-perintah ini akan dibahas secara rinci di bawah ini, menggunakan sketsa sebagai contoh.

Sensor


Dalam percobaan kami, tiga sensor akan digunakan.

gambar

Sensor suhu PT112 dan sensor suhu dan kelembaban PT111. Mereka terlihat sama dan bekerja dengan cara yang persis sama, perbedaannya adalah PT112 hanya memberikan informasi tentang suhu, dan PT111 memberikan informasi tentang suhu dan kelembaban. Sensor-sensor ini dapat bekerja dalam mode sensor sederhana atau dalam mode termostat dan hygrostat, tetapi kita akan tertarik dengan mode sensor sederhana.

gambar

Sensor ketiga adalah PM111. Ini adalah sensor gerak yang dapat secara langsung mengontrol unit daya nooLite, tetapi kami hanya akan tertarik pada kami sebagai sumber informasi tentang gerakan dan keberadaan orang di ruangan.

Pengendali



Arduino Mega 2560 akan digunakan sebagai pengontrol kontrol, dan dua antarmuka serial - Serial (untuk kontrol informasi visual) Serial2 (untuk komunikasi dengan modul penerima). Serial1 dicadangkan untuk modul pemancar MT1132.

gambar

Sketsa


Di bagian setup (), dua antarmuka diluncurkan, pesan informasi tentang awal sketsa ditampilkan, dan perintah dikeluarkan untuk mengikat perangkat nooLite pada saluran nol. Ini adalah perintah uji dan Anda dapat berkomentar atau menggantinya dengan perintah lain (misalnya, binding di saluran lain atau melepaskan ikatan).

void setup() {
  Serial.begin(9600);
  Serial2.begin(9600);
  Serial.println("*** Start sketch ***");
  mrBind(0);
  //mrUnbind(0);
}

Sebelum mengerjakan sketsa, Anda perlu melakukan beberapa langkah awal, yaitu, ikat sensor Anda ke modul dengan cara berikut:

PT112 - saluran nol
PT111 - saluran satu
PM111 - saluran dua

Untuk ini Anda perlu menjalankan sketsa tiga kali, mengubah perintah penjilidan

mrBind(0);
mrBind(1);
mrBind(2);

dan setiap kali tekan tombol pada sensor yang sesuai. Ini perlu dilakukan hanya sekali, maka perintah yang mengikat dapat dikomentari. Atau, alih-alih, lepaskan perintah lepaskan dan lepaskan salah satu sensor yang terpasang.

Di bagian loop (), hanya ada satu fungsi mrCheck (), yang bertanggung jawab untuk "menangkap" pesan dari modul MR1132 dari antarmuka serial Serial2.

void mrCheck() {
  if (Serial2.available() == 8) {
    mrBuf[0] = Serial2.read();
    mrBuf[1] = Serial2.read();
    mrBuf[2] = Serial2.read();
    mrBuf[3] = Serial2.read();
    if (mrBuf[0] == 79 && mrBuf[1] == 75 && mrBuf[2] == 13 && mrBuf[3] == 10) {
      Serial.println("OK");
    } else {
        mrBuf[4] = Serial2.read();
        mrBuf[5] = Serial2.read();
        mrBuf[6] = Serial2.read();
        mrBuf[7] = Serial2.read();
        mrNewData();
      }
  }
}

Fungsi ini mengisi array mrBuf [8] dengan data yang berasal dari modul atau mentransmisikan ke pesan Seri "OK", yang dikeluarkan oleh modul MR1132. Selanjutnya, isi dari array mrBuf [8] diuraikan sesuai dengan format data dari perintah sistem nooLite, dan fungsi sketsa yang sesuai terlibat dalam hal ini.

Fungsi mrNewData () mengekstrak data utama dari array mrBuf [8] dan, tergantung pada perintah yang masuk, menampilkan informasi yang diperlukan ke Serial (saluran, perintah, suhu, kelembaban, status baterai sensor, dll.).

void mrNewData() {
  mrClearData();
  mrPrintHeader();
  
  mrSetBindState();
  mrPrintBindState();
  mrSetChannel();
  mrPrintChannel();

  mrSetCommand();
  mrSetDatas();

  switch (mrCommand) {
    case 0:
      Serial.print("PIR command: ");Serial.println("OFF");
      break;
    case 2:
      Serial.print("PIR command: "); Serial.println("ON");
      break;
    case 21:
      mrSetDeviceType();
      mrPrintDeviceType();
      if (mrDeviceType == 1) {
        mrSetTemperature();
        mrPrintTemperature();
      }
      if (mrDeviceType == 2) {
        mrSetTemperature();
        mrPrintTemperature();
        mrSetHumidity();
        mrPrintHumidity();
      }
      break;
    default: 
      ;
  } // switch
  mrSetBatteryState();
} // newData()

Fungsi yang mengandung kata Cetak dalam namanya terlibat dalam mengeluarkan informasi ke antarmuka Serial untuk kontrol visual.

Fungsi-fungsi berikut mendekripsi data dalam array mrBuf [8], sesuai dengan format data dari perintah sistem nooLite:

mrSetTogl () - nilai penghitung perintah masuk
mrSetBindState () - status modul (mengikat / norma)
mrSetReceiveBit () - bit penerimaan kontrol perintah baru
mrSetChannel () - nomor saluran
mrSetCommand () - perintah
mrSetFormat () - format data
mrSetDeviceType () - tipe sensor
mrSetDatas () - isi empat byte data
mrSetTemperature ()- mendapatkan nilai suhu
mrSetHumidity () - mendapatkan nilai kelembaban
mrSetBrightness () - mendapatkan nilai iluminasi
mrSetBatteryState () - status baterai sensor

Anda dapat melihat detail penerapan fungsi-fungsi ini dalam kode sketsa lengkap yang terlampir di bawah ini.

Ini sketsa lengkapnya.

Kode sketsa lengkap
// TX2 16
// RX2 17
// TX1 18
// RX1 19

// nooLite MR1132 data
byte mrBuf[8];
int mrTogl = -1;
int mrBindState = -1;
int mrReceiveBit = -1;
int mrChannel = -1;
int mrCommand = -1;
int mrFormat = -1;
int mrData0 = -1;
int mrData1 = -1;
int mrData2 = -1;
int mrData3 = -1;
int mrDeviceType = -1;
int mrBatteryState = -1;
int mrHumidity = -1;
int mrBrightness = -1;
float mrTemp = -1.0;

// nooLite MR1132 bind/unbind

void mrSerialChannel(byte ch) {
switch (ch) {
case 0: Serial.println («0»); break;
case 1: Serial.println («1»); break;
case 2: Serial.println («2»); break;
case 3: Serial.println («3»); break;
case 4: Serial.println («4»); break;
case 5: Serial.println («5»); break;
case 6: Serial.println («6»); break;
case 7: Serial.println («7»); break;
case 8: Serial.println («8»); break;
case 9: Serial.println («9»); break;
case 10: Serial.println(«10»); break;
case 11: Serial.println(«11»); break;
case 12: Serial.println(«12»); break;
case 13: Serial.println(«13»); break;
case 14: Serial.println(«14»); break;
case 15: Serial.println(«15»); break;
case 16: Serial.println(«16»); break;
case 17: Serial.println(«17»); break;
case 18: Serial.println(«18»); break;
case 19: Serial.println(«19»); break;
case 20: Serial.println(«20»); break;
case 21: Serial.println(«21»); break;
case 22: Serial.println(«22»); break;
case 23: Serial.println(«23»); break;
case 24: Serial.println(«24»); break;
case 25: Serial.println(«25»); break;
case 26: Serial.println(«26»); break;
case 27: Serial.println(«27»); break;
case 28: Serial.println(«28»); break;
case 29: Serial.println(«29»); break;
case 30: Serial.println(«30»); break;
case 31: Serial.println(«31»); break;
} // switch
} // mrSerialChannel( )

void mrSerial2Channel(byte ch) {
switch (ch) {
case 0: Serial2.print(«00»); break;
case 1: Serial2.print(«01»); break;
case 2: Serial2.print(«02»); break;
case 3: Serial2.print(«03»); break;
case 4: Serial2.print(«04»); break;
case 5: Serial2.print(«05»); break;
case 6: Serial2.print(«06»); break;
case 7: Serial2.print(«07»); break;
case 8: Serial2.print(«08»); break;
case 9: Serial2.print(«09»); break;
case 10: Serial2.print(«10»); break;
case 11: Serial2.print(«11»); break;
case 12: Serial2.print(«12»); break;
case 13: Serial2.print(«13»); break;
case 14: Serial2.print(«14»); break;
case 15: Serial2.print(«15»); break;
case 16: Serial2.print(«16»); break;
case 17: Serial2.print(«17»); break;
case 18: Serial2.print(«18»); break;
case 19: Serial2.print(«19»); break;
case 20: Serial2.print(«20»); break;
case 21: Serial2.print(«21»); break;
case 22: Serial2.print(«22»); break;
case 23: Serial2.print(«23»); break;
case 24: Serial2.print(«24»); break;
case 25: Serial2.print(«25»); break;
case 26: Serial2.print(«26»); break;
case 27: Serial2.print(«27»); break;
case 28: Serial2.print(«28»); break;
case 29: Serial2.print(«29»); break;
case 30: Serial2.print(«30»); break;
case 31: Serial2.print(«31»); break;
} // switch
} // mrSerial2Channel( )

void mrPrintBind(byte ch) {
Serial.print(«Bind on channel „);
mrSerialChannel(ch);
}

void mrBind(byte ch) {
mrPrintBind(ch);
Serial2.print(“bind_mode_cell_»);
mrSerial2Channel(ch);
Serial2.write(3); // End of Text — B00000011(BIN)
}

void mrPrintUnbind(byte ch) {
Serial.println(«Unbind on channel „);
mrSerialChannel(ch);
}

void mrUnbind(byte ch) {
mrPrintUnbind(ch);
Serial2.print(“clear_one_cell_»);
mrSerial2Channel(ch);
Serial2.write(3);
}

void mrBindStop() {
Serial.println(«Bind mode off»);
Serial2.print(«bind_mode_off»);
Serial2.write(3);
}

void mrClearAll() {
Serial.println(«Clear all cell»);
Serial2.print(«clear_all_cell»);
Serial2.write(3);
}

// nooLite MR1132 print works

void mrPrintHeader() {
Serial.println();
}

void mrPrintDeviceType() {
Serial.print(«Device: „);
if (mrDeviceType == 1) {
Serial.println(“PT112»);
}
if (mrDeviceType == 2) {
Serial.println(«PT111»);
}
}

void mrPrintBindState() {
if (mrBindState == 1) {
Serial.print(«Bind State: „);
Serial.println(“ON»);
}
}

void mrPrintBatteryState() {
if (mrBatteryState == 1) {
Serial.print(«Battery State: „);
Serial.println(“LOW!»);
}
}

void mrPrintChannel() {
Serial.print(«Channel: „);
Serial.println(mrChannel);
}

void mrPrintTemperature() {
Serial.print(“Temp: „);
Serial.println(mrTemp);
}

void mrPrintHumidity() {
Serial.print(“Humidity: „);
Serial.println(mrHumidity);
}

// nooLite MR1132 data works

void mrClearData() {
mrTogl = -1;
mrBindState = -1;
mrReceiveBit = -1;
mrChannel = -1;
mrCommand = -1;
mrFormat = -1;
mrData0 = -1;
mrData1 = -1;
mrData2 = -1;
mrData3 = -1;
mrDeviceType = -1;
mrBatteryState = -1;
mrHumidity = -1;
mrBrightness = -1;
mrTemp = -1.0;
}

void mrSetTogl() {
byte b0 = bitRead(mrBuf[0], 0);
byte b1 = bitRead(mrBuf[0], 1);
byte b2 = bitRead(mrBuf[0], 2);
byte b3 = bitRead(mrBuf[0], 3);
byte b4 = bitRead(mrBuf[0], 4);
byte b5 = bitRead(mrBuf[0], 5);
mrTogl = 32*b5 + 16*b4 + 8*b3 + 4*b2 + 2*b1 + b0;
}

void mrSetBindState() {
mrBindState = bitRead(mrBuf[0], 6);
}

void mrSetReceiveBit() {
mrReceiveBit = bitRead(mrBuf[0], 7);
}

void mrSetChannel() {
mrChannel = mrBuf[1];
}

void mrSetCommand() {
mrCommand = mrBuf[2];
}

void mrSetFormat() {
mrFormat = mrBuf[3];
}

void mrSetDeviceType() {
byte tp1 = bitRead(mrBuf[5], 4);
byte tp2 = bitRead(mrBuf[5], 5);
byte tp3 = bitRead(mrBuf[5], 6);
mrDeviceType = 4*tp3 + 2*tp2 + tp1;
}

void mrSetDatas() {
mrData0 = mrBuf[4];
mrData1 = mrBuf[5];
mrData2 = mrBuf[6];
mrData3 = mrBuf[7];
}

void mrSetTemperature() {
byte t8 = bitRead(mrData1, 0);
byte t9 = bitRead(mrData1, 1);
byte t10= bitRead(mrData1, 2);
int temp2 = 1024*t10 + 512*t9 + 256*t8;

int temp = mrData0 + temp2;

byte t11 = bitRead(mrData1, 3);
if (t11 == 1) {
temp = (4096 — temp) * -1;
}
mrTemp = (float)temp / 10.0;
}

void mrSetBatteryState() {
mrBatteryState = bitRead(mrBuf[5], 7);
}

void mrSetHumidity() {
mrHumidity = mrData2;
}

void mrSetBrightness() {
mrBrightness = mrData3;
}

void mrNewData() {
mrClearData();
mrPrintHeader();

mrSetBindState();
mrPrintBindState();
mrSetChannel();
mrPrintChannel();

mrSetCommand();
mrSetDatas();

switch (mrCommand) {
case 0:
Serial.print(“PIR command: „); Serial.println(“OFF»);
break;
case 2:
Serial.print(«PIR command: „); Serial.println(“ON»);
break;
case 21:
mrSetDeviceType();
mrPrintDeviceType();
if (mrDeviceType == 1) {
mrSetTemperature();
mrPrintTemperature();
}
if (mrDeviceType == 2) {
mrSetTemperature();
mrPrintTemperature();
mrSetHumidity();
mrPrintHumidity();
}
break;
default:
;
} // switch
mrSetBatteryState();
} // newData()

void mrCheck() {
if (Serial2.available() == 8) {
mrBuf[0] = Serial2.read();
mrBuf[1] = Serial2.read();
mrBuf[2] = Serial2.read();
mrBuf[3] = Serial2.read();
if (mrBuf[0] == 79 && mrBuf[1] == 75 && mrBuf[2] == 13 && mrBuf[3] == 10) {
Serial.println(«OK»);
} else {
mrBuf[4] = Serial2.read();
mrBuf[5] = Serial2.read();
mrBuf[6] = Serial2.read();
mrBuf[7] = Serial2.read();
mrNewData();
}
}
}

void setup() {
Serial.begin(9600);
Serial2.begin(9600);
Serial.println("*** Start sketch ***");
mrBind(0);
//mrUnbind(0);
}

void loop() {
mrCheck();
} // loop()


Kesimpulan


Sebenarnya, itulah yang Anda butuhkan untuk mulai bekerja dengan modul MR1132 dan menggunakannya dalam sketsa dan proyek Anda. Modul ini juga dapat digunakan untuk mengontrol sinyal dari konsol yang terpasang di dinding nooLite dan sistem Anda sekarang dapat mengetahui di mana dan di mana konsol bekerja dan perintah mana yang dikirim ke unit daya.

Segera versi 0.15 baru dari sistem Arduino Mega Server populer akan dirilis dan dalam versi ini akan ada dukungan built-in untuk modul MR1132 dan manajemen yang nyaman langsung dari halaman web dan banyak lagi.

Source: https://habr.com/ru/post/id393185/


All Articles