2016年9月27日 星期二

繼續貪心的加功能-SciCore 多功能sensor

之前就想做還沒做的,就是RGB三色LED燈泡調控顏色的功能。要做這個其實蠻奢侈的,因為要控制三個燈泡,就要用到三個analog腳位讀取可變電阻的訊號,還要三個PWM(pulse width modulation)的 digital腳位來輸出訊號。arduino UNO上的PWM腳位在3, 5, 6, 9, 10, 11。其中11號之前被pH meter用掉了。所以就選擇6, 9 , 10 擔任 RGB腳位。



然後一開始就遇到一個大麻煩,因為原本的Arduino UNO上就已經佔用了A0, A1, A2三個腳位擔任不同功能。接下來RGB就要用到A3, A4, A5。但是A4, A5會影響LCD顯示,試了幾次都失敗。後來齋戒沐浴後,問了阿簡大神,知道A4, A5雖然可以並聯一些sensor,但是不能用在可變電阻這種上面,所以就調整一下。把A1, A2 負責壓力和pH計的腳位移動到A4, A5,A0負責檔位調控, A1~A3就都給RGB燈泡了。

這個解決了就簡單了,就是讀取A1~A3的數值,用map縮成0-255,再讓D6, 9, 10輸出就行。然後再讓LCD.print出RGB的數值,就變成可以調控顏色的燈泡囉。



#include <Wire.h>  // Arduino IDE 內建
// LCD I2C Library,從這裡可以下載:
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
#include <LiquidCrystal_I2C.h>
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // 設定 LCD I2C 位址
//以上是驅動LCD的部分


#define LEDR 6                    //定義輸出的腳位
#define LEDG 9
#define LEDB 1
int potPinR = 1;                       //設定輸入訊號的腳位
int potPinG = 2;
int potPinB = 3;
void setup() {                
  Serial.begin(9600);
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
}

int r = 0;
int g = 0;
int b = 0;

void loop() {
  r = analogRead(potPinR);                      
  r = map(r, 0, 1023, 0, 255);
  analogWrite(LEDR, r);

  g = analogRead(potPinG);
  g = map(g, 0, 1000, 0, 255);
  analogWrite(LEDG, g);
  
  b = analogRead(potPinB);
  b = map(b, 0, 1023, 0, 255);
  analogWrite(LEDB, b);
  Serial.print("R= ");
  Serial.print(r);
  Serial.print("  G= ");
  Serial.print(g);
  Serial.print("  B= "); 
  Serial.println(b);  
  lcd.setCursor(0,0);
  lcd.print("R= ");
  lcd.print(r);
  lcd.print(" G= ");
  lcd.print(g);
  lcd.setCursor(0,1);
  lcd.print("B= "); 
  lcd.print(b);  
}
張貼留言