สารบัญ:

นาฬิกาข้อความเลื่อน Arduino: 3 ขั้นตอน
นาฬิกาข้อความเลื่อน Arduino: 3 ขั้นตอน

วีดีโอ: นาฬิกาข้อความเลื่อน Arduino: 3 ขั้นตอน

วีดีโอ: นาฬิกาข้อความเลื่อน Arduino: 3 ขั้นตอน
วีดีโอ: 30 LCD3 แสดงข้อความโดยการกดปุ่ม การเลื่อนข้อความแบบต่างๆ และ ข้อความกระพริบ 2024, กรกฎาคม
Anonim
นาฬิกาข้อความเลื่อน Arduino
นาฬิกาข้อความเลื่อน Arduino

วัตถุประสงค์ของโครงการนี้คือการสร้างนาฬิกาข้อความแบบเลื่อนที่แสดงเวลาตามที่พูด (เช่น "เที่ยงคืน")

นี่เป็นโครงการด่วน เราให้คุณมากพอที่จะใช้งานฮาร์ดแวร์และสเก็ตช์ จากนั้นคุณสามารถดำเนินการเพิ่มเติมเพื่อให้เหมาะกับความต้องการของคุณ

ขั้นตอนที่ 1: ฮาร์ดแวร์

ฮาร์ดแวร์
ฮาร์ดแวร์

คุณจะต้องมีสามรายการหลัก -

  • บอร์ดที่เข้ากันได้กับ Arduino Uno
  • วงจรหรือโมดูลนาฬิกาตามเวลาจริงโดยใช้ DS1307 หรือ DS3231 IC
  • และจอแสดงผล LED แบบขาวดำสไตล์ P10

คุณอาจต้องการแหล่งจ่ายไฟภายนอก แต่เราจะพูดถึงในภายหลัง

ขั้นตอนแรกคือการปรับนาฬิกาตามเวลาจริงให้เหมาะสม คลิกที่นี่เพื่อดูบทแนะนำหากคุณต้องการความช่วยเหลือ

ตอนนี้ฉันหวังว่าคุณจะคิดว่า "คุณตั้งเวลาอย่างไร"

มีสองคำตอบสำหรับคำถามนั้น หากคุณกำลังใช้ DS3231 เพียงตั้งค่าไว้ในแบบร่าง (ดูด้านล่าง) เนื่องจากความแม่นยำดีมาก คุณเพียงแค่อัปโหลดแบบร่างพร้อมเวลาใหม่ปีละสองครั้งเพื่อให้ครอบคลุมเวลาออมแสง

มิฉะนั้นให้เพิ่มอินเทอร์เฟซผู้ใช้แบบง่าย – สองสามปุ่มก็สามารถทำได้ สุดท้าย คุณเพียงแค่ต้องวางฮาร์ดแวร์ไว้ที่ด้านหลังของ DMD มีขอบเขตมากมายที่ตรงกับความต้องการของคุณ วิธีแก้ไขง่ายๆ อาจเป็นการจัดตำแหน่งบอร์ดควบคุม เพื่อให้คุณสามารถเข้าถึงซ็อกเก็ต USB ได้อย่างง่ายดาย จากนั้นจึงใช้ Sugru บางส่วน

เกี่ยวกับการเปิดเครื่องนาฬิกา – คุณสามารถเรียกใช้จอแสดงผล LED หนึ่งจอจาก Arduino และทำงานที่ความสว่างที่ดีสำหรับการใช้งานในร่ม หากคุณต้องการให้ DMD ทำงานอย่างเต็มที่และสว่างจนแสบตา คุณต้องใช้แหล่งจ่ายไฟ DC 5V 4A แยกต่างหาก หากคุณกำลังใช้ DMD สองตัว – ไปที่ 8A เป็นต้น เพียงเชื่อมต่อแหล่งจ่ายไฟภายนอกเข้ากับขั้วของ DMD (เชื่อมต่อ DMD ตัวที่สองหรือมากกว่าเข้ากับขั้วต่อเหล่านี้)

หากคุณไม่อยากตัดปลายสายไฟของแหล่งจ่ายไฟ ให้ใช้ปลั๊กไฟ DC ที่ฝ่าวงล้อม

ขั้นตอนที่ 2: Arduino Sketch

คุณจะต้องติดตั้งไลบรารี Arduino สองไลบรารีต่อไปนี้ - TimerOne และ DMD จากนั้นอัปโหลดภาพร่าง:

// สำหรับ RTC#include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // DS1307 RTC คือ 0x68

// สำหรับจอแสดงผล LED

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // คุณสามารถมี DMD มากกว่าหนึ่งใน แถว #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

สตริงสุดท้ายสตริง; // ใช้เพื่อเก็บประโยคสุดท้ายเพื่อแสดงบน DMD

เป็นโมฆะ ScanDMD() // จำเป็นสำหรับ DMD

{ dmd.scanDisplayBySPI(); }

การตั้งค่าเป็นโมฆะ ()

{ // สำหรับ DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen(จริง);

// สำหรับ RTC

Wire.begin(); // เปิดไฟบัส I2C ไบต์วินาที, นาที, ชั่วโมง, วันในสัปดาห์, วันของเดือน, เดือน, ปี; // เปลี่ยนตัวแปรและยกเลิกการใส่เครื่องหมาย setDateDs1307 เพื่อตั้งเวลา // จากนั้นให้ใส่ความคิดเห็นใหม่เกี่ยวกับฟังก์ชันและอัปโหลดภาพร่างอีกครั้ง วินาที = 0; นาที = 13; ชั่วโมง = 23; วันของสัปดาห์ = 4; วันของเดือน = 19; เดือน = 5; ปี = 13; // setDateDs1307(วินาที นาที ชั่วโมง วันในสัปดาห์ วันของเดือน เดือน ปี); }

// ฟังก์ชัน RTC ปกติ

// แปลงตัวเลขทศนิยมปกติเป็นไบต์ทศนิยมแบบเข้ารหัสไบนารี decToBcd (ไบต์ val) { return ((val/10 * 16) + (val% 10)); }

// แปลงเลขฐานสองทศนิยมให้เป็นเลขฐานสองปกติ

ไบต์ bcdToDec (ไบต์ val) { ผลตอบแทน ((val/16*10) + (val% 16)); }

เป็นโมฆะ setDateDs1307 (ไบต์วินาที // 0-59

ไบต์นาที // 0-59 ไบต์ชั่วโมง // 1-23 ไบต์ dayOfWeek, // 1-7 ไบต์ dayOfMonth, // 1-28/29/ไบต์เดือน, // 1-12 ไบต์ปี) // 0- 99 { Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(วินาที)); // 0 ถึงบิต 7 เริ่มนาฬิกา Wire.write(decToBcd(นาที)); Wire.write(decToBcd(ชั่วโมง)); Wire.write (decToBcd (วันในสัปดาห์)); Wire.write (decToBcd (วันของเดือน)); Wire.write(decToBcd(เดือน)); Wire.write(decToBcd(ปี)); Wire.write (00010000); // ส่ง 0x10 (ฐานสิบหก) 00010000 (ไบนารี) เพื่อควบคุมการลงทะเบียน - เปิดคลื่นสี่เหลี่ยม Wire.endTransmission(); }

// รับวันที่และเวลาจาก ds1307

ถือเป็นโมฆะ getDateDs1307 (ไบต์ * วินาที ไบต์ * นาที ไบต์ * ชั่วโมง ไบต์ * วันในสัปดาห์ ไบต์ * วันของเดือน ไบต์ * เดือน ไบต์ * ปี) { // รีเซ็ตตัวชี้การลงทะเบียน Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// บางส่วนต้องการมาสก์เพราะบางบิตเป็นบิตควบคุม

*วินาที = bcdToDec(Wire.read() & 0x7f); *นาที = bcdToDec(Wire.read()); *ชั่วโมง = bcdToDec(Wire.read() & 0x3f); // ต้องการเปลี่ยนสิ่งนี้หาก 12 ชั่วโมงก่อน/หลังเที่ยง *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *เดือน = bcdToDec(Wire.read()); *ปี = bcdToDec(Wire.read()); }

เป็นโมฆะ drawText (String oldString)

{ dmd.clearScreen (จริง); dmd.selectFont(Arial_Black_16); ถ่าน newString[256]; ความยาวของ int = oldString.length(); oldString.toCharArray(newString, sLength+1); dmd.drawMarquee(newString, sLength, (32*DISPLAYS_ACROSS)-1, 0); เริ่มต้นนาน=มิลลิวินาที(); จับเวลานาน=เริ่ม; ตัวจับเวลานาน2=เริ่ม; บูลีน ret=false; while(!ret){ if ((timer+20) < millis()) { ret=dmd.stepMarquee(-1, 0); ตัวจับเวลา = มิลลิวินาที (); } } }

เป็นโมฆะ createTextTime (int hh, int mm)

// สิ่งนี้จะรวมข้อมูลตลอดเวลาเป็นข้อความเป็นประโยคเดียว { finalString=" "; // เช็ดประโยคสำหรับกรณีพิเศษ (ด้านล่าง) finalString=finalString+"It's ";

// ตอนนี้เพิ่มชั่วโมง

ถ้า (hh==1 || hh==13) { finalString=finalString+"one"; } if (hh==2 || hh==14) { finalString=finalString+"two"; } if (hh==3 || hh==15) { finalString=finalString+"three"; } if (hh==4 || hh==16) { finalString=finalString+"four"; } if (hh==5 || hh==17) { finalString=finalString+"five"; } if (hh==6 || hh==18) { finalString=finalString+"six"; } if (hh==7 || hh==19) { finalString=finalString+"seven "; } if (hh==8 || hh==20) { finalString=finalString+"eight"; } if (hh==9 || hh==21) { finalString=finalString+"nine"; } ถ้า (hh==10 || hh==22) { finalString=finalString+"ten"; } if (hh==11 || hh==23) { finalString=finalString+"eleven"; }

// ตอนนี้เพิ่มนาที

สวิตช์ (มม.) { กรณีที่ 1: finalString=finalString+"โอ้ หนึ่ง"; หยุดพัก; กรณีที่ 2: finalString=finalString+"โอ้ สอง"; หยุดพัก; กรณีที่ 3: finalString=finalString+"โอ้ สาม"; หยุดพัก; กรณีที่ 4: finalString=finalString+"โอ้ สี่"; หยุดพัก; กรณีที่ 5: finalString=finalString+"โอ้ ห้า"; หยุดพัก; กรณีที่ 6: finalString=finalString+"โอ้ หก"; หยุดพัก; กรณีที่ 7: finalString=finalString+"โอ้ เซเว่น"; หยุดพัก; กรณีที่ 8: finalString=finalString+"โอ้ แปด"; หยุดพัก; กรณีที่ 9: finalString=finalString+"โอ้ เก้า"; หยุดพัก; กรณีที่ 10: finalString=finalString+"ten"; หยุดพัก; กรณีที่ 11: finalString=finalString+"eleven"; หยุดพัก; กรณีที่ 12: finalString=finalString+"twelve"; หยุดพัก; กรณีที่ 13: finalString=finalString+"thirteen"; หยุดพัก; กรณีที่ 14: finalString=finalString+"14"; หยุดพัก; กรณีที่ 15: finalString=finalString+"15"; หยุดพัก; กรณีที่ 16: finalString=finalString+"สิบหก"; หยุดพัก; กรณีที่ 17: finalString=finalString+"seventeen"; หยุดพัก; กรณีที่ 18: finalString=finalString+"สิบแปด"; หยุดพัก; กรณีที่ 19: finalString=finalString+"nineteen"; หยุดพัก; กรณีที่ 20: finalString=finalString+"twenty"; หยุดพัก; กรณีที่ 21: finalString=finalString+"twenty one"; หยุดพัก; กรณีที่ 22: finalString=finalString+"twenty two"; หยุดพัก; กรณีที่ 23: finalString=finalString+"twenty three"; หยุดพัก; กรณีที่ 24: finalString=finalString+"twenty four"; หยุดพัก; กรณีที่ 25: finalString=finalString+"twenty five"; หยุดพัก; กรณีที่ 26: finalString=finalString+"twenty six"; หยุดพัก; กรณีที่ 27: finalString=finalString+"twenty seven"; หยุดพัก; กรณีที่ 28: finalString=finalString+"twenty eight"; หยุดพัก; กรณีที่ 29: finalString=finalString+"twenty nine"; หยุดพัก; กรณีที่ 30: finalString=finalString+"สามสิบ"; หยุดพัก; กรณีที่ 31: finalString=finalString+"สามสิบเอ็ด"; หยุดพัก; กรณีที่ 32: finalString=finalString+"สามสิบสอง"; หยุดพัก; กรณีที่ 33: finalString=finalString+"สามสิบสาม"; หยุดพัก; กรณีที่ 34: finalString=finalString+"สามสิบสี่"; หยุดพัก; กรณีที่ 35: finalString=finalString+"สามสิบห้า"; หยุดพัก; กรณีที่ 36: finalString=finalString+"thirty six"; หยุดพัก; กรณีที่ 37: finalString=finalString+"สามสิบเจ็ด"; หยุดพัก; กรณีที่ 38: finalString=finalString+"สามสิบแปด"; หยุดพัก; กรณีที่ 39: finalString=finalString+"สามสิบเก้า"; หยุดพัก; กรณีที่ 40: finalString=finalString+"forty"; หยุดพัก; กรณีที่ 41: finalString=finalString+"สี่สิบเอ็ด"; หยุดพัก; กรณีที่ 42: finalString=finalString+"สี่สิบสอง"; หยุดพัก; กรณีที่ 43: finalString=finalString+"สี่สิบสาม"; หยุดพัก; กรณีที่ 44: finalString=finalString+"สี่สิบสี่"; หยุดพัก; กรณีที่ 45: finalString=finalString+"สี่สิบห้า"; หยุดพัก; กรณีที่ 46: finalString=finalString+"สี่สิบหก"; หยุดพัก; กรณีที่ 47: finalString=finalString+"สี่สิบเจ็ด"; หยุดพัก; กรณีที่ 48: finalString=finalString+"สี่สิบแปด"; หยุดพัก; กรณีที่ 49: finalString=finalString+"สี่สิบเก้า"; หยุดพัก; กรณีที่ 50: finalString=finalString+"fifty"; หยุดพัก; กรณีที่ 51: finalString=finalString+"ห้าสิบเอ็ด"; หยุดพัก; กรณีที่ 52: finalString=finalString+"fifty two"; หยุดพัก; กรณีที่ 53: finalString=finalString+"fifty three"; หยุดพัก; กรณีที่ 54: finalString=finalString+"fifty four"; หยุดพัก; กรณีที่ 55: finalString=finalString+"fifty five"; หยุดพัก; กรณีที่ 56: finalString=finalString+"fifty six"; หยุดพัก; กรณีที่ 57: finalString=finalString+"fifty seven"; หยุดพัก; กรณีที่ 58: finalString=finalString+"fifty eight"; หยุดพัก; กรณีที่ 59: finalString=finalString+"fifty nine"; หยุดพัก; }

//เที่ยงวัน?

ถ้า (hh==12 && mm==0) { finalString=finalString+"เที่ยงวัน"; } // เที่ยงคืน? ถ้า (hh==00 && mm==0) { finalString=finalString+"เที่ยงคืน"; }

}

วงเป็นโมฆะ ()

{ // รับเวลาจาก RTC ไบต์วินาที, นาที, ชั่วโมง, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&วินาที &นาที &ชั่วโมง &วันในสัปดาห์ &วันของเดือน &เดือน &ปี);

// แปลงเวลาเป็นสตริงประโยค

createTextTime(ชั่วโมง นาที);

// ตอนนี้ส่งข้อความไปที่ DMD

drawText(finalString); }

สเก็ตช์มีฟังก์ชันปกติในการตั้งค่าและดึงเวลาจากไอซีนาฬิกาเรียลไทม์ DS1307/3232 และตามปกติกับนาฬิกาทั้งหมดของเรา คุณสามารถป้อนข้อมูลเวลาลงในตัวแปรใน void setup() จากนั้น uncomment setDateDs1307() อัปโหลดภาพสเก็ตช์ แสดงความคิดเห็นอีกครั้ง setDateDs1307 จากนั้นอัปโหลดภาพร่างอีกครั้ง ทำซ้ำขั้นตอนนั้นเพื่อตั้งเวลาใหม่หากคุณไม่ได้เพิ่มส่วนต่อประสานผู้ใช้ที่ใช้ฮาร์ดแวร์

ขั้นตอนที่ 3:

เมื่อเวลาถูกดึงออกมาใน void loop() มันจะถูกส่งไปยังฟังก์ชัน createTextTime() ฟังก์ชันนี้จะสร้างสตริงข้อความที่จะแสดงโดยเริ่มต้นด้วย "It's" แล้วกำหนดคำที่จะปฏิบัติตามขึ้นอยู่กับเวลาปัจจุบัน ในที่สุดฟังก์ชัน drawText() จะแปลงสตริงที่ถือข้อความเพื่อแสดงเป็นตัวแปรอักขระที่สามารถส่งผ่านไปยัง DMD ได้

แนะนำ: