Bagaimana untuk membuat jam dari Arduino. Menyambungkan jam masa nyata ds1302 ke Arduino

Salah satu projek pertama yang dibina oleh pemula menggunakan papan Arduino ialah jam ringkas, mengira masa. Pada asasnya, jam sedemikian adalah berdasarkan modul RTC yang disambungkan ke Arduino ( Masa sebenar Jam atau Jam Masa Nyata). Di pasaran hari ini komponen elektronik tersedia model yang berbeza RTC yang berbeza dalam ketepatan dan harga. Model biasa termasuk DS1302, DS1307, DS3231.



Tetapi jam boleh dibuat pada Arduino tanpa menggunakan RTC, terutamanya jika anda tidak boleh mendapatkan modul sedemikian. Sudah tentu, ketepatannya dalam kes ini akan menjadi kecil, jadi projek itu sepatutnya dianggap sebagai projek latihan.


Prinsip operasi jam tangan sedemikian agak mudah. Setiap kali anda menghidupkan jam Arduino ini, anda perlu menetapkannya kepada masa semasa, sama seperti mana-mana jam analog. Sudah tentu adalah lebih baik untuk tidak menggunakan jam tangan sedemikian dalam anda Kehidupan seharian apabila mereka aktif untuk masa yang lama tanpa but semula dan penyesuaian selanjutnya, kerana penyahsegerakan dengan masa semasa semasa operasi jangka panjang boleh menjadi penting.


Jam tangan ini boleh dipasang menggunakan jam biasa papan roti, kerana ia tidak memerlukan banyak komponen. Pautan utama kami di sini ialah papan Arduino Uno. Untuk memaparkan masa, anda boleh mengambil paparan LCD 16x2. Untuk menukar tetapan masa, anda perlu menyambungkan dua butang (untuk jam dan minit). Butang disambungkan ke Aduino melalui perintang 10KΩ. Untuk menukar kecerahan paparan anda memerlukan potensiometer 10 kOhm. Gambar rajah sambungan untuk semua komponen ini ke papan Arduino Uno dibentangkan di bawah.



Sekarang anda perlu memprogramkan Arduino. Kod ringkas (lakaran) yang membolehkan anda memaparkan masa pada skrin LCD diberikan di bawah.


#termasuk lcd LiquidCrystal(12,11,5,4,3,2); int h=12; int m; int s; bendera int; int MASA; const int hs=8; const int ms=9; int keadaan1; int keadaan2; persediaan void() ( lcd.begin(16,2); ) void loop() ( lcd.setCursor(0,0); s=s+1; lcd.print("MASA:"); lcd.print(h ); lcd.print(":"); lcd.print(m); lcd.print(":"); lcd.print(s); if(flag<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); if(bendera==24)bendera=0; kelewatan(1000); lcd.clear(); jika(s==60)( s=0; m=m+1; ) jika(m==60) ( m=0; h=h+1; bendera=bendera+1; ) jika(h==13 ) ( h=1; ) lcd.setCursor(0,1); lcd.print("SELAMAT HARI NIE"); //-------Masa // tetapan-------// state1=digitalRead(hs); if(state1==1) ( h=h+1; flag=flag+1; if(flag<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); if(bendera==24)bendera=0; jika(h==13)h=1; ) state2=digitalRead(ms); jika(nyatakan2==1)( s=0; m=m+1; ) )

   Terima kasih kerana berminat dengan projek maklumat tapak web.
   Jika anda mahu menarik dan bahan berguna keluar lebih kerap dan iklan kurang,
   Anda boleh menyokong projek kami dengan menderma sebarang jumlah untuk pembangunannya.

Selamat petang, hari ini saya akan berkongsi arahan untuk membuat jam dengan termometer bilik( Jam Arduino DIY). Jam terus berjalan Arduino UNO, skrin grafik WG12864B digunakan untuk memaparkan masa dan suhu. Sebagai sensor suhu - ds18b20. Tidak seperti kebanyakan jam lain, saya tidak akan menggunakan RTS (Jam Masa Sebenar), tetapi 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, QSG644-88 Topway LD128, QSG64-1288, QSG641W, Digit480000 8 64F, 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 siri atau pelabuhan 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 empirikal 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.

