Menyambung modul masa nyata ke arduino. Jam dinding besar dengan kecerahan automatik pada Arduino

Saya perlu membuat sesuatu yang lebih besar entah bagaimana. Jam dinding dengan kecerahan automatik.

Jam ini sesuai untuk bilik besar, seperti lorong pejabat atau apartmen yang besar.

Membuat jam dinding yang besar tidak begitu sukar menggunakan arahan ini.


Untuk menganggarkan saiz jam tangan, anda boleh mengandaikan bahawa satu segmen jam tangan akan menjadi saiz kertas A4, yang akan memudahkan penggunaan bingkai foto dengan saiz yang sesuai.

Langkah 1. Komponen jam dinding yang besar.

Wayar, pateri, besi pematerian, jalur LED Arduino Nano Penukar DC-DC LM2596
4 meter jalur LED WS2811 sensor cahaya jam masa sebenar DS3231
suis mikro

Apa yang saya gunakan untuk projek ini:

Langkah 8. Program jam.

Selepas beberapa kali bermain-main, saya berjaya mendapatkan jam tangan yang benar-benar memenuhi keperluan saya. Saya pasti anda boleh melakukan lebih baik daripada saya.

Kod ini diulas dengan baik dan tidak sukar untuk anda memahaminya; mesej penyahpepijatan juga diulas dengan sangat baik.

