查看完整版本: (已解決)(Arduino)用按鈕控制七段顯示器數字,卡在數字不會更動
頁: [1]

a7813195 發表於 2017-4-27 08:25 PM

(已解決)(Arduino)用按鈕控制七段顯示器數字,卡在數字不會更動

本帖最後由 a7813195 於 2017-5-4 12:09 PM 編輯

先PO上程式碼
//七段顯示器字型碼
byte seven_seg_digits = { { 0,0,0,0,0,0,1 },  // = 0
                                 { 1,0,0,1,1,1,1 },  // = 1
                                 { 0,0,1,0,0,1,0 },  // = 2
                                 { 0,0,0,0,1,1,0 },  // = 3
                                 { 1,0,0,1,1,0,0 },  // = 4
                                 { 0,1,0,0,1,0,0 },  // = 5
                                 { 0,1,0,0,0,0,0 },  // = 6
                                 { 0,0,0,1,1,1,1 },  // = 7
                                 { 0,0,0,0,0,0,0 },  // = 8
                                 { 0,0,0,1,1,0,0 }   // = 9
                             };
const int seven_LED_a = 2;
const int seven_LED_b = 3;  
const int seven_LED_c = 4;  
const int seven_LED_d = 5;  
const int seven_LED_e = 6;  
const int seven_LED_f = 7;  
const int seven_LED_g = 8;  
const int seven_LED_dot = 9;  
const int buttonPin = 10;
//設定Button當前狀態
int buttonState = 0;
//設定Button之前狀態
int lastButtonState = 0;
void setup() {
  pinMode(seven_LED_a, OUTPUT);   
  pinMode(seven_LED_b, OUTPUT);
  pinMode(seven_LED_c, OUTPUT);   
  pinMode(seven_LED_d, OUTPUT);
  pinMode(seven_LED_e, OUTPUT);   
  pinMode(seven_LED_f, OUTPUT);   
  pinMode(seven_LED_g, OUTPUT);   
  pinMode(seven_LED_dot, OUTPUT);   
  pinMode(buttonPin, INPUT);
  digitalWrite(seven_LED_dot, HIGH);
}
void sevenSegWrite(byte digit) {
  byte pin = 2;
  for (byte seg = 0; seg < 7; ++seg) {
    digitalWrite(pin, seven_seg_digits);
    ++pin;
  }
}
void loop() {
  buttonState = digitalRead(buttonPin);
  byte digit = 0;
  if(buttonState != lastButtonState){
      if (buttonState == HIGH) {
        sevenSegWrite(digit);
      } else {
        sevenSegWrite(digit+1);
      }
      delay(1000);
  }
      
}   
         

想請問各位大大,我這卡在哪裡呢?
我編譯後七段顯示器目前顯示0
不管按鈕怎麼案都沒反應
我想說這會不會遇到什麼彈跳的問題呢?


如果之後我要讀取目前數字
我是想說我用七隻接腳(INPUT)去讀取abcdefg的電位在轉成數字
我這樣是不是有些多此一舉

因為之後要按鈕控制數字上升下降

然後要把目前數值上傳到雲端
拜託各位大大給個方向了 抱歉我很笨

更新一下最新程式碼
讓有需要的可以取用以及參考
---
//七段顯示器字型碼
byte seven_seg_digits = { { 0,0,0,0,0,0,1 },  // = 0
                                 { 1,0,0,1,1,1,1 },  // = 1
                                 { 0,0,1,0,0,1,0 },  // = 2
                                 { 0,0,0,0,1,1,0 },  // = 3
                                 { 1,0,0,1,1,0,0 },  // = 4
                                 { 0,1,0,0,1,0,0 },  // = 5
                                 { 0,1,0,0,0,0,0 },  // = 6
                                 { 0,0,0,1,1,1,1 },  // = 7
                                 { 0,0,0,0,0,0,0 },  // = 8
                                 { 0,0,0,1,1,0,0 }   // = 9
                             };
const int seven_LED_a = 2;
const int seven_LED_b = 3;  
const int seven_LED_c = 4;  
const int seven_LED_d = 5;  
const int seven_LED_e = 6;  
const int seven_LED_f = 7;  
const int seven_LED_g = 8;  
const int seven_LED_dot = 9;  
const int buttonPin = 10;
//設定一個儲存變數為buttonStatus
int buttonStatus =0;
//設定Button當前狀態
int buttonState = 0;
//設定Button之前狀態
int lastButtonState = 0;
byte digit = 0;
void setup() {
  pinMode(seven_LED_a, OUTPUT);   
  pinMode(seven_LED_b, OUTPUT);
  pinMode(seven_LED_c, OUTPUT);   
  pinMode(seven_LED_d, OUTPUT);
  pinMode(seven_LED_e, OUTPUT);   
  pinMode(seven_LED_f, OUTPUT);   
  pinMode(seven_LED_g, OUTPUT);   
  pinMode(seven_LED_dot, OUTPUT);   
  pinMode(buttonPin, INPUT);
  digitalWrite(seven_LED_dot, HIGH);
  digitalWrite(buttonPin, HIGH); //開啟上拉電阻
  pinMode(13, OUTPUT);  //測試用LED
  sevenSegWrite(digit);
}
void sevenSegWrite(byte digit) {
  byte pin = 2;
  for (byte seg = 0; seg < 7; ++seg) {
    digitalWrite(pin, seven_seg_digits);
    ++pin;
  }
}
void loop() {
  buttonState = digitalRead(buttonPin);
  digitalWrite(13, HIGH);
  if (buttonState != HIGH){ //假如按鈕按下
    if (digit < 9){
       digit++;
       sevenSegWrite(digit);
       digitalWrite(13, LOW);
       delay(300); //抗雜訊,防手殘!
      }else {
        digit = 0;
        sevenSegWrite(digit);
        delay(300); //抗雜訊,防手殘!
        }
  }  
}   
         

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

chevylin0802 發表於 2017-4-28 09:22 AM

本帖最後由 chevylin0802 於 2017-4-28 09:23 AM 編輯

你的按鈕的線路圖是怎麼接的?
因為按鈕的接線方式會影響到你的偵測電位會不會變化
一般有兩種接線方式
按鈕按下的時候電路導通時如果要讓輸入電壓為+5V的話
就必需要在輸入腳位也加一顆電阻接地
而按鈕則是一端接+5V另一端接到輸入腳位上

按鈕按下的時候電路導通時如果要讓輸入電壓為0V的時候
那麼就必需要從+5V接一個電阻接到輸入腳位上
而按鈕則是一端接輸入腳位而另一端接地

如果你完全沒有接電阻的話
那麼你的輸入腳位的電壓是不正確的
當然不管怎麼按都不會有反應


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

a7813195 發表於 2017-4-28 12:20 PM

本帖最後由 a7813195 於 2017-4-28 12:20 PM 編輯

chevylin0802 發表於 2017-4-28 09:22 AM static/image/common/back.gif
你的按鈕的線路圖是怎麼接的?
因為按鈕的接線方式會影響到你的偵測電位會不會變化
一般有兩種接線方式

我有試著用arduino內建的Button範例去執行
是可以執行的但我用這個執行後是失敗的

七段顯示器是CA
Button有電阻接地 另一端是連接到第10腳

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

chevylin0802 發表於 2017-4-28 12:42 PM

本帖最後由 chevylin0802 於 2017-4-28 01:53 PM 編輯

a7813195 發表於 2017-4-28 12:20 PM static/image/common/back.gif
我有試著用arduino內建的Button範例去執行
是可以執行的但我用這個執行後是失敗的


果然是Button接錯了

電阻接到Button的那一條線
要直接分線出來到第10腳
不是從Button的另一端
Button的另一端要接到+5V
而不是去接到第10腳

因為你Button沒有電壓供給
所以第10腳的腳位永遠都是0V
不管你Button有沒有按都一樣是0V
你應該準備一個三用電表
轉到直流電壓檔
然後去量第10腳跟地的電位差
就很容易發現你的接法
電壓根本不會變化

Arduino畢竟是提供I/O端口出來的板子
I/O端口要怎麼接怎麼用都需要再外接線路
所以基本的三用電腦仍然要有
只有電路正確了
你軟體才有辦法正確的運作

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

a7813195 發表於 2017-4-28 03:37 PM

chevylin0802 發表於 2017-4-28 12:42 PM static/image/common/back.gif
果然是Button接錯了

電阻接到Button的那一條線


那麼我另一端應該接到5V
電阻接地那邊不動他
我要再拉一條線到10腳嗎?<br><br><br><br><br><div></div>

chevylin0802 發表於 2017-4-28 03:53 PM

a7813195 發表於 2017-4-28 03:37 PM static/image/common/back.gif
那麼我另一端應該接到5V
電阻接地那邊不動他
我要再拉一條線到10腳嗎?

電阻有一頭是接到地
另一頭跟按鈕的接點相接
這個地方還要拉一條給第10腳
而按鈕的另一頭則是接到+5V上
這樣子你按鈕放開的時候
第10腳的電壓是零
按鈕按下的時候
第10腳的電壓是+5V

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

a7813195 發表於 2017-5-1 12:01 PM

chevylin0802 發表於 2017-4-28 03:53 PM static/image/common/back.gif
電阻有一頭是接到地
另一頭跟按鈕的接點相接
這個地方還要拉一條給第10腳


我想到是不是Arduino有個上拉電阻的指令
這樣是否就能解決拉到5V的問題
之前似乎有看到這樣接 不過好像是有開啟上拉電阻
有錯請鞭

chevylin0802 發表於 2017-5-1 12:37 PM

本帖最後由 chevylin0802 於 2017-5-2 10:47 AM 編輯

a7813195 發表於 2017-5-1 12:01 PM static/image/common/back.gif
我想到是不是Arduino有個上拉電阻的指令
這樣是否就能解決拉到5V的問題
之前似乎有看到這樣接 不過好像是 ...
那要看硬體的規格才行
許多MCU的GPIO確實有的有上拉電阻的設定
但未必每一個都有
像Arduino板子
我是可以給你很肯定確定的說
雖然可以直接透過pinMode()來做
我完全不建議你靠軟體設定來做
原因是它的升壓電阻的值隨著不同的AVR而定
有的是20k~50k歐姆
有的則是50k~150k歐姆
接按鈕的話還無所謂
但如果去接一些感測器的話
恐怕就會傷腦筋了
並不是每一種感測器的升壓電阻都能正常工作
因為到了實務上工作經驗的時候
硬體設計的人未必會鳥你
除非你自己也下去做硬體線路
不過我想應該不太可能
畢竟那未必是你的專業
但即使是如此
做MCU內部的軔體仍然要懂硬體才行
三用電表也是基本的工具
有的時候必要的狀況還是需要量示波器
尤其是I2C線路到底有沒有輸出以及它的時脈到底正不正確都是要靠量測的
切記一點
千萬別以為硬體設計的人一次就可以幫你把線路設計正確
往往都需要軔體的人去幫他們檢查線路
所有的輸出入的接腳到底有沒有訊號
本來就是在做軔體的人在負責的



...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

a7813195 發表於 2017-5-4 12:07 PM

chevylin0802 發表於 2017-5-1 12:37 PM static/image/common/back.gif
那要看硬體的規格才行
許多MCU的GPIO確實有的有上拉電阻的設定
但未必每一個都有


是呀
我用上拉電阻目前的確是可以運作了
但像您說的可能之後會面臨這些問題
我會盡可能一步一步去了解
至於韌體 目前的確是沒有接觸到
硬體部分也只是略懂略懂
像您所說 三用電表示必備基本工具
看來的確是要買個一台 不然我連哪邊有問題都不了解
非常謝謝您給的提示與方向 ...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

chevylin0802 發表於 2017-5-4 12:22 PM

a7813195 發表於 2017-5-4 12:07 PM static/image/common/back.gif
是呀
我用上拉電阻目前的確是可以運作了
但像您說的可能之後會面臨這些問題


你現在做的程式
灌到板子上的那個部份就是叫做軔體
雖然它不是指泛稱的軔體(因為bootloader已經是機器碼且已經下載進去了)
一般來講單晶片的系統設計通常也都是軔體跟硬體一起打包成一體在做
也就是說單晶片從電路設計一直到程式設計一般來講都是同一個人完成

三用電表也只是初淺的必備工具而已
當你用到PWM輸出或PWM監側或I2C介面的時候
還是只能靠示波器
當然不需要非常高精度的專業儀器
目前也有學生可以自己購窄的示波器學習套件
其實已經非常足夠了
因為Arduino可以使用的頻率本來就不高
示波器20MHz的極限已經足夠使用了
雖然它是USB介面
要使用到電腦來當示波器的螢幕操作
不過這種套件非常便宜
不到1500台幣就可以買得到了
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>
頁: [1]