Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan

Komponen dan Perlengkapan

Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Raspberry Pi 3 Model B
OPTIONAL - Internet of Things - pengiriman pesan teks
× 1
Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Arduino Nano R3
× 2
Expansion Shield Arduino Nano
× 2
Sensor Suhu / Kelembaban DHT21/22
mungkin membutuhkan resistor 10k antara Vcc/Data
× 1
Modul Sel Foto
× 1
Modul Transceiver Radio Nirkabel nRF24L01 2.4Ghz
dengan atau tanpa Antena SMA
× 1
Sensor Suhu Dallas (untuk suhu larutan nutrisi)
mungkin membutuhkan konektor
× 1
Modul Penerima & Penerus RF 433MHz
× 1
set 3-5 paket Kontak Listrik Dikendalikan Nirkabel termasuk remote
× 1
Shield LCD dengan Tombol DFRobot untuk Arduino Uno
× 1

Alat dan Mesin yang Diperlukan

Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Pakuin (Generic)

Aplikasi dan Layanan Online

Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Arduino IDE
Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Microsoft Visual Studio 2015

Tentang Proyek Ini



Tidak ada niat saya untuk membuat produk. Saya hanya ingin menyelesaikan masalah umum. Saya ingin menanam tanaman di dalam ruangan atau dalam kondisi yang terkendali. Bagaimana saya dapat menciptakan lingkungan optimum untuk tanaman berkembang menggunakan elektronika dan barang rumah tangga yang tersedia secara umum? Mana yang lebih baik, tanah atau hidroponik?

hydroMazing adalah alat untuk memudahkan memberikan kondisi pertumbuhan optimum untuk menanam tanaman dengan sukses di rumah. Sistem pemantauan data mandiri dan antarmuka web yang terletak pada perangkat Anda sendiri bukan cloud jarak jauh.

~

Belajar cara menanam tanaman dapat rumit dan mahal. Tanaman tahan lama, namun satu kesedihan sederhana dapat merusak panen Anda. Anda dapat menghindari kesalahan mahal ini dengan membiarkan sistem taman cerdas melakukan pekerjaan keras untuk Anda!

Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan

Dua tahun yang lalu saya memutuskan untuk mencoba menggunakan mikrokontroler Arduino Uno untuk mengganti Termostat Kontak Listrik Pemanas & Pendingin Pemrograman Lux WIN100 saya. Kontak listrik ini mengontrol alat, seperti pemanas kecil atau, dalam kasus ini, kipas ventilasi. Alat yang diselangorkan ke kontak listrik menyalakan dan mematikan alat dengan menggunakan pengaturan suhu yang Anda program secara manual ke setiap perangkat. Teknik untuk mengontrol kipas ventilasi ini efektif, namun menggunakan beberapa kabel pemanjang. Pengontrol suhu kontak listrik menggunakan relai gaya lama untuk mengubah status perangkat. Upaya awal saya adalah mengobrak-alokasi kotak pemanjang memasukkan relai saya sendiri ke dalamnya dan menghubungkannya ke Arduino Uno. Tidak lama setelah itu ada rantai kabel dengan banyak dadu konektor dan saya merasa terhambat.

Otomatisasi Rumah

Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan

Ide otomatisasi rumah yang saya pikirkan selama beberapa saat adalah menggunakan kontak listrik AC yang dikendalikan nirkabel dengan remote tangan. Mengobrak-alokasi remote untuk mengirim sinyal untuk tombol ON atau OFF yang dipilih oleh pin yang sesuai pada Arduino Uno tidak seharusnya terlalu sulit, kan? Kekhawatiran yang menghambat saya dari menguji ide ini adalah takut sinyal tidak andal dan Uno mungkin "memikirkan" telah menyalakan alat saat sebenarnya gagal. Akhirnya, saya mampu meyakinkan diri sendiri bahwa cara terbaik untuk mengetahuinya adalah hanya mencoba dan melihat apa yang terjadi. Sayangnya, hasil uji ini tidak jauh lebih baik dari upaya relai.

