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

Botol Air Bertenaga Arduino

Komponen dan persediaan

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
Sensor Ultrasonik Tahan Air
× 1
Jam Waktu Nyata (RTC)
× 1
SparkFun Common-cathode 4-digit Tampilan 7-segmen
× 1
Buzzer
× 1
Sakelar Tombol Tekan SparkFun 12mm
× 1
NPN Transistor Serbaguna
× 1
Baterai Li-Ion 1000mAh
× 1
Pengisi Daya Baterai Li Ion USB Adafruit
× 1
Resistor 221 ohm
× 8
Resistor 1k ohm
× 4
Resistor 4.75k ohm
× 2

Alat dan mesin yang diperlukan

Besi solder (generik)
Pistol lem panas (generik)

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Pendahuluan:

Minum air yang cukup sangat penting untuk kesehatan kita. Minum lebih banyak air dapat menghasilkan kulit yang lebih bersih, kesehatan yang lebih baik secara keseluruhan, peningkatan produktivitas dan fungsi otak, peningkatan tingkat energi, dan bahkan penurunan berat badan.

Dalam kehidupan kita yang sibuk, sangat sulit untuk mengingat untuk minum cukup air. Dan sebagian besar waktu kita lupa untuk minum cukup air baik di rumah, kantor atau di perjalanan. Sekitar 75% orang Amerika mengalami dehidrasi kronis sepanjang waktu.

Jadi, untuk membangun kebiasaan minum air yang sehat, penting untuk melacak asupan air Anda setiap hari.

Untuk melacak asupan air saya, saya membuat botol air saya pintar menggunakan Arduino. Bisa:

1. Lacak asupan air harian saya

2. Lacak asupan air rata-rata mingguan saya

3. Ingatkan saya untuk mengambil air

4. Lacak waktu masuk terakhir

5. Jalankan lebih dari satu bulan dalam sekali pengisian daya.

Membuat Modul RTC

Untuk mencatat atau melacak informasi asupan air, diperlukan informasi waktu dan tanggal saat ini untuk disimpan bersama dengan akumulasi data. Chip Real-Time Clock (RTC) seperti DS1307 dengan baterai cadangan yang sesuai dapat digunakan untuk memasok informasi yang diperlukan. Proses pemrograman chip RTC (dalam perangkat lunak) juga sangat sederhana dan didukung di sebagian besar lingkungan pemrograman.

Berikut adalah desain modul RTC yang ringkas, berdasarkan IC RTC DS1307 yang populer, untuk proyek mikrokontroler Anda sehari-hari. DS1307 serial real-time clock (RTC) adalah jam/kalender berkode biner penuh daya rendah, ditambah 56 byte NV SRAM. Alamat dan data ditransfer secara serial melalui bus dua arah I2C. Format 24 jam/12-jam jam/kalender memberikan informasi detik, menit, jam, hari, tanggal, bulan, dan tahun, termasuk koreksi untuk tahun kabisat.

Mari kita buat modul jam real time sesuai skema terlampir. DS1307 RTC membutuhkan kristal eksternal untuk beroperasi dengan benar. Dua resistor pull-up diperlukan untuk pin SCL &SDA IC. Nilai resistor mungkin sekitar 2k sampai 10k. Saya menggunakan 4.7k. Selama penyolderan saya mencoba untuk menjaga modul sekecil mungkin karena ruang terbatas untuk sirkuit saya. Anda dapat menggunakan DS3231 sebagai pengganti DS1307 dan IC memiliki osilator kristal internal. Jadi, Anda tidak perlu menambahkan kristal eksternal. Anda juga dapat membeli modul RTC kecil yang sudah jadi jika Anda tidak ingin membuatnya sendiri. Karena sistem yang lengkap akan beroperasi dari baterai, oleh karena itu saya menghubungkan pin VBAT dari RTC ke ground tanpa menggunakan sel koin.

Pin Penting DS1307:

  • Pin 5V :Ketika pin ini tinggi, maka ds1307 mengirimkan data, dan ketika rendah, ia berjalan pada sel tombol cadangan.
  • GND :Ini adalah pin ground untuk modul. Baik arde baterai dan catu daya diikat menjadi satu.
  • SCL :Ini adalah pin jam I2C - yang berkomunikasi dengan mikrokontroler. Harus terhubung dengan pin Arduino SCL.
  • SDA :Ini adalah pin data I2C - yang berkomunikasi dengan mikrokontroler. Harus terhubung dengan pin Arduino SDA.
  • VBAT :Masukan baterai untuk sel lithium 3V standar atau sumber energi lainnya. Harus di-ground jika tidak digunakan.