Jika anda perlu menukar warna jam dinding yang digunakan, anda perlu menukar pembolehubah pada baris 22 ( int ledColor = 0x0000FF; // Warna yang digunakan (dalam hex)). Anda boleh menemui senarai warna dan kod heksnya pada halaman: https://github.com/FastLED/FastLED/wiki/Pixel-refe…

Jika anda menghadapi masalah memuat turun, gunakan cermin: http://bit.ly/1Qjtgg0

Lakaran akhir saya boleh dimuat turun.

Langkah 9. Buat nombor menggunakan polisterin.

Pangkalan pemotong Badan kerja pemotong Borang am pemotong
Hasil pemotong

Potong setiap segmen ke dalam templat yang dicetak pada permulaan.
Polistirena boleh dipotong dengan pisau tajam, yang agak sukar, atau dengan peranti mudah yang diperbuat daripada dawai nichrome atau tali gitar dan beberapa keping papan OSB.

Anda boleh lihat bagaimana saya melakukannya dalam imej di atas.

Untuk menghidupkan pemotong saya menggunakan bekalan kuasa 12v.

Hasil daripada pemotongan, anda harus mendapatkan empat segmen untuk jam besar, salah satunya ditunjukkan dalam foto.

Langkah 10. Lekatkan nombor dan tutup semuanya dengan peresap. Jam dinding besar terakhir.

Bercahaya pada siang hari Bercahaya pada waktu malam

Selepas memotong keempat-empat nombor dan titik jam dinding, lekatkan semuanya pada kadbod bersama-sama Jalur LED(Saya menggunakan pita bermuka dua untuk memudahkan proses)

Untuk menghilangkan yang keras lampu led Saya menggunakan dua helai kertas di atas nombor polistirena. Untuk kemudahan dan estetika, saya menggunakan kertas saiz A2 yang dilipat dua.

Selepas melengkapkan semua langkah ini, saya meletakkan pemasangan jam dinding besar yang terhasil ke dalam bingkai foto besar yang sepadan.

Jam tangan ini ternyata sangat mengagumkan dan menarik perhatian. Saya fikir bahawa jam dinding yang besar akan menghiasi banyak bilik dengan sempurna.

Bersentuhan dengan

Jadi, jam masa sebenar. Perkara kecil yang berguna ini menyelesaikan masalah berkaitan masa yang paling berguna. Katakan anda mengawal penyiraman pada pukul 5 pagi di dacha anda. Atau menghidupkan dan mematikan lampu detik tertentu. Mengikut tarikh anda boleh mula memanaskan di mana-mana rumah. Perkara itu agak menarik dan berguna. Dan lebih khusus lagi? Kami akan melihat jam masa nyata DS1302 untuk platform Arduino yang popular.

Dari artikel ini anda akan belajar:

selamat hari, wahai pembaca sekalian blok kip-world! apa khabar? Tulis dalam komen, adakah anda berminat dengan robotik? Apakah maksud topik ini kepada anda?

Saya tidak boleh berhenti memikirkan perkara ini seminit. Saya bermimpi dan melihat bila kita akhirnya akan sampai ke tahap di mana semua orang mampu membeli pembantu robot peribadi. Tidak kira apa yang dia lakukan, memungut sampah, memotong rumput, mencuci kereta.

Saya boleh bayangkan bagaimana algoritma yang kompleks mereka mesti mengandungi dalam "otak" mereka.

Lagipun, kita akan sampai ke tahap di mana kita akan flash perisian dengan cara yang sama seperti pada komputer peribadi. Muat turun juga program aplikasi. Jahit pada lengan, kaki, tukar cakar, manipulator.

Tonton filem "I Robot", " Kecerdasan buatan", "Star Wars".

Jepun telah lama melaksanakan pembangunan mereka. Kenapa kita lebih teruk?? Kami mempunyai sedikit populariti. Saya tahu beberapa pembangun. Saya boleh mengiranya dengan jari saya. Kami sedang melakukan sesuatu yang lain. Kami adalah penjual semula. Kami hanya membeli kit siap, robot, mainan dan segala macam sampah.

Mengapa kita tidak membangunkan ini:

Atau ini:

Saya menghabiskan pemikiran saya dengan kuat. Mari kita bincangkan tentang menyambungkan Pemasa Jam Masa Nyata DS1302 kepada Arduino.

Jam masa nyata DS1302

Pengawal Arduino tidak mempunyai jam sendiri. Oleh itu, jika perlu, ia mesti ditambah dengan litar mikro DS1302 khas.

Untuk bekalan kuasa, papan ini boleh menggunakan baterinya sendiri, atau dikuasakan terus dari papan Arduino.

Jadual pinout:

Gambar rajah sambungan dengan Arduino UNO:


Kaedah untuk pengaturcaraan Arduino untuk berfungsi dengan DS1302

Adalah penting untuk memuat turun perpustakaan yang sah daripada sumber yang boleh dipercayai.

Perpustakaan membolehkan anda membaca dan menulis parameter masa nyata. Saya berikan penerangan ringkas di bawah:

#termasuk // Sambungkan perpustakaan.
iarduino_RTC SEBUAH OBJEK ( NAMA [, RST_OUTPUT [, CLK_OUTPUT [, DAT_OUTPUT ]]] ); // Cipta objek.

Fungsi mula ();// Permulaan kerja modul RTC.

Fungsi tetapkan masa( SEK [, MIN [, JAM [, HARI [, BULAN [, TAHUN [, HARI]]]]]] ); // Menetapkan masa.

Fungsi masa lapang ([ LINE ] ); // Baca masa.

fungsi masa kejap ( PARAMETER [FREKUENSI] ); // Menyebabkan fungsi gettime menjadi "berkedip" parameter yang ditentukan masa.

fungsi tempoh ( MINIT ); // Menunjukkan tempoh minimum untuk mengakses modul dalam beberapa minit.

Pembolehubah detik// Mengembalikan saat dari 0 hingga 59.

Pembolehubah minit// Mengembalikan minit dari 0 hingga 59.

Pembolehubah Jam// Mengembalikan jam dari 1 hingga 12.

Pembolehubah Jam// Mengembalikan jam dari 0 hingga 23.

Pembolehubah tengah hari// Kembali tengah hari 0 atau 1 (0 pagi, 1 petang).

Pembolehubah hari// Mengembalikan hari dalam bulan dari 1 hingga 31.

Pembolehubah hari minggu// Mengembalikan hari dalam seminggu dari 0 hingga 6 (0 ialah Ahad, 6 ialah Sabtu).

Pembolehubah bulan// Mengembalikan bulan dari 1 hingga 12.

Pembolehubah tahun// Mengembalikan tahun dari 0 hingga 99.

Kami menulis program yang mudah. Menetapkan masa semasa dalam modul RTC (DS1302):

Arduino

#termasuk iarduino_RTC masa(RTC_DS1302,6,7,8); void setup() ( delay(300); Serial.begin(9600); time.begin(); time.settime(0,51,21,27,10,15,2); // 0 saat, 51 min, 21 jam, 27 Oktober 2015, Selasa ) void loop())( if(millis()%1000==0)( // jika 1 saat telah berlalu Serial.println(time.gettime("d-m-Y, H:i: s, D")); // paparkan kelewatan masa(1); // jeda selama 1 ms supaya tidak memaparkan masa beberapa kali dalam 1 ms ) )

#termasuk

iarduino_RTCtime(RTC_DS1302, 6, 7, 8);

persediaan batal() (

kelewatan(300);

bersiri. mula (9600);

masa. mula ();

masa. settime(0, 51, 21, 27, 10, 15, 2); // 0 saat, 51 min, 21 jam, 27 Oktober 2015, Selasa

gelung kosong() (

jika (millis() % 1000 == 0 ) ( // jika 1 saat telah berlalu

bersiri. println (masa . gettime ( "d-m-Y, H:i:s, D" ) ); // masa paparan

kelewatan(1); // jeda selama 1 ms supaya tidak memaparkan masa beberapa kali dalam 1 ms

Membaca masa semasa daripada modul RTC (DS1302) dan output ke "Port bersiri":

#termasuk iarduino_RTC masa(RTC_DS1302,6,7,8); void setup() ( delay(300); Serial.begin(9600); time.begin(); ) void loop())( if(millis()%1000==0)( // jika 1 saat telah berlalu Serial .println (time.gettime("d-m-Y, H:i:s, D")); // paparkan kelewatan masa(1); // jeda selama 1 ms supaya tidak memaparkan masa beberapa kali dalam 1 ms ) )

Selamat petang, hari ini saya akan berkongsi arahan untuk membuat jam dengan termometer bilik( Jam Arduino DIY). Jam berjalan pada Arduino UNO; skrin grafik WG12864B digunakan untuk memaparkan masa dan suhu. Sebagai sensor suhu - ds18b20. Tidak seperti kebanyakan jam tangan lain, saya tidak akan menggunakan RTS ( Masa sebenar Jam), tetapi saya akan cuba melakukannya tanpa modul tambahan ini.

Litar Arduino dibezakan oleh kesederhanaannya, dan sesiapa sahaja boleh mula belajar Arduino. Anda boleh membaca tentang cara menyambungkan perpustakaan dan flash Arduino dalam artikel kami.

Mari kita mulakan.

Untuk mencipta jam ini kita perlukan:

Arduino UNO (Atau mana-mana yang lain Serasi Arduino bayar)
- Skrin grafikWG12864B
- Penderia suhu ds18b20
- Perintang 4.7 Kom 0.25 W
- Perintang 100 ohm 0.25 W
- Petak bateri untuk 4 bateri AA
- Kotak padanan
- Fail yang baik
- Pengilat kuku (warna hitam atau badan)
- Beberapa plastik atau kadbod nipis
- Pita elektrik
- Wayar penyambung
- Papan litar
- Butang
- Besi pematerian
- Pateri, rosin
- Pita bermuka dua

Menyediakan skrin grafik.
Pada pandangan pertama, menyambungkan skrin menimbulkan banyak masalah dan kesukaran. Tetapi jika anda mula-mula memahami jenis mereka, ia akan menjadi lebih mudah dan lebih jelas. Terdapat banyak jenis dan jenis skrin pada pengawal ks0107/ks0108. Semua skrin biasanya dibahagikan kepada 4 jenis:
Pilihan A: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T
Pilihan B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ Memaparkan AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LD12864-88, QSG644-8888, QSG6Y4888, QSG6Y1288, Digitron LM1288 4 F, TM12864L-2, 12864J-1
Pilihan C: Shenzhen Jinghua Displays Co Ltd. JM12864
Pilihan D: Wintek-Cascades WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS19262/HD61202

Senarainya tidak lengkap, ada banyak. Yang paling biasa dan, pada pendapat saya, mudah ialah WG12864B3 V2.0. Paparan boleh disambungkan ke Arduino melalui port bersiri atau selari. Apabila menggunakan dengan Arduino UNO, lebih baik memilih sambungan melalui port bersiri– maka kita hanya memerlukan 3 output mikropengawal, bukannya sekurang-kurangnya 13 talian apabila disambungkan melalui port selari. Semuanya bersambung dengan mudah. Terdapat satu lagi nuansa: anda boleh menemui dua pilihan paparan yang dijual, dengan potensiometer terbina dalam (untuk melaraskan kontras) dan tanpanya. Saya memilih, dan saya menasihati anda untuk melakukan perkara yang sama, dengan yang terbina dalam.


Ini mengurangkan bilangan bahagian dan masa pematerian. Ia juga bernilai memasang perintang pengehad arus 100 Ohm untuk lampu latar. Dengan menyambungkan 5 volt secara terus, terdapat risiko untuk membakar lampu latar.
WG12864B – Arduino UNO
1 (GND) - GND
2 (VCC) - +5V
4 (RS) – 10
5 (R/W) – 11
6 (E) – 13
15 (PSB) – GND
19 (BLA) – melalui perintang - +5V
20 (BLK) – GND

Cara paling mudah ialah memasang segala-galanya di belakang skrin dan mengeluarkan 5 wayar daripadanya yang menyambung ke Arduino UNO. Hasil akhir sepatutnya kelihatan seperti ini:


Bagi yang masih memilih sambungan selari Saya akan menyediakan jadual sambungan.

Dan gambar rajah untuk skrin pilihan B:



Beberapa sensor boleh disambungkan ke satu talian komunikasi. Satu sudah cukup untuk jam tangan kami. Kami menyambung wayar dari pin "DQ" ds18b20 ke "pin 5" Arduino UNO.

Menyediakan papan dengan butang.
Untuk menetapkan masa dan tarikh pada jam tangan kami akan menggunakan tiga butang. Untuk kemudahan, kami menyolder tiga butang pada papan litar dan mengeluarkan wayar.


Kami menyambung seperti berikut: kami menyambung wayar biasa kepada ketiga-tiga butang ke "GND" Arduino. Butang pertama, yang digunakan untuk memasuki mod tetapan masa dan bertukar mengikut masa dan tarikh, disambungkan ke "Pin 2". Yang kedua, butang untuk meningkatkan nilai, adalah untuk "Pin 3", dan yang ketiga, butang untuk menurunkan nilai, adalah untuk "Pin 4".

Menyatukan semuanya.
Untuk mengelakkan litar pintas, skrin hendaklah terlindung. Kami membungkusnya dalam bulatan dengan pita elektrik, dan seterusnya belakang Kami melampirkan jalur bahan penebat pada pita bermuka dua, dipotong mengikut saiz. Kadbod tebal atau plastik nipis akan sesuai. Saya menggunakan plastik daripada tablet untuk kertas. Hasilnya adalah seperti berikut:


Di hadapan skrin, di sepanjang tepi, kami gam pita buih dua sisi, lebih baik hitam.


Sambungkan skrin ke Arduino:


Tambahan daripada petak bateri sambung ke "VIN" Arduino, tolak ke "GND". Kami meletakkannya di belakang Arduino. Sebelum memasangnya dalam kes itu, jangan lupa untuk menyambungkan sensor suhu dan papan dengan butang.


Menyediakan dan mengisi lakaran.
Penderia suhu memerlukan perpustakaan OneWire.

Output ke skrin dijalankan melalui perpustakaan U8glib:

Untuk mengedit dan mengisi lakaran, anda perlu memasang kedua-dua perpustakaan ini. Terdapat dua cara untuk melakukan ini. Hanya buka pembungkusan arkib ini dan letakkan fail yang tidak dibungkus dalam folder "perpustakaan" yang terletak dalam folder pemasangan Arduino IDE. Atau pilihan kedua ialah memasang perpustakaan secara langsung dalam persekitaran pengaturcaraan. Tanpa membongkar arkib yang dimuat turun, dalam IDE Arduino, pilih menu Sketch - Connect Library. Di bahagian paling atas senarai juntai bawah, pilih "Tambah.Zip perpustakaan". Dalam kotak dialog yang muncul, pilih perpustakaan yang ingin anda tambahkan. Buka menu Lakaran sekali lagi - Sambung Perpustakaan. Di bahagian paling bawah senarai juntai bawah anda sepatutnya melihat perpustakaan baharu. Kini perpustakaan boleh digunakan dalam program. Jangan lupa untuk memulakan semula Arduino IDE selepas semua ini.

Penderia suhu beroperasi menggunakan protokol One Wire dan mempunyai alamat unik untuk setiap peranti - kod 64-bit. Tidak praktikal untuk mencari kod ini setiap kali. Oleh itu, anda mesti terlebih dahulu menyambungkan sensor ke Arduino, muat naik lakaran yang terdapat dalam menu Fail – Contoh – Suhu Dallas – OneWireSearch. Seterusnya, lancarkan Alat - Port Monitor. Arduino mesti mencari sensor kami, tulis alamatnya dan bacaan suhu semasa. Kami menyalin atau hanya menulis alamat penderia kami. Buka lakaran Arduino_WG12864B_Term, cari baris:

Byte addr=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97);//alamat penderia saya

Kami menulis alamat penderia anda antara pendakap kerinting, menggantikan alamat penderia saya.

Stok:

//u8g.setPrintPos(44, 64); u8g.print(saat); // Keluaran saat untuk mengawal ketepatan pergerakan

Berfungsi untuk memaparkan detik di sebelah tulisan "Data". Ini adalah perlu untuk pemasangan yang tepat peredaran masa.
Jika jam pantas atau ketinggalan, anda harus menukar nilai dalam baris:

Jika (micros() - prevmicros >494000) ( // tukar kepada sesuatu yang lain untuk membetulkannya ialah 500000

Saya secara empirik menentukan nombor di mana jam berjalan dengan agak tepat. Jika jam anda pantas, anda harus meningkatkan nombor ini; jika ia ketinggalan, kurangkannya. Untuk menentukan ketepatan langkah, anda perlu memaparkan saat. Selepas penentukuran tepat nombor, detik boleh dikomentari dan dengan itu dikeluarkan dari skrin.

Semuanya bermula dengan fakta bahawa secara kebetulan saya mendapati diri saya pemilik skrin LCD teks BTHQ 22005VSS (2 baris 20 aksara setiap satu) dan papan jam elektronik DS1302. Sejujurnya, saya mengambil langkah pertama saya dalam pembuatan Arduino, jadi peranan penting dalam memperoleh bahagian ini dimainkan oleh harga berpatutan dan peluang penghantaran cepat. Lagipun, selalunya tiada masa untuk menunggu "peranti" tiba dari Kerajaan Tengah, setelah mengembara hampir "separuh dunia," dan anda tidak mahu melakukannya.

Mengapa jam tangan? Pada masa apabila terdapat banyak jam tangan yang berbeza dijual di sekeliling, harga yang paling mudah adalah setanding dengan kotak jus. Tetapi perkara itu adalah bahawa ia sering diperlukan bukan sahaja untuk mengetahui masa yang tepat (dan tarikh, yang juga kadang-kadang perlu), tetapi juga untuk beroperasi dengan masa ini. Contohnya, simpan log perubahan suhu (kelembapan, tekanan, cahaya, dll.) yang menunjukkan masa yang tepat apabila perubahan ini berlaku. Di sinilah ARDUINO, dilengkapi dengan jam, akan memberikan perkhidmatan yang hebat. Selain itu, ia bagus apabila peranti juga menunjukkan masa. Lagipun, walaupun bekerja untuk komputer peribadi Kami sesekali mengerling ke sudut kanan bawah, bagaimana jika sudah tiba masanya untuk makan tengah hari, atau sudah tamat hari bekerja, atau mungkin sudah subuh?

Dengan hati saya projek ini Saya menggunakan ARDUINO UNO, yang agak mudah untuk dibeli - ini, sudah tentu, jika anda ingin membeli sesuatu yang berkualiti tinggi dan cepat. Anda boleh, tentu saja, mencarinya lebih murah, tetapi sekali lagi anda perlu menunggu, dan saya tidak mahu menunggu. Arduinka dengan ceria mengelipkan LEDnya, melakukan semua yang diperlukan, memberikan mesej ringkas port bersiri, secara amnya saya gembira. Tetapi mari kita kembali kepada jam. Masalah bermula, seperti biasa, tanpa diduga. Tidak mungkin untuk mencari artikel yang masuk akal dan segala-galanya sama ada pada skrin atau selama berjam-jam di perhimpunan itu. Pada skrin lain - terdapat, pada jam tangan lain - seberapa banyak yang anda suka, tetapi pada apa yang ada di tangan anda - hampir tiada apa-apa. Tetapi apabila tiada apa-apa, "hampir" juga banyak.

Mari kita mulakan dengan skrin. BTHQ 22005VSS ternyata skrin LCD 20x2 yang cetek (iaitu ia mempunyai 2 baris 20 aksara setiap satu); sebaliknya, ia agak mungkin untuk digunakan, sebagai contoh, skrin - walaupun ia mempunyai "hanya" 16 aksara dalam setiap baris , tetapi untuk kebanyakan projek ini lebih, daripada cukup. Skrin ini mempunyai penyambung 16-pin, walaupun bukan satu baris, tetapi dua baris (2x8), jika anda memegang peranti dengan skrin menghadap ke arah anda dan penyambung di sebelah kanan, maka pin pertama akan berada di sebelah kiri bawah, kedua di bawah kanan, yang ketiga di atas yang pertama, yang keempat di atas yang kedua, dsb. Bahagian kiri atas (15) akan menjadi anod, kanan atas (16) akan menjadi katod. Jika anda mempunyai pengetahuan bahasa Inggeris dan rasa ingin tahu, anda boleh membaca penerangan teknikal. Jika terdapat sangat sedikit yang pertama, dan rasa ingin tahu jauh lebih lemah daripada keinginan untuk mencuba, ini adalah cara saya menyambungkannya:

Kenalan skrin Kenalan Arduino Catatan
1 GND Ini adalah "tolak" atau "tanah".
2 +5V
3 GND Jika anda memerlukan tanda terang.
4 4
5 GND Jika hanya untuk "menulis".
6 5
7 -- tak guna
8 -- tak guna
9 -- tak guna
10 -- tak guna
11 10
12 11
13 12
14 13
A(15) +5V Saya menyambung melalui perintang 500 Ohm
K(16) GND

Dalam sesetengah sumber, "pinout" pada bahagian Arduino adalah berbeza, tetapi ia lebih mudah untuk saya dengan cara ini. Menyambungkan jam tangan juga tidak menyebabkan sebarang masalah:

Tonton DS1302 Arduino Catatan
VCC +5V
GND GND Di sini saya menyambungkannya melalui perintang 10 kOhm.
CLK 0 Jangan dikelirukan dengan GND!!! Pin juga dipanggil SCLK
DAT 1 Kenalan juga dipanggil IO
RST 3 Kenalan juga dipanggil CE

Anda boleh menyambungkannya dengan wayar atau kabel; Saya secara peribadi memasangnya pada papan roti.

Masalah bermula apabila lakaran demo dimuatkan dan jam tangan mula berfungsi. Benar, mereka menunjukkan tahun 2165, bulan 45, minggu 85... Mungkin ini mengikut kalendar "Uranian" atau "Neptune"... Tetapi saya tidak akan tinggal di Bumi, dan saya tidak akan pergi ke Uranus dan Neptun lagi. Secara umum, sesuatu perlu dilakukan. Memateri perintang 10kOhm ke dalam litar GND->GND tidak membantu. Masalahnya ternyata adalah perpustakaan yang tidak betul. Saya akan mengatakan dengan segera bahawa perpustakaan yang betul boleh diambil. Ini untuk jam tangan. Skrin kecil berjaya menggunakan perpustakaan daripada set standard, yang dipanggil LiquidCrystal.h.

Masalah #2. Setiap kali jam bermula, ia mula mengira dari masa yang "dijahit" dalam program. makan keputusan yang sukar masalah ini. Buat cincang, tulis pada memori jam, kemudian, apabila memulakan, baca dari sana, bandingkannya... Secara umum, untuk pemula dalam kejuruteraan Arduino, ia agak rumit. Ternyata, ada penyelesaian yang mudah. atau lebih tepatnya sangat mudah. Iaitu, flash 2 kali. Kali pertama - kilatkannya dengan menetapkan tarikh dan masa, kali kedua kilatkannya, setelah "mengulas keluar" sebelum ini (meletakkan tanda // di bahagian paling awal baris) baris dengan menetapkan tarikh ini.

Sebenarnya lakarannya:

// DS1302_LCD (C)2010 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
// Demonstrasi pantas tentang cara menggunakan perpustakaan DS1302 saya untuk mempercepatkan
// jam menggunakan DS1302 dan LCD 20x2.
// Koresponden antara pin jam dan skrin pinpm Arduino.
// DS1302: Pin CE -> Arduino Digital 3
// Pin I/O -> Arduino Digital 1
// PIN SCLK -> Arduino Digital 0
// LCD: DB7 -> Arduino Digital 13
// DB6 -> Arduino Digital 12
// DB5 -> Arduino Digital 11
// DB4 -> Arduino Digital 10
// E -> Arduino Digital 5
// RS -> Arduino Digital 4

#termasuk // Menyambung pustaka skrin.
#termasuk // Menyambung pustaka jam.

// Mulakan pin jam
DS1302 rtc(3, 1, 0);
// Mulakan pin skrin
lcd LiquidCrystal(4, 5, 10, 11, 12, 13);

persediaan batal()
{
// Mulakan jam
rtc.halt(false);
rtc.writeProtect(false);

// Lancarkan skrin yang menunjukkan bilangan aksara dan baris
lcd.begin(20, 2);

// Tiga baris bawah tidak diulas buat kali pertama; kami menunjukkan tarikh dan masa semasa di dalamnya. Kali kedua - mari kita komen.
//rtc.setDOW(KHAMIS); // Hari dalam seminggu, jika hari Jumaat, maka jangan tulis JUMAAT dalam bahasa Rusia!
//rtc.setTime(11, 41, 0); // Jam, minit, saat dalam format 24 jam.
//rtc.setDate(13, 6, 2013); // Tarikh. DALAM NOMBOR!!! Anda tidak perlu meletakkan sifar di hadapan satu digit!
}

gelung kosong()
{
// Paparkan masa berpusat pada baris atas
lcd.setCursor(6, 0); // Tetapkan kursor untuk mencetak masa di baris atas
lcd.print(rtc.getTimeStr()); // Cetak masa

// Paparkan singkatan Hari-dalam-Minggu di sudut kiri bawah
lcd.setCursor(0, 1); // Tetapkan kursor di bahagian bawah sebelah kiri untuk mencetak hari dalam seminggu
lcd.print(rtc.getDOWStr(FORMAT_LONG)); // Cetak hari dalam seminggu sepenuhnya, kerana skrin membenarkannya.

// Paparkan tarikh di sudut kanan bawah
lcd.setCursor(9, 1); // Tetapkan kursor untuk mencetak tarikh
lcd.print(rtc.getDateStr()); // Cetak tarikh

// Tunggu satu saat sebelum mengulangi
kelewatan(1000); // Jeda 1 saat dan mulakan semula!
}

Artikel ini membincangkan contoh mencipta jam masa nyata. Penunjuk akan memaparkan masa yang tepat, dan kolon padanya akan berkelip sekali sesaat. Masa yang tepat akan dipasang secara automatik semasa penyusunan perisian tegar.

Penerangan komponen

Jam masa sebenar

Kami menggunakan modul jam masa nyata daripada Seeed Studio. Ia berdasarkan cip DS1307 daripada Maxim Integrated. Daripada elemen pengikat, ia memerlukan tiga perintang, kuarza jam dan bateri, yang sudah tersedia pada modul ini. Modul ini mempunyai ciri-ciri berikut:

    Mengira masa (saat, minit, jam), tarikh (tahun, bulan, hari), hari dalam seminggu

    Antara muka I²C dua wayar

Intipati jam masa nyata ialah jika ada bateri, ia boleh berjalan walaupun peranti utama dinyahtenagakan. Kami sentiasa menghadapi jam sedemikian dalam komputer riba atau kamera digital. Jika anda mengeluarkan bateri daripada peranti ini dan meletakkannya semula selepas beberapa ketika, masa tidak akan ditetapkan semula. Ini adalah terima kasih kepada jam masa sebenar, Jam Masa Nyata (RTC).

Semua perpustakaan yang diperlukan boleh dimuat turun dari laman web rasmi.

Penunjuk

Kami menggunakan penunjuk empat digit daripada Seeed Studio. Perkara utama dalam penunjuk ialah cip TM1637, yang merupakan pemacu untuk bit 7-segmen individu. Modul ini menggunakan 4 bit. Modul ini mempunyai ciri-ciri berikut:

    8 tahap kecerahan

    Antara muka operasi dua wayar (CLK, DIO)

Kami menggunakan modul ini untuk memaparkan masa: jam dan minit. Kemudahan modul ialah ia disambungkan melalui dua wayar sahaja dan tidak memerlukan pelaksanaan perisian petunjuk dinamik, kerana semuanya telah dilaksanakan di dalam modul.

Petunjuk dinamik ialah proses di mana penunjuk dalam modul kami menyala secara berurutan. Tetapi kita tidak melihat kelipan, kerana mata manusia mempunyai inersia yang hebat. Kaedah ini membolehkan anda menyimpan dengan baik bilangan sambungan antara penunjuk dan pengawal:

    Paparan statik: 4 digit × 7 segmen = 28 sambungan.

    Petunjuk dinamik: 7 segmen + 4 anod atau katod biasa = 11 sambungan.

    Cip TM1637: 2 sambungan.

Faedahnya jelas.

Sambungan

Modul jam masa nyata mesti disambungkan kepada pin SCL/SDA yang berkaitan dengan bas I²C. Ia juga perlu untuk menyambungkan talian kuasa (Vcc) dan tanah (GND).

Talian SDA/SCL mempunyai pin berasingan mereka sendiri pada Arduino, tetapi secara dalaman mereka entah bagaimana disambungkan ke pin tujuan am. Jika kita pertimbangkan Arduino Uno, garisan SDA sepadan dengan pin A4, dan garisan SCL sepadan dengan A5.

Modul ini dilengkapi dengan kabel dengan kenalan wanita, yang lebih mudah untuk disambungkan ke Troyka Shield. Walau bagaimanapun, pin SDA dan SCL yang berasingan tidak dipaparkan padanya, jadi kami menyambung terus melalui pin A5 dan A4.

Dari segi menyambung penunjuk, semuanya lebih mudah. Pin CLK dan DIO boleh disambungkan ke mana-mana pin digital. DALAM dalam kes ini pin ke-12 dan ke-11 digunakan masing-masing.

Menulis firmware

Fungsi persediaan harus memulakan jam dan penunjuk masa nyata, dan merekodkan masa kompilasi masuk ingatan dalaman jam masa sebenar. Keseluruhan tindakan, atau lebih tepat, membaca masa dari RTC dan memaparkannya pada penunjuk, akan dijalankan dalam fungsi gelung.

Kod untuk ini kelihatan seperti ini:

rtc.ino #include #termasuk //Kelas TM1637 dan DS1307 diisytiharkan di dalamnya jam ; void setup() ( clock .begin (); clock clock .setTime () ; ) void loop() ( int8_t timeDisp[ 4 ] ; //Minta masa dari jam] = jam .minit % 10 ; paparan.titik (jam .saat % 2 ? POINT_ON : POINT_OFF) ; ) //Kandungan fungsi diterangkan di bawah char getInt(const char * string, int startIndex) ( return int (string[ startIndex] - "0") * 10 + int (string[ startIndex+ 1 ] ) - "0" ; )

Sekarang kami memuatkan kod ini ke dalam persekitaran pembangunan, menyusun dan memuat naik. Kami melihat paparan - bingo! Masa pada paparan ialah masa penyusunan.

fungsi getInt dijelaskan

Pertama, anda perlu memahami dari mana datangnya masa dalam tatasusunan compileTime. Ia muncul dalam baris ini:

unsigned char compileTime = __TIME__;

Pengkompil menggantikan __TIME__ dengan rentetan yang mengandungi masa kompilasi dalam bentuk __TIME__ = "hh:mm:ss" , di mana hh ialah jam, mm ialah minit, ss ialah saat.

Mari kembali kepada kod yang perlu dijelaskan:

char getInt(const char * string, int startIndex) ( return int (string[ startIndex] - "0") * 10 + int (string[ startIndex+ 1 ] ) - "0" ; )

Dalam tatasusunan rentetan yang diluluskan sebagai parameter kepada fungsi getInt, kita mendapat aksara pada indeks startIndex dan aksara yang mengikutinya berakhir dengan integer dua digit. Walau bagaimanapun, pada mulanya ini bukan nombor, tetapi sepasang watak. Untuk mendapatkan nombor daripada simbol, kita perlu menolak simbol sifar (“0”) daripada simbol ini: selepas semua, dalam Jadual ASCII semua simbol digit datang satu demi satu, bermula dengan simbol sifar. Oleh itu, kod int(string) - "0"), secara literal, melakukan perkara berikut: "Ambil nombor aksara startIndex , tolak aksara sifar daripadanya dan tukarkannya kepada jenis integer."

Masalah

Ya, kod ini berfungsi, dan jam akan berjalan. Walau bagaimanapun, jika anda mematikan kuasa dan menghidupkannya beberapa minit kemudian, kemudian selepas menghidupkannya, masa akan kembali sama seperti semasa penyusunan.

Ini berlaku kerana selepas menghidupkan kuasa, kod yang terdapat dalam fungsi persediaan dilaksanakan semula. Dan dia menulis nilai masa lama ke jam masa sebenar.

Untuk mengelakkan ini, kita perlu mengubah suai kod sedikit lagi. Setiap kali dalam fungsi persediaan, "cincang" masa kompilasi akan dikira - bilangan saat yang telah berlalu dari 00:00:00 hingga masa penyusunan akan dikira. Dan cincang ini akan dibandingkan dengan cincang dalam EEPROM. Biar kami ingatkan anda bahawa EEPROM ialah memori yang tidak ditetapkan semula apabila kuasa dimatikan.

Jika nilai cincang yang dikira dan disimpan sebelum ini bertepatan, ini bermakna tidak perlu menulis semula masa dalam modul jam: ini telah dilakukan. Tetapi jika cek ini tidak lulus, maka masa ditimpa dalam RTC.

Untuk menulis/membaca nombor jenis yang tidak ditandatangani int ke/dari EEPROM dua ditulis fungsi tambahan EEPROMWriteInt dan EEPROMReadInt . Ia ditambah kerana fungsi EEPROM.read dan EEPROM.write hanya boleh membaca dan menulis data char.

rtc-eeprom.ino #include #termasuk #include "TM1637.h" #include "DS1307.h" // Tatasusunan yang mengandungi masa penyusunan char compileTime = __TIME__; //Bilangan pin Arduino yang penunjuk disambungkan#define DISPLAY_CLK_PIN 12 #define DISPLAY_DIO_PIN 13 //Untuk bekerja dengan cip jam dan penunjuk kami menggunakan perpustakaan Paparan TM1637(DISPLAY_CLK_PIN, DISPLAY_DIO_PIN) ; jam DS1307 ; persediaan batal() ( // Dayakan dan konfigurasikan penunjuk display.set(); display.init(); //Mulakan jam masa sebenar clock.begin(); //Dapatkan nombor daripada rentetan, mengetahui nombor aksara pertama jam bait = getInt(compileTime, 0); bait minit = getInt(compileTime, 3); byte second = getInt(compileTime, 6); //Cincang masa yang telah diubahsuai //Mengandungi bilangan saat sejak permulaan hari unsigned int hash = jam * 60 * 60 + minit * 60 + saat; //Periksa jika cincang baharu tidak sepadan dengan cincang dalam EEPROM jika (EEPROMReadInt(0 ) != hash) ( //Simpan cincang baharu EEPROMWriteInt(0 , hash); //Sediakan jam, minit, saat untuk rakaman dalam RTC jam .fillByHMS (jam, minit, saat) ; //Tulis data ini ke memori dalaman jam tangan. //Dari saat ini mereka mula mengira masa yang kita perlukan clock.setTime(); ) ) gelung kosong() ( //Nilai untuk dipaparkan pada setiap 4 digit int8_t timeDisp[ 4 ] ; //Minta masa dari jam] = jam .minit % 10 ; //... dan kemudian paparkan pada skrin display.display(timeDisp); //kami tidak mempunyai digit berasingan untuk beberapa saat, jadi //kami akan menghidupkan dan mematikan kolon setiap saat paparan.titik (jam .saat % 2 ? POINT_ON : POINT_OFF) ; ) char getInt(const char * string, int startIndex) ( return int (string[ startIndex] - "0") * 10 + int (string[ startIndex+ 1 ] ) - "0" ; ) //Tulis nombor dua bait ke dalam ingatan void EEPROMWriteInt(int address, int value) ( ​​​​EEPROM.write (address, lowByte(value) ); EEPROM.write (address + 1 , highByte(value) ) ; ) //Membaca nombor dari ingatan unsigned int EEPROMReadInt(int address) ( byte lowByte = EEPROM.read (address) ; byte highByte = EEPROM.read (alamat + 1 ); return (highByte<< 8 ) | lowByte; }

Kesimpulan

Artikel ini menunjukkan contoh bekerja dengan cip jam masa nyata RTC DS1307 dan cip pemacu penunjuk TM1637; kami juga mempelajari cara mendapatkan tarikh dan masa pada peringkat penyusunan. Sekarang, jika anda menetapkan masa yang diingini pada jam, dan kemudian mematikan kuasa selama sekurang-kurangnya beberapa jam, maka selepas menghidupkannya masa akan kembali tepat. Disemak!