Pencarian di web untuk hampir setiap sensor atau barang elektronik dengan "Arduino" akan menghasilkan sejumlah produk yang dijual dengan beberapa dolar. Dalam kasus ini, saya menemukan pasangan penerus dan penerima 315Mhz dan 433Mhz yang berada dalam rentang frekuensi sebagian besar kontak listrik yang dikendalikan nirkabel komersial. Keuntungan terbesar menggunakan keluarga mikrokontroler Arduino untuk jenis proyek ini adalah Anda dapat menemukan perangkat lunak open source untuk memulai. Pencarian lain di web untuk "library Arduino" dan dalam kasus ini, pasangan penerus dan penerima atau tx/rx. Sekarang, semakin menarik bagi saya. Saya dapat membaca kode yang keluar dari remote, merekamnya, dan kemudian memprogram Arduino untuk mengontrol kontak listrik yang sesuai. Mendesain perangkat lunak untuk beroperasi pada Arduino Uno menjadi tantangan. Contoh yang datang dengan perangkat lunak Arduino dan contoh yang disertakan dengan library adalah awal yang sangat baik untuk proyek. Dalam pengalaman saya, setelah Anda mulai menggabungkan dan melakukan modifikasi pada contoh-contoh itu tidak lama sebelum Anda mencapai batas. Saya tidak pikir saya adalah programmer yang baik, saya pikir saya adalah sempurnawan yang keras kepala.

Di salah satu buku favorit saya, Zen and the Art of Motorcycle Maintenance penulisnya, Robert Pirsig, berbicara tentang perangkap gumpal. Secara esensial, perangkap gumpal adalah peristiwa atau pola pikir yang dapat menyebabkan seseorang kehilangan antusias dan menjadi terhambat dari memulai atau melanjutkan proyek. Mengetahui kapan harus melanjutkan melalui ketidaknyamanan dan keingkaran dan kapan harus istirahat dan pergi dari proyek adalah tantangan pribadi. Ada kalanya jika saya telah istirahat, saya mungkin tidak akan menemukan solusi yang bagus untuk konflik dalam kode sumber saya. Sebaliknya, ada kalanya saya telah pergi selama sebulan dan bekerja pada jenis proyek yang sama sekali berbeda merasa teruapkan kembali. Mungkin, jika proyek ini cukup penting, kita akan terpaksa kembali untuk mengerjakannya. Perangkap itu adalah meyakinkan diri sendiri bahwa proyek tidak layak untuk kembali padahal bisa menjadi luar biasa. Mungkin sebenarnya tidak layak untuk kembali menyelesaikannya dan inilah tempat banyak proyek berakhir.

Pemrograman

Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan

Perangkat lunak yang telah saya kembangkan telah diprogram ke dalam mikrokontroler dan memiliki serangkaian parameter dasar untuk pengaturan waktu, pengelolaan, transmisi, dan penerimaan objek "sensor" dan objek "peralatan". Pengendalian peralatan dicapai melalui serangkaian algoritma yang saya namakan "TheDecider," yang membuat keputusan berdasarkan pembacaan sensor dan ambang batas yang diprogram sebelumnya dan memicu mikrokontroler untuk menyalakan atau mematikan kontak listrik yang dikendalikan nirkabel. Saya ingin sistem dapat dengan mudah dimodifikasi untuk bekerja dengan lingkungan lain termasuk akuaponik, menanam jamur, dan segala sesuatu di mana pengendalian dicapai dengan membaca sensor dan mengoperasikan peralatan berdasarkan aturan yang diprogram. Kontak listrik yang dikendalikan nirkabel terbukti menjadi metode yang andal untuk mengontrol kipas menggunakan Arduino untuk mengirim sinyal berdasarkan pembacaan sensor suhu. Tidak lama setelah itu kode sumber berkembang menjadi makhluk besar. Keluarga mikrokontroler Arduino terbatas dalam berapa banyak instruksi yang dapat dijalankan dan mencapai batas ukuran program tidak lama jika Anda ingin mengontrol lebih dari beberapa LED berkedip. Saya telah menemukan bahwa batasan ukuran telah memaksa saya untuk menulis kode yang lebih baik dan lebih efisien daripada yang awalnya saya lakukan. Bahkan dengan penanganan variabel yang kreatif dan library khusus, akhirnya, ada kebutuhan untuk mikrokontroler lain atau pindah ke yang lebih besar.

Pemantauan Nirkabel tanpa Internet

Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan

Ada beberapa cara mikrokontroler dapat berkomunikasi satu sama lain. Metode nirkabel termurah yang saya temukan adalah transceiver radio nirkabel nRF24L01. Modul ini adalah variasi bluetooth dengan daya rendah dan ringan yang memberi hydroMazing kemampuan untuk berkomunikasi dengan unit pemantauan.

Saya memutuskan untuk menambahkan Arduino Uno lainnya dengan Liquid Crystal Display shield sehingga saya dapat menampilkan apa yang dibaca sensor, status peralatan, dan peringatan dengan notifikasi.

Saya telah membuat platform open source dan dapat disesuaikan sendiri yang dapat dikustomisasi untuk berbagai kebutuhan dan kondisi taman; namun, juga sistem nirkabel yang terkontained. Arsitektur terbuka sistem memungkinkan kemudahan integrasi konektivitas Internet dan layanan web.

