- Arduino Nano R3
- Modul jam DS3231
- Modul GPS NEO 6M
- Penglalih level dua arah
- Tampilan LCD 16*2
- Backpack LCD I2C
Soket 15 jalur 0.1 inci (2 buah) | Soket 6 jalur 0.1 inci (2 buah) | Soket 4 jalur 0.1 inci | Soket 5 jalur 0.1 inci | Strip pin 4 jalur 0.1 inci | Papan stripboard 24 strip * 37 kolom | Resistor 4K7 (2 buah) | Tombol push (single pole momentary)Tentang proyek iniDS3231 saya drift, saya melakukan hal normal dalam memperbaruinya dengan mengompilasi beberapa kode menggunakan waktu sistem, tetapi ini terbukti kurang akurat karena proses kompilasi dan pengunggahan terus terganggu oleh proses lain yang terjadi pada komputer saya. Setelah saya menemukan bahwa GPS memberikan waktu (UTC) dan tanggal yang akurat, saya memutuskan untuk menggunakannya untuk mengatur DS3231 saya. Rangkaian:Backpack 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) Penglalih level dari Arduino: 5V - 5V GND - GND D3 - BUS D4 - BUS NEO 6M GPS dari penglalih level: 3V - VCC GND - GND BUS - TXD (akhirnya di D3) BUS - RXD (akhirnya di D4) Kontak saklar: SAKLAR - D9 SAKLAR - GND Daya:Saya menyuplai daya ke rangkaian saya melalui kabel USB. Perangkat lunak:99% perangkat lunak adalah contoh parsing.ino di pustaka GPS Adafruit. Saya menambahkan sedikit kode untuk melewatkan tanggal dan waktu yang diekstrak GPS ke DS3231 dan beberapa kode tambahan untuk menampilkan waktu dari DS3231 pada tampilan LCD. Pustaka yang digunakan:- Adafruit GPSLibrary oleh Adafruit versi 1.0.3
- RTCLib oleh Adafruit versi 1.2.0
- NewLiquidCrystal untuk backpack tampilan I2C.
Operasi:Nyalakan unit. LCD akan menampilkan nilai tanggal dan waktu yang saat ini ada dalam register DS3231. Tunggu sebentar hingga GPS terkunci. Tekan tombol untuk mengatur waktu melalui sinyal GPS. LCD akan menampilkan waktu baru. Keterbatasan operasi:Unit GPS memerlukan waktu untuk terkunci dan tidak ada indikator bahwa terkunci telah tercapai. Menekan tombol setel tanpa terkunci resulted in my DS3231 date being set to2000:0:0 and the time to 0:0:0. Setelah LED merah pada unit GPS mulai berkedip sepertinya waktu terbaik untuk menekan tombol setel – ini bisa selama puluhan menit (di dalam ruangan). Awalnya unit DS3231 yang saya gunakan memiliki baterai habis, saat menekan setel tanggal diatur ke2000:0:0 dan waktu ke 0:164:164. Butuh waktu cukup lama untuk baterai mendapatkan cukup muatan untuk menerima data GPS dan terus berdetik dengan benar sendiri. Kejadian aneh GPS:Papan yang saya beli mengatakan sederhana NEO 6M GPS dan memiliki pin koneksi yang ditandai dengan fungsinya. Saya melihat datasheet untuk perangkat [1] dan itu menyatakan perangkat berfungsi pada sekitar 3V, sehingga penggunaan penglalih level saya. Namun setelah pemeriksaan lebih dekat saya menemukan chip 4A2D yang disolder pada papan, pencarian di internet menunjukkan itu adalah regulator tegangan tetapi ini tidak menjamin bahwa garis komunikasi di-level shift (unit saya tidak datang dengan diagram rangkaian). Saya juga telah membaca online bahwa modul GPS berbeda bervariasi dalam kemampuan mereka untuk menerima sinyal yang baik di dalam ruangan, sehingga penambahan saya layar LCD sehingga saya dapat membawanya ke luar. Kejadian aneh LCD:Saya menggunakan yang aneh yang memiliki alamat I2C 0x3F, sebagian besar menggunakan alamat 0x27, jadi jika Anda tidak melihat apa-anya coba mengubah itu terlebih dahulu. Kejadian aneh pustaka:Pustaka RTCLib (versi Adafruit 1.2.0) mengatur register waktu dan tanggal tetapi tidak register hari dari DS3231. Pustaka memiliki fungsi untuk mengembalikan hari dalam seminggu yang dihitung di waktu aktif menggunakan nilai dalam register tanggal. Saya menemukan ini aneh tetapi akhirnya menyadari bahwa itu masuk akal, mengatur register hari akan memerlukan kode Anda disiapkan untuk mengubahnya pada tahun kabisat sementara menghasilkan hari dengan rumus menghindari ini. Waktu UTC & Waktu Lokal:Saya melakukan pencarian tentang UTC dan menemukan bahwa tidak ada perubahan yang diperlukan untuk waktu lokal saya, jadi jika Anda memerlukannya Anda harus menambahkan potongan kode itu sendiri. Referensi:[1] https://www.u-blox.com/sites/default/files/products/documents/NEO-6_DataSheet_(GPS.G6-HW-09005).pdf(diunduh /Des/2018) KodeFile kode Set DS3231// Date and time functions using a DS3231 RTC connected via I2C and Wire lib #include <Wire.h> #include "RTClib.h"//Aadafruit version 1.2.0 on my machine RTC_DS3231 RTC; char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; const int days_string_length =12; #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); #define button 9 #include <Adafruit_GPS.h> #include <SoftwareSerial.h> SoftwareSerial mySerial(3, 2); Adafruit_GPS GPS(&mySerial); #define GPSECHO false boolean usingInterrupt = false; void useInterrupt(boolean); void setup() { Serial.begin(115200); Serial.println("Adafruit GPS library basic test!"); GPS.begin(9600); GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); GPS.sendCommand(PGCMD_ANTENNA); useInterrupt(true); delay(1000); mySerial.println(PMTK_Q_RELEASE); lcd.begin(16,2); lcd.backlight(); lcd.clear(); pinMode(button,INPUT_PULLUP); } SIGNAL(TIMER0_COMPA_vect) { char c = GPS.read(); #ifdef UDR0 if (GPSECHO) if (c) UDR0 = c; #endif } void useInterrupt(boolean v) { if (v) { OCR0A = 0xAF; TIMSK0 |= _BV(OCIE0A); usingInterrupt = true; } else { TIMSK0 &= ~_BV(OCIE0A); usingInterrupt = false; } } uint32_t timer = millis(); void loop() { if (! usingInterrupt) { char c = GPS.read(); if (GPSECHO) if (c) Serial.print(c); } if (GPS.newNMEAreceived()) { if (!GPS.parse(GPS.lastNMEA())) return; } if (timer > millis()) timer = millis(); static bool second_time_round=false; if(!digitalRead(button)){ RTC.adjust(DateTime(GPS.year, GPS.month, GPS.day, GPS.hour, GPS.minute, GPS.seconds)); lcd.clear(); lcd.setCursor(2,0); lcd.print("Pressed set"); delay(5000); lcd.clear(); } DateTime now = RTC.now(); lcd.setCursor(4,0); lcd.print(now.year(), DEC); lcd.print('/'); lcd.print(now.month(), DEC); lcd.print('/'); lcd.print(now.day(), DEC); lcd.print(' '); lcd.setCursor(4,1); lcd.print(now.hour(), DEC); lcd.print(':'); lcd.print(now.minute(), DEC); lcd.print(':'); lcd.print(now.second(), DEC); lcd.print(" "); } Skematik 
|