Membuat Papan Display Tujuh Segmen

Untuk modul tampilan di sini saya menggunakan modul katoda umum kompak yang berisi empat tampilan numerik LED 7-segmen yang bagus untuk menampilkan data numerik dengan beberapa karakter sederhana.

Setiap segmen dalam modul tampilan dimultipleks, artinya ia berbagi titik koneksi anoda yang sama. Dan masing-masing dari empat digit dalam modul memiliki titik koneksi katoda umum mereka sendiri. Ini memungkinkan setiap digit untuk dihidupkan atau dimatikan secara independen. Selain itu, teknik multiplexing ini mengubah sejumlah besar pin mikrokontroler yang diperlukan untuk mengontrol tampilan menjadi hanya sebelas atau dua belas (menggantikan tiga puluh dua)!

Segmen LED pada layar memerlukan resistor pembatas arus saat diberi daya dari pin logika 5 V. Nilai resistor biasanya antara 330 dan 470 ohm untuk 5 V. Untuk operasi baterai Li-ion mungkin 220 ohm. Dan, transistor driver direkomendasikan untuk memberikan arus penggerak tambahan ke segmen LED, karena setiap pin mikrokontroler dapat mengalirkan atau menenggelamkan hanya sekitar 40 mA arus. Ketika semua (tujuh) segmen layar dihidupkan sekaligus (angka 8), permintaan saat ini akan melebihi batas 40 mA ini. Gambar di bawah menunjukkan diagram pengkabelan dasar resistor pembatas arus dan transistor driver.

Bagian tampilan 7-segmen 4-digit ini dihubungkan dengan empat layar LED 7-segmen katoda umum, dan empat transistor NPN 2N2222. Resistor 1K digunakan untuk membatasi arus basis, dan resistor 220R membatasi arus pengoperasian segmen tampilan LED.

Di papan Arduino, output digital dari D10 hingga D17 digunakan untuk menggerakkan segmen (a hingga g &dp), dan output digital D6 hingga D9 digunakan untuk digit (D0-D3) dari tampilan LED 4×7.

Sakelar tombol ditambahkan dengan modul tampilan untuk mengakses opsi yang berbeda. Ini juga akan digunakan untuk membangunkan Arduino dari mode tidur menggunakan interupsi perangkat keras eksternal. jadi, tombol terhubung ke pin digital Arduino #2 (INT0).

Menghubungkan Papan Display dengan Arduino Mini Pro

Menurut skema yang disediakan sebelum menyolder semua pin segmen ke pin mini Arduino. Kemudian solder 4 pin umum ke pin kolektor transistor. Basis transistor terhubung ke pin Arduino. Setelah menghubungkan tampilan, sambungkan sakelar tombol dengan pin digital Arduino 2 (INT 0). Pastikan Anda menghubungkan tombol ke pin 2 Arduino karena kami akan menerapkan interupsi perangkat keras eksternal untuk membangunkan Arduino dari mode tidur menggunakan tombol ini.

Menghubungkan Modul RTC dan Buzzer

Sekarang, hubungkan modul RTC yang Anda buat sebelumnya ke papan Arduino. Pin SDA modul harus terhubung ke pin SDA (A4) pin Arduino dan pin SCL modul harus terhubung ke pin SCL (A5) Arduino. Kemudian hubungkan buzzer ke board Arduino.

Koneksi:

RTC ------> Arduino Mini Pro

  • SDA ------> A4
  • SCL ------> A5
  • Buzzer ------> H3

Memasang Sensor Ultrasonik dengan Tutup Botol

Buat lubang pada tutup botol seperti pada gambar. Keluarkan empat kabel sensor ultrasonik melalui lubang dan pasang sensor ultrasonik di tengah tutup botol. Sensor harus dipasang di bagian dalam tutup botol dan harus ditempatkan di posisi tengah.

Koneksi:

Sensor Ultrasonik ------> Arduino Mini Pro

  • VCC ------> VCC
  • GND ------> GND
  • Pemicu ------> D4
  • Gema ------> D5

Mengunggah Program &Pengujian