Dalam artikel ini kita akan melihat cara membuat jam yang tepat berasaskan Arduino atau cip jam masa nyata mikropengawal AVR DS1307. Masa akan dipaparkan pada paparan LCD.

Apa yang perlu

  • komputer dengan Arduino IDE dipasang;
  • Cip DS1307 atau modul RTC berdasarkannya;
  • komponen daripada senarai elemen.

Anda boleh menggantikan Papan Arduino kepada pengawal Atmel, tetapi pastikan ia mempunyai pin input dan output yang mencukupi dan mempunyai pelaksanaan perkakasan antara muka I2C. Saya menggunakan ATMega168A-PU. Jika anda akan menggunakan mikropengawal yang berasingan, maka anda memerlukan pengaturcara, sebagai contoh, AVR MKII ISP.

Diandaikan bahawa pembaca sudah biasa dengan papan roti, pengaturcaraan dalam IDE Arduino dan mempunyai sedikit pengetahuan tentang bahasa pengaturcaraan C. Kedua-dua program di bawah tidak memerlukan penjelasan lanjut.

pengenalan

Bagaimanakah mikropengawal menjejaki masa dan tarikh? Mikropengawal konvensional mempunyai fungsi pemasa yang bermula dari sifar apabila voltan bekalan digunakan, dan kemudian mula mengira. Dalam dunia Arduino, kita boleh menggunakan fungsi millis() untuk mengetahui berapa milisaat telah berlalu sejak bekalan kuasa digunakan. Apabila anda mengalih keluar dan menggunakan semula kuasa, ia akan mula mengira dari awal. Ini tidak begitu mudah apabila ia datang untuk bekerja dengan jam dan tarikh.

Di sinilah penggunaan cip RTC (Jam Masa Sebenar) akan menjadi mudah. Litar mikro ini dengan bateri 3V atau beberapa sumber kuasa lain memantau masa dan tarikh. Jam/kalendar menyediakan maklumat tentang saat, minit, jam, hari dalam seminggu, tarikh, bulan dan tahun. Cip berfungsi dengan betul dengan bulan yang berlangsung 30/31 hari dan dengan tahun lompat. Komunikasi adalah melalui bas I2C (bas I2C tidak dibincangkan dalam artikel ini).

Jika voltan rel kuasa utama Vcc jatuh di bawah voltan bateri Vbat, RTC secara automatik bertukar kepada penggunaan kuasa yang rendah daripada bateri sandaran. Bateri sandaran- ini biasanya bateri kecil (dalam bentuk "syiling", "tablet") dengan voltan 3 volt, disambungkan antara pin 3 dan sarungnya. Dengan cara ini, cip masih akan menjejaki masa dan tarikh, dan apabila kuasa digunakan pada litar utama, mikropengawal akan menerima masa dan tarikh semasa.

Dalam projek ini kami akan menggunakan DS1307. Untuk cip ini, pin 7 ialah pin SQW/OUT (output gelombang persegi). Anda boleh menggunakan pin ini untuk menyalakan LED dan memberi amaran kepada mikropengawal untuk menangkap masa. Kami akan melakukan kedua-duanya. Di bawah ialah penjelasan tentang operasi pin SQW/OUT.

Daftar kawalan DS1307 digunakan untuk mengawal operasi pin SQW/OUT.

Bit 7: Kawalan Output (OUT) Bit ini mengawal tahap output pin SQW/OUT apabila output gelombang persegi dimatikan. Jika SQWE = 0, tahap logik pada pin SQW/OUT ialah 1 jika OUT = 1 dan 0 jika OUT = 0. Pada mulanya, bit ini biasanya 0. Bit 4: Square Wave Enable (SQWE) Bit ini, apabila ditetapkan kepada logik 1, membolehkan pengayun keluaran. Kekerapan denyutan gelombang persegi bergantung pada nilai bit RS0 dan RS1. Apabila frekuensi gelombang persegi ditetapkan kepada 1 Hz, daftar jam dikemas kini semasa kejatuhan gelombang persegi. Pada mulanya, bit ini biasanya 0. Bit 1 dan 0: Frequency Select (RS) Bit ini mengawal frekuensi output gelombang persegi apabila output gelombang persegi dihidupkan. Jadual berikut menyenaraikan frekuensi gelombang persegi yang boleh dipilih menggunakan bit ini. Bit ini biasanya pada mulanya ditetapkan kepada 1.