Pemantauan Internet

Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan

Masuk Raspberry Pi yang terhubung dengan modul nRF24L01.

Saya mampu memodifikasi sebagian besar kode sumber Arduino saya untuk mendengarkan transmisi masuk dan kemudian menulis data tersebut ke beberapa file. Pertama, file log yang menangkap semua komunikasi antara Pi dan hydroMazing Monitor. Selanjutnya, saya membuat program menulis status saat ini dari semua objek sensor dan file untuk semua objek peralatan. Ketika peringatan terjadi program akan membuat file yang berisi peringatan tersebut. Kemudian saya menambahkan skrip PHP untuk membaca objek data dari file masing-masing dan menampilkan secara live di server Apache Pi.

Selanjutnya, saya menulis skrip Python untuk membaca direktori untuk file peringatan dan jika ada, membaca file, memparsing informasi yang relevan dan kemudian mengirim email atau melalui SMS teks ke pengguna. Selain mengirim email atau teks peringatan, skrip Python memindahkan file peringatan ke posisi untuk skrip PHP dapat membaca dan menampilkan. Menggunakan file log yang dibuat, saya mampu mengimpor data ke dalam database. Setelah data hydroMazing tercatat ke dalam database yang tinggal di Raspberry Pi kita dapat mulai melakukan analitik dan menghasilkan beberapa laporan. Pemantauan dan pengendalian sistem sebagian besar dilakukan untuk kita, tetapi saat hydroMazing perlu memperingatkan kita tentang masalah itu sekarang dapat dengan menggunakan Raspberry Pi.

HydroMazing Garden Wizard yang memandu Anda melalui seluruh proses pertumbuhan Anda! Sistem memberikan umpan balik dan tips untuk mengelola masalah yang teridentifikasi hydroMazing. https://www.hydroMazing.com

Pemantauan Larutan Nutrisi

Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan

Tingkat larutan nutrisi pada sistem wadah hidroponik harus dipantau.

Seiring berkurangnya tingkat larutan nutrisi, perlu diisi kembali dengan air segar, jika tidak larutan nutrisi menjadi lebih ter konsentrasi dan beberapa tanaman tidak akan merespons dengan baik. Pengontrol Nutrisi hydroMazing dapat mengaktifkan pompa yang menambahkan air segar untuk membawa konsentrasi kembali ke tingkat saat dimulai, sering disebut "topping-off." Pengontrol Nutrisi hydroMazing juga akan memantau pH dan EC, mengaktifkan pompa untuk mengelola larutan, dan memberitahu Anda saat perlu melakukan perubahan.

Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan
Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan

Ingin Lebih Banyak?

Kode