Setelah menyelesaikan semua koneksi, inilah saat yang tepat untuk mengunggah program ke papan Arduino dan menguji fungsionalitasnya. Anda akan diminta beberapa perpustakaan agar program dapat bekerja dengan benar. Untuk antarmuka tombol, Anda perlu menambahkan perpustakaan OneButton. Karena perangkat akan beroperasi dari baterai, konsumsi daya merupakan masalah penting. Saya menerapkan mode tidur ke sketsa Arduino saya. Pengatur waktu pengawas dan interupsi perangkat keras eksternal digunakan untuk membangunkan Arduino dari mode tidur. Arduino mengambil pembacaan sensor selama tiga kali, rata-rata dan menghitung informasi yang diperlukan dan menampilkan informasi selama 10 detik dan kemudian masuk ke mode tidur selama 1 menit. Itu bangun kapan saja pada tombol yang ditekan terhubung ke INT0 (pin digital 2). Jadi, jika Anda ingin melihat informasi tentang asupan air Anda, cukup tekan tombol opsi kapan saja. Ini akan bangun untuk Anda. Tanpa menekan tombol apa pun, pembacaan akan dilakukan setiap 1 menit. Untuk menerapkan mode tidur saya menggunakan perpustakaan Arduino Low-Power. Untuk waktu membaca dari modul DS1307 RTC saya menggunakan library DS1307RTC. Jadi, untuk mengkompilasi program terlampir, tambahkan semua perpustakaan ke lingkungan Anda.

Disini saya akan menjelaskan hanya algoritma perhitungan secara singkat. Lihat isian terlampir untuk sketsa lengkap. Perhitungan dilakukan dari rata-rata lima pembacaan sensor agar cukup akurat. Bacaan harian disetel ulang pada 24 jam dan disiapkan untuk membaca baru di hari yang baru.

Rata-rata asupan air disusun dari rata-rata asupan harian tujuh hari sebelumnya. Anda 2 jam berlalu tanpa asupan air apapun itu akan mengingatkan pengguna dengan bunyi bip dua kali setiap 15 menit dan berhenti selama 2 jam berikutnya setelah mengambil air.

Unduh kode terlampir dan unggah ke Arduino Mini Pro Anda. Hubungkan semua modul dan nyalakan untuk menguji apakah semua komponen berfungsi dengan benar atau tidak. Jika tampilan menunjukkan beberapa hasil, maka selamat! Anda telah melakukan hal-hal yang sulit.

Memperbaiki Arduino dengan Tutup Botol

Menggunakan lem panas atase Arduino mini pada sisi atas tutup botol. Perlu diingat bahwa Anda harus memperbaiki semua komponen ke dalam tutup botol. Tambahkan lem secukupnya agar menempel erat pada tutup botol.

Memasang Baterai dan Modul Pengisi Daya

Sekarang, pasang baterai Li-ion di bagian atas Arduino. Berhati-hatilah agar tidak korslet baterai dengan pin terbuka. Kemudian sambungkan modul pengisi daya dengan tutupnya. Jaga agar port USB mudah diakses dari sisi luar sehingga dapat dihubungkan dengan mudah ke pengisi daya.

Membuat Semua Sirkuit Tahan Air

Setelah menghubungkan semua komponen dan modul, inilah saat yang tepat untuk membuat perangkat kami benar-benar tahan air. Ini sangat penting karena ini adalah botol air dan sewaktu-waktu air dapat jatuh ke sirkuit dan dapat merusak sirkuit. Untuk membuatnya benar-benar tahan air, tambahkan lem yang cukup di setiap bagian luar sirkuit tanpa port USB. Anda dapat membuat tutupnya bagus menggunakan lem untuk membuatnya bulat pada tutup aslinya.

Jangan menenggelamkan tutup botol ke dalam air.

Selamat menikmati

Kode

  • Sketsa Arduino
