創作內容

17 GP

arduino 四位數七段顯示器

作者:貓貓風 ฅ●ω●ฅ│2017-06-22 21:31:20│巴幣:34│人氣:8906
.











四位數的顯示器控制基本都跟單顆控制一樣,GOOGLE應該都可以找到很多就不在這邊贅述

四位數的控制主要可以看下圖



角位 0 1 2 3 分別控制每段顯示,0為控制最右邊 3為最左邊  依此類推

剩下的 A B C D E F G H(DP) 則控制每個LED的亮與不亮,如下圖



接著為 arduino 控制器 與 四位數七段顯示器的接線圖



圖源: http://yehnan.blogspot.tw/2013/08/arduino_26.html

接著為程式碼部分主要分成控制端(PC)與顯示端(arduino)

控制端負責送訊號 顯示端接收到後進行動作

此程式會傳出 1 或 0 的訊號來控制arduino上面的燈亮與不亮

同時也會藉由 Serial Port接收從arduino產生的資料,並將資料儲存在指定資料夾中



以下為 arduino 程式碼,提供兩種方式控制燈光 1. 亂數>5000亮燈 2. 看 PC端送的訊號亮燈
註解掉的部分如果在角位A1接上燈就可以使用


  1. #define PIN_0 2  
  2. #define PIN_g 3  
  3. #define PIN_c 4  
  4. #define PIN_h 5  
  5. #define PIN_d 6  
  6. #define PIN_e 7  
  7. #define PIN_b 8  
  8. #define PIN_1 9  
  9. #define PIN_2 10  
  10. #define PIN_f 11  
  11. #define PIN_a 12  
  12. #define PIN_3 13  
  13.   
  14. // 共有4個七段顯示器,分別由針腳PIN_0、PIN_1、PIN_2、PIN_3控制  
  15. // 七段顯示器裡有8個LED(包含小數點)  
  16. #define POS_NUM 4  
  17. #define SEG_NUM 8  
  18. const byte pos_pins[POS_NUM] = {PIN_0, PIN_1, PIN_2, PIN_3};  
  19. const byte seg_pins[SEG_NUM] = {PIN_a, PIN_b, PIN_c, PIN_d, PIN_e, PIN_f, PIN_g, PIN_h};  
  20.   
  21. // 底下定義由七段顯示器顯示數字時所需要的資料  
  22. const boolean data[10][SEG_NUM] = {  
  23.   {1, 1, 1, 1, 1, 1, 0, 0}, // 0  
  24.   {0, 1, 1, 0, 0, 0, 0, 0}, // 1  
  25.   {1, 1, 0, 1, 1, 0, 1, 0}, // 2  
  26.   {1, 1, 1, 1, 0, 0, 1, 0}, // 3  
  27.   {0, 1, 1, 0, 0, 1, 1, 0}, // 4  
  28.   {1, 0, 1, 1, 0, 1, 1, 0}, // 5  
  29.   {1, 0, 1, 1, 1, 1, 1, 0}, // 6  
  30.   {1, 1, 1, 0, 0, 0, 0, 0}, // 7  
  31.   {1, 1, 1, 1, 1, 1, 1, 0}, // 8  
  32.   {1, 1, 1, 1, 0, 1, 1, 0}, // 9  
  33. };  
  34.   
  35. // 以格式字串輸出到序列埠  
  36. void pf(const char *fmt, ... ){  
  37.     char tmp[128]; // max is 128 chars  
  38.     va_list args;  
  39.     va_start (args, fmt );  
  40.     vsnprintf(tmp, 128, fmt, args);  
  41.     va_end (args);  
  42.     Serial.print(tmp);  
  43. }  
  44.   
  45. // 設定某個七段顯示器所顯示的數字,  
  46. // 參數pos為0~3,指出想要更新哪一個七段顯示器,  
  47. // 參數n為0~9,顯示數字  
  48. void setDigit(int pos, int n){  
  49.   if(pos < 0 || 3 < pos){  
  50.     pf("error pos=%d\n", pos);  
  51.     return;  
  52.   }  
  53.   
  54.   // 控制想要更新哪一個七段顯示器,將其腳位設為LOW  
  55.   // 其他腳位則設為HIGH,代表不更新。   
  56.   for(int p = 0; p < POS_NUM; p++){  
  57.     if(p == pos)  
  58.       digitalWrite(pos_pins[p], LOW);  
  59.     else  
  60.       digitalWrite(pos_pins[p], HIGH);  
  61.   }  
  62.     
  63.   // 寫入數字   
  64.   if(0 <= n && n <= 9){  
  65.     for(int i = 0; i < SEG_NUM; i++){  
  66.       digitalWrite(seg_pins[i], data[n][i] == 1 ? HIGH : LOW);  
  67.     }  
  68.   }  
  69. }  
  70.   
  71. // 設定整個四合一型七段顯示器想要顯示的數字  
  72. // 參數number的範圍應是0~9999  
  73. void setNumber(int number)  
  74. {  
  75.   int n0, n1, n2, n3;  
  76.   n3 = number / 1000; //位數轉換 千  
  77.   number %= 1000;  
  78.   n2 = number / 100;//位數轉換 百  
  79.   number %= 100;  
  80.   n1 = number / 10;//位數轉換 十  
  81.   n0 = number % 10;//位數轉換 個位數  
  82.   
  83.   // 求出每個位數的值後,分別更新  
  84.   //以delay(5)隔開每個位數的更新   
  85.   setDigit(0, n0); delay(5);  
  86.   setDigit(1, n1); delay(5);  
  87.   setDigit(2, n2); delay(5);  
  88.   setDigit(3, n3); delay(5);  
  89. }  
  90.   
  91. unsigned long time_previous;  
  92. void setup() {  
  93.   Serial.begin(9600); //baud rate太高會顯示亂碼  
  94.   randomSeed(analogRead(0));  //隨機亂數種子,讓每次產生的亂數都不相同  
  95.   pinMode(A0,OUTPUT);  
  96.   for(int i = 0; i < POS_NUM; i++){  
  97.     pinMode(pos_pins[i], OUTPUT);  
  98.     digitalWrite(pos_pins[i], HIGH);  
  99.   }  
  100.   for(int i = 0; i < SEG_NUM; i++){  
  101.     pinMode(seg_pins[i], OUTPUT);  
  102.     digitalWrite(seg_pins[i], LOW);  
  103.   }  
  104.   time_previous = millis();  
  105. }  
  106.   
  107. int number = 0;  
  108. void loop() {  
  109.   // 經過一秒後就讓number改變  
  110.   unsigned long time_now = millis();  
  111.   if(time_now - time_previous > 1000){  
  112.     number = random(0,9999);  //亂數範圍0-9999  
  113.     time_previous += 1000;  
  114.     //pf("number=%d\n", number);  
  115.     //Serial.println(String("") + "random number is " + number);
  116.     //用字串方式連接顯示文字  
  117.     Serial.println(number);//用字串方式連接顯示文字  
  118.     //如果產生值>5000 讓 LED1發亮 否則關閉  
  119.     /*if(number >= 5000)
  120.     {
  121.       analogWrite(A1, 200);
  122.     }
  123.     else
  124.     {
  125.        analogWrite(A1, 0);
  126.     }*/  
  127.     //讀取從PC SerialPort傳來的訊息  
  128.     char inByte = Serial.read();   
  129.     //如果為1讓LED2發亮 如果為0讓LED2熄滅  
  130.     if(inByte == '1')  
  131.     {  
  132.        analogWrite(A0, 200);  
  133.     }  
  134.     else  
  135.     {  
  136.        analogWrite(A0, 0);  
  137.     }  
  138.       
  139.   }  
  140.   setNumber(number); //顯示寫入數字  
  141.   
  142. }  

