Created
February 19, 2015 16:55
-
-
Save A-L-E-X/e2e00319789b4b3c0ec8 to your computer and use it in GitHub Desktop.
adafruit rgb sensor
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <LiquidCrystal.h> | |
#include <Wire.h> | |
#include "Adafruit_TCS34725.h" | |
#define TWOBUTTONS // если работает одна кнопка, то надо закомментить | |
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C O N S T R U C T O R S - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
/* | |
// Integration time constants | |
// void Adafruit_TCS34725::setIntegrationTime(tcs34725IntegrationTime_t it); | |
TCS34725_INTEGRATIONTIME_2_4MS = 0xFF // < 2.4ms | |
TCS34725_INTEGRATIONTIME_24MS = 0xF6 // < 24ms | |
TCS34725_INTEGRATIONTIME_50MS = 0xEB // < 50ms | |
TCS34725_INTEGRATIONTIME_101MS = 0xD5 // < 101ms | |
TCS34725_INTEGRATIONTIME_154MS = 0xC0 // < 154ms | |
TCS34725_INTEGRATIONTIME_700MS = 0x00 // < 700ms | |
// Sets the gain of the ADC to control the sensitivity of the sensor. Valid gain settings are: | |
// void Adafruit_TCS34725::setGain(tcs34725Gain_t gain) | |
TCS34725_GAIN_1X = 0x00 // < No gain | |
TCS34725_GAIN_4X = 0x01 // < 2x gain | |
TCS34725_GAIN_16X = 0x02 // < 16x gain | |
TCS34725_GAIN_60X = 0x03 // < 60x gain | |
// Initialise with default values (int time = 2.4ms, gain = 1x) | |
// Adafruit_TCS34725 tcs = Adafruit_TCS34725(); | |
// Initialise with specific int time and gain values | |
// Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X); | |
*/ | |
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_154MS, TCS34725_GAIN_60X); // был TCS34725_GAIN_4X | |
//LiquidCrystal lcd(RS, En, D4, D5, D6, D7); | |
LiquidCrystal lcd(9, 8, 10, 11, 12, 13); // конструктор. цифры обозначают номера пинов в порядке RS, En, D4, D5, D6, D7 | |
// Vdd - red | |
// Vss - brown | |
// En - orange - 8 | |
// RS - yellow - 9 (Register Select) | |
// D6 - purple - 12 | |
// D7 - gray - 13 | |
// D4 - green - 10 | |
// D5 - blue - 11 | |
// - - - - - - - - - - - - - - - - - - - - - - - - - - - C O N S T D E F I N I T I O N S - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
const uint8_t blueLedPin = 6; // пин, к которому подключен синий светодиод | |
const uint8_t greenLedPin = 5; // пин, к которому подключен зеленый светодиод | |
const uint8_t whiteLedPin = 4; // пин, к которому подключен белый светодиод (на плате сенсора) | |
const uint8_t buttonPin1 = 2; // пин, к которому подключена кнопка управления диодами | |
const uint8_t buttonPin2 = 3; // пин, к которому подключена кнопка yправления режимом дисплея | |
const uint16_t buttonPressTimeout = 100; // таймаут по нажатию (не чаще 10 нажатий в сек - норма) | |
const uint16_t displayRefreshTimeout = 2000; // таймаут по обновлению экрана (2 раза в сек) - сейчас не используется // поправил 3000 | |
const uint16_t sensorCheckTimeout = 100; // опрос таймера 10 раз в сек | |
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - V A R D E F I N I T I O N S - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
uint8_t buttonPressed1 = 0; // флаг для захвата состояния нажатия/отжатия кнопки | |
uint8_t lastTimeButtonPressed1 = 0; // метка времени, когда произошло последнее нажатие кнопки - нужно для защиты от дребезга | |
uint8_t ledActive = 2; // указывает состояние свечение светодиодов (0 -ничего не горит, 1 - горит синий, 2 - горит зеленый) | |
uint8_t buttonPressed2 = 0; // флаг для захвата состояния нажатия/отжатия кнопки | |
uint8_t lastTimeButtonPressed2 = 0; // метка времени, когда произошло последнее нажатие кнопки - нужно для защиты от дребезга | |
uint8_t displayMode = 0; // 0 - default mode (temp + C mode), 1 - RGB mode | |
uint32_t lastTimeDisplayed = 0; // метка системного времени, когда последний раз отображались данные | |
uint32_t lastTimeSensorChecked = 0; // метка системного времени, когда последний раз отображались считывались данные с сенсора | |
uint16_t r, g, b, c, colorTemp, lux; // поправил. теперь они глобальные и видны везде. | |
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - S E T U P F U N C T I O N - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
void setup() | |
{ | |
pinMode(blueLedPin, OUTPUT); // инициализируем пин синего светодиода как вЫход | |
pinMode(greenLedPin, OUTPUT); // инициализируем пин зеленого светодиода как вЫход | |
pinMode(whiteLedPin, OUTPUT); // инициализируем пин белого светодиода как вЫход | |
pinMode(buttonPin1, INPUT); // инициализируем пин кнопки как вход | |
pinMode(buttonPin2, INPUT); // инициализируем пин кнопки как вход | |
digitalWrite(blueLedPin, LOW); // выключение синего светодиода | |
digitalWrite(greenLedPin, HIGH); // выключение зеленого светодиода | |
digitalWrite(whiteLedPin, LOW); // выключение белого светодиода | |
digitalWrite(buttonPin1, HIGH); // подтяжка кнопки к питанию | |
digitalWrite(buttonPin2, HIGH); // подтяжка кнопки к питанию | |
lcd.begin(16, 2); // LCD initialization: 2 rows and 16 characters | |
Serial.begin(115200); // иниц серийного порта | |
tcs.begin(); | |
} | |
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - M A I N L O O P - - - - - - - - - - - - - - - - - - - - - - - | |
void loop() | |
{ | |
checkButtons(); // обработка события нажатия кнопки | |
if(millis() - lastTimeSensorChecked > sensorCheckTimeout) | |
{ | |
processRGBSensor(); | |
lastTimeSensorChecked = millis(); | |
} | |
// на самом деле как-то нелогично отображать данные реже, чем они читаются с датчика. По идее тела двух if-ов надо объединить в один и пользоваться одним таймаутом | |
if(millis() - lastTimeDisplayed > displayRefreshTimeout) | |
{ | |
displayData(); | |
lastTimeDisplayed = millis(); | |
} | |
} | |
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A U X F U N C T I O N S - - - - - - - - - - - - - - - - - - - - - - - - - - - - | |
// - - - - - - - - - - - - - - - - - - - - - - - - - - | |
void processRGBSensor() | |
{ | |
tcs.getRawData(&r, &g, &b, &c); | |
colorTemp = tcs.calculateColorTemperature(r, g, b); | |
lux = tcs.calculateLux(r, g, b); | |
} | |
void displayData() | |
{ | |
lcd.begin(16, 2); // переинициализация дисплея (в случае если в проводах навелись помехи или произошел краткий обрыв сигнальных цепей) | |
lcd.clear(); // очистка экрана | |
switch(displayMode) | |
{ | |
case 0: | |
lcd.setCursor(0, 0); // установка курсора на печать в верхней строке с 1й позиции (счет идет с 0й позиции по 15ю слева-направо, а строки сверху-вниз) | |
// lcd.print('T'); | |
lcd.print(colorTemp); | |
lcd.print(','); | |
lcd.setCursor(8, 0); // установка курсора на печать в верхней строке с 8й позиции (счет идет с 0й позиции по 15ю слева-направо, а строки сверху-вниз) | |
// lcd.print('C'); | |
lcd.print(c); | |
break; | |
case 1: | |
lcd.setCursor(0, 1); | |
lcd.print('R'); | |
lcd.print(r/10); | |
lcd.print(','); | |
lcd.setCursor(5, 1); | |
lcd.print('G'); | |
lcd.print(g/10); | |
lcd.print(','); | |
lcd.setCursor(11, 1); | |
lcd.print('B'); | |
lcd.print(b/10); | |
break; | |
} | |
} | |
// - - - - - - - - - - - - - - - - - - - - - - - - - - | |
// здесь обрабатывается событие нажатия кнопки (защита от дребезга контактов и запоминание состояния) а также переключение режимов светодиодов (0 - 1 - 2) | |
void checkButtons() | |
{ | |
// обработка нажатия/отпускания кнопки и защиты от дребезгов контактов | |
if(!digitalRead(buttonPin2) && (millis() - lastTimeButtonPressed2 >= buttonPressTimeout)) | |
{ | |
if(buttonPressed2 == 0) | |
{ | |
buttonPressed2 = 1; // флаг нажатия (обработка первого фронта) | |
displayMode = 1 - displayMode; // меняем режим дисплея | |
lastTimeButtonPressed2 = millis(); // защита от дребезга кнопки по фронту (при нажатии) | |
} | |
} | |
else | |
{ | |
delay(1); // защита от дребезга при отжатии кнопки | |
buttonPressed2 = 0; // сброс флага нажатия (это значит, что кнопку отпустили) | |
} | |
#ifdef TWOBUTTONS | |
// обработка нажатия/отпускания кнопки и защиты от дребезгов контактов | |
if(!digitalRead(buttonPin1) && (millis() - lastTimeButtonPressed1 >= buttonPressTimeout)) | |
{ | |
if(buttonPressed1 == 0) | |
{ | |
buttonPressed1 = 1; // флаг нажатия (обработка первого фронта) | |
ledActive++; // инкрементим состояние светодиода (т.е. переключаем светодиоды) | |
if(ledActive > 2) ledActive = 0; // замыкаем переключение | |
lastTimeButtonPressed1 = millis(); // защита от дребезга кнопки по фронту (при нажатии) | |
} | |
} | |
else | |
{ | |
delay(1); // защита от дребезга при отжатии кнопки | |
buttonPressed1 = 0; // сброс флага нажатия (это значит, что кнопку отпустили) | |
} | |
// далее идет обработка разных вариантов состояния светодиодов | |
switch(ledActive) | |
{ | |
case 0: | |
digitalWrite(blueLedPin, LOW); | |
digitalWrite(greenLedPin, LOW); | |
digitalWrite(whiteLedPin, LOW); | |
break; | |
case 1: | |
digitalWrite(blueLedPin, HIGH); | |
digitalWrite(greenLedPin, LOW); | |
digitalWrite(whiteLedPin, LOW); | |
break; | |
case 2: | |
digitalWrite(blueLedPin, LOW); | |
digitalWrite(greenLedPin, HIGH); | |
digitalWrite(whiteLedPin, LOW); | |
break; | |
} | |
#endif | |
} | |
// - - - - - - - - - - - - - - - - - - - - - - - - - - |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment