Sebuah lampu pintar untuk "orang kaya" dengan tangan "malas", itu "sederhana" dan nyaman



pengantar


Dia membuat pencahayaan "modern" di dapur untuk bak cuci, kompor, dan meja potong berdasarkan strip LED di bawah kendali arduino (sebut saja lampu 1). Desain ini bekerja selama 2 tahun, sampai bagian kekuatan "otak" memburuk. Ini adalah kesempatan yang bagus untuk menemukan kembali roda dari "tempat sampah improvisasi" lagi (lampu 2). Benar, kali ini "sampah" akan mahal dan kompatibel dengan rumah pintar Z-wave. Berikut ini adalah kisah tentang mengganti arduino dengan ZUNo (modul yang kompatibel dengan arduino untuk membuat perangkat Z-wave) dengan penghematan kode maksimum dan penjelasan tentang perubahan yang diperlukan.

Apa yang terjadi sebelum saya muncul di sana


Sekali waktu, untuk mencuci piring atau memasak makanan, perlu menyalakan lampu di atas wastafel. Itu adalah lampu meja redone.

Saya tidak suka menekan saklar kecil dengan tangan basah karena saklar 220 volt ke lampu pijar.



Juga, cahaya dari lampu jatuh terutama di wastafel, tetapi saya ingin lebih baik menerangi meja dan kompor memasak.

Tujuan:

  • Jadikan lampu on / off di dapur tanpa kontak;
  • Menyalakan wastafel, meja, dan kompor secara merata;
  • Hemat energi dengan mengganti lampu pijar dengan LED.

Dia merakit lampu 1. Terdiri dari kotak aluminium 2 meter dengan diffuser untuk pita RGB dan unit kontrol. Sebuah kotak dan diffuser dibeli sudah jadi di toko, ada selotip, dan unit kontrol sudah lama berada di sudut dan menunggu di sayap.

Kasingnya adalah industri (tahan debu, tahan air). Karena pita itu 12 volt, unit catu daya dari 220 V hingga 12 V terletak di unit, papan isolasi galvanik untuk mengontrol pita berdasarkan TLP250 (optocoupler) juga mengendalikan semua Arduino ini dalam desain yang ringkas.
Saya mendapat isolasi galvanik dari proyek lama. Suatu hari saya membuat lampu latar untuk minibar di meja saya. Saat pintu dibuka, panel sentuh merekam perubahan kapasitas dan menyalakan cahaya yang berkilau lembut. Artinya, dewan cocok untuk proyek saat ini, yang tersisa hanyalah memotong semua yang tidak perlu. Ada konverter linier 5-volt di papan, itu didukung oleh ZUNo.

Direncanakan untuk menyalakan lampu dengan nampan tangan ke pengukur jarak ultrasonik. Dia memasangnya di tutupnya, dan semua bagian lainnya masuk ke dalam kotak. Semua "andal" diperbaiki dengan perekat hot-melt. Pada saat pengujian, saya membuat tombol terdekat untuk memasok daya ke unit kontrol dari saklar lampu untuk instalasi eksternal.



Menyalakan lampu menjadi lebih mudah dan aman. Itu dipasang terbalik di bagian bawah lemari dapur dan lebih sulit untuk mendapatkan air dari tangan basah dari dalam.

Kesimpulan dari unit kontrol sebelumnya


Pencahayaan area kerja dapur menjadi lebih merata dan menyenangkan, karena warna yang tidak alami pada strip LED saya, warna beberapa produk berubah. Sebagai contoh: wortel tampak lebih menggiurkan karena warnanya yang lebih cerah. Tapi itu tidak banyak mengganggu, dan saya harap itu tidak banyak merugikan.

Dengan on / off tanpa kontak, semuanya menjadi lebih buruk. Itu berhasil. Tetapi setelah 5 menit dalam kondisi mati, lampu kilat mulai menyala pada strip LED. Saya tidak mulai mengulangi sirkuit pada optocouplers dan meninggalkan semuanya apa adanya. Hanya untuk menghidupkan dan mematikan mulai menggunakan saklar baru. Semua orang menyukai lokasi dan bentuknya.
Penggunaan selama dua tahun, lemak dan senyawa lain yang dikeluarkan selama pemasakan terakumulasi di tubuh dan di dalamnya. Plak ini sebagian menembus ke dalam perumahan melalui lubang untuk masuknya kabel. Tetapi karena permukaan tubuh yang mengkilap, zat ini mengembun menjadi massa agar-agar. Sangat menyenangkan untuk disentuh, tidak berbau dan ... (Saya tidak merasakannya). Saya mengambil beberapa foto tempat itu dalam bentuk kuman naga.





Di dinding, zat ini berubah menjadi serangan mengerikan, yang tidak hanya dicuci.