Settings of objectsC/C++
File CoreSettings.h berisi banyak pengaturan kritis termasuk jaringan nRF, kode saklar remote kontak listrik AC, Timer, Appliance, dan definisi objek Sensor yang digunakan oleh sistem hydroMazing.
/* * @file CoreSettings.h * Copyright (C) 2015 Cory J. Potter - All Rights Reserved * You may use, distribute and modify this code under the * terms of the LICENSE.txt * NOT INTENDED FOR COMMERCIAL USE! * You should have received a copy of the LICENSE.txt with * this file. If not, please write to: <bitsandbots@gmail.com> */ #ifndef __CORESETTINGS_H__ #define __CORESETTINGS_H__ #ifdef ARDUINO // RX_PIN 3 in use by Dallas Temperature Probe #define RX_PIN 103 #define TONE_PIN 104 #define TX_PIN 8 // What is our address 1 or 2 uint8_t node_address = 1; uint8_t totalNodes = 3; unsigned long lastRxTimeStamp = 0; const uint64_t nRFbaseAddress = 1034834473100; uint8_t nRFaddress = 0; // 00 - 255 // NOTE: the "LL" at the end of the constant is "LongLong" type // 1034834473185, 1034834473170 // const uint64_t tx_pipes[5] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F141LL, 0xF0F0F0F1B0LL, 0xF0F0F0F1BBLL }; // const uint64_t rx_pipes[5] = { 0xF0F0F0F22ALL, 0xF0F0F0F299LL, 0xF0F0F0F308LL, 0xF0F0F0F377LL, 0xF0F0F0F3E6LL }; // uint64_t tx_pipes[3] = { 0xF0F0F0F0E8LL, 0xF0F0F0F0E7LL, 0xF0F0F0F0E6LL }; // uint64_t rx_pipes[3] = {0xF0F0F0F0E1LL, 0xF0F0F0F0E2LL, 0xF0F0F0F0E3LL }; uint64_t tx_pipes[3] = { 0xF0F0F0F0F8LL, 0xF0F0F0F0F7LL, 0xF0F0F0F0F6LL }; uint64_t rx_pipes[3] = { 0xF0F0F0F0F1LL, 0xF0F0F0F0F2LL, 0xF0F0F0F0F3LL }; /************************************************************************/ // Wirelessly Controlled Outlet Switches /************************************************************************/ // ETEKCITY #1401 // unsigned long mySwitchOn[] = { 24, 1398067,1398211,1398531 }; // unsigned long mySwitchOff[] = { 24, 1398076,1398220,1398540 }; // ETEKCITY #1405 // unsigned long mySwitchOn[] = { 24,1135923,1136067,1136387 }; // unsigned long mySwitchOff[] = { 24,1135932,1136076,1136396 }; // ETEKCITY #1406 // unsigned long mySwitchOn[] = { 24,4281651,4281795,4282115 }; // unsigned long mySwitchOff[] = { 24,4281660,4281804,4282124 }; // ETEKCITY #1407 // unsigned long mySwitchOn[] = { 24,87347,87491,87811 }; // unsigned long mySwitchOff[] = { 24,87356,87500,87820 }; // ETEKCITY #1411 // unsigned long mySwitchOn[] = { 24,283955,284099,284419 }; // unsigned long mySwitchOff[] = { 24,283964,284108,284428 }; // ETEKCITY #1415 // unsigned long mySwitchOn[] = { 24,21811,21955,22275,23811,29955 }; // unsigned long mySwitchOff[] = { 24,21820,21964,22284,23820,29964 }; // ETEKCITY #1419 // unsigned long mySwitchOn[] = {24,333107,333251,333571,335107,341251}; // unsigned long mySwitchOff[] = {24,333116,333260,333580,335116,341260}; // ETEKCITY #0319 uint8_t totalSwitches = 5; unsigned long mySwitchOn[] = {24,333107,333251,333571,335107,341251}; unsigned long mySwitchOff[] = {24,333116,333260,333580,335116,341260}; /************************************************************************/ /* I2C Communications */ /************************************************************************/ const int MY_ADDRESS = 42; const int SEND_TO_ADDRESS = 22; /************************************************************************/ /* Timers */ /************************************************************************/ //Timer Object = { (type), (interval in millis), ready, triggered, timestamp, (pointer to next object) Timer Timer_txData = { TIMER_TX_DATA, 30000UL, true, false, 0, NULL }; // Timer Timer_Lcd = { TIMER_LCD, 12000UL, true, false, 0, &Timer_Log }; // Timer Timer_Lcd_Cycle = { TIMER_LCD_CYCLE, 6000UL, true, false, 0, &Timer_Lcd }; // Timer Timer_Lcd_Scroller = { TIMER_LCD_SCROLLER, 500UL, true, false, 0, &Timer_Lcd_Cycle }; //Timer Timer_Ping = { TIMER_SENSOR_READINGS, 10UL, true, false, 0, &Timer_Log }; //Timer Timer_Lite = { TIMER_LITE, 180000UL, true, false, 0, &Timer_Ping }; Timer Timer_Save_Settings = { TIMER_SAVE_SETTINGS, 3600000UL, true, false, 0, &Timer_txData }; //Timer Timer_Sensor_Read = { TIMER_SENSOR_READINGS, 7000UL, true, false, 0, &Timer_Save_Settings }; //Timer Timer_Alerts = { TIMER_ALERTS, 45000UL, true, false, 0, &Timer_Sensor_Read }; Timer Timer_rxData = { TIMER_RX_DATA, 6000UL, true, false, 0, &Timer_Save_Settings }; /************************************************************************/ // Initialize Appliances /************************************************************************/ Appliance Appliance_Light_1 = {101, 1, APPLIANCE_LIGHT, DEFAULT_TIME, true, false, OFF, NULL }; // Appliance Appliance_Light_2 = {102, 0, APPLIANCE_LIGHT, DEFAULT_TIME, true, false, OFF, &Appliance_Light_1 }; // Appliance Appliance_Light_3 = {103, 0, APPLIANCE_LIGHT, DEFAULT_TIME, true, false, OFF, &Appliance_Light_2 }; Appliance Appliance_IntakeFan = {104, 1, APPLIANCE_INTAKE_FAN, DEFAULT_TIME, true, false, OFF, &Appliance_Light_1 }; Appliance Appliance_ExhaustFan = {103, 1, APPLIANCE_EXHAUST_FAN, DEFAULT_TIME, true, false, OFF, &Appliance_IntakeFan }; Appliance Appliance_Humidifier = {102, 0, APPLIANCE_HUMIDIFIER, DEFAULT_TIME, true, false, OFF, &Appliance_ExhaustFan }; Appliance Appliance_Heater = {101, 0, APPLIANCE_HEATER, DEFAULT_TIME, true, false, OFF, &Appliance_Humidifier }; //Appliance Appliance_AirPump = {PIN4, 2, APPLIANCE_PUMP, DEFAULT_TIME, true, false, OFF, &Appliance_Heater }; Appliance Appliance_FeedPump = {105, 1, APPLIANCE_PUMP, DEFAULT_TIME, true, false, OFF, &Appliance_Heater }; uint8_t totalAppliances = 6; /************************************************************************/ // Initialize Sensors /************************************************************************/ //Sensor: = { pin; node_address; SENSOR_TYPE; freq; minVal; maxVal; UL timestamp; float value; struct Sensor *next; } // NULL for the first - We cannot point to an object hasn't been created yet. Sensor Sensor_Photocell = { PIN_A0, 1, SENSOR_PHOTO, 100, 50, 100, 0, 25, NULL }; Sensor Sensor_Temp = { PIN7, 1, SENSOR_TEMPF, 50, 70, 80, 0, 75, &Sensor_Photocell }; Sensor Sensor_Humidity = {PIN7, 1, SENSOR_HUMIDITY, 50, 40, 70, 0, 50, &Sensor_Temp }; Sensor Sensor_WaterTemp = {PIN3_INT1, 1, SENSOR_WATER_TEMPF, 100, 50, 70, 0, 65, &Sensor_Humidity }; Sensor Sensor_Flow = {PIN2_INT0, 2, SENSOR_FLOW, 100, 50, 50, 0, 75, &Sensor_WaterTemp }; //Sensor Sensor_Microphone = {PIN_A1, 0, SENSOR_SOUND, 60, 10, 100, 0, 75, &Sensor_Flow }; //Sensor Sensor_Ultrasonic = {PIN_A2, 0, SENSOR_ULTRASONIC, 60, 10, 100, 0, 75, &Sensor_Microphone }; //Sensor Sensor_PIR = {PIN_A2, 0, SENSOR_PHOTO, 60, 10, 100, 0, 75, &Sensor_Microphone }; //Sensor Sensor_Moisture = {PIN_A2, 0, SENSOR_MOISTURE, 60, 10, 100, 0, 75, &Sensor_Flow }; Sensor Sensor_Float = {PIN_A2, 1, SENSOR_FLOAT, 100, 0, 1, 0, 1, &Sensor_Flow }; Sensor Sensor_Voltage = {PIN1_TX, 1, SENSOR_VOLTAGE, 100, 0, 100, 0, 50, &Sensor_Float }; uint8_t totalSensors = 7; /************************************************************************/ 

