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

Mesin Kopi Cerdas dengan Arduino dan Bluetooth

Komponen dan persediaan

Arduino Nano R3
× 1
Modul Bluetooth HC-05
× 1
Sensor Suhu HARDWARIO DS18B20 1m
× 1

Aplikasi dan layanan online

Terminal Bluetooth Serial dibuat oleh Kai Morich
Arduino IDE

Tentang proyek ini

Pendahuluan

Pembuat Kopi otomatis pintar dengan Grafik, dapat dikontrol melalui Bluetooth... atau hanya memuat air segar, dan sistem akan mulai secara otomatis!

Setiap bagian adalah buatan tangan dan semua fungsi adalah ide saya sendiri.

Saya juga membuat kode "Test Mode", sehingga pengontrol dapat digunakan sebagai pengukur suhu serbaguna dengan sensor suhu eksternal.

Dikembangkan di Arduino Nano / Uno, menggunakan tampilan ST7920 , HC-05 Bluetooth adaptor, Dallas DS18B20 sensor suhu , relai untuk mengontrol koil pemanas, tombol dengan led, bel, dan penghitung dekade CD4017BE menggerakkan bilah LED.

Bagaimana memulai

  • Mulai otomatis :dalam mode siaga, sistem mengukur suhu di latar belakang secara siklis. Memuat air tawar menyebabkan penurunan suhu , dan sistem akan mulai.
    Fungsi ini dapat diaktifkan/dinonaktifkan dengan mengirimkan "auto" dari Smartphone, dan pengaturannya akan disimpan di memori EEPROM.
  • Tekan tombol :untuk memulai / menghentikan pembuatan kopi, atau keluar dari Mode Uji.
  • Kirim pesan "mulai" dari ponsel cerdas Anda, atau "berhenti ".

Video

Menampilkan semua cara kerja.

Cara pembuatannya, tampilannya... klik/tap di bawah!

Analisis Satu Kali Selama Pembuatan Kopi

Setelah 60 detik dari mulai, MCU membandingkan nilai suhu awal dan saat ini yang disimpan untuk menarik kesimpulan hanya berdasarkan suhu dan waktu yang telah berlalu, yang dapat berupa:

  • "Anda lupa airnya. " - (suhu menjadi terlalu tinggi)
  • "Kopi untuk Dua Orang. " - (lebih sedikit air - lebih banyak peningkatan suhu)
  • "Kopi untuk Enam Orang. " - (lebih banyak air - lebih sedikit elevasi suhu)
  • "Kesalahan Kumparan Pemanas! " - (tidak ada peningkatan suhu yang signifikan)

Selain itu Deteksi Kesalahan Sensor bekerja terus menerus selama mesin kopi dihidupkan.

Seperti dapat dilihat, enam dosis air membutuhkan lebih banyak waktu untuk mencapai suhu yang sama dengan yang dicapai dosis kecil lebih cepat.

Memulai tanpa air menghasilkan suhu yang sangat tinggi, namun garis datar menunjukkan suhu yang tidak berubah sehingga terjadi kesalahan koil pemanas.

Mengubah Satuan Pengukuran

Satuan pengukuran dapat diubah dengan mengirimkan "c " atau "f " dari Smartphone, bahkan selama prosedur pembuatan kopi, dan tidak meninggalkan bekas pada grafik .

nilai suhu awal dan sebelumnya yang disimpan akan dikonversi dengan panggilan fungsi program yang saya kodekan - digunakan untuk statistik dan analisis. Pengaturan ini juga disimpan dalam memori EEPROM.

Elemen Layar Dinamis

Jika layar penuh, grafik mulai bergulir ke kiri.

Tergantung pada nilai yang diukur, beberapa elemen layar dapat menghalangi jalannya. Untuk menghindari tabrakan, tempat mereka dinamis.

Enam gambar kecil animasi . ini menunjukkan apa yang saya kode:

Yah, itu adalah hiburan yang menyenangkan:

Mode Uji

Pada saat saya membuat semua ini, muncul ide, mengapa tidak menggunakan grafik untuk tujuan lain?

Jadi saya mengkodekan Test Mode; cukup pasang sensor suhu eksternal dan sistem dapat digunakan sebagai pengukur suhu serbaguna dengan grafik.