meja ini akan membantu anda dengan kekerapan:

Pemilihan frekuensi gelombang persegi DS1307
Kekerapan nadiBit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
1 Hz0 0 0 1 0 0 0 0
4.096 kHz0 0 0 1 0 0 0 1
8.192 kHz0 0 0 1 0 0 1 0
32.768 kHz0 0 0 1 0 0 1 1

Jika anda menyambungkan LED dan perintang ke pin 7 dan mahu LED berkelip pada frekuensi 1 Hz, anda mesti menulis nilai 0b00010000 pada daftar kawalan. Jika anda mahukan denyutan 4.096 kHz, maka anda akan menulis 0b000100001. Dalam kes ini, anda memerlukan osiloskop untuk melihat denyutan, kerana LED akan berkelip dengan cepat sehingga kelihatan sentiasa menyala. Kami akan menggunakan denyutan dengan frekuensi 1 Hz.

Perkakasan

Ditunjukkan di bawah skema struktur apa yang kita perlukan.

Kami diperlukan:

  • Penyambung ISP (Dalam Pengaturcaraan Sistem, pengaturcaraan dalam litar) untuk menyalakan perisian tegar mikropengawal;
  • butang untuk menetapkan masa dan tarikh;
  • mikropengawal untuk komunikasi dengan RTC melalui bas I2C;
  • paparan untuk menunjukkan tarikh dan masa.

Gambarajah skematik:


Senarai elemen

Di bawah ialah tangkapan skrin daripada Eagle:


Perisian

Dalam tutorial ini kami akan menggunakan dua lakaran berbeza: satu lakaran yang menulis masa dan tarikh kepada RTC, dan satu lakaran yang membaca masa dan tarikh daripada RTC. Kami melakukan ini kerana dengan cara ini anda boleh mendapatkan lebih banyak lagi pandangan penuh tentang apa yang berlaku. Kami akan menggunakan skema yang sama untuk kedua-dua program.

Mula-mula kita akan menulis masa dan tarikh ke dalam RTC, yang serupa dengan menetapkan masa pada jam tangan.

Kami menggunakan dua butang. Satu untuk menambah jam, minit, tarikh, bulan, tahun dan hari dalam seminggu, dan yang kedua untuk memilih antaranya. Aplikasi ini tidak membaca keadaan mana-mana penderia kritikal, jadi kami akan menggunakan gangguan untuk menyemak sama ada butang ditekan dan untuk mengendalikan lantunan kenalan.

Kod berikut menetapkan nilai dan menulisnya ke RTC:

#termasuk // Define LCD pin #define RS 9 #define E 10 #define D4 8 #define D5 7 #define D6 6 #define D7 5 LiquidCrystal lcd(RS, E, D4, D5, D6, D7); // Interrupt 0 ialah pin mikropengawal 4 (pin digital Arduino 2) int btnSet = 0; // Interrupt 1 ialah pin mikropengawal 5 (pin digital Arduino 3) int btnSel = 1; // Interrupt flags volatile int togBtnSet = false; volatile int togBtnSel = palsu; int counterVal tidak menentu = 0; // Pembolehubah untuk menjejaki di mana dalam "menu" kita tidak menentu int menuCounter = 0; // Tatasusunan nilai tidak menentu int menuValues; // 0=jam, 1=minit, 2=hari dalam bulan, 3=bulan, 4=tahun, 5=hari dalam minggu // Tajuk menu char* menuTitles = ( "Tetapkan jam.", "Tetapkan minit.", "Tetapkan tarikh.", "Tetapkan bulan.", "Tetapkan tahun.", "Tetapkan hari (1=mon)." ); // Tatasusunan hari dalam seminggu char* days = ( "NA", "Isnin", "Selasa", "Rabu", "Kha", "Fre", "Sabtu", "Ahad" ); void setup() ( // Mengisytiharkan gangguan, melaksanakan fungsi increaseValue/nextItem // pada kelebihan yang meningkat pada btnXXX attachInterrupt(btnSet, increaseValue, RISING); attachInterrupt(btnSel, nextItem, RISING);Wire.begin();lcd.begin ( 16,2); showWelcome(); ) // Fungsi interrupt void increaseValue() ( // Pembolehubah statik tidak ditandatangani lama lastInterruptTime = 0; // Cipta cap masa tanpa tanda interruptTime panjang = millis(); // Jika cap masa - lastInterruptTime ialah lebih besar, daripada 200 jika (interruptTime - lastInterruptTime > 200) ( togBtnSet = true; // Naikkan counterVal sebanyak 1 counterVal++; ) // Tetapkan lastInterruptTime sama dengan cap waktu // supaya kita tahu kita telah pergi lebih jauh lastInterruptTime = interruptTime; ) / / Fungsi interrupt untuk item menu seterusnya void nextItem() ( static unsigned long lastInterruptTime = 0; unsigned long interruptTime = millis(); if (interruptTime - lastInterruptTime > 200) ( togBtnSel = true; // Naikkan kaunter menu, jadi kita pergi ke menu item menu seterusnyaCounter++ ; jika (menuCounter > 6) menuCounter = 0; // Letakkan counterVal dalam menu counters array element menuValues ​​​​= counterVal; // Tetapkan semula counterVal, sekarang kita mulakan dari 0 untuk item menu seterusnya counterVal = 0; ) lastInterruptTime = interruptTime; ) // Fungsi penukaran nombor perpuluhan to BCD byte decToBCD(byte val) ( return ((val/10*16) + (val%10)); ) // Berfungsi untuk menyemak sama ada butang menu telah ditekan, // dan mengemas kini tajuk pada paparan. void checkCurrentMenuItem() ( if (togBtnSel) ( togBtnSel = false; lcd.setCursor(0,0); lcd.print(menuTitles); ) ) // Berfungsi untuk menyemak sama ada butang kenaikan ditekan, // dan kemas kini pembolehubah mengikut kesesuaian elemen tatasusunan, // tambah output nilai baharu pada paparan. void checkAndUpdateValue() ( // Semak sama ada gangguan dicetuskan = butang ditekan jika (togBtnSet) ( // Kemas kini nilai elemen tatasusunan dengan counterVal menuValues ​​​​= counterVal; // Tetapkan semula bendera gangguan togBtnSet = false; lcd .setCursor(7,1); // Cetak nilai baharu lcd.print(menuValues); lcd.print(" "); ) ) // Mesej alu-aluan ringkas, kini kita tahu semuanya baik-baik saja void showWelcome() ( lcd .setCursor(2,0); lcd .print("Hello world."); lcd.setCursor(3,1); lcd.print("Saya masih hidup."); delay(500); lcd.clear( ); ) // Tulis data ke RTC void writeRTC() ( Wire.beginTransmission(0x68); Wire.write(0); // alamat permulaan Wire.write(0x00); // saat Wire.write(decToBCD(menuValues) ); // tukar minit kepada kod BCD dan tulis Wire.write(decToBCD(menuValues)); // tukar jam kepada kod BCD dan tulis Wire.write(decToBCD(menuValues)); // tukar hari dalam seminggu kepada kod BCD dan tulis Wire.write(decToBCD( menuValues));// tukar hari dalam bulan kepada kod BCD dan tulis Wire.write(decToBCD(menuValues)); // tukar bulan kepada kod BCD dan tulis Wire.write(decToBCD(menuValues)); // tukar tahun kepada kod BCD dan tulis Wire.write(0b00010000); // hidupkan nadi segi empat sama 1 Hz pada pin 7 Wire.endTransmission(); // close transfer ) // Show time // Untuk melihat bahawa RTC berfungsi, anda perlu melihat program lain void showTime() ( lcd.setCursor(0,0); lcd.print(" "); lcd.print (MenuValues ​​); lcd.print(":"); // jam lcd.print(menuValues); lcd.print(":"); lcd.print("00 "); // minit lcd.setCursor(3, 1) ; lcd.print(hari); lcd.print(" "); // hari dalam minggu lcd.print(menuValues); lcd.print("."); // tarikh lcd.print(menuValues); lcd.print( "."); // bulan lcd.print(menuValues); lcd.print(" "); // tahun // panggil fungsi writeRTC writeRTC(); ) void loop() ( if (menuCounter< 6) { checkCurrentMenuItem(); checkAndUpdateValue(); } else { showTime(); } }