Skematik

Kipas masuk dan keluar, lampu tumbuh, pemanas, dehumidifier, dan pompa secara otomatis dikendalikan melalui kontak listrik AC nirkabelSistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutankontak listrik AC yang dikendalikan nirkabel umum yang digunakan dalam proyek ini.Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT LanjutanRakit dan pengujianSistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutanprototaip hydroMazing Antarmuka WebSistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT LanjutanAntarmuka web prototaip hydroMazing untuk notifikasi peringatan.Sistem Taman Cerdas HydroMazing: Perawatan Tanaman IoT Lanjutan

Proses manufaktur

  1. Pemantauan Suhu Raspberry Pi Profesional dengan DS18B20
  2. Sistem Kontrol Suhu Berbasis LM35 dengan Mikrokontroler AT89S52
  3. Menggunakan ADC MCP3008 untuk Membaca Sensor Analog dengan Raspberry Pi
  4. Menyelesaikan Kesenjakan Keterampilan Rumah Cerdas: Mengapa Inggris Ketinggalan dari Eropa
  5. Masa Depan Kehidupan Perkotaan: Ciri Kunci Kota Cerdas yang Muncul – Bagian 1
  6. Meningkatkan Produksi Minuman dengan Pemantauan Tingkat Cairan Berbasis IoT
  7. Cara Kerja Sistem Fren Anti-Lock (ABS): Panduan Komprehensif
  8. Cara Kerja Sistem Pengapian Elektronik: Panduan Lengkap
  9. Cara Kerja Sistem Pengapian Magneto: Prinsip Utama & Aplikasi
  10. Sistem Manufaktur Amerika: Sejarah, Teknik, dan Dampaknya