C# 控制端


  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using System.IO.Ports;  
  10. using System.Threading;  
  11. using System.IO;  
  12.   
  13. namespace Serial_Recieve  
  14. {  
  15.     public partial class Form1 : Form  
  16.     {  
  17.         string _command = "";  
  18.   
  19.         public Form1()  
  20.         {  
  21.             InitializeComponent();  
  22.         }  
  23.   
  24.         private void Form1_Load(object sender, EventArgs e)  
  25.         {  
  26.             serialPort1.BaudRate = 9600;  
  27.             serialPort1.Parity = Parity.None;  
  28.             serialPort1.DataBits = 8;  
  29.             serialPort1.StopBits = StopBits.One;  
  30.             serialPort1.Encoding = Encoding.GetEncoding("UTF-8");
  31.             //指定編碼格式 收到資訊才不會出現亂碼  
  32.             label1.Text = "PC狀態:尚未連線";  
  33.             serialPort1.PortName = "COM3";  
  34.         }  
  35.   
  36.         private void button1_Click(object sender, EventArgs e)  
  37.         {  
  38.             try  
  39.             {  
  40.                 serialPort1.Open();  
  41.                 Thread.Sleep(1000);  
  42.                 timer1.Enabled = true;  
  43.                 button1.Enabled = false;  
  44.                 label1.Text = "PC狀態:連線中";  
  45.             }  
  46.             catch  
  47.             {  
  48.                 label1.Text = "PC狀態:Comport open fail";  
  49.             }  
  50.         }  
  51.   
  52.         private void timer1_Tick(object sender, EventArgs e)  
  53.         {  
  54.             string data = "";  
  55.             data = serialPort1.ReadLine();  
  56.             label2.Text = "Arduino回傳:" + data;  
  57.             store_data(data);  
  58.   
  59.             try  
  60.             {  
  61.                 serialPort1.Write(_command);  
  62.             }  
  63.             catch  
  64.             {  
  65.                 label1.Text = "PC狀態:Comport disconnect";  
  66.             }  
  67.         }  
  68.   
  69.         private void store_data(string data)  
  70.         {  
  71.             string str = System.Windows.Forms.Application.StartupPath;  
  72.             string file = str + "\\data\\" + DateTime.Now.Year.ToString() +
  73.             DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() +  
  74.             DateTime.Now.Hour.ToString()+".txt";  
  75.             if (!System.IO.File.Exists(file))  
  76.             {  
  77.                 FileStream filestream = new FileStream(file, FileMode.Create);  
  78.                 filestream.Close();  
  79.             }  
  80.   
  81.             StreamWriter sw = new StreamWriter(file, true);  
  82.             sw.WriteLine("Recieve random number is "+data);  
  83.             sw.Close();  
  84.         }  
  85.   
  86.         private void button2_Click(object sender, EventArgs e)  
  87.         {  
  88.             _command = "1";  
  89.         }  
  90.   
  91.         private void button3_Click(object sender, EventArgs e)  
  92.         {  
  93.             _command = "0";  
  94.         }  
  95.   
  96.         private void button4_Click(object sender, EventArgs e)  
  97.         {  
  98.             button1.Enabled = true;  
  99.             timer1.Enabled= false;  
  100.             label1.Text = "PC狀態:Comport disconnect";  
  101.             serialPort1.Close();  
  102.         }  
  103.     }  
  104. }  