Program ini dimulakan dengan ucapan alu-aluan ringkas. Mesej ini memberitahu kami bahawa kuasa dihidupkan, LCD berfungsi dan program telah dimulakan. Oleh kerana lakaran berfungsi hanya untuk menunjukkan cara menulis data dari Arduino ke RTC DS1307, ia tidak mempunyai fungsi tambahan (menyemak sama ada nilai berada dalam julat yang boleh diterima; menggelung apabila menekan butang untuk meningkatkan nilai, iaitu, menetapkan semula kepada 0, apabila nilai, sebagai contoh, minit melebihi 60, dsb.)

// Termasuk fail pengepala #include #termasuk // Define LCD pin #define RS 9 #define E 10 #define D4 8 #define D5 7 #define D6 6 #define D7 5 LiquidCrystal lcd(RS, E, D4, D5, D6, D7); // Pin yang akan menerima denyutan daripada RTC int clockPin = 0; // Pembolehubah masa dan tarikh bait saat; minit bait jam bait; hari bait; tarikh bait; bulan bait; tahun bait; // Tatasusunan hari dalam seminggu char* days = ( "NA", "Isnin", "Selasa", "Rabu", "Kha", "Fre", "Sabtu", "Ahad" ); // Fungsi yang dilaksanakan hanya pada persediaan void permulaan() ( pinMode(clockPin, INPUT); pinMode(clockPin, LOW); Wire.begin(); lcd.begin(16,2); showWelcome(); ) / / Mesej alu-aluan ringkas, kini kita tahu semuanya baik-baik saja void showWelcome() ( lcd.setCursor(2,0); lcd.print("Hello world."); lcd.setCursor(3,1); lcd.print( "Saya masih hidup."); delay(500); lcd.clear(); ) byte bcdToDec(byte val) ( return ((val/16*10) + (val%16)); ) // Ini berjalan terus kosong gelung() ( // Jika clockPin tinggi jika (digitalRead(clockPin)) ( // Mulakan penghantaran I2C di alamat 0x68 Wire.beginTransmission(0x68); // Mulakan pada alamat 0 Wire.write(0); / / Tutup pemindahan Wire.endTransmission(); // Mula membaca 7 data binari daripada 0x68 Wire.requestFrom(0x68, 7); kedua = bcdToDec(Wire.read()); minit = bcdToDec(Wire.read());jam = bcdToDec(Wire.read());hari = bcdToDec(Wire.read());tarikh = bcdToDec(Wire.read());bulan = bcdToDec(Wire.read());tahun = bcdToDec(Wire.read ( )); // Memformat dan memaparkan masa lcd.setCursor(4,0); jika (jam< 10) lcd.print("0"); lcd.print(hour); lcd.print(":"); if (minute < 10) lcd.print("0"); lcd.print(minute); lcd.print(":"); if (second < 10) lcd.print("0"); lcd.print(second); lcd.setCursor(2,1); // Форматирование и отображение даты lcd.print(days); lcd.print(" "); if (date < 10) lcd.print("0"); lcd.print(date); lcd.print("."); if (month < 10) lcd.print("0"); lcd.print(month); lcd.print("."); lcd.print(year); } }

Kesimpulan

Dalam artikel ini, kami melihat cip DS1307 dari Maxim Integrated dan menulis dua program demo: satu untuk menetapkan masa dan tarikh dan satu untuk membaca masa dan tarikh. Untuk menyemak sama ada butang ditekan, kami menggunakan gangguan, yang turut menghapuskan pengaruh lantunan kenalan.

Foto dan video

Menetapkan masa

Masa membaca

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 ();// Mulakan operasi 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 ) )

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 melihat 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