Skip to content

Instantly share code, notes, and snippets.

@A-L-E-X
Created February 19, 2015 16:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save A-L-E-X/e2e00319789b4b3c0ec8 to your computer and use it in GitHub Desktop.
Save A-L-E-X/e2e00319789b4b3c0ec8 to your computer and use it in GitHub Desktop.
adafruit rgb sensor
#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