Sketsa ArduinoArduino
// Fungsi tanggal dan waktu menggunakan DS1307 RTC yang terhubung melalui I2C dan Wire lib#include #include #include #include #include " LowPower.h"#include "OneButton.h"Tombol OneButton(2, true);const byte interruptPin =2;volatile int state =0;const int trigPin =4;const int echoPin =5;int piezoPin =3;const int digit[4] ={9,6,7,8};int digit_value[4];int digit_value1[4];int button_press_count =1;const int segmen[8] ={16,10,12,14,15, 17,11,13};jumlah byte konstan[10][8] ={{1,1,1,1,1,1,0,0}, //0 {0,1,1,0,0, 0,0,0}, //1 {1,1,0,1,1,0,1,0}, //2 {1,1,1,1,0,0,1,0}, / /3 {0,1,1,0,0,1,1,0}, //4 {1,0,1,1,0,1,1,0}, //5 {1,0,1 ,1,1,1,1,0}, //6 {1,1,1,0,0,0,0,0}, //7 {1,1,1,1,1,1,1 ,0}, //8 {1,1,1,1,0,1,1,0}}; //9const byte d[8] ={0,1,1,1,1,0,1,1};const byte a[8] ={1,1,1,0,1,1,1,1 };const byte r[8] ={0,0,0,0,1,0,1,1};const byte t[8] ={0,0,0,1,1,1,1,1 };int detik, menit, jam;int water_in_ounch[15];int water_intake_ounch[15];int water_intake_days[7];int water_intake_times =0;int sebelumnya_jumlah_air =0;int total_water_intake_today =0;int average_intake_last_week =0;int inatke_day =1; rata-rata terapung_tingkat_air =0; //menyimpan rata-rata beberapa bacaanint water_amount_in_ounce =0; //menyimpan jumlah waterint idle_time =0;int intake_day =1;int sebelumnya_value =0;void setup() { Serial.begin(9600); pinMode(interruptPin, INPUT_PULLUP); // letakkan kode setup Anda di sini, untuk dijalankan sekali:for(int i=6; i<=17; i++) pinMode(i, OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); button.attachClick(ditekan); button.attachDoubleClick(klik dua kali); button.attachLongPressStart(longPressStart); button.attachDuringLongPress(longPress);}lama sebelumnya_status =milis();int count =1;int daily_intake =0;int mingguan_intake =0;lama tidur_time =millis();void loop() { read_time(); tombol. centang(); // terus perhatikan tombol tekan:kalkulasi(); daily_intake =total_water_intake_in_day(); mingguan_intake =rata-rata_water_intake_last_week(); if(button_press_count ==1){ display_d(); display_number(pengambilan_harian); } else if(button_press_count ==2){ display_a(); display_number(masukan_mingguan); } else if(button_press_count ==3){ display_r(); display_number(jumlah_air_dalam_ons); } else if(button_press_count ==4){ display_first_2(jam); display_last_2(menit); } if(idle_time>=120){ alert(); peringatan(); } if((millis() - sleep_time)>=15000){ display_off(); attachInterrupt(digitalPinToInterrupt(interruptPin), kosong, JATUH); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); detachInterrupt(digitalPinToInterrupt(interruptPin)); sleep_time =milis(); } }void display_digit(int digit){ for(int i=0; i<8; i++){ digitalWrite(segmen[i], number[digit][i]); } }void display_number(nomor int){ int i=0; while(angka>0){ digit_value[2-i] =angka%10; angka =angka/10; saya++; } digitalWrite(digit[1], TINGGI); digitalWrite(digit[2], RENDAH); digitalWrite(digit[3], RENDAH); tampilan_digit(digit_nilai[0]); penundaan (5); digitalWrite(digit[1], RENDAH); digitalWrite(digit[2], TINGGI); digitalWrite(digit[3], RENDAH); tampilan_digit(nilai_angka[1]); penundaan (5); digitalWrite(digit[1], RENDAH); digitalWrite(digit[2], RENDAH); digitalWrite(digit[3], TINGGI); display_digit(digit_value[2]); penundaan (5); digitalWrite(digit[3], RENDAH); angka_nilai[0] =0; angka_nilai[1] =0; angka_nilai[2] =0; }void display_first_2(int number){ digitalWrite(digit[2], LOW); digitalWrite(digit[3], RENDAH); int saya=0; while(angka>0){ digit_value[1-i] =angka%10; angka =angka/10; saya++; } digitalWrite(digit[0], TINGGI); digitalWrite(digit[1], RENDAH); tampilan_digit(digit_nilai[0]); penundaan (3); digitalWrite(digit[0], RENDAH); digitalWrite(digit[1], TINGGI); tampilan_digit(nilai_angka[1]); penundaan (3); }void display_last_2(int number){ digitalWrite(digit[0], LOW); digitalWrite(digit[1], RENDAH); int saya=0; while(angka>0){ digit_value1[1-i] =angka%10; angka =angka/10; saya++; } digitalWrite(digit[2], TINGGI); digitalWrite(digit[3], RENDAH); display_digit(digit_value1[0]); penundaan (3); digitalWrite(digit[2], RENDAH); digitalWrite(digit[3], TINGGI); display_digit(digit_value1[1]); penundaan (3); }void display_d(){ digitalWrite(digit[0], TINGGI); for(int i=0; i<8; i++){ digitalWrite(segmen[i], d[i]); } penundaan (5); digitalWrite(digit[0], RENDAH); }void display_a(){ digitalWrite(digit[0], TINGGI); for(int i=0; i<8; i++){ digitalWrite(segmen[i], a[i]); } penundaan (5); digitalWrite(digit[0], RENDAH); } batal tampilan_r(){ digitalWrite(digit[0], TINGGI); for(int i=0; i<8; i++){ digitalWrite(segmen[i], r[i]); } penundaan (5); digitalWrite(digit[0], RENDAH); } batal tampilan_t(){ digitalWrite(digit[0], TINGGI); for(int i=0; i<8; i++){ digitalWrite(segmen[i], t[i]); } penundaan (5); digitalWrite(digit[0], RENDAH); }void display_off(){ digitalWrite(digit[0], RENDAH); digitalWrite(digit[1], RENDAH); digitalWrite(digit[2], RENDAH); digitalWrite(digit[3], RENDAH); for(int i=0; i<8; i++){ digitalWrite(segmen[i], RENDAH); } penundaan (5); }kosongkan read_time() { tmElements_t tm; if (RTC.read(tm)) { detik =tm.Second; menit =tm.Menit; jam =tm.Jam; } }int distance_in_cm(){ durasi panjang, cm; // Sensor dipicu oleh pulsa TINGGI 10 mikrodetik atau lebih. // Berikan pulsa LOW pendek sebelumnya untuk memastikan pulsa HIGH bersih:digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, TINGGI); delayMicroseconds(10); digitalWrite(trigPin, RENDAH); // Membaca sinyal dari sensor:pulsa TINGGI yang // durasinya adalah waktu (dalam mikrodetik) dari pengiriman // ping ke penerimaan gema dari suatu objek. durasi =pulseIn(echoPin, TINGGI); // ubah waktu menjadi jarak cm =microsecondsToCentimeters(durasi); kembali cm; }mikrodetik panjangToCentimeters(mikrodetik panjang) { // Kecepatan suara adalah 340 m/s atau 29 mikrodetik per sentimeter. // Ping bergerak keluar dan kembali, jadi untuk menemukan jarak objek // kita mengambil setengah dari jarak yang ditempuh. kembali mikrodetik / 29 / 2; }peringatan batal(){ nada(piezoPin, 2000, 50); nada(piezoPin, 2000, 200); //tunda(10); }kosong kosong() { //nada(PiezoPin, 2000, 100); //state++;}// Fungsi ini akan dipanggil ketika tombol1 ditekan 1 kali (dan tidak ada 2. penekanan tombol diikuti).void pressed() { //Serial.println("Tombol 1 klik."); button_press_count++; peringatan(); if(button_press_count ==5){ button_press_count =1; }} // klik// Fungsi ini akan dipanggil ketika tombol1 ditekan 2 kali dalam waktu singkat.void doubleclick() { Serial.println("Button 1 doubleclick.");} // doubleclick// Fungsi ini akan dipanggil sekali, bila tombol1 ditekan lama.void longPressStart() { Serial.println("Button 1 longPress start");} // longPressStart// Fungsi ini akan sering dipanggil, sedangkan tombol1 ditekan untuk a lama.void longPress() { Serial.println("Tombol 1 longPress..."); water_intake_ounch[water_intake_times - 1] =0; //abaikan nilai terakhir} // perhitungan longPressvoid(){ float water_level =0;// simpan level di setiap langkah int read_value =0; //baca pembacaan sensor dalam cm for(int i=0; i<5; i++){ //ambil lima pembacaan read_value =distance_in_cm(); if(read_value>16 || read_value<3){// hasil pembacaan tidak stabil; //kembali ke fungsi pemanggilan karena pembacaan tidak stabil } else if(read_value<=16 &&read_value>=3){//valid value water_level =water_level + read_value; } penundaan (10); } average_water_level =17 - water_level/5; //cari rata-rata dari lima bacaan, 17 =tinggi botol water_amount_in_ounce =int(average_water_level*1.87);//16 cm ketinggian air =30 ons if(water_intake_times==0){ sebelumnya_jumlah_air =water_amount_in_ounce; air_intake_times =1; } if((water_amount_in_ounce  before_water_amount){ //air diisi ulang //water refil here before_water_amount =water_amount_in_ounce; } else if(water_amount_in_ounce ==before_water_amount){ //tidak ada air yang dikonsumsi atau diisi ulang idle_time+=1; } if(jam==23 &&menit==59){ // hari berakhir dan semua nilai dimulai dari nol untuk hari baru for(int i=0; i<15; i++){ water_intake_ounch[i] =0; } air_intake_times =0; asupan_hari++; if(intake_day==8){ intake_day =1; } }}int total_water_intake_in_day(){//hitung total asupan air dalam sehari total_water_intake_today =0; for(int i=0; i  

Skema


Proses manufaktur

  1. Penyemprot Rumput
  2. Pencuci Piring
  3. Pistol Air
  4. Toilet
  5. Hidran Kebakaran
  6. Botol Terisolasi
  7. Air
  8. Sampo
  9. Drywall
  10. MOSMusic