發表文章

目前顯示的是 4月, 2016的文章

Arduino Tiny RTC I2C Module

圖片
最近在學習Arduino和RTC的使用,看了葉難先生寫的「輕鬆入門Arduino範例分析與實作設計」一書,其中提到DS1307即時時鐘晶片的使用。就很有興趣的想買一顆來試試,到ICSHOP網站一看,哇!一顆要79塊台幣。這這也不算便宜,而且還要買石英晶體和其他小零件,特別是要一個CR2032電池座,還要把這些東西焊在一起。想想自己手藝不精,眼力也不行了,只怕這些零件到時玩過就散在一邊,浪費了。 沒想到,看到他們也賣另一個[DS1307時鐘模組],而且只要60塊台幣,內含DS1307晶片、石英晶體、CR2032電池座等,還都焊的好好的。 那就先來試試了。 貨到了,看了一下電路圖和文件。哈,除了DS1307外,還有一顆24C32 32K I2C EEPROM,還留了3個接點給DS18B20溫度感測器。太多東西可以玩了,當下不知由那裡玩起啊。 先Google一下好了,果然有一大堆的資料。首先由Matthew的 Arduino RTC: TinyRTC v1 with Arduino Mega 2560 開始看。 他說只要接Vcc, GND, SCL, SDA這四條線就好了。然後他不知由那裡找到的三支草稿碼:SetRTC,GetRTC,I2CScanner。首先用I2CScanner來找DS1307的位址,嗯,是0x68。 然後再用SetRTC這支來設定日期時間,嘔,要直接改程式才能設定哦!再來就是可以用GetRTC這支來讀取日期時間了。試了一下,沒問題,都可以正常運作的。而且,這三支都只用到內建的Wire程式庫。 可是第一個問題,就是要設定日期時間,還要改草稿碼,然後再上傳,實在有點不方便啊! 此時回頭看看葉難的書,發現他用的是另外的方法,是別的程式庫。不過葉先生寫的設定日期時間的程式很好用的,我就先直接把Matthew的草稿碼GetRTC改成可以設定日期時間。 /* Downloaded from http://projectsfromtech.blogspot.com/ *Connect SCL, SDA, Vcc, and GND *Open Serial Monitor and enjoy! */ //Arduino 1.0+ Only #include "Wire.h" #define DS1307_ADDRE...

取得Windows電腦上可用序列埠的名稱

最近要在Windows 10上寫一支程式, 其中有一個需求, 要取得目前可用的所有序列埠. 花了一些時間, 發現網路上大家都說, .Net Framework的SerialPort.GetPortNames 方法會傳回 許多重覆的序列埠名稱。例如: COM1 COM12 COM12 COM5 COM5 COM5 除了會重覆外, 還有排序不對的問題。排序問題參考 [C#] 取得目前電腦所有可使用的序列埠(Serial Port)名稱  可以寫一段delegate的排序比較方法來解決。 同樣的, 重覆問題也可以用群組的方式, 寫一小段程式來解決。合在一起, 如下: string[] ports = SerialPort.GetPortNames(); List<string> listPorts = new List<string>(ports); Comparison<string> comparer = delegate (string name1, string name2) { int port1 = Convert.ToInt32(name1.Remove(0,3)); int port2 = Convert.ToInt32(name2.Remove(0,3)); return (port1 - port2); }; listPorts.Sort(comparer); string[] ComPorts = listPorts.ToArray(); var result = ComPorts.GroupBy(a => a); ArrayList GroupPorts = new ArrayList(); foreach (var group in result) { GroupPorts.Add(group.Key); } cboPorts.Items.Clear(); cboPorts.Items.AddRange(GroupPorts.ToArray()); 這樣,下拉選單的內容就會變成: COM1 COM5 COM12 ...