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

Setel DS3231 dengan GPS

Komponen dan persediaan

Arduino Nano R3
× 1
modul jam DS3231
× 1
MODUL GPS NEO 6M
× 1
PERGESER TINGKAT ARAH BI
× 1
TAMPILAN LCD 16*2
× 1
RANSEL LCD I2C
× 1
soket 0,1 inci 15 arah
× 2
soket 6 arah 0,1 inci
× 2
soket 0,1 inci 4 arah
× 1
soket 0,1 inci 5 arah
× 1
strip pin 0,1 inci 4 arah
× 1
Stripboard 24 strip * 37 kolom
× 1
resistor 4K7
× 2
Tombol tekan (tiang tunggal sesaat 6m persegi)
× 1

Tentang proyek ini

DS3231 saya melayang, saya melakukan hal yang normal dalam memperbaruinya dengan mengkompilasi beberapa kode menggunakan waktu sistem, tetapi ini terbukti sedikit tidak akurat karena kompilasi dan pengunggahan terus terganggu oleh proses lain yang terjadi di komputer saya.

Setelah saya menemukan bahwa GPS memberikan waktu dan tanggal yang akurat (UTC) saya memutuskan untuk menggunakannya untuk mengatur DS3231 saya.

Sirkuit:

Tas punggung LCD ke Arduino:

GND - GND

VCC - 5V

SDA - SDA (A4)

SCL - SCL (A5)

Modul jam DS3231 ke Arduino:

GND - GND

VCC - 5V

SDA - SDA (A4)

SCL - SCL (A5)

PERGESER TINGKAT dari Arduino:

5V - 5V

GND - GND

D3 - BUS

D4 - BUS

NEO 6M GPS dari pemindah level:

3V - VCC

GND - GND

BUS - TXD (berakhir pada H3)

BUS - RXD (berakhir di H4)

GANTI KONTAK:

BERALIH - H9

BERALIH - GND

Kekuatan:

Saya memasok daya ke sirkuit saya melalui kabel USB.

Perangkat Lunak:

99% dari perangkat lunak adalah contoh parsing.ino di perpustakaan Adafruit GPS. Saya menambahkan sedikit kode untuk meneruskan tanggal dan waktu GPS yang diekstraksi ke DS3231 dan beberapa kode tambahan untuk menampilkan waktu dari DS3231 pada layar LCD.

Perpustakaan yang digunakan:

Adafruit GPSLibrary oleh Adafruit versi 1.0.3

RTCLib oleh Adafruit versi 1.2.0

NewLiquidCrystal untuk ransel layar I2C.

Operasi:

Nyalakan unit.

LCD akan menampilkan nilai tanggal dan waktu saat ini dalam register DS3231.

Tunggu beberapa saat hingga GPS terkunci.

Tekan tombol untuk menyetel waktu melalui sinyal GPS.

LCD akan menampilkan waktu baru.

Batasan operasi:

Unit GPS membutuhkan waktu untuk mengunci dan tidak ada indikator bahwa kunci telah tercapai. Menekan tombol set tanpa kunci mengakibatkan tanggal DS3231 saya disetel ke 2000:0:0 dan waktu ke 0:0:0.

Setelah LED merah pada unit GPS mulai berkedip, sepertinya ini adalah waktu terbaik untuk menekan tombol set – ini bisa menjadi 10 menit (dalam ruangan).

Awalnya unit DS3231 yang saya gunakan memiliki baterai yang kempes, saat ditekan set tanggalnya menjadi 2000:0:0 dan waktu menjadi 0:164:164. Butuh waktu cukup lama bagi baterai untuk mendapatkan daya yang cukup untuk menerima data GPS dan terus berdetak dengan benar dengan sendirinya.

Keunikan GPS:

Papan yang saya beli hanya mengatakan NEO 6M GPS dan memiliki pin penghubung yang ditandai dengan fungsinya. Saya melihat lembar data untuk perangkat [1] dan menyatakan bahwa perangkat berfungsi pada sekitar 3V, oleh karena itu saya menggunakan level shifter. Namun pada pemeriksaan lebih dekat saya menemukan chip 4A2D yang disolder ke papan, pencarian di internet menunjukkan itu sebagai pengatur tegangan tetapi ini tidak menjamin bahwa jalur komunikasi bergeser level (unit saya datang tanpa diagram sirkuit).

Saya juga membaca secara online bahwa modul GPS yang berbeda memiliki kemampuan yang berbeda untuk menerima sinyal yang baik di dalam ruangan, oleh karena itu saya menambahkan layar LCD sehingga saya dapat membawanya keluar.

Keunikan LCD:

Saya menggunakan salah satu yang eksentrik yang memiliki alamat I2C 0x3F, sebagian besar menggunakan alamat 0x27, jadi jika Anda tidak melihat apa pun, coba ubah dulu.

Keunikan perpustakaan:

LibraryRTCLib (Adafruit versi 1.2.0) menyetel register waktu dan tanggal tetapi bukan register hari DS3231. Perpustakaan memiliki fungsi untuk mengembalikan hari dalam seminggu yang dihitung dengan cepat menggunakan nilai-nilai dalam register tanggal.

