整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          初遇JS,做一個(gè)簡(jiǎn)易數(shù)字時(shí)鐘

          初遇JS,做一個(gè)簡(jiǎn)易數(shù)字時(shí)鐘

          遇JS,做一個(gè)簡(jiǎn)易數(shù)字時(shí)鐘。

          《JavaScript》學(xué)習(xí)過程中的心得與總結(jié)

          1、做一個(gè)數(shù)字時(shí)鐘,首先我們先放上圖片,給他的背景加點(diǎn)顏色

          <body style="color: #FF9900; background-color: #cccccc">

          <img src="images/0.jpg" />

          <img src="images/0.jpg" />

          時(shí)

          <img src="images/0.jpg" />

          <img src="images/0.jpg" />

          <img src="images/0.jpg" />

          <img src="images/0.jpg" />

          </body>

          現(xiàn)在是這個(gè)樣子:

          在給他設(shè)置一個(gè)按鈕,用更新系統(tǒng)時(shí)間:

          <input id="btn1" type="button" value="更新時(shí)間">

          2、想做一個(gè)數(shù)字時(shí)鐘,最重要的是先想辦法獲取系統(tǒng)時(shí)間。

          所以 我們寫一個(gè)JS,來獲取系統(tǒng)時(shí)間

          <script type="text/javascript">

          window.onload=function (){

          //上一篇文章已經(jīng)講過,windows.onload的作用

          var Img=document.getElementsByTagName('img');

          var Btn=document.getElementById('btn1');

          var i=0;

          Btn.onclick=function() {

          var oDate=new Date();

          //初始化創(chuàng)建一個(gè)新對(duì)象(獲取系統(tǒng)時(shí)間

          var str=oDate.getHours()+'點(diǎn)'+oDate.getMinutes()+'分'+oDate.getSeconds()+'秒';

          </script>

          現(xiàn)在當(dāng)我們點(diǎn)擊更新按鈕時(shí),我們的程序顯示如下:

          3、獲取系統(tǒng)時(shí)間之后我們發(fā)現(xiàn),我們的時(shí)間是有六張圖片的,可是我們?cè)诟孪到y(tǒng)時(shí)間時(shí)發(fā)現(xiàn)當(dāng)一秒鐘時(shí)我們的系統(tǒng)時(shí)間顯示為21點(diǎn)10分4秒

          我們?nèi)绻胱屗@示21時(shí)10分04秒應(yīng)該怎么做呢?

          我們應(yīng)該創(chuàng)建一個(gè)函數(shù),讓他去判斷

          function toDouble(num) {

          if (num<10)

          {

          return '0'+num;

          }

          else

          {

          return ''+num;

          } }

           var str=toDouble(oDate.getHours())+toDouble(oDate.getMinutes())+toDouble(oDate.getSeconds());
          alert(str);
          </script>
          </head>
          此時(shí),獲取系統(tǒng)時(shí)間就完成了

          anvas是HTMl5中的重要標(biāo)簽之一,它可以在瀏覽器中繪制圖形。canvas標(biāo)簽需要指定一個(gè)寬度和高度。

          本文將包括以下內(nèi)容:

          1. 準(zhǔn)備canvas
          2. 繪制時(shí)鐘外框
          3. 繪制刻度
          4. 繪制時(shí)針、分針和秒針
          5. 更新時(shí)鐘

          1、準(zhǔn)備canvas

          <canvas id="canvas" width="200" height="200"></canvas>  
          var canvas=document.getElementById("canvas");
          var ctx=canvas.getContext("2d");

          我們首先獲取到canvas元素,然后使用 getContext方法 獲取2D上下文,從而可以控制canvas。


          2、繪制時(shí)鐘外框

          // 繪制時(shí)鐘外框
          function drawBorder(){
              ctx.beginPath(); //開始繪制路徑  
              ctx.arc(100, 100, 90, 0, Math.PI * 2); //繪制圓形  
              ctx.strokeStyle='black'; //設(shè)置顏色  
              ctx.lineWidth=5; //設(shè)置線條寬度  
              ctx.stroke(); //繪制路徑  
          }

          這個(gè)代碼塊中,我們使用 beginPath()方法 開始繪制,然后使用arc()方法繪制圓形。圓心的坐標(biāo)為(100, 100),半徑為90像素。我們還使用strokeStyle屬性設(shè)置顏色,使用lineWidth屬性設(shè)置線條寬度,并最終使用stroke()方法繪制。


          3、繪制刻度

          //繪制刻度
          function drawTicks() {
            for (var i=0; i < 60; i++) {
              ctx.beginPath(); //開始繪制路徑
              ctx.lineWidth=(i%5==0) ? 5 : 2; //設(shè)置線條寬度
              ctx.strokeStyle=(i%5==0) ? '#e2e2e2' : '#f2f2f2'; //設(shè)置顏色
              var angle=(i/60) * (2*Math.PI); //計(jì)算角度
              var x=100 + Math.cos(angle) * 80; //計(jì)算X坐標(biāo)
              var y=100 + Math.sin(angle) * 80; //計(jì)算Y坐標(biāo)
              ctx.moveTo(x, y); //移動(dòng)到刻度點(diǎn)
              ctx.lineTo(100, 100); //向圓心連線
              ctx.stroke(); //繪制路徑
            }
          }

          這個(gè)代碼塊中,我們使用for循環(huán)來繪制60個(gè)刻度。在每個(gè)迭代中,我們?cè)O(shè)置線條寬度和顏色,然后計(jì)算出刻度點(diǎn)的坐標(biāo),并使用moveTo()方法移動(dòng)到該點(diǎn)。接下來,我們使用lineTo()方法將該點(diǎn)與圓心連線,并使用stroke()方法繪制路徑。


          4、繪制時(shí)針、分針和秒針

          //繪制指針
          function drawHands() {
            var now=new Date(); //獲取當(dāng)前時(shí)間
            var hour=now.getHours(); //獲取小時(shí)
            var minute=now.getMinutes(); //獲取分鐘
            var second=now.getSeconds(); //獲取秒鐘
            var hourAngle=(hour/12) * (Math.PI*2) - (Math.PI/2); //計(jì)算時(shí)針角度
            var minuteAngle=(minute/60) * (Math.PI*2) - (Math.PI/2); //計(jì)算分針角度
            var secondAngle=(second/60) * (Math.PI*2) - (Math.PI/2); //計(jì)算秒針角度
            
            //繪制時(shí)針
            ctx.beginPath(); //開始繪制路徑
            ctx.lineWidth=8; //設(shè)置線條寬度
            ctx.strokeStyle='black'; //設(shè)置顏色
            ctx.moveTo(100, 100); //移動(dòng)到圓心
            ctx.lineTo(100 + Math.cos(hourAngle) * 60, 100 + Math.sin(hourAngle) * 60); //繪制路徑
            ctx.stroke(); //繪制路徑
            
            //繪制分針
            ctx.beginPath(); //開始繪制路徑
            ctx.lineWidth=5; //設(shè)置線條寬度
            ctx.strokeStyle='black'; //設(shè)置顏色
            ctx.moveTo(100, 100); //移動(dòng)到圓心
            ctx.lineTo(100 + Math.cos(minuteAngle) * 80, 100 + Math.sin(minuteAngle) * 80); //繪制路徑
            ctx.stroke(); //繪制路徑
            
            //繪制秒針
            ctx.beginPath(); //開始繪制路徑
            ctx.lineWidth=2; //設(shè)置線條寬度
            ctx.strokeStyle='red'; //設(shè)置顏色
            ctx.moveTo(100, 100); //移動(dòng)到圓心
            ctx.lineTo(100 + Math.cos(secondAngle) * 90, 100 + Math.sin(secondAngle) * 90); //繪制路徑
            ctx.stroke(); //繪制路徑
            
            //繪制圓心
            ctx.beginPath(); //開始繪制路徑
            ctx.arc(100, 100, 5, 0, Math.PI * 2); //繪制圓形
            ctx.fillStyle='black'; //設(shè)置填充色
            ctx.fill(); //填充路徑
          }

          在這個(gè)代碼塊中,我們首先獲取當(dāng)前的時(shí)間,然后計(jì)算時(shí)針、分針和秒針的角度。我們使用beginPath()方法開始繪制路徑,然后使用moveTo()方法移動(dòng)到圓心。使用lineTo()方法繪制指針,并使用stroke()方法繪制路徑。最后,我們使用arc()方法繪制圓心,并使用fill()方法填充路徑。


          5、更新時(shí)鐘

          setInterval(function() {
            ctx.clearRect(0, 0, canvas.width, canvas.height); //清空畫布
            drawBorder(); //繪制時(shí)鐘外框
            drawTicks(); //繪制刻度
            drawHands(); //繪制指針
          }, 1000);

          在這個(gè)代碼塊中,我們使用clearRect()方法清空畫布,讓我們可以重新繪制指針。然后,每秒鐘調(diào)用drawBorder、drawTicks、drawHands函數(shù),以重新繪制時(shí)鐘。


          希望本文能夠?qū)δ兴鶐椭兄x您的閱讀!

          人人為我,我為人人,謝謝您的瀏覽,我們一起加油吧。


          周和大家介紹一個(gè)漂亮的墨水屏電子鐘,兼具氣象站功能(可以通過GPS自動(dòng)設(shè)置),用4節(jié)AAA電池可以續(xù)航6個(gè)月左右,而且,為了保證安全和可靠性,它不需要任何網(wǎng)絡(luò)連接。

          特點(diǎn)包括:

          • 自動(dòng)設(shè)置(通過GPS)
          • 當(dāng)前溫度。
          • 當(dāng)前的濕度。
          • 顯示過去25小時(shí)內(nèi)壓力的壓力圖。
          • 日出和日落時(shí)間
          • 當(dāng)前的月相
          • 在12小時(shí)或24小時(shí)模式之間選擇。
          • 在英文和公制單位之間選擇。

          這個(gè)項(xiàng)目有兩個(gè)不同的版本,分別是 “簡(jiǎn)易”版本“低功率”版本

          “簡(jiǎn)易”版本是基于Arduino Nano的。這個(gè)版本的目的是盡量減少成本、零件數(shù)量和制作的復(fù)雜性;缺點(diǎn)是你需要用一個(gè)USB 5V適配器來給時(shí)鐘供電。

          “低功率”版本使用一個(gè)32k的振蕩器,以極小的功率保持精確的計(jì)時(shí)。這個(gè)振蕩器讓時(shí)鐘可以用電池運(yùn)行。

          第1步:"簡(jiǎn)易 "版零件清單

          • Arduino Nano
          • Waveshare 2.9 in EPaper模塊
          • Adafruit MS8607壓力/濕度/溫度傳感器
          • 任何帶有9600 Baud TX的GPS模塊
          • 電路板(可以是一塊原型板或一塊用于CNC的銅板)
          • 幾個(gè)按鈕開關(guān)(用來改變UTC時(shí)間偏移和顯示偏好的)
          • 制作外殼的材料(文末會(huì)有提供.3mf.scad.dxf文件)
          • USB充電器和充電線

          第2步:"低功率 "版本

          這些材料和上面的簡(jiǎn)易版本一樣:

          • Waveshare 2.9 in EPaper Module
          • Adafruit MS8607壓力/濕度/溫度傳感器
          • 電路板
          • 幾個(gè)按鈕開關(guān)
          • 制作外殼的材料

          此外,你還需要:

          • Atmega328P DIP版(你也可以選擇SMD封裝版本,但在32K晶體上焊接會(huì)更難)
          • 32768 Hz晶體(這個(gè)振蕩器是設(shè)計(jì)中低功率的關(guān)鍵)
          • Adafruit GPS模塊(這個(gè)模塊比 "簡(jiǎn)易 "版中的模塊質(zhì)量要高一些,因?yàn)樗梢愿櫢嗟男l(wèi)星(以便更快地鎖定),提供一個(gè)使能引腳(用于低功耗)和一個(gè)用于保持其內(nèi)存活動(dòng)的端口(用于快速重新鎖定)。如果所有這些功能對(duì)你來說不值得增加成本,你可以通過添加你自己的使能FET,魔改一個(gè)更便宜的模塊來完成這項(xiàng)工作。后面會(huì)解釋怎么做)
          • LED+電阻(光禿禿的Atmega328P沒有辦法告訴你它是否在工作,閃爍的燈可以提供一個(gè)1ms/秒的 "心跳",幾乎不耗電,但提供了有用的反饋)
          • 幾個(gè)10uF和100nF的電容來平滑電源電壓
          • 電池(我用的是4個(gè)AAA電池,但任何能可以獲得5-7伏電壓的電池都可以使用)
          • (可選)一個(gè)用于通過ICSP對(duì)芯片進(jìn)行編程的3x2針頭(如果你可以拆下Atmega328P重新編程,那么你可以跳過這個(gè)連接器)
          • (可選)一個(gè)用于UART調(diào)試的1x2針腳接頭(只有在板子運(yùn)行不穩(wěn)定的情況下才需要這個(gè))

          第3步:Arduino Mini版本

          前面說有兩個(gè)版本,這個(gè)是一個(gè)額外的版本,之所以會(huì)有這么一個(gè)額外的版本,就是因?yàn)槲覀儸F(xiàn)在處于 "零件荒 ",像Atmega328P這樣的芯片會(huì)長期缺貨。

          你可以用 "簡(jiǎn)單 "版本的固件運(yùn)行這個(gè)版本,或者,如果你對(duì)自己的焊接技術(shù)有信心,你可以在微控制器上焊接一個(gè)32k的晶體(如上圖所示),并使用32k版本的固件(更多細(xì)節(jié)見下節(jié))。

          上面的原理圖是用一個(gè) "便宜的GPS "解決方案來連接的,但是如果你用了別的(比如Adafruit)的設(shè)置來替換原理圖中的GPS部分,你也可以使用別的(比如Adafruit的)GPS(如上一步的原理圖所示)。

          第4步:便宜的GPS(可選)

          與競(jìng)爭(zhēng)對(duì)手(12美元)相比,Adafruit的GPS裝置很貴(30美元)。如果你認(rèn)為增加的功能(在低功耗部件部分有描述)不 "值得",你可以把任何能以9600波特傳輸NMEA字符串的GPS模塊丟進(jìn)去(大多數(shù)的GPS模塊都可以)。

          但現(xiàn)在有一個(gè)新的問題需要解決:這些單元中的大多數(shù)缺乏一個(gè)啟用/禁用引腳,而GPS單元通常消耗30-100毫安的電力。我們可以用一個(gè)N-MOSFET(或類似的)黑掉一個(gè)禁用開關(guān)。上面的原理圖顯示了基本的想法。我們也可以在falstad[1]中進(jìn)行嘗試。

          這個(gè)電源開關(guān)電路是有取舍的。如果你有興趣了解更多細(xì)節(jié),請(qǐng)參見附錄B。

          第5步:低功率硬件修改

          如果你正在制作 "簡(jiǎn)易 "版本,你不需要閱讀這一部分。對(duì)于“低功率”版本,這些改裝將大大改善電池壽命。

          為了說明問題,我們將假設(shè)電源來自一組AAA電池,可以提供1000毫安時(shí)。讓我們假設(shè)你使用的是32K的Adafruit版本,并且沒有做任何修改。下面是一個(gè)電源分解的例子。

          • "睡眠/關(guān)閉 " CPU、GPS、MS8607和EPaper:測(cè)量值為30-70uA(我們認(rèn)為是50uA)。
          • 屏幕更新:5毫安,每分鐘2秒一次:5 * 2 / 60=166 uA
          • GPS更新:每天一次,每次50毫安,每次10秒。50 * 10 / 86400=6 uA
          • MS8607 LED:100 uA
          • Adafruit GPS上拉電阻:500 uA

          因此,我們有(50 + 166 + 6 + 100 + 500)=822 uA的平均電流消耗,相當(dāng)于約50天的功率。

          如果去掉MS8607 LED和GPS上拉電阻,我們的用電量就會(huì)減少到222 uA,也就是大約187天的用電量,大大增加了使用時(shí)間。

          1、首先,建議從MS8607上拆下LED(具體如上圖所示)

          2、Adafruit GPS上的上拉電阻是由Adafruit的設(shè)計(jì)人員添加的,使得EN引腳變成一個(gè)可選項(xiàng)。不過它也有一個(gè)缺點(diǎn),就是當(dāng)你把它拉到地(禁用GPS)時(shí),大約有500uA的電流在上拉電阻中被消耗掉了。由于這個(gè)設(shè)計(jì)的使能引腳是主動(dòng)驅(qū)動(dòng)的,你可以去掉這個(gè)電阻(具體如上圖所示)

          3、專業(yè)的迷你修改。搜索引擎搜索 "Arduino mini低功耗 "了解詳情,基本上,你會(huì)想去掉電壓調(diào)節(jié)器和LED,來減少電源使用。我們改用MS8607的電壓調(diào)節(jié)器(3.3V,空閑時(shí)損失35-55uA的功率)為pro mini供電。

          4、在pro mini的照片中,我還去掉了晶體振蕩器,為32K晶體的芯片做準(zhǔn)備。只有在32K晶體版本的情況下才去掉這個(gè)晶體,而且只有在對(duì)pro mini的內(nèi)熔絲進(jìn)行重新編程后才去掉,后面會(huì)解釋。

          第6步:固件

          在這個(gè)步驟中,我附上了nano和32k晶體版本的.hex文件(這兩個(gè)版本都適用于pro-mini,如果你不確定使用哪個(gè)版本,就使用nano版本)。

          如果想自己構(gòu)建/修改源代碼,可以訪問GitHub:https://github.com/mattwach/epaper_clock

          自己構(gòu)建.hex固件文件(可選)

          注意,這段代碼沒有使用Arduino庫,因?yàn)楫a(chǎn)生的代碼太大,無法在Atmega328P上安裝(而且這是我的個(gè)人偏好)。它是用C語言編寫的,使用了Arduino[2]也使用的AVR基礎(chǔ)庫作為基礎(chǔ)。如果你想編譯代碼,你需要安裝(免費(fèi)的)avr-gcc工具[3],克隆epaper項(xiàng)目[4]的源碼。然后進(jìn)入firmware/[5]目錄并輸入。

          make
          

          如果代碼建立了,可以打開Makefile[6],看看這些選項(xiàng)。

          # This is the Low-power stand alone chip configuration.
          CLOCK_MODE ?=USE_32K_CRYSTAL
          UART_MODE ?=HARDWARE_UART
          F_CPU ?=8000000
          
          # This is the easy-to-build firmware that is based on an Ardino Nano
          #CLOCK_MODE ?=USE_CPU_CRYSTAL
          #UART_MODE ?=SOFTWARE_UART
          #F_CPU ?=16000000
          

          如果你正在構(gòu)建32k晶體固件,配置已經(jīng)正確了。如果構(gòu)建nano的版本,你需要注釋32k那段,取消注釋nano那段代碼,然后再次make

          還有一個(gè)特殊的調(diào)試模式,通過硬件UART以9600波特的速度轉(zhuǎn)儲(chǔ)日志信息。你現(xiàn)在可以忽略,但要記住它,因?yàn)樗院罂赡軙?huì)有用。

          # Uncomment to activate debug via the UART TX (9600 baud)
          #DEBUG_CFLAG :=-DDEBUG
          

          最后,你可以通過改變幾個(gè)變量來決定GPS應(yīng)該多長時(shí)間被激活。默認(rèn)每天運(yùn)行一次,但如果GPS需要很長時(shí)間鎖定,它會(huì)減少運(yùn)行頻率,從而減少電池的消耗。請(qǐng)?jiān)?/span>src/gps.c[7]中閱讀所有相關(guān)內(nèi)容。

          這部分的文件可以在文末下載!

          第7步:使用ICSP上傳固件

          本節(jié)是為那些上傳代碼到獨(dú)立的Atmega328P芯片的小伙伴準(zhǔn)備的,如果你要上傳到Arduino Nano,請(qǐng)?zhí)较乱粋€(gè)步驟。

          你需要一個(gè)ISP(或ICSP)編程器。可以用一個(gè)備用的Aruino Uno/Nano自己做一個(gè)。可以在搜索引擎搜索"Arduino ISP Programmer" 請(qǐng)注意,這些指南中的很多內(nèi)容都假定你的真正目的是安裝一個(gè)引導(dǎo)程序,但對(duì)于我們來說,不需要引導(dǎo)程序,因?yàn)槲覀儗⒅苯佑肐CSP上傳.hex文件。

          斷電檢測(cè)

          在我的Atmega328P上,斷電檢測(cè)設(shè)置為3.5V(貌似是舊版本),所以我用這個(gè)命令禁用斷電檢測(cè)。

          /usr/bin/avrdude -patmega328p -cusbasp -Uefuse:w:0xFF:m
          

          你的可能不一樣,這取決于你的“ISP programmer”(-c選項(xiàng))。也有可能你不需要設(shè)置,只是以防萬一。

          第8步:使用Avrdude

          我們可以使用一個(gè)叫avrdude的免費(fèi)工具,來把它創(chuàng)建的十六進(jìn)制文件上傳到你的Uno/Nano/。我們也可以直接用命令行下載并使用avrdude。

          • 用Arduino IDE在輸出記錄打開的情況下運(yùn)行一個(gè)上傳(點(diǎn)燈的demo或者其他的demo),然后復(fù)制它使用的命令。或者
          • 閱讀官方的avrdude文檔[8]或者
          • 閱讀參考網(wǎng)上使用avrdude的教程

          這里是我在nano版本中使用的avrdude命令(通過make上傳)。

          供參考:

          /usr/bin/avrdude \
            -v \
            -patmega328p \
            -carduino \
            -P/dev/ttyUSB0 \
            -b57600 \
            -D \
            -Uflash:w:epaper_firmware_using_arduino_nano.hex:i 
          

          這個(gè)是我在ISP版本中使用的:

          /usr/bin/avrdude \
            -v \
            -patmega328p \
            -cusbasp \
            -Uflash:w:epaper_firmware_using_32k_crystal.hex:i 
          

          這邊使用的是Linux。Mac和Windows也能正常工作,但像-P這樣的選項(xiàng)會(huì)有所不同(即在Windows中可能是-PCOM1)。

          同樣,這部分的文件可以在文末下載

          第9步:32K晶振

          如果你正在制作 "簡(jiǎn)易 "版本,請(qǐng)?zhí)^這一步。如果你使用的是32k晶體固件,則需要安裝晶體以使固件發(fā)揮作用。

          首先(!) 你還需要配置ATMega328P的內(nèi)部?jī)?nèi)熔絲,以使用內(nèi)部的8Mhz晶體。

          先做這一步很重要,因?yàn)?2K晶體將取代任何現(xiàn)有晶體。如果你不改變這些內(nèi)熔絲,芯片會(huì)變得沒有反應(yīng),直到你重新連接一個(gè)8或16Mhz的振蕩器。

          據(jù)我所知,Arduino pro mini也需要ISP來改變內(nèi)熔絲(但我可能是錯(cuò)的)。我查找了 "Arduino ISP",來獲得正確的引腳映射,以便將ISP連接器與面包板對(duì)接(如上圖所示)。

          在連接了我的ISP programmer后,可以用這個(gè)命令檢查當(dāng)前的內(nèi)熔絲配置。

          $ avrdude -patmega328p -cusbasp
          ...
          avrdude: safemode: Fuses OK (E:FF, H:DE, L:E2)
          

          L:E2是我們想要的內(nèi)部8mhz的設(shè)置。如果你的值不一樣,可以用類似于這個(gè)的命令來更新它。

          /usr/bin/avrdude -patmega328p -cusbasp -Ulfuse:w:0xE2:m
          

          然后重新檢查。

          內(nèi)熔絲設(shè)置完畢后,你就可以焊接晶體了。建議將晶體直接連接到微控制器引腳上,以減少雜散電容。太多的電容會(huì)使晶體需要更長的時(shí)間來開始振蕩(或無法啟動(dòng))。

          第10步:(可選)第一個(gè)步驟

          請(qǐng)參考步驟1、步驟2或步驟3中你所選擇的設(shè)計(jì)原理圖。

          • 你可以在面包板上驗(yàn)證到目前為止的情況,只需將一個(gè)LED/Resistor從D5連接到地,然后上傳固件。如果一切正常,LED將每秒短暫地閃爍一次;
          • 接下來,你可以添加EPaper顯示屏。顯示器上的數(shù)據(jù)都不會(huì)是正確的,但它應(yīng)該顯示一些一些數(shù)據(jù);
          • 然后,添加PHT模塊,并驗(yàn)證它是否工作;
          • 最后是GPS模塊。

          如果測(cè)試正常,我們可以把所有東西轉(zhuǎn)移到一個(gè)更“永久”的固定裝置上。

          第11步:線路板組裝

          你可以選擇使用perf板,用CNC切割板子,或者把設(shè)計(jì)送到工廠去制造。

          Kicad設(shè)計(jì)文件可以在schematic/目錄[9]中找到。有三種硬件可供選擇(都是從后面顯示的,因?yàn)檫@是你手工布線的方式)。

          我用我的CNC機(jī)器制作ATMega328P版本。如果你沒有用CNC切割過PCB而又感興趣,可以嘗試在搜索引擎上搜索 "3018 PCB",你會(huì)發(fā)現(xiàn)很多關(guān)于這個(gè)主題的視頻和文章。

          間隙設(shè)置0.4毫米,但你可以更窄(可能不會(huì)更寬)。我使用Flatcam將Kicad的Gerber輸出轉(zhuǎn)換為G代碼。

          相關(guān)文件可以在文末下載到。

          第12步:案例設(shè)計(jì)

          你可以設(shè)計(jì)你想要的任何類型的外觀,非常鼓勵(lì)大家發(fā)揮創(chuàng)意!

          這里分享一下我是怎么制作的(所有的設(shè)計(jì)文件都可以在文末下載到)。

          我的設(shè)計(jì)使用了一個(gè)3D打印的支撐結(jié)構(gòu)和兩個(gè)CNC部件:一個(gè)頂蓋和前面板。數(shù)控部件是用木頭做的,因?yàn)槲艺J(rèn)為它比塑料看起來更漂亮。我在OpenSCAD中預(yù)先設(shè)計(jì)了整個(gè)東西。

          我用0.2毫米的層高打印了主要結(jié)構(gòu)。在我的3D打印機(jī)上,打印花了5個(gè)小時(shí)多一點(diǎn)。

          我使用OpenSCAD的 "projection"[10] 功能,為頂蓋和前板創(chuàng)建了2D DXF文件。

          我通常會(huì)使用一個(gè)名為 "Carbide Create"[11]的免費(fèi)程序,為數(shù)控機(jī)床制作G代碼。但面板有一個(gè)45度的倒角,而Carbide Create是一個(gè)太基本的程序,不能很好地處理這個(gè)問題(至少我通過谷歌搜索他們網(wǎng)站上的論壇,得出了這個(gè)結(jié)論)。所以我嘗試了一個(gè)不同的程序,叫做"CamBam"[12],它的效果非常好。(CamBam不是免費(fèi)的,但可以免費(fèi)使用40次)

          第13步:附錄A:時(shí)鐘漂移校正(可選)

          你的32k/CPU晶體不會(huì)是完美的。當(dāng)GPS開啟時(shí),它將修正漂移。但是如果漂移不好或者你的GPS信號(hào)不好,你也可以在固件中應(yīng)用一個(gè)校正。目前這需要構(gòu)建代碼。在main.c的頂部,有一些被注釋掉的定義。

          // Clock drift correction
          // If your clock runs too fast or too slow, then you can enable these
          //#define CORRECT_CLOCK_DRIFT
          // number of seconds that a second should be added or removed
          //#define CLOCK_DRIFT_SECONDS_PER_CORRECT 1800
          // define this if the clock is too slow, otherwise leave it commented out
          //#define CLOCK_DRIFT_TOO_SLOW
          

          你可以取消對(duì)上面兩個(gè)#define語句的加注,以啟用校正。

          只需取消對(duì)CLOCK_DRIFT_TOO_SLOW的注釋(你的時(shí)鐘已經(jīng)慢了的話)。

          如果你的時(shí)鐘太快了,就不要注釋。唯一要做的是設(shè)置CLOCK_DRIFT_SECONDS_PER_CORRECT...

          數(shù)學(xué)方法

          等了大約一天,然后看看時(shí)鐘漂移了多少。例如,你可能要等23個(gè)小時(shí)。如果這時(shí)你看到時(shí)鐘慢了10秒,那么你的修正將是。

          (3600 * 23) / 10=8280秒,每次修正。

          #define CORRECT_CLOCK_DRIFT
          #define CLOCK_DRIFT_SECONDS_PER_CORRECT 8280
          #define CLOCK_DRIFT_TOO_SLOW
          

          非數(shù)學(xué)的方法

          只需嘗試一個(gè)像5000這樣的數(shù)字,并在你注意到時(shí)鐘仍然過快或過慢時(shí)對(duì)其進(jìn)行完善。還是太慢?試試2,500。太快了?試試10,000。保持記錄,并反復(fù)完善到可接受的數(shù)值,就像你在某些時(shí)候可能玩過的猜數(shù)字游戲一樣。

          第14步:附錄B:廉價(jià)的GPS電源控制(關(guān)于BS170 N-MOSFET)

          重溫一下第四步"便宜GPS " 里描述的電源控制電路,上面的電源切斷電路被稱為 "low side switch"。它的好處是比較容易理解,而且零件數(shù)量少。盡管如此,還是有一些設(shè)計(jì)上的問題。

          • GPS的地線并不與GND相連,而是與MOSFET相連。這意味著從GPS到微控制器的UART信號(hào)會(huì)有MOSFET的壓降加在上面(Vds),增加了噪聲的敏感性,并可能造成的錯(cuò)誤。
          • 如果你的微控制器的輸入被規(guī)定為3.3V的最大值,你就不會(huì)想使用這種設(shè)計(jì)(我選擇的ATMega328P沒有這個(gè)限制)。
          • 3.3V(上面的EN引腳)對(duì)每個(gè)MOSFET來說都不是一個(gè)很強(qiáng)的開啟電壓。

          但是,UART是一個(gè)數(shù)字信號(hào),地線的差異并不大,所以也許它無論如何都會(huì)工作?我試過了,而且工作得很好......起初,但隨著時(shí)間的推移,我逐漸發(fā)現(xiàn)它并不可靠。為了了解原因,我們參考一下我最初選擇的BS170作為我的N-MOSFET的特性曲線[13]

          在X軸的3.3V時(shí),我們將坐在圖上的3.0和4.0V線之間。因此,也許我們會(huì)得到100mA?也許足夠?

          萬用表告訴我,GPS消耗40-60mA,但我認(rèn)為這是一個(gè)平均值。根據(jù)GPS試圖做什么,它只是需要比晶體管能夠允許的更多的電流,因此GPS的地(MOSFET漏極)電壓會(huì)上升。這既造成了UART錯(cuò)誤,又降低了GPS裝置的整體電壓,而GPS裝置有時(shí)仍然可以工作,有時(shí)則進(jìn)入復(fù)位循環(huán)。

          一個(gè)解決方案是使用一個(gè) "high side"電源電路,在上面增加一個(gè)P-MOSFET來實(shí)現(xiàn)這個(gè)目標(biāo)。見上面的原理圖。這消除了單獨(dú)接地的問題,并提供一個(gè)完整的5V(電池)柵極電壓波動(dòng),這將使相關(guān)的P-MOSFET完全打開。

          這里[14]是falstad中的一個(gè)高邊設(shè)計(jì)實(shí)例。

          目前我已經(jīng)訂購了帶有低端布線的PCB,所以我的次要解決方案是放棄BS170,而用FQP30N06L代替。這種較高電流的MOSFET(最大30A!)似乎嚴(yán)重過剩,而且確實(shí)如此,但其曲線看起來要好得多。在3.3V電壓下,大約有10A的電流余量,比BS170改進(jìn)了100倍,現(xiàn)在應(yīng)該足夠了;而且確實(shí)沒有恢復(fù)不穩(wěn)定。

          參考資料

          [1]falstad: http://www.falstad.com/circuit/circuitjs.html?ctz=CQAgjCAMB0l3BWcMBMcUHYMGZIA4UA2ATmIxAUgoqoQFMBaMMAKADMLiUQUAWKwvx5Ds3MNCQwELAEoUMhEIIphuyqlSGSoUCSwBOSoczVCUfHZRYAPJQnJpeIDJAeuQTiwHEACgGUWACMlfHAUPGcwRRQwJ0gWAHd5RWVBATjEo3Ss8FUoFgBzHJQEFJFIOPzDBC5hTWJooSoweFkPZT5NUTqdTSpsaGxe3WkAZ3bPIV4GnuaQNgBDABtRugMPGc6NxVENZHg4Qu2QXePsbEUNFiA

          [2]Arduino: https://www.arduino.cc/

          [3]avr-gcc工具: https://www.pololu.com/docs/0J61/6.3

          [4]epaper項(xiàng)目: https://github.com/mattwach/epaper_clock

          [5]firmware目錄: https://github.com/mattwach/epaper_clock/tree/main/firmware

          [6]Makefile: https://github.com/mattwach/epaper_clock/blob/main/src/Makefile

          [7]src/gps.c: https://github.com/mattwach/epaper_clock/blob/main/src/gps.c

          [8]https://www.nongnu.org/avrdude/: https://www.nongnu.org/avrdude/

          [9]schematic/: https://github.com/mattwach/epaper_clock/tree/main/schematic

          [10]projection功能: https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#3D_to_2D_Projection

          [11]Carbide Create: https://carbide3d.com/carbidecreate/

          [12]CamBam: http://www.cambam.info/

          [13]N-MOSFET的特性曲線: https://www.onsemi.com/pdf/datasheet/mmbf170-d.pdf

          [14]falstad中的一個(gè)高邊設(shè)計(jì)實(shí)例: http://www.falstad.com/circuit/circuitjs.html?ctz=CQAgjCAMB0l3BWcMBMcUHYMGZIA4UA2ATmIxAUgoqoQFMBaMMAKADMLiUQUAWKwvx5Ds3MNCQxIKdiEFUwGQnKFgUeELwjjJsGQCcVCpRULHlC+JBYB3OX3DrTCp9bsIzjjR-NQWAJWcvTWJlNQ0qKiFJKCgJFkMMNHATJKp1CJoWAA8QHHIiDQw8AowIXmEQAHEABQBlFgAjOTwNMC480J5ivwBzPOSMgapRSL87Qg9gtOC3YenkxQtbIxTleR4Ha36NlCmN3ArIhM5uPiiu89iweADNQWEo0UfYqJHobFe4hBYAZ3uKldeJchAoQGwAIYAG1+dBYQA



          原文鏈接:https://www.instructables.com/E-Paper-Clock/

          原文作者:mattwach

          譯文首發(fā):DF創(chuàng)客社區(qū) https://mc.dfrobot.com.cn/thread-313226-1-1.html

          轉(zhuǎn)載請(qǐng)注明原作者及出處


          主站蜘蛛池模板: 天堂资源中文最新版在线一区| 亚洲无人区一区二区三区| 久久无码一区二区三区少妇| 精品无码人妻一区二区免费蜜桃| 黑巨人与欧美精品一区| 2014AV天堂无码一区| 四虎成人精品一区二区免费网站 | 亚洲一区精彩视频| 相泽亚洲一区中文字幕| 成人区人妻精品一区二区不卡| 中文字幕精品无码一区二区三区 | 2021国产精品一区二区在线| 国产精品小黄鸭一区二区三区| 天天视频一区二区三区| 激情内射亚洲一区二区三区| 国产精品伦一区二区三级视频| 国产成人av一区二区三区在线| 无码人妻精品一区二区蜜桃网站 | 中文字幕在线无码一区| 国产福利一区二区| 精品国产区一区二区三区在线观看| 亚洲国产精品一区二区久| 又硬又粗又大一区二区三区视频| 四虎永久在线精品免费一区二区| 波多野结衣一区二区| 在线观看亚洲一区二区| 日韩精品中文字幕无码一区 | 中文字幕色AV一区二区三区 | 日本一区二区在线| 久久精品国产一区二区| 国产美女口爆吞精一区二区| 无遮挡免费一区二区三区| 国产视频一区在线播放| 日本v片免费一区二区三区| 国产在线观看一区二区三区四区 | 麻豆精品一区二区综合av| 美女免费视频一区二区| 成人在线一区二区| 国产精品亚洲高清一区二区| 三上悠亚日韩精品一区在线| 国产在线精品一区二区夜色 |