-
1. TCS34725 테스트만들어보기/자연광 모방 조명 2023. 5. 27. 21:37
이 프로젝트에서 중요한건 1. 센싱 2. 통신 3. 전력소비이다.
그 중 3은 1과 2가 충족되는 상태에서 고려하여야 하므로, 우선 1. 센싱을 테스트해보고자 한다.
센서 선정
우선 센서로 TCS34725를 골랐다. 라이브러리가 있어 사용하기 편리하고, 필요한 데이터를 전부 제공한다. 모자라면 나중에 다시 알아보자는 마인드
적당히 성능을 알아보기 위해 LED를 연결하고 적절한 코드를 작성해서 테스트. RGB LED가 없어 3mm LED 3개를 꽂아놓은 게 조금 에러.
적절히 작성한 코드는 다음과 같다.
#include <Wire.h> #include "Adafruit_TCS34725.h" #define RED 9 #define GREEN 10 #define BLUE 11 #define IN_MIN 0 #define IN_MAX 4095 #define OUT_MIN 1 #define OUT_MAX 255 int valueR, valueG, valueB; // Initialise with specific int time and gain values Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_614MS, TCS34725_GAIN_1X); const int interruptPin = 2; volatile boolean state = false; //Interrupt Service Routine void isr() { state = true; } /* tcs.getRawData() does a delay(Integration_Time) after the sensor readout. We don't need to wait for the next integration cycle because we receive an interrupt when the integration cycle is complete */ void getRawData_noDelay(uint16_t *r, uint16_t *g, uint16_t *b, uint16_t *c) { *c = tcs.read16(TCS34725_CDATAL); *r = tcs.read16(TCS34725_RDATAL); *g = tcs.read16(TCS34725_GDATAL); *b = tcs.read16(TCS34725_BDATAL); } void setup(void) { valueR = 0; valueG = 0; valueB = 0; pinMode(interruptPin, INPUT_PULLUP); //TCS interrupt output is Active-LOW and Open-Drain attachInterrupt(digitalPinToInterrupt(interruptPin), isr, FALLING); Serial.begin(9600); if (tcs.begin()) { Serial.println("Found sensor"); } else { Serial.println("No TCS34725 found ... check your connections"); while (1) ; } // Set persistence filter to generate an interrupt for every RGB Cycle, // regardless of the integration limits tcs.write8(TCS34725_PERS, TCS34725_PERS_NONE); tcs.setInterrupt(true); Serial.flush(); pinMode(RED, OUTPUT); pinMode(GREEN, OUTPUT); pinMode(BLUE, OUTPUT); } void loop(void) { uint16_t r, g, b, c, colorTemp, lux; if (state) { getRawData_noDelay(&r, &g, &b, &c); // colorTemp = tcs.calculateColorTemperature(r, g, b); colorTemp = tcs.calculateColorTemperature_dn40(r, g, b, c); lux = tcs.calculateLux(r, g, b); tcs.clearInterrupt(); state = false; } // valueR = (valueR + (r == 0 ? 0 : map(r, 0, 65535, 1, 256))) / 2; // valueG = (valueG + (g == 0 ? 0 : map(g, 0, 65535, 1, 256))) / 2; // valueB = (valueB + (b == 0 ? 0 : map(b, 0, 65535, 1, 256))) / 2; if (valueR > (r == 0 ? 0 : map(r, IN_MIN, IN_MAX, OUT_MIN, OUT_MAX))) { valueR--; } else if (valueR == (r == 0 ? 0 : map(r, IN_MIN, IN_MAX, OUT_MIN, OUT_MAX))) { ; } else { valueR++; } if (valueG > (g == 0 ? 0 : map(r, IN_MIN, IN_MAX, OUT_MIN, OUT_MAX))) { valueG--; } else if (valueG == (g == 0 ? 0 : map(r, IN_MIN, IN_MAX, OUT_MIN, OUT_MAX))) { ; } else { valueG++; } if (valueB > (b == 0 ? 0 : map(r, IN_MIN, IN_MAX, OUT_MIN, OUT_MAX))) { valueB--; } else if (valueB == (b == 0 ? 0 : map(r, IN_MIN, IN_MAX, OUT_MIN, OUT_MAX))) { ; } else { valueB++; } valueR = constrain(valueR, 0, 255); valueG = constrain(valueG, 0, 255); valueB = constrain(valueB, 0, 255); analogWrite(RED, valueR); analogWrite(GREEN, valueG); analogWrite(BLUE, valueB); // Serial.print("RED:"); // Serial.print(valueR); // Serial.print(","); // Serial.print("GREEN:"); // Serial.print(valueG); // Serial.print(","); // Serial.print("BLUE:"); // Serial.println(valueB); // analogWrite(RED, r == 0 ? 0 : map(r, 0, 65535, 1, 256)); // analogWrite(GREEN, g == 0 ? 0 : map(g, 0, 65535, 1, 256)); // analogWrite(BLUE, b == 0 ? 0 : map(b, 0, 65535, 1, 256)); Serial.print("Color Temp: "); Serial.print(colorTemp, DEC); Serial.print(" K - "); Serial.print("Lux: "); Serial.print(lux, DEC); Serial.print(" - "); Serial.print("R: "); Serial.print(valueR, DEC); Serial.print(" "); Serial.print("G: "); Serial.print(valueG, DEC); Serial.print(" "); Serial.print("B: "); Serial.print(valueB, DEC); Serial.print(" "); Serial.print("C: "); Serial.print(c, DEC); Serial.print(" "); Serial.println(" "); delay(10); }
내장된 LED를 켜서 이것저것 갖다대어 보니 맞는 값을 내놓는 것 같기는 하다.
통신 구현하고 전력소비 계산해서 전원 문제 해결하고 하우징 모델링해서 내놓고 LED바에 연결하면 끝이다.
모노콥터보다는 머리아플 일이 훨씬 적어보이는데...
P.s 모노콥터는 1차 출력한 프레임이 치수가 안맞아서, 버니어캘리퍼스를 구매해서 치수에 맞게 모델링을 수정해둔 상태... 출력을 다시 맡겨야 한다... 눈대중 모델링은 하는게 아니라는 가르침을 얻었습니다.
'만들어보기 > 자연광 모방 조명' 카테고리의 다른 글
3. 태양광 시스템 구성 (0) 2023.08.04 2. nRF24L01과 씨름하기 (0) 2023.06.09 0. 들어가며 (0) 2023.05.19