Saya menemukan ini aneh tetapi akhirnya menyadari bahwa itu masuk akal, menyetel register hari akan mengharuskan kode Anda diatur untuk mengubahnya pada tahun kabisat sementara menghasilkan hari dengan formula menghindari hal ini.

Waktu UTC &Lokal:

Saya melakukan penelusuran di UTC dan menemukan bahwa tidak ada perubahan yang diperlukan untuk waktu lokal saya, jadi jika Anda membutuhkannya, Anda harus menambahkan sendiri sedikit kode itu.

Referensi:

[1] https://www.u-blox.com/sites/default/files/products/documents/NEO-6_DataSheet_(GPS.G6-HW-09005).pdf(diambil /Des/2018)

Kode

  • Mengatur file kode DS3231
Mengatur file kode DS3231Arduino
// Fungsi tanggal dan waktu menggunakan DS3231 RTC yang terhubung melalui I2C dan Wire lib#include #include "RTClib.h"//Aadafruit versi 1.2.0 di mesin sayaRTC_DS3231 RTC;char daysOfTheWeek[7] [12] ={"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};const int days_string_length =12;//barang akhir jam//untuk lcd display//#include //telah disertakan (di atas) // Dapatkan Perpustakaan LCD I2C di sini:// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads#include //Perhatikan alamat yang tidak biasa dari 0x3F kebanyakan lcd menggunakan alamat 0x27 jadi jika Anda tidak melihat apa-apa coba ubah lcd firstLiquidCrystal_I2C itu (0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIF); // Setel alamat LCD I2C//akhir untuk tampilan lcd//untuk tombol#define button 9// Kode uji untuk modul GPS Adafruit menggunakan driver MTK3329/MTK3339//// Kode ini menunjukkan cara mendengarkan modul GPS di interupsi// yang memungkinkan program memiliki lebih banyak 'kebebasan' - cukup parsing// ketika kalimat NMEA baru tersedia! Kemudian akses data bila// diinginkan.//// Diuji dan berfungsi baik dengan modul GPS Adafruit Ultimate// menggunakan chipset MTK33x9// ------> http://www.adafruit.com/products/746/ / Ambil satu hari ini di toko elektronik Adafruit // dan bantu dukung perangkat keras &perangkat lunak sumber terbuka! -ada#include #include // Jika Anda menggunakan modul GPS:// Hubungkan pin Daya GPS ke 5V// Hubungkan pin GPS Ground ke ground// Jika menggunakan perangkat lunak serial (contoh sketsa default):// Hubungkan pin GPS TX (transmit) ke Digital 3// Hubungkan pin GPS RX (receive) ke Digital 2// Jika menggunakan hardware serial (misalnya Arduino Mega):// Hubungkan GPS TX (transmit) pin ke Arduino RX1, RX2 atau RX3// Hubungkan pin GPS RX (receive) ke pencocokan TX1, TX2 atau TX3// Jika Anda menggunakan pelindung GPS Adafruit, ubah // SoftwareSerial mySerial(3, 2 ); -> SoftwareSerial mySerial(8, 7);// dan pastikan sakelar disetel ke SoftSerial// Jika menggunakan serial perangkat lunak, tetap aktifkan baris ini// (Anda dapat mengubah nomor pin agar sesuai dengan kabel Anda):SoftwareSerial mySerial( 3, 2;// Jika menggunakan serial perangkat keras (misalnya Arduino Mega), beri komentar// di atas baris SoftwareSerial, dan aktifkan baris ini sebagai gantinya// (Anda dapat mengubah nomor Seri agar sesuai dengan kabel Anda)://HardwareSerial mySerial =Serial1;Adafruit_GPS GPS(&mySerial);// Setel GPSECHO ke 'false' untuk mematikan gema data GPS ke konsol Serial// Setel ke 'true' jika Anda ingin men-debug dan mendengarkan kalimat GPS mentah. #define GPSECHO false //--------->dimatikan// ini melacak apakah kita menggunakan interupsi// nonaktif secara default!boolean usingInterrupt =false;void useInterrupt(boolean); // Prototipe fungsi membuat Arduino 0023 happyvoid setup() { // terhubung pada 115200 sehingga kita dapat membaca GPS dengan cukup cepat dan menggema tanpa menjatuhkan karakter // juga mengeluarkan Serial.begin(115200); Serial.println("Tes dasar library GPS Adafruit!"); // 9600 NMEA adalah baud rate default untuk Adafruit MTK GPS- beberapa menggunakan 4800 GPS.begin(9600); // batalkan komentar pada baris ini untuk mengaktifkan RMC (minimal yang disarankan) dan GGA (memperbaiki data) termasuk ketinggian GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // batalkan komentar pada baris ini untuk mengaktifkan hanya data "minimal yang disarankan" //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); // Untuk parsing data, kami tidak menyarankan menggunakan apa pun kecuali RMC saja atau RMC+GGA karena // parser tidak peduli dengan kalimat lain saat ini // Atur kecepatan pembaruan GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // Tingkat pembaruan 1 Hz // Agar kode penguraian berfungsi dengan baik dan memiliki waktu untuk memilah-milah data, dan // mencetaknya, kami tidak menyarankan menggunakan apa pun yang lebih tinggi dari 1 Hz // Meminta pembaruan tentang status antena, komentar keluar untuk diam GPS.sendCommand(PGCMD_ANTENNA); // hal yang menyenangkan tentang kode ini adalah Anda dapat membuat interupsi timer0 mati // setiap 1 milidetik, dan membaca data dari GPS untuk Anda. yang membuat // kode loop jauh lebih mudah! gunakanInterrupt(benar); penundaan (1000); // Minta versi firmware mySerial.println(PMTK_Q_RELEASE); //mulai lcd lcd.begin(16,2); lcd.lampu latar(); lcd.clear(); //setup tombol pinMode(tombol,INPUT_PULLUP); }// Interupsi dipanggil sekali dalam satu milidetik, mencari data GPS baru, dan menyimpannyaSIGNAL(TIMER0_COMPA_vect) { char c =GPS.read(); // jika Anda ingin men-debug, inilah saat yang tepat untuk melakukannya!#ifdef UDR0 if (GPSECHO) if (c) UDR0 =c; // menulis langsung ke UDR0 jauh lebih cepat daripada Serial.print // tetapi hanya satu karakter yang dapat ditulis dalam satu waktu. #endif}void useInterrupt(boolean v) { if (v) { // Timer0 sudah digunakan untuk milis() - kita hanya akan menginterupsi suatu tempat // di tengah dan memanggil fungsi "Bandingkan A" di atas OCR0A =0xAF; TIMSK0 |=_BV(OCIE0A); usingInterrupt =benar; } else { // jangan panggil fungsi interupsi COMPA lagi TIMSK0 &=~_BV(OCIE0A); menggunakanInterrupt =salah; }}uint32_t timer =millis();void loop() // berjalan berulang-ulang{ // jika Anda tidak menggunakan interupsi di atas, Anda akan // perlu 'meminta' GPS, bukan yang disarankan :( if (! usingInterrupt) { // membaca data dari GPS di 'main loop' char c =GPS.read(); // jika Anda ingin men-debug, inilah saat yang tepat untuk melakukannya! if (GPSECHO) if (c) Serial.print(c); } // jika sebuah kalimat diterima, kita dapat memeriksa checksum, mengurainya... if (GPS.newNMEAreceived()) { // hal yang rumit di sini adalah jika kita mencetak kalimat NMEA, atau data // kita akhirnya tidak mendengarkan dan menangkap kalimat lain! // jadi berhati-hatilah jika menggunakan OUTPUT_ALLDATA dan mencoba mencetak data //Serial.println(GPS.lastNMEA()); // ini juga menyetel flag newNMEAreceived() ke false if (!GPS.parse(GPS.lastNMEA())) // ini juga menyetel flag newNMEAreceived() ke false return; // kita bisa gagal mengurai kalimat dalam hal ini kita harus tunggu saja yang lain } // jika milis() atau timer berputar, kami hanya akan mengatur ulang jika (timer> milis()) timer =milis();statis bool second_time_round=false; // kira-kira setiap 2 detik atau lebih, cetak statistik saat ini //if (millis() - timer> 2000) { // timer =millis(); // reset timer //Tulis data ke jam jika tombol ditekan - tombol biasanya ditahan tinggi oleh pullup internal if(!digitalRead(button)){//Catatan:RTClib tidak secara eksplisit mengatur hari dalam seminggu, register di DS3231.// Sebaliknya ketika Anda menggunakan dayOfTheWeek() hari dihitung dengan rumus berdasarkan tanggal. //Minggu dianggap nol.//(berdasarkan bacaan saya tentang header perpustakaan dan file ccp) //set rtc RTC.adjust(DateTime(GPS.year, GPS.month, GPS.day, GPS.hour, GPS.menit, GPS.detik)); //lcd lcd.clear(); lcd.setCursor(2,0); lcd.print("Set yang ditekan"); penundaan(5000); lcd.clear(); } DateTime sekarang =RTC.now(); lcd.setCursor(4,0); lcd.print(sekarang.tahun(), DES); lcd.print('/'); lcd.print(sekarang.bulan(), DES); lcd.print('/'); lcd.print(sekarang.hari(), DES); lcd.print(' '); lcd.setCursor(4,1); lcd.print(sekarang.jam(), DES); lcd.print(':'); lcd.print(sekarang.menit(), DES); lcd.print(':'); lcd.print(sekarang.detik(), DES); lcd.print(" ");}

Skema


Proses manufaktur

  1. Apa itu Set Sekrup?
  2. Meninggalkan warisan abadi
  3. SMRP menerbitkan kumpulan definisi metrik M&R
  4. Java 10 - Pengaturan Lingkungan
  5. Apa Itu Persegi Set?
  6. Penggilingan permukaan dengan cara kuno
  7. Pilihan Terbaik:Bubut CNC Cara Kotak
  8. Apa Itu Punch Set?
  9. Apa itu Bubut CNC Linear Way?
  10. Memahami peralatan mekanik