Saya ingin berbagi pengalaman pertama saya dalam menciptakan akuarium Arduino. Sebelumnya, saya sama sekali tidak bekerja dengan elektronik, dan terlebih lagi, saya tidak tahu bagaimana mikrokontroler diprogram. Namun demikian, saya memutuskan untuk mencoba dan ingin membagikan hasilnya.
Gagasan membuat akuarium
Kebetulan saya terutama terlibat dalam pemrograman .NET dan belajar untuk memotong C ++. Ini mungkin mengapa saya tidak pernah bertemu dengan mikrokontroler dan mikrokontroler, meskipun keinginan untuk mengenal mereka tumbuh hampir setiap tahun. Terutama, tahun-tahun terakhir ketika saya mengetahui tentang Arduino. Tapi itu perlu untuk datang dengan aplikasi praktis untuknya. Dan masalah ini dengan cepat terselesaikan.Ada akuarium di kamar kami, dan setiap hari kami harus memanjat di bawah meja dan mematikan lampu untuk ikan, dan kemudian menyalakannya di pagi hari. Selain itu, ikan harus menghidupkan pemanas ketika mereka dingin, dan mematikannya saat hangat. Kadang-kadang kelupaan saya menyebabkan kematian ikan di akuarium dan harus membeli yang baru. Bahkan ikan harus mengganti 2/3 air secara berkala. Dan untuk akuarium kami, prosedur ini sangat panjang dan tidak menyenangkan.Pertama-tama, saya melihat solusi yang sudah jadi untuk akuarium. Ada banyak dari mereka. Ini sebagian besar video di youtube. Ada juga artikel yang cukup menarik tentang geektimes. Tetapi untuk tujuan saya - mempelajari dan mengenal dunia mikrosirkuit - itu terlalu rumit, dan panduan terperinci "dari awal" tidak ditemukan di Internet. Gagasan mengembangkan pengontrol akuarium harus ditunda sampai dasar-dasar mikroelektronika itu sendiri dipelajari.Kenalan dengan mikroelektronika
Saya memulai perjalanan saya dengan kit yang sudah jadi untuk belajar Arduino. Mungkin, semua orang mengumpulkan sesuatu yang serupa ketika ia berkenalan dengan platform ini:
Bola lampu biasa (LED), resistor 220 Ohm. Arduino mengontrol bola menggunakan algoritma C ++. Segera melakukan pemesanan yang telah membeli set Arduino yang sudah jadi atau analognya, tidak mungkin untuk merakit hal yang kurang lebih berguna. Nah, kecuali untuk tweeter atau, katakanlah, termometer rumah. Dimungkinkan untuk mempelajari platform itu sendiri melalui pelajaran, tetapi tidak lebih. Untuk hal - hal yang berguna, saya harus belajar menyolder, papan sirkuit tercetak, desain papan sirkuit tercetak, dan kesenangan elektronik lainnya.Bangun Prototipe Akuarium Pertama Anda
Jadi, hal pertama yang saya mulai dengan akuarium prototipe saya adalah merumuskan persyaratan kertas untuk perangkat ini.Akuarium harus:- , , ;
- , , ( ) ;
- ( ) ;
- , , ;
- « »
- ;
- . , 9:00 AM;
- , ;
- .
- Layar dengan tanggal ketika Anda menekan tombol pada remote control harus disorot. Jika tidak ada yang ditekan dalam 5 detik, maka keluarlah.
Saya memutuskan untuk memulai dengan menjelajahi operasi LCD dan Arduino.Buat menu utama. Operasi LCD
Untuk LCD, saya memutuskan untuk menggunakan perpustakaan LiquidCrystal. Secara kebetulan, selain Arduino, saya juga memiliki layar LCD di kit saya. Dia bisa menampilkan teks, angka. Itu sudah cukup, dan saya mulai mempelajari koneksi layar ini ke Arduino. Saya mengambil informasi koneksi dasar dari sini . Ada juga contoh kode untuk mengeluarkan "Hello World".Setelah sedikit berurusan dengan layar, saya memutuskan untuk membuat menu utama controller. Menu terdiri dari item berikut:- Informasi dasar;
- Pengaturan waktu;
- Pengaturan tanggal;
- Suhu;
- Iklim;
- Lampu latar
- Perangkat
Setiap item adalah mode spesifik dari output informasi ke layar teks LCD. Saya ingin memungkinkan kemungkinan membuat menu multi-level, di mana setiap sub-level akan memiliki implementasi outputnya sendiri ke layar.Sebenarnya, kelas dasar ditulis dalam C ++, dari mana semua submenu lainnya akan diwarisi. class qQuariumMode
{
protected:
LiquidCrystal* LcdLink;
public:
bool isLcdUpdated = false;
void exit();
virtual void loop();
virtual void OkClick();
virtual void CancelClick();
virtual void LeftClick();
virtual void RightClick();
};
Misalnya, untuk menu "Perangkat", implementasi kelas dasar qQuariumMode akan terlihat seperti ini:#include "qQuariumMode.h"
class qQuariumDevicesMode :
public qQuariumMode
{
private:
int deviceCategoryLastIndex = 4;
enum DeviceCategory
{
MainLight,
Aeration,
Compressor,
Vulcanius,
Pump
};
DeviceCategory CurrentDeviceCategory = MainLight;
char* headerDeviceCategoryText = NULL;
BaseOnOfDeviceHelper* GetDeviceHelper();
public:
void loop();
void OkClick();
void CancelClick();
void LeftClick();
void RightClick();
};
Berikut ini adalah hasil implementasi level pertama dari menu:Bagian perangkat keras. Nuansa komponen penghubung
Saya ingin mengatakan beberapa kata tentang perangkat keras pengendali akuarium. Untuk pengoperasian controller yang normal, saya harus membeli:- 1 x Arduino Uno / Mega. Kemudian dia memutuskan untuk bekerja dengan Mego;
- 1 x Jam waktu nyata, misalnya DS1307;
- 2 x RTD14005, , .. 220 ;
- 1 x ;
- 1 x ;
- 5 x IRF-530 MOSFET N . (3 RGB , 1 , 1 );
- 1 x RGB . , . ;
- 1 x White ;
- 1 x LCD ;
- 1 x . DS18B20;
- 1 x . DHT11;
Setiap komponen memiliki tipe koneksi sendiri dan drivernya untuk operasi. Saya tidak akan menjelaskan nuansa menghubungkan semua komponen, karena mereka dapat ditemukan di situs web produsen atau di forum. Jika Anda berencana untuk menggunakan komponen yang sama dengan saya, maka Anda tidak perlu mengubah kode sumber.Kerusakan komponen
Hati-hati. Cobalah membaca tentang komponen plug-in terlebih dahulu. Itu harus dioperasikan secara tepat dalam rentang tegangan yang dibuat. Ini biasanya ditunjukkan di situs web produsen. Ketika saya sedang mengembangkan pengontrol akuarium, saya menghancurkan 2 sensor suhu tertutup dan jam waktu nyata. Sensor gagal karena fakta bahwa saya menghubungkannya ke 12V, dan itu perlu untuk 5V. Jam waktu nyata mati karena korsleting "acak" di sirkuit karena kesalahan saya.Strip LED RGB
Kesulitan khusus muncul dengan strip LED. Saya mencoba menerapkan skema berikut:
Saat menghubungkan ke Arduino, saya menggunakan pin yang mendukung PWM (Pulse Width Modulation). Sementara secara bersamaan menyalakan tegangan maksimum semua 3 pin, kaset saya sangat panas. Akibatnya, jika Anda membiarkannya selama satu atau dua jam, beberapa LED tidak lagi menyala. Saya percaya bahwa ini disebabkan oleh kegagalan beberapa resistor. Kerugian lain dari skema ini adalah kecerahan yang berbeda dari strip LED untuk masing-masing warna. Sebagai contoh, jika saya meletakkan tegangan maksimum pada komponen merah dari pita, maka saya mendapatkan kecerahan bersyarat dari pita merah pada 255 unit. Jika saya menyalakan komponen merah dan biru pada tegangan maksimum, maka kecerahan akan sama dengan 255 + 255 = 510 unit, dan warnanya akan ungu. Secara umum, solusi ini tidak cocok untuk saya.Diputuskan untuk mengimplementasikan algoritma berikut:void LedRgbHelper::Show(RGBColorHelper colorToShow)
{
int sumColorParts = colorToShow.RedPart + colorToShow.GreenPart + colorToShow.BluePart;
float rK = 0;
float gK = 0;
float bK = 0;
if (sumColorParts != 0)
{
float redPartAsFloat = (float)colorToShow.RedPart;
float greenPartAsFloat = (float)colorToShow.GreenPart;
float bluePartAsFloat = (float)colorToShow.BluePart;
float sumColorPartsAsFloat = (float)sumColorParts;
int brightness = colorToShow.Brightness;
rK = redPartAsFloat / sumColorPartsAsFloat;
gK = greenPartAsFloat / sumColorPartsAsFloat;
bK = bluePartAsFloat / sumColorPartsAsFloat;
rK = rK*brightness;
gK = gK*brightness;
bK = bK*brightness;
}
uint8_t totalCParts = (uint8_t)rK + (uint8_t)gK + (uint8_t)bK;
if (totalCParts <= 255){
analogWrite(RedPinNum, (uint8_t)rK);
analogWrite(GreenPinNum, (uint8_t)gK);
analogWrite(BluePinNum, (uint8_t)bK);
}
}
Dalam perwujudan ini, warna merah dan warna ungu memiliki kecerahan yang sama. Itu LED merah dalam casing pertama bersinar dengan kecerahan 255 unit, dan dengan ungu, merah dengan kecerahan 127 unit dan biru dengan kecerahan 127 unit, yang pada akhirnya kira-kira sama dengan 255 unit:LED strip putih
Dengan strip LED, itu mungkin yang paling mudah. Satu-satunya saat yang sulit adalah memastikan perubahan kecerahan yang mulus saat mengubah waktu.Untuk menerapkan ide ini, saya menerapkan algoritma linier untuk mengubah kecerahan strip LED putih.void MainLightHelper::HandleState()
{
if (!IsFadeWasComplete)
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > 50) {
previousMillis = currentMillis;
switch (CurrentLevel)
{
case MainLightHelper::Off:
{
if (currentBright != 0)
{
if (currentBright > 0)
{
currentBright--;
}
else
{
currentBright++;
}
}
else
{
currentBright = 0;
IsFadeWasComplete = true;
}
break;
}
case MainLightHelper::Low:
case MainLightHelper::Medium:
case MainLightHelper::High:
{
if (currentBright != CurrentLevel)
{
if (currentBright > CurrentLevel)
{
currentBright--;
}
else
{
currentBright++;
}
}
else
{
currentBright = CurrentLevel;
IsFadeWasComplete = true;
}
}
break;
}
analogWrite(PinNum, currentBright);
}
}
}
Riak "gunung berapi"
Gagasan implementasi datang kepada saya secara kebetulan. Saya hanya ingin menghidupkan dan mematikan gunung berapi dekoratif dengan menerapkan tegangan rendah dan tegangan tinggi ke transistor. Di toko ikan, saya merawat gunung berapi yang bagus dengan pipa timbal untuk kompresor dan LED yang diisolasi dari air.
Itu datang dengan adaptor, output yang 12V DC, dan input AC 220V. Saya tidak memerlukan adaptor, karena saya menerapkan kekuatan dan kecerahan gunung berapi melalui Arduino.Denyut gunung berapi itu sendiri diimplementasikan sebagai berikut:long time = 0;
int periode = 10000;
void VulcanusHelper::HandleState()
{
if (IsActive){
// time - cos .
// -
time = millis();
int value = 160 + 95 * cos(2 * PI / periode*time);
analogWrite(PinNum, value);
}
else
{
analogWrite(PinNum, 0);
}
}
Gunung berapi itu menerangi akuarium dengan sempurna di malam hari, dan riaknya sendiri terlihat sangat indah:
Pompa air. Mengganti air akuarium
Pompa air membantu mengganti air di akuarium dengan cepat. Saya membeli pompa yang beroperasi pada DC 12V. Pompa dikendalikan melalui transistor efek medan. Pengemudi untuk perangkat itu sendiri dapat melakukan dua hal: menghidupkan pompa, mematikan pompa. Saat mengimplementasikan driver, saya hanya mewarisi dari kelas dasar BaseOnOfDeviceHelper dan tidak mendefinisikan apa pun di dalam driver. Seluruh algoritma perangkat dapat mengimplementasikan kelas dasar.Saya menguji pompa di stand:Meskipun pompa bekerja dengan baik, saya menemukan satu hal yang tidak terlihat. Jika Anda memompa air ke tangki lain, maka hukum kapal yang berkomunikasi mulai berlaku. Akibatnya, saya menjadi biang keladi banjir di ruangan itu, karena jika Anda mematikan pompa, air akan tetap mengalir ke tangki lain, jika permukaan airnya di bawah permukaan air di akuarium. Dalam kasus saya, hanya itu saja.Port inframerah dan keinginan untuk menggantinya
Saya melakukan pengelolaan akuarium melalui inframerah mengikuti contoh pelatihan pendahuluan. Inti dari contoh ini adalah sebagai berikut: ketika saya menghidupkan controller di jaringan, saya menginterogasi tindakan kiri, kanan, atas, bawah, ok. Pengguna memilih tombol remote control yang ia kaitkan dengan masing-masing tindakan. Keuntungan dari implementasi ini adalah kemampuan untuk mengikat remote control yang tidak perlu.Akuarium dilatih melalui metode Belajar, intinya ditampilkan di bawah ini:void ButtonHandler::Learn(IRrecv* irrecvLink, LiquidCrystal* lcdLink)
{
irrecvLink->enableIRIn();
decode_results irDecodeResults;
...
...
while (true) {
if (irrecvLink->decode(&irDecodeResults)) {
irrecvLink->resume();
if (irDecodeResults.bits >= 16 &&
irDecodeResults.value != 0xC53A9966
) {
lcdLink->setCursor(0, 1);
lcdLink->print(irDecodeResults.value, HEX);
irRemoteButtonId = irDecodeResults.value;
...
...
Kemudian saya sampai pada kesimpulan bahwa remote control tidak nyaman. Hanya karena Anda perlu mencarinya dan ini adalah perangkat tambahan di rumah. Lebih baik untuk menerapkan kontrol melalui ponsel atau tablet. Saya punya ide untuk menggunakan mikrokomputer Raspberry PI, untuk meningkatkan aplikasi web ASP.NET MVC 5 di atasnya melalui Mono dan NancyFX. Selanjutnya, gunakan kerangka kerja jquery seluler untuk aplikasi web lintas platform. Melalui Raspberry, berkomunikasi dengan Arduino melalui WiFi, atau LAN. Dalam hal ini, Anda bahkan dapat meninggalkan layar LCD, karena semua informasi yang diperlukan dapat dilihat di smartphone atau tablet. Tetapi proyek ini hanya di kepala saya.Papan sirkuit tercetak dan pembuatannya
Dengan satu atau lain cara, saya sampai pada kesimpulan bahwa kita perlu membuat papan sirkuit tercetak. Ini terjadi setelah begitu banyak kabel muncul di dudukan saya sehingga ketika merakit perangkat jadi, beberapa dari mereka mulai memutuskan sambungan dari tekanan yang tidak disengaja dari kabel lain. Ini terjadi secara kasat mata dan dapat menyebabkan hasil yang tidak dapat dipahami. Dan penampilan perangkat seperti itu meninggalkan banyak yang harus diinginkan.Perakitan pada papan sirkuit (digunakan oleh Arduino Uno):
Saya mengembangkan PCB satu lapis dalam program Fritzing. Ternyata yang berikut (menggunakan Arduino Mega):
Hal yang paling buruk tentang membuat papan sirkuit adalah mengebor. Terutama ketika saya mencoba membuat papan sirkuit tipe Shield, mis. dia berpakaian arduino. Mengebor lebih dari 50 lubang dengan bor tipis adalah tugas yang membosankan. Dan hal yang paling sulit adalah mengambil besi barunya dari istrinya dan membujuknya untuk membeli printer laser.Ngomong-ngomong, jika ada yang takut dengan teknologi penyetrikaan laser, saya akan segera mengatakan bahwa itu sangat sederhana. Saya melakukannya pertama kali:
Perakitan itu sendiri juga sederhana - itu cukup untuk menyolder komponen utama ke papan:
Tetapi terlepas dari ini, pertama dan terakhir kali saya membuat papan sirkuit tercetak di rumah. Di masa depan saya hanya akan memesan di pabrik. Dan kemungkinan besar Anda harus menguasai sesuatu yang lebih keras daripada Menggores.Kesimpulan
Proyek firmware akuarium tersedia di GitHub . Diadaptasi untuk Arduino Mega. Saat menggunakan Uno, Anda harus menyingkirkan beberapa fungsi. Tidak ada cukup memori, kinerja, dan pin bebas untuk menghubungkan semua modul.