Apa yang telah terjadi


Setelah mencari-cari dalam keranjang saya menemukan modul ekspansi yang belum selesai untuk ZUNo. ZUNo adalah papan seperti arduino untuk mendesain perangkat Anda sendiri yang kompatibel dengan rumah pintar Z-Wave. Diprogram dari lingkungan Arduino.

Spesifikasi produsen:
  • 28 kB Flash memory for your sketches
  • 2 kB RAM available
  • Z-Wave RF transmitter at 9.6/40/100 kbps
  • 26 GPIO (overlaps with special hardware controllers)
  • 4 ADC
  • 5 PWM
  • 2 UART
  • 1 USB (serial port)
  • 16 kB EEPROM
  • 1 SPI (master or slave)
  • 4 IR controllers, 1 IR learn capability
  • 1 TRIAC/ZEROX to control dimmer
  • 3 Interrupts
  • 1 Timer 4 MHz
  • I2C (software)
  • 1-Wire (software)
  • 8x6 Keypad Scanner (software)
  • 2 service LED, 1 service button
  • 1 user test LED


Modul ekspansi menjadikan ZUNo papan debug lengkap, yang, setelah debugging prototipe, dapat digunakan sebagai perangkat lengkap.

Beberapa informasi dari pabrikan:
  • One 0-10 V analog output — control industrial dimmers
  • Up to four PWM or switch outputs (up to 5 A per channel) — control contactors, switches, halogen bulbs or LED strips
  • Up to eight digital 0/3 V inputs or outputs — connect various low voltage digital senors and actors
  • Up to four digital 0/3, 0/5 or 0/12 V digital or analog inputs — connect industrial 10 V sensors or any Arduino-compatible sensor
  • RS485 or UART — for industial meters
  • OneWire — for DS18B20 or other sensors


Untuk proyek saya, saya memerlukan 3 transistor yang kuat untuk mengalihkan 12 volt ke strip LED dan konverter dari 12 volt ke 5 volt ke daya ZUNo. Sisa dari pinggiran modul ekspansi tidak disolder atau diuji.



Di bagian sirkuit ini, tidak ada cukup dioda untuk catu daya, untuk perlindungan terhadap "pembalikan polaritas", dan resistor pada gerbang transistor efek medan listrik harus terhubung ke gerbang, dan tidak di depan resistor pembatas. Saya akan menulis lebih banyak tentang ini di kesimpulan.

Modul ekspansi ini disediakan di perumahan dari Gainta. Unit kontrol saya sebelumnya juga dalam kasus dari perusahaan ini, tetapi dengan ukuran yang berbeda. Sayangnya, pengikat pada modul tidak sesuai dengan case lama, tetapi tidak ingin mengebor yang baru, meninggalkan case lama. Papan itu "ditanam" pada perekat meleleh panas.



Sedikit tentang pemrograman Arduino dan ZUNo


Perangkat Z-wave harus memiliki sejumlah kelas tertentu. Kelas menggambarkan fungsi perangkat dan antarmuka interaksi. Misalnya, lampu saya mengontrol strip LED yang terdiri dari tiga warna (merah, hijau, biru). Fungsi-fungsi ini dilakukan oleh kelas multilevel Switch. Jika kita menambahkannya ke sketsa, kita dapat mengubah kecerahan salah satu dari jarak jauh. Untuk mengontrol tiga warna, Anda perlu membuat tiga instance dari kelas ini. Saya tidak akan membicarakan hal ini lebih detail dan mendetail. Karena manipulasi kelas rutin disembunyikan untuk pengguna ZUNo dengan gagasan "saluran". Sebagai contoh, saya memerlukan tiga kelas Switch multilevel, sehingga dalam kode akan muncul 3 saluran Switch multilevel dan beberapa fungsi panggilan balik untuk kontrol radio. Bagaimana cara melakukannya? Anda juga perlu menambahkan kelas dasar Switch,untuk menghidupkan dan mematikan lampu dengan satu sentuhan tombol (dari antarmuka pengontrol jaringan), dan tidak mengonfigurasi 3 saluran setiap kali.

Anda harus mengunjungi situs web pengembang, tempat contoh z-uno.z-wave.me/Reference/ZUNO_SWITCH_MULTILEVEL ditampilkan . Setiap kelas yang didukung oleh ZUNo memiliki deskripsi dan contoh. Selanjutnya, salin dan tempel fungsi yang diusulkan ke dalam sketsa Anda. Sekarang di sketsa ada tiga saluran multilevel switch dan 6 fungsi callback untuk menanggapi perintah di radio. Saya tidak terlalu canggih di kelas Z-Wave, jadi perangkat strip LED saya sebelumnya bekerja dengan set kelas ini.

Saluran dinyatakan seperti ini:

Judul spoiler
ZUNO_SETUP_CHANNELS(
      ZUNO_SWITCH_MULTILEVEL(getRed, setRed),
      ZUNO_SWITCH_MULTILEVEL(getGreen, setGreen),
      ZUNO_SWITCH_MULTILEVEL(getBlue, setBlue),
      ZUNO_SWITCH_BINARY(switch_getter, switch_setter)
);


Hal ini menyebabkan generasi widget berikut di controller setelah menambahkan ke jaringan:



Untuk menyesuaikan warna, perlu untuk membuka dan mengkonfigurasi setiap warna dalam menu controller secara terpisah. Itu tidak nyaman dan lambat. Namun, saya beruntung. Ternyata saya tidak sendiri. Mereka memikirkan kami dan membuat saluran z-uno.z-wave.me/Reference/ZUNO_SWITCH_COLOR . Sekarang hanya ada satu saluran dan dua fungsi panggilan balik dalam sketsa. Dalam menu pengontrol, pengaturan warna dilakukan secara terpisah untuk setiap warna, serta untuk sekaligus, dengan memilih dari palet.

ZUNO_SETUP_CHANNELS(ZUNO_SWITCH_COLOR(SWITCH_COLOR_FLAGS_RED|SWITCH_COLOR_FLAGS_GREEN|SWITCH_COLOR_FLAGS_BLUE, getterFunction, setterFunction));

Dan di menu controller sepertinya ini:



Fungsi selanjutnya menanggapi permintaan melalui radio. Permintaan untuk membaca status salah satu saluran warna mungkin datang.

BYTE getterFunction(BYTE component) {
  switch(component)
  {
    case SWITCH_COLOR_COMPONENT_RED:
      return pwmR;
      break;
    case SWITCH_COLOR_COMPONENT_GREEN:
      return pwmG;
      break;
    case SWITCH_COLOR_COMPONENT_BLUE:
      return pwmB;
      break;
  }
  return 3;
}

Dan ini adalah fungsi untuk mengatur warna dari antarmuka pengontrol.

void setterFunction(BYTE component, BYTE newValue) 
{
  switch(component)
  {
    case SWITCH_COLOR_COMPONENT_RED:
      pwmR = newValue;
      break;
    case SWITCH_COLOR_COMPONENT_GREEN:
      pwmG = newValue;
      break;
    case SWITCH_COLOR_COMPONENT_BLUE:
      pwmB = newValue;
      break;
  }
  radio_action = 1;
}

Itu semua kode yang perlu Anda tambahkan untuk mengubah sketsa arduino menjadi sketsa untuk ZUNo.

Kesimpulan


Setelah perakitan dan instalasi, semua tugas yang dinyatakan selesai. Namun, kebiasaan menyalakan lampu dengan saklar tetap (ternyata sangat nyaman). Opsi inklusi tanpa kontak juga berfungsi. Di antara kekurangannya, saya ingin memperhatikan kelap-kelip lampu LED selama sedetik setelah menerapkan daya ke unit kontrol. Ini karena inisialisasi panjang periferal ZUNo. Pada titik ini, kakinya tidak dapat diprediksi. Saya pikir resistor pull-up di gerbang transistor akan memperbaiki situasi jika Anda meletakkannya setelah resistor yang membatasi. Jika kode inisialisasi menyesuaikan kaki ke output dan mengubah level logika dengan sengaja, Anda dapat bereksperimen dengan filter RC, yang tidak akan melewatkan pulsa pendek. Saya belum melakukannya, dan mungkin saya tidak akan pernah melakukannya!

temuan


ZUNo dan modul perluasannya sangat menyederhanakan "kreativitas teknis rumah". Namun, saya menganggap produk ini sangat mahal dan jika saya bekerja di tempat lain dan peralatan Z-Wave tidak tergeletak, saya akan melakukan segalanya di ESP8266. Selama pengembangan saya belajar "standar" baru untuk menandai kabel dari catu daya.



Sekarang tidak hanya bumi ditandai dengan garis hitam, tetapi seperti dalam kasus saya kabel "positif". Untuk modul ekspansi, ini ternyata penting. Konverter 5-volt LM2594 telah gagal (harga dalam Chip dan Dip adalah sekitar 200 rubel). Saya berharap bahwa dalam versi berikutnya dari modul ekspansi akan ada dioda pelindung terhadap "pembalikan polaritas". Dan saya akan memeriksa polaritas kabel pasokan. Kelemahan lain terkait dengan tubuh. Kasingnya terlihat bagus, tapi saya tidak bisa menghubungkan kabel tanpa pinset ke blok terminal. Saya berharap bahwa akan ada versi dengan blok terminal lain (untuk menghubungkan kabel dari atas, atau miring).

