สารบัญ:
วีดีโอ: นาฬิกาข้อความเลื่อน Arduino: 3 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:05
วัตถุประสงค์ของโครงการนี้คือการสร้างนาฬิกาข้อความแบบเลื่อนที่แสดงเวลาตามที่พูด (เช่น "เที่ยงคืน")
นี่เป็นโครงการด่วน เราให้คุณมากพอที่จะใช้งานฮาร์ดแวร์และสเก็ตช์ จากนั้นคุณสามารถดำเนินการเพิ่มเติมเพื่อให้เหมาะกับความต้องการของคุณ
ขั้นตอนที่ 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 ได้
แนะนำ:
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: การตวัดเป็นวิธีง่ายๆ ในการสร้างเกม โดยเฉพาะอย่างยิ่งเกมปริศนา นิยายภาพ หรือเกมผจญภัย
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: ในคำแนะนำนี้ เราจะทำการตรวจจับใบหน้าบน Raspberry Pi 4 ด้วย Shunya O/S โดยใช้ Shunyaface Library Shunyaface เป็นห้องสมุดจดจำใบหน้า/ตรวจจับใบหน้า โปรเจ็กต์นี้มีจุดมุ่งหมายเพื่อให้เกิดความเร็วในการตรวจจับและจดจำได้เร็วที่สุดด้วย
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: 3 ขั้นตอน
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: ในบทช่วยสอนนี้ ฉันจะแสดงขั้นตอนสำคัญในการติดตั้งปลั๊กอิน WordPress ให้กับเว็บไซต์ของคุณ โดยทั่วไป คุณสามารถติดตั้งปลั๊กอินได้สองวิธี วิธีแรกคือผ่าน ftp หรือผ่าน cpanel แต่ฉันจะไม่แสดงมันเพราะมันสอดคล้องกับ
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): 8 ขั้นตอน
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): ตัวแปลงสัญญาณเสียงล้ำเสียง L298N Dc ตัวเมียอะแดปเตอร์จ่ายไฟพร้อมขา DC ตัวผู้ Arduino UNOBreadboardวิธีการทำงาน: ก่อนอื่น คุณอัปโหลดรหัสไปยัง Arduino Uno (เป็นไมโครคอนโทรลเลอร์ที่ติดตั้งดิจิตอล และพอร์ตแอนะล็อกเพื่อแปลงรหัส (C++)
Arduino ที่ถูกที่สุด -- Arduino ที่เล็กที่สุด -- Arduino Pro Mini -- การเขียนโปรแกรม -- Arduino Neno: 6 ขั้นตอน (พร้อมรูปภาพ)
Arduino ที่ถูกที่สุด || Arduino ที่เล็กที่สุด || Arduino Pro Mini || การเขียนโปรแกรม || Arduino Neno:…………………………… โปรดสมัครสมาชิกช่อง YouTube ของฉันสำหรับวิดีโอเพิ่มเติม……. โปรเจ็กต์นี้เกี่ยวกับวิธีเชื่อมต่อ Arduino ที่เล็กที่สุดและถูกที่สุดเท่าที่เคยมีมา Arduino ที่เล็กที่สุดและถูกที่สุดคือ arduino pro mini คล้ายกับ Arduino