Robofun 機器人論壇

標題: 用可調式電阻改變LED燈位置 [打印本頁]

作者: Suzaku    時間: 2012-10-20 01:45
標題: 用可調式電阻改變LED燈位置
各位前輩好小弟照著cooper大的教學網站,自己練習寫出了些問題想請教
接上一顆可變電阻,利用可變電阻來控制 LED bar graph。提醒:使用 analogRead() 讀進來的可變電阻數值介於 0 到 1023,程式的邏輯可以這樣寫:介於 0 – 99 就開第一顆 LED依此類推。
而我自己是這樣寫
int SensorPin = 3 ;
int ledpins[] = {
  2,3,4,5,6 };




void setup() {


  Serial.begin(9600) ;
  pinMode(ledpins[2,3,4,5,6],OUTPUT);
  pinMode(SensorPin,INPUT);



}


void loop() {
    int SensorValue = analogRead(SensorPin) ;
    Serial.println(SensorValue,DEC);
      
  if (SensorValue >= 0 & SensorValue < 200) {
    digitalWrite(ledpins[2], HIGH);
}
  else if (SensorValue >= 200 & SensorValue < 400) {
    digitalWrite(ledpins[2], LOW);
    digitalWrite(ledpins[3], HIGH);
  }
  else if (SensorValue >= 400 & SensorValue < 600) {
    digitalWrite(ledpins[3], LOW);
    digitalWrite(ledpins[4], HIGH);
  }
  else if (SensorValue >= 600 & SensorValue < 800) {
    digitalWrite(ledpins[4],LOW);
    digitalWrite(ledpins[5],HIGH);
  }
  else {
    digitalWrite(ledpins[5],LOW);
    digitalWrite(ledpins[6],HIGH);
  }
}



大致上就是希望3號腳讀取電阻值,然後下一盞開了之後上一盞就關掉,但驗證的結果它在下一盞燈亮的時候上一盞也關不掉
然後繼續往上調到最大也只能亮三盞燈而已,能拜託幫我指正一下嗎?謝謝
作者: Shinwei    時間: 2012-10-23 21:16
大致上是掉到邏輯上陷阱!

你假設每個VR值區間是對的,但是你忽略下個區間應該被限制!

假設VR值是 200
if (SensorValue >= 0 & SensorValue < 200) ---> 200 >=0 執行,所以 SensorValue >= 0 去掉
if (SensorValue >= 200 & SensorValue < 400) ---> 200 >= 200 執行
結果,會是 ledpins[2] 應該會變暗一點,因為一直在高速開開關關,人眼無法分別!

Serial.println(SensorValue,DEC);
你有加駐這一行,應該可以看到VR值!
打開 序列埠監視視窗 看看轉動VR時能否到達 800 以上!
作者: g921002    時間: 2012-10-24 09:46
本帖最後由 g921002 於 2012-10-24 16:00 編輯

回復 1# Suzaku

1.你宣告陣列 int ledpins[] = {2,3,4,5,6 }; ,所引值最大不過4,ledpins[6]、ledpins[5]不應該出現吧?
2.如果你指示要把ADC的值分做5等份點燈,那用map去規範區間

PS.以下CODE純腦內補完,沒有測試~~~(我不用Arduino的)


  1. #define LEDSIZE 5
  2. int SensorPin = 3 ;
  3. int ledpins[LEDSIZE] = {2,3,4,5,6 };


  4. void setup()
  5. {
  6.   Serial.begin(9600) ;
  7.   //pinMode(ledpins[2,3,4,5,6],OUTPUT); <--- 勘誤
  8.   for(int ix=0;ix<LEDSIZE;ix++)
  9.   {
  10.     pinMode(ledpins[ix],OUTPUT);
  11.   }
  12.   pinMode(SensorPin,INPUT);
  13. }

  14. void  turnOneLed(unsigned char pins[],int length,int led)
  15. {
  16.   for (int i = 0; i < length; i++)
  17.   {
  18.        if(ix==led){ digitalWrite(pins[ix], HIGH);}
  19.        else{digitalWrite(pins[ix], LOW);}
  20.   }
  21. }

  22. void loop()
  23. {
  24.     int SensorValue = analogRead(SensorPin) ;
  25.     int LedChn = map(SensorValue, 0, 1024, 0, 4);
  26.     turnOneLed(ledpins,LEDSIZE,LedChn);
  27. }
複製代碼


作者: Shinwei    時間: 2012-10-24 15:12
高手出現了!

光這一行指令,就受用無窮~
int LedChn = map(SensorValue, 0, 1024, 0, 4);
作者: coopermaa    時間: 2012-10-24 15:37
沒想到我出的習題真的有人做~~~ :)

g921002 已經骨架做得差不多囉!
不過,要注意一下,這行這樣寫是不行的:

pinMode(ledpins[2,3,4,5,6],OUTPUT);

因為 pinMode() 一次只能設定一個 pin,請參考:
http://www.arduino.cc/en/Reference/pinMode
作者: g921002    時間: 2012-10-24 15:49
本帖最後由 g921002 於 2012-10-24 15:55 編輯

沒注意到說~~
那個我是從原PO貼過來的.XD 那個也是索引值溢出的問題~~~

  1. for(int ix=0;ix<5;ix++)
  2. {
  3.     pinMode(ledpins[ix],OUTPUT);
  4. }
複製代碼


我從來沒用過Arduino啊~~~冏rz
作者: Suzaku    時間: 2012-10-26 01:58
先謝謝各位大爺回答我的問題。

Shin大  我也不知道我寫的那串是怎麼回事 從那個Monitor可以看到我的值可以超過800,但是很奇怪的他調到1023時沒半個燈亮,調到0時會亮兩個燈,不管怎樣調他最多就只有兩個燈。


g92大  謝謝,程式碼我心懷感激地收下了,不過想問一下那個索引值詳細是怎麼回事,我還新手不是很懂,然後L10的for(int ix=0;ix<LEDSIZE;ix++)和L12的pinMode(ledpins[ix] 這括號裡的ix他究竟會認為是5還是會認為是ledpin的那幾隻腳位{2,3,4,5,6}這些呢?


cooper大  謝謝你的教學網站,不過有些地方真的想問一下像是你的LAB5 LED Bar的L10程式碼pinMode(ledPins[thisLed], OUTPUT),所以[]裡的thisLed實際上他也一次只有設定一個pin的意思嗎? 還有一個問題就是在LAB6的蜂鳴器在void setup的大括號{}之內,沒有寫pinMode之類的東西,不用替蜂鳴器的腳位設定OUTPUT嗎?究竟什麼情況要在setup裡寫東西什麼時候不用寫?
作者: g921002    時間: 2012-10-27 01:14
回復 7# Suzaku

你要不要花個5分鐘複習一下C語言入門中的陣列?
作者: pkduke2003    時間: 2012-10-27 17:52
小弟拿出我剛買的 ArduinoUNO 參考coopermaa大大網站
我這樣寫 你參考看看
int potPin = 3;
int ledPins[] = {2, 3, 4, 5, 6, 7,8,9,10,11};
void setup()
{
   for (int thisLed = 0; thisLed < 10; thisLed++)
   {
    pinMode(ledPins[thisLed], OUTPUT);
   }
}
void loop()
{
  int sensorValue = analogRead(potPin);
  sensorValue=map(sensorValue, 0, 1023, 0, 9);
  digitalWrite(ledPins[sensorValue], HIGH);
  delay(100);
  digitalWrite(ledPins[sensorValue], LOW);
}
作者: Suzaku    時間: 2012-11-2 22:49
g921大  我懂你說的意思了,你是指說我既然定義五個腳位應該寫從0,1,2,3,4這樣子嗎?

pkduke大 非常謝謝 有成功了,只是我有點不懂後面兩段的程式碼該怎麼解釋,delay0.1秒延遲之後再去把前一盞關掉嗎?




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2