Dengan cara kerja ini, nilai ekstrem dari grafik adalah -20°C (-4°F) dan +128°C (+262°F) .

Mengirim nomor dari Smartphone antara 1 dan 999999 akan diterima sebagai interval pengukuran dalam detik, jadi lebar grafik adalah antara 128 detik dan 11,57 hari .

Komunikasi Bluetooth

Menerima perintah dan mengirim laporan, mendeteksi jika smartphone terhubung atau terputus.

Pesan terkirim berwarna biru dan pesan tanggapan/laporan berwarna hijau yang dikirim oleh pembuat kopi.

Kontrol yang Dipimpin

Penghitung dekade CD4027BE menggerakkan bilah LED, menerima CLK dari MCU pada setiap pengukuran suhu, dan meningkatkan posisinya. Jika prosedur pembuatan kopi baru atau Test Mode dimulai, Atmega 328P mengirimkan sinyal RST untuk mengatur posisi default.

Tombolnya memiliki LED bicolor dengan hanya dua pin, jadi solusi sederhana dan lucu saya dapat dilihat pada kode, cara mengontrolnya.

  • Hijau Padat :standby atau kopi sudah siap, koil mati
  • Merah Padat :pembuatan kopi sedang berlangsung, koil pemanas menyala
  • Merah / Hijau bergantian :Mode Uji
  • Merah Berkedip :terjadi error, yang bisa
    -Sensor error,
    -Heer Coil error, atau
    -Anda lupa air, sehingga proses pembuatan kopi terganggu oleh sistem

Kode

  • Pembuat Kopi Cerdas - si Gyula
Pembuat Kopi Cerdas - si GyulaArduino
// Kode Program - Pembuat Kopi Cerdas. Dikembangkan di Arduino Nano, menggunakan layar ST7920, adaptor Bluetooth HC-05,// sensor suhu Dallas DS18B20, relai, tombol, led, buzzer, dan penghitung dekade CD4017BE.// // Dapat dikontrol melalui Bluetooth dengan mengirimkan perintah dan parameter kerja atau menggunakan Tombol... atau hanya memuat air tawar!//// Fungsi:// -Grafik:grafik suhu dinamis pada layar// -Mulai otomatis:memuat air tawar menyebabkan penurunan suhu, dan sistem akan mulai// Ini fungsi dapat diaktifkan / dinonaktifkan dengan mengirimkan "Otomatis", dan pengaturan akan disimpan dalam memori EEPROM// -Analisis selama pembuatan kopi:60 detik setelah memulai sistem membandingkan nilai suhu saat ini dan awal// dan menarik kesimpulan yang dapat be:// 1. Anda lupa airnya (suhu terlalu tinggi)// 2. Kopi untuk Dua (lebih sedikit air - lebih banyak suhu)// 3. Kopi untuk Enam (lebih banyak air - kurangi suhu)// 4. Kesalahan Heating Coil (tidak ada peningkatan suhu yang signifikan dari awal)// -Deteksi kesalahan sensor (mendapatkan nilai abnormal)// -C elsius atau Fahrenheit bekerja:dapat diaktifkan dengan mengirimkan C dari F dari Smartphone, bahkan selama prosedur pembuatan kopi.// Nilai suhu awal dan sebelumnya akan dikonversi digunakan untuk statistik dan analisis.// Pengaturan ini disimpan dalam memori EEPROM .// -Test Mode:memasang sensor suhu eksternal, sistem dapat digunakan sebagai pengukur suhu serbaguna.// Dalam mode ini interval grafik adalah antara -20C / -4F dan +128C / +262F.// Mengirim nilai numerik antara 1 dan 999999 akan diterima sebagai interval pengukuran dalam hitungan detik, jadi // lebar grafik bisa antara 128 detik dan 11,57 hari.// -Komunikasi Bluetooth:menerima perintah dan mengirim laporan, mendeteksi jika ponsel cerdas terhubung atau terputus// - Kontrol bilah LED:MCU mengontrol penghitung dekade CD4027BE, dan bilah LED akan melangkah di semua siklus pengukuran suhu // ------------------------- -------------------------------------------------- -------------------------------------------------- ---// // dirancang, dibangun t dan diprogram // oleh Gyula Osi//// Hak cipta dilindungi undang-undang.// ---- Tampilan #include "U8glib.h"//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // tampilan OLED Bus I2C, SDA(TX) A4, SCL(RX) A5U8GLIB_ST7920_128X64 u8g(11, 10, 9, U8G_PIN_NONE); // menampilkan konstruktor PIN6-D11, PIN5-D10, PIN4-D9byte bingkai =0; // mulai penunjuk logo // ---- Port &Periferal Terkendali// led merah di A0 // led grn di A1const int bright[2] ={0, 500};const byte buzzer =3;const byte cd4017beCLK =4; // control CD4017BE dekade counterconst byte cd4017beRST =5;const byte btn =13;const byte relay =12;// ---- System Strings#define strSize 3String str[strSize]; // kejadian sistem dan laporan printout#define reportSize 5const String reportStr[reportSize] ={"Mulai...", "Segera standby...", "Berhenti.", " *** TEST MODE ***", "Mode normal."};//#define standbySize 5//const String standbyStr[standbySize] ={"Tekan tombol", ">", "atau", "kirim", "mulai"};const String autostartStr[2 ] ={"Autostart off.", "Autostart on."};// ---- Struktur Array Bendera Biner Status Sistem #define flagElements 6bool binFlags[flagElements] ={0, 1, 1, 0, 0, 0 }; // ---- elemen [i] tujuan init/mode siaga val // 0 diperiksa 0 // 1 selesai 1 // 2 siaga 1 // 3 pesan siaga terkirim 0 // 4 koil/kesalahan sensor 0 // 5 tes mode 0// ---- Pengukuran Suhu dan Fitur Terkait#termasuk "OneWire.h" #termasuk "DallasTemperature.h"#menentukan DS18B20 2 // menyiapkan bus OneWire pada D2OneWire temprWire(DS18B20); // siapkan DS18B20 untuk bekerja pada sensor OneWire busDallasTemperature(&temprWire);float tempr; // nilai terukurfloat temprInit; // salinan nilai terukur untuk satu kali perbandinganfloat temprPrev; // salinan nilai terukur untuk perbandingan siklik#define mUnit 2float temprBottomLim[mUnit] ={ 0, 26}; // autostart di bawah tempr AND analisis satu kali di bawah tempr ofconst char unit[mUnit] ={'F', 'C'};const String unitStr[mUnit] ={"Fahrenheit mode.", "Mode Celcius."};float trendSens[mUnit] ={ 0, 0.1}; // +/- range (F/C) yang akan dievaluasi sebagai suhu konstan // *** Nilai referensi Fahrenheit akan dihitung saat startup!bool trend[2] ={1, 0}; // menjelaskan tren suhu seperti di bawah ini // ---- elemen [i] tujuan // 0 perubahan // 1 tren #define checkSize 7const String checkStr[checkSize] ={"Air terdeteksi!", "Heating coil error!", "Kopi untuk enam", "Kopi untuk dua", "Anda lupa airnya!", "Sensor error!", "Kopi Anda sudah siap."};float temprCheck[mUnit][checkSize] ={{ }, {- 0,15, 5, 17, 28, 60, -127, 110}}; // |<-- REL -->|<--CONST-->| // [j] F / C // ---------------------------------------- ----- // ---- elemen [i] tujuan digunakan sebagai // 0 nilai rel autostart // 1 nilai rel deteksi kesalahan koil // 2 air untuk nilai enam rel // 3 air untuk dua nilai rel // 4 tidak ada nilai rel deteksi air // 5 tidak ada sinyal pada referensi konstan D2 // 6 referensi konstanta titik didih// ---- Deklarasi dan Variabel Grafik#define posYsize 128byte posY[ukuran posY];byte pointer =0;#define refrElements 42float temprRefr[refrElements];#define rangeElements 2 // min / max#define mode 2 // normal / test modefloat graphRange[mUnit][mode][rangeElements] ={{{ }, { }}, {{24, 127.938889 + 2}, {-20, rentang grafik[1][0][1]}}}; // [k] 0 1 0 1 // [j] | 0 | 1 // ---- elemen [i] | | | | // 0 minFnorm maxFnorm minFtest maxFtest // 1 minCnorm maxCnorm minCtest maxCtestfloat graphDiff[mUnit][mode]; // langkah vertikal menurut suhu// ---- Pengatur Waktu Sistem, Kontrol &Analisis#termasuk  elapsedMillis timer0; // 8-bit, timer PWM, digunakan oleh fungsi elapsedMillis()unsigned long tmrPrev =0; // yang berlalu akan menjadi yang sebelumnya ketika interval upbool cyclic =0;const long tmrInt[5] ={500, 2000, 60000, 640000, 800000}; // ---- elemen [i] tujuan // 0 interval pengukuran (mode uji), led ctrl // 1 interval pengukuran (mode normal) // 2 analitik satu kali (mode normal, selama pembuatan kopi) / analitik siklis ( mode siaga) // 3 mengirim pesan siaga (mode normal, setelah pembuatan kopi) // 4 sistem siaga (mode normal, setelah pembuatan kopi)long copyof_tmrInt0 =tmrInt[0]; const String tmrInt0Str ="Interval berubah."; // ---- Konfigurasi Komunikasi Serialconst byte btState =6;bool conn =0;const String connStr[2] ={"Connection lost.", "Smartphone connected."};#include  const int RX1 =7;const int TX1 =8;SoftwareSerial sUART(RX1,TX1); #define exRXSize 6char exRX[exRXSize]; // variabel untuk menerima data dari port serial// ---- Memory Management#include #define occBytes 2const byte addr[occBytes] ={ 0, 1};bool sysSettings[occBytes]; // ---- Peta Memori addr[i] | data | deskripsi | disimpan val // ---------------------------------------------- ------- // 0 | bool | mulai otomatis | 0:tidak ada autostart, 1:autostart // 1 | bool | satuan ukuran | 0:Fahrenheit, 1:Celsius// ---- Terminator &The Cleanup Crewconst char termCharSpc =' ';const String termStr;const byte termByte =0;const bool termBool =0;const uint8_t frame0[] U8G_PROGMEM ={ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0xFF, 0x7F, 0xF0, 0x3F, 0x00, FF, 0xFE, 0xFF 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0xFF, 0x7F, 0xF0, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF , 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0x1F, 0x7F, 0x8C, 0x3F, 0x1E, 0xFF, 0x00, 0xFE , 0x00, 0x18, 0xC0, 0x8F, 0xFF, 0x1F, 0x7F, 0x8C, 0x3F, 0x1E, 0xFF, 0x00, 0xFE, 0x1F, 0xFF, 0xF1, 0x00, 0x18, 0xC0, 0x8F, 0x3F, 0x1 , 0x1E, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0x31, 0xFE, 0x7F, 0xFC, 0x8F, 0xFF, 0x1F, 0x1F, 0x0C, 0x3E, 0x1E, 0xFF, 0xFF, 0xF8, 0x1F , 0xFC, 0x0F, 0x0E, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0xFC, 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0x7F, 0xF0, 0x0F, 0x0E, 0x18, 0x1 , 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0x7F, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0x , 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x00, 0x7E, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0xE , 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0x 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x3F, 0x00, 0x7E, 0x00, 0x3C, 0x80, 0x8x, 0x80 0x7F, 0x00, 0x3C, 0x00, 0x1E, 0xC0, 0x3F, 0x00, 0x7E, 0x00, 0x3C, 0x80, 0x07, 0xF0, 0x00, 0xF8, 0x7F, 0x00, 0x3C, 0x00, 0xFF, 0xFF, 0xC 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x FF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x06, 0xE , 0x06, 0xC6, 0x7F, 0xFE, 0xE7, 0x3F, 0x7E, 0xFE, 0xC7, 0x7F, 0x00, 0x00, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x60, 0x60 , 0x00, 0x00, 0x00, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x30, 0x1E, 0x66, 0x60, 0x06 , 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x30, 0x3E, 0x66, 0x60, 0 x06, 0x66, 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xE6, 0x61, 0x1E, 0xC7, 0x3F, 0x70, 0xE0, 0x3F, 0x3C 0x3F, 0x00, 0x00, 0x3C, 0x7E, 0xE6, 0x61, 0x1E, 0xC7, 0x3F, 0x70, 0xE0, 0x3F, 0x3C, 0xFE, 0xC3, 0x3F, 0x00, 0x00, 0x3C, 0xDE, 0xE 0x70, 0x70, 0xE0, 0x1D, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE7, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x31, 0x3C, 00x1E, 0x00, 0x3C, 0x1E, 0xE6, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE6, 0x61, 0x1E 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x7F, 0x1E, 0xE6, 0x3F, 0xFC, 0xE3, 0x3F, 0x70, 0xE0, 0x61, 0x7E, 0xFE, 0xE7, 0x300,00, 0x3 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0 0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };const uint8_t frame1 ={ 0xF8, // 11111000 00 0x21, // 00100001 01 0x22, // 00100010 02 0x24, // 00100100 03 0x08, // 00001000 04 0x10, // 000100000 05 0x24, // 00100100 06 0x44, // 01000100 07 0x0F, // 00001111 08 0x04, // 00000100 09 0x04, // 00000100 10 0x03, // 00000011 11};const uint8_t frame2[] PROGMEM ={ 0x08, // 00001000 00 0x1C, // 00011100 01 0x3E, // 00111110 02 0x7F, // 01111111 03};konst uint8_t bingkai3[] PROGMEM ={ 0x7F, // 01111111 00 0x3E, // 00111110 01 0x1C, // 00011100 02 0x08, // 00001000 03 }; batalkan penyiapan() { u8g .mulai(); isiArray(); pinMode(cd4017beCLK, OUTPUT); pinMode(cd4017beRST, OUTPUT); CD4017BE(0); // kirim RESET ke Decade IC Counter pinMode(btState, INPUT); pinMode(btn, INPUT); pinMode(relai, OUTPUT); sUART.begin(9600); memo(2); // memuat pengaturan sistem dari sensor EEPROM.begin(); // mulai DS18B20 temprMeas(); suhuInit =suhu; grafik (2); // init graph ledHandler(0);}void loop() { sysControl(); cekBtn(); periksaSambungan(); RX(); u8g.HalamanPertama(); melakukan { menggambar(); } while(u8g.nextPage()); if (bingkai ==0) { delay(3000); bingkai =1; scrClr(); }} // ---- Manajemen Memori // panggil param // 2:baca saat startup // 0, 1:tulis ke alamat yang benar //void memo(byte op) { switch(op) { case 2:for (byte i =0; i  tmrInt[2]) &&(!binFlags[5])) { if (binFlags[2]) { temprMeas(); if ((tempr - temprInit <=temprCheck[sysSettings[1]][0]) &&(tempr =temprCheck[sysSettings[1]][6]) &&(!binFlags[1])) { // check boiling point coil(0); strSelector(0, 6); } if ((timer0> tmrInt[3]) &&(!binFlags[2]) &&(!binFlags[3])) { // going standby msg AND a second security check strSelector(1, 1); binFlags[3] =1; if (!binFlags[1]) { // for case if the coil went broken after the One Time Analysis coil(0); // and therefore there was no boiling point strSelector(0, 1); } } if (timer0> tmrInt[4]) { // the system goes standby binFlags[2] =1; strSelector(6, 0); } }void temprMeas() { temprPrev =tempr; sensor.requestTemperatures(); // update sensor readings if (sysSettings[1]) { tempr =sensors.getTempCByIndex(0); // read remperature } else { tempr =sensors.getTempFByIndex(0); } if (tempr>=temprPrev + trendSens[sysSettings[1]]) { trend[0] =0; trend[1] =1; } if (tempr <=temprPrev + trendSens[sysSettings[1]]) { trend[0] =0; trend[1] =0; } if ((tempr  temprPrev - trendSens[sysSettings[1]])) { trend[0] =1; }} // ---- Coil Control // 0:power off // 1:power onvoid coil(byte op) { switch (op) { case 0:digitalWrite(relay, 0); binFlags[1] =1; strSelector(1, 2); ledHandler(0); merusak; case 1:digitalWrite(relay, 1); strSelector(6, 0); CD4017BE(0); graph(1); for (byte i =0; i  0; i--) { str[i] =termStr; } return; } TX(); for (byte i =(strSize - 1); i> 0; i--) { // roll for printout str[i] =str[i - 1]; } buzz(4, 1); }void draw(void) { if (frame ==0) { u8g.drawXBMP( 0, 0, 128, 64, frame0); } else { if (frame ==1) { scr(); } }}void scr(void) { if (binFlags[2]) { #define standbySize 4 const String standbyStr[standbySize] ={"Press key>>>>", "or", "send", "start"}; u8g.setFont(u8g_font_courB10); u8g.setPrintPos(2, 12); u8g.print(standbyStr[0]); u8g.setPrintPos(14, 26); u8g.print(standbyStr[1]); u8g.setPrintPos(30, 40); u8g.print(standbyStr[2]); u8g.setColorIndex(!cyclic); u8g.drawBox(74, 28, 50, 14); u8g.setColorIndex(cyclic); u8g.setPrintPos(76, 40); u8g.print(standbyStr[3]); u8g.setColorIndex(1); } else { if ((posY[0]>=20) || (posY[13]>=20)) { u8g.drawBitmapP( 5, 0, 1, 12, frame1); } else { u8g.drawBitmapP( 5, 25, 1, 12, frame1); } if ((posY[54]>=30) || (posY[112]>=30)) { u8g.drawHLine(69, 40, 53); scrTempr(72, 12); } else { scrTempr(72, 44); } for (byte i =0; i  0) { u8g.drawVLine(i, posY[i], 2); } } } u8g.setFont(u8g_font_6x12); byte y =53; for (byte i =(strSize - 1); i> 0; i--) { u8g.setPrintPos(0, y); y =y + 9; u8g.print(str[i]); } }void scrTempr (byte tX, byte tY) { u8g.drawVLine(2, 4, 39); u8g.drawHLine(0, 40, 69); u8g.drawHLine(0, posY[pointer - 1], 5); byte tXrel =2; byte tYrel =11; if ((tempr <100) &&(tempr> -10)) { u8g.drawFrame(tX - tXrel, tY - tYrel, 45, 13); u8g.drawHLine(116, 40, 12); } else { u8g.drawFrame(tX - tXrel, tY - tYrel, 51, 13); u8g.drawHLine(122, 40, 6); } u8g.setFont(u8g_font_6x12); u8g.setPrintPos(tX, tY); u8g.print(tempr); u8g.print(char(176)); u8g.print(unit[sysSettings[1]]); if (trend[0]) { return; } tXrel =12; if (trend[1]) { u8g.drawBitmapP(tX - tXrel, tY - tYrel, 1, 4, frame2); } else { u8g.drawBitmapP(tX - tXrel, tY - tYrel, 1, 4, frame3); }}void scrClr(){ u8g.firstPage(); do { } while(u8g.nextPage());} // ---- Maintenance of Graph Arrays // call param // 0:step &fill // 1:clr // 2:initvoid graph(byte op) { switch (op) { case 0:if (pointer ==posYsize) { for (byte i =0; i <(posYsize - 1); i++) { posY[i] =posY[i + 1]; posY[i + 1] =termByte; } pointer =posYsize - 1; } for (byte i =0; i =temprRefr[i + 1])) { posY[pointer] =i; kembali; } } break; case 1:for (byte i =0; i  0) &&(atof(exRX)>=1) &&(atof(exRX) <=999999)) { copyof_tmrInt0 =(atof(exRX) * 1000); strSelector(5, 0); } for (byte i =0; i   

Skema


Proses manufaktur

  1. Kontrol akses dengan QR, RFID, dan verifikasi suhu
  2. Pencatat Data Suhu dan Kelembaban
  3. Arduino dengan Bluetooth untuk Mengontrol LED!
  4. Smart Shoes (Tali Otomatis dan Pembangkit Listrik)
  5. Suhu, Kelembaban, dan Tekanan BME280 pada Tampilan Berikutnya
  6. Mengontrol Motor Servo dengan Arduino dan MPU6050
  7. Peralatan yang Dikendalikan Suara Bluetooth dengan OK Google
  8. u-blox LEA-6H 02 Modul GPS dengan Arduino dan Python
  9. Cara membaca suhu dan kelembaban di Blynk dengan DHT11
  10. Lengan Robot Sederhana dan Cerdas Menggunakan Arduino