Saya tidak suka menyimpan foto di layanan cloud dan sering membuat cadangan. Oleh karena itu, sebagian besar foto yang terkait dengan proses desain dan lampu 1 tidak dapat diperbaiki.



Ini semua yang tersisa dari proses perakitan dan debugging.

Dan sepertinya lampu latar dioperasikan, jika Anda sedikit membungkuk. Jika Anda meluruskan, maka kotak dan sakelar tidak terlihat.



Sketsa untuk ZUNo. Saya lampirkan, hanya untuk mengkonfirmasi bahwa semuanya adalah dasar
#include "EEPROM.h"
#include "EEPR.h"

int readPin = 9;
int triggerPin = 10;
byte controlState = 0;
word lastValue;
#define REDPIN   PWM1     // pin connection R 
#define GREENPIN PWM2     // pin connection G
#define BLUEPIN  PWM3     // pin connection B

ZUNO_SETUP_CHANNELS(ZUNO_SWITCH_COLOR(SWITCH_COLOR_FLAGS_RED|SWITCH_COLOR_FLAGS_GREEN|SWITCH_COLOR_FLAGS_BLUE, getterFunction, setterFunction));

#define ON 1
#define OFF 0
uint8_t switch_=OFF;

uint8_t pwmR=0;
uint8_t pwmG=0;
uint8_t pwmB=0;
uint8_t b_pwmR=0;
uint8_t b_pwmG=0;
uint8_t b_pwmB=0;

enum
{
  DEF_R = 255,
  DEF_G = 255,
  DEF_B = 255
};
uint8_t radio_action = 0;

void setup() 
{ 
  init_EEPROM();
  Serial.begin();
  pinMode(readPin, INPUT);
  pinMode(triggerPin, OUTPUT);
  digitalWrite(triggerPin, LOW);
  pinMode(REDPIN, OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);
  analogWrite(REDPIN, pwmR & 0xff);
  analogWrite(GREENPIN, pwmG & 0xff);
  analogWrite(BLUEPIN, pwmB & 0xff);
  
} 
int act=1;
int actf = 0;
int cnt=57; 

void loop()
{
  int tmp;
  // trigger measurement
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(10);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  // read pulse width
  tmp = pulseIn(readPin, HIGH, 100000);
  lastValue = tmp / 58;
  Serial.print(" cm= ");
  Serial.println(lastValue);
  if (lastValue < 30)
  {
    cnt++;
  }
  else
  {
    cnt--;
  }
  if (cnt > 55)
  { 
    act=1;
  }
  if (cnt > 60)
    cnt= 60;
  if (cnt < 50)
  {
    act=0;
    actf=0;
  }
  if (cnt < 45 )
    cnt = 45;
  
  if ((act == 1) && (actf == 0))
  {  
    actf = 1;
    if (switch_ == OFF)
    {
      switch_=ON;
      b_pwmG = pwmG;
      b_pwmB = pwmB;
      b_pwmR = pwmR;
    }
    else
    {
      switch_=OFF;
      b_pwmR=0;
      b_pwmG=0;
      b_pwmB=0;
    }
    analogWrite(REDPIN, b_pwmR & 0xff);
    analogWrite(GREENPIN, b_pwmG & 0xff);
    analogWrite(BLUEPIN, b_pwmB & 0xff); 
  } 
  
  Serial.print("cnt = ");    
  Serial.print(cnt);  
  Serial.print(" || ");    
  Serial.print(pwmR);  
  Serial.print(" ");      
  Serial.print(pwmG);  
  Serial.print(" ");
  Serial.print(pwmB);  
  Serial.print(" ");
  Serial.println("");
 // delay(10);

 if(radio_action)
 {
    radio_action = 0;
    eepr_save_col();
    analogWrite(REDPIN, pwmR & 0xff);
    analogWrite(GREENPIN, pwmG & 0xff);
    analogWrite(BLUEPIN, pwmB & 0xff);
 }
}

BYTE getterFunction(BYTE component) {
  switch(component)
  {
    case SWITCH_COLOR_COMPONENT_RED:
      return pwmR;
      break;
    case SWITCH_COLOR_COMPONENT_GREEN:
      return pwmG;
      break;
    case SWITCH_COLOR_COMPONENT_BLUE:
      return pwmB;
      break;
  }
  return 3;
}

void setterFunction(BYTE component, BYTE newValue) 
{
  switch(component)
  {
    case SWITCH_COLOR_COMPONENT_RED:
      pwmR = newValue;
      break;
    case SWITCH_COLOR_COMPONENT_GREEN:
      pwmG = newValue;
      break;
    case SWITCH_COLOR_COMPONENT_BLUE:
      pwmB = newValue;
      break;
  }
  radio_action = 1;
}


All Articles