執行結果

控制端連上Comport接收資料並送訊號開啟LED,接收的資料每秒會不斷刷新


顯示端序列阜上面的結果



PC端將接收到的資料儲存(LOG)



LED燈光控制 與 顯示的亂數 在 arduino上的執行狀況 (LED ON)



LED OFF



執行畫面  拍影片的時候還沒接燈 @_@ 不過後來有補  如上圖


最後  由於手機很差  拍的圖片跟影片沒很清楚  請見諒 >A<



引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3618207
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:涼涼風|C#|arduino

留言共 8 篇留言

羽翼ˊ● ω ●ˋ
暑假來玩一下ARDUINO,想做小臺的CNC

06-22 21:53

貓貓風 ฅ●ω●ฅ
CNC感覺很讚耶>< 需要查一下還要買哪些元件06-22 21:54
小刀
好厲害!看不懂~[e5]

06-22 22:01

貓貓風 ฅ●ω●ฅ
這次的對會的人來說應該算很基本~ 不過我弄有點久才稍為搞懂>A< 畢竟對電路超不熟
06-22 22:03
(゚∀ ゚)✄╰U╯
雖不明 但覺厲

06-23 00:12

貓貓風 ฅ●ω●ฅ
[e34]06-23 00:20
生不如死兔兔砲
之前學這個的時候做到睡著(#)整天除了玩麵包板就是寫七段顯示器的程式

06-23 01:38

貓貓風 ฅ●ω●ฅ
有時候是會弄到蠻無聊的啦,真的會想睡XD06-23 13:23
珀伽索斯(Ama)
這讓我想起以前我讀高職時,實習課時在麵包版上用過的七段顯示器,
看過後感覺有點懷念,另外我覺得拍的還好,你介紹的也不錯喔!

06-23 12:38

貓貓風 ฅ●ω●ฅ
謝謝你的稱讚哦,我覺得畫質都沒很好><,原來你有學過呢,我都是自學,常常遇到瓶頸待解決06-23 13:24
星砂彌雪
看到這個讓我想到這科差點被當掉 哈[e6]

06-23 19:44

貓貓風 ฅ●ω●ฅ
所以你是類似電子科的OWO?06-23 21:53
別動肝火
以前高中玩過都忘記怎麼用了

06-23 20:38

貓貓風 ฅ●ω●ฅ
這對高職來說可能是基本~~~~06-23 21:53
(●´∀`)ノ♡
U質文ㄛ

06-27 22:09

貓貓風 ฅ●ω●ฅ
桑Q
06-27 22:11
我要留言提醒:您尚未登入,請先登入再留言

17喜歡★s1234567 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:C# Socket大檔案... 後一篇:arduino LCD ...

追蹤私訊切換新版閱覽

作品資料夾

a86189642祝福
祝大家幸福。看更多我要大聲說14小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】