diff --git a/ESP32/RgbSpectralSensor/AS7262.pdf b/ESP32/RgbSpectralSensor/AS7262.pdf new file mode 100644 index 0000000..65b385d Binary files /dev/null and b/ESP32/RgbSpectralSensor/AS7262.pdf differ diff --git a/ESP32/RgbSpectralSensor/Example1_BasicReadings..txt b/ESP32/RgbSpectralSensor/Example1_BasicReadings..txt new file mode 100644 index 0000000..1298f68 --- /dev/null +++ b/ESP32/RgbSpectralSensor/Example1_BasicReadings..txt @@ -0,0 +1,128 @@ +/* + This is a library written for the AS726X Spectral Sensor (Visible or IR) with I2C firmware + specially loaded. SparkFun sells these at its website: www.sparkfun.com + + Written by Nathan Seidle & Andrew England @ SparkFun Electronics, July 12th, 2017 + + https://github.com/sparkfun/Qwiic_Spectral_Sensor_AS726X + + Do you like this library? Help support SparkFun. Buy a board! + + Development environment specifics: + Arduino IDE 1.8.1 + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + + ---AVAILABLE FUNCTIONS--- + AS726X(TwoWire &wirePort = Wire, byte gain = 3, byte measurementMode = 3); + void takeMeasurements(); + void takeMeasurementsWithBulb(); + void printMeasurements(); + byte getTemperature(); + float getTemperatureF(); + void setMeasurementMode(byte mode); + boolean dataAvailable(); + void enableIndicator(); + void disableIndicator(); + void setIndicatorCurrent(byte current); + void enableBulb(); + void disableBulb(); + void setBulbCurrent(byte current); + void softReset(); + void setGain(byte gain); + void setIntegrationTime(byte integrationValue); + void enableInterrupt(); + void disableInterrupt(); + + //Get the various color readings + int getViolet(); + int getBlue(); + int getGreen(); + int getYellow(); + int getOrange(); + int getRed(); + + //Get the various NIR readings + int getR(); + int getS(); + int getT(); + int getU(); + int getV(); + int getW(); + + //Returns the various calibration data + float getCalibratedViolet(); + float getCalibratedBlue(); + float getCalibratedGreen(); + float getCalibratedYellow(); + float getCalibratedOrange(); + float getCalibratedRed(); + + float getCalibratedR(); + float getCalibratedS(); + float getCalibratedT(); + float getCalibratedU(); + float getCalibratedV(); + float getCalibratedW(); +*/ + +#include "AS726X.h" + +AS726X sensor; + +void setup() { + Wire.begin(); + Serial.begin(115200); + + sensor.begin(); +} + +void loop() { + sensor.takeMeasurements(); + //Prints all measurements + if (sensor.getVersion() == SENSORTYPE_AS7262) + { + //Visible readings + Serial.print(" Reading: V["); + Serial.print(sensor.getCalibratedViolet(), 2); + Serial.print("] B["); + Serial.print(sensor.getCalibratedBlue(), 2); + Serial.print("] G["); + Serial.print(sensor.getCalibratedGreen(), 2); + Serial.print("] Y["); + Serial.print(sensor.getCalibratedYellow(), 2); + Serial.print("] O["); + Serial.print(sensor.getCalibratedOrange(), 2); + Serial.print("] R["); + Serial.print(sensor.getCalibratedRed(), 2); + } + else if (sensor.getVersion() == SENSORTYPE_AS7263) + { + //Near IR readings + Serial.print(" Reading: R["); + Serial.print(sensor.getCalibratedR(), 2); + Serial.print("] S["); + Serial.print(sensor.getCalibratedS(), 2); + Serial.print("] T["); + Serial.print(sensor.getCalibratedT(), 2); + Serial.print("] U["); + Serial.print(sensor.getCalibratedU(), 2); + Serial.print("] V["); + Serial.print(sensor.getCalibratedV(), 2); + Serial.print("] W["); + Serial.print(sensor.getCalibratedW(), 2); + } + + Serial.print("] tempF["); + Serial.print(sensor.getTemperatureF(), 1); + Serial.print("]"); + + Serial.println(); +} diff --git a/ESP32/RgbSpectralSensor/RgbSpectralSensor.ino b/ESP32/RgbSpectralSensor/RgbSpectralSensor.ino new file mode 100644 index 0000000..5f809b7 --- /dev/null +++ b/ESP32/RgbSpectralSensor/RgbSpectralSensor.ino @@ -0,0 +1,477 @@ + +//2DO: +// obsługa przycisków zmieniających menu i LED + +//160x128 + +#define Version "0.0.0" +#include +#include +#include +#include +#include "AS726X.h" +#define TFT_DC 8 +#define TFT_CS 9 +#define TFT_RST 10 + +#define Btn1 21 //on board: A1 menu +#define Btn2 20 //on board: A2 gain +#define Btn3 19 //on board: A3 ??? + +#define WHITE 0xFFFF +#define BLACK 0x0000 +#define GRAY 0x8410 +#define RED 0xF800 +#define ORANGE 0xFA60 +#define YELLOW 0xFFE0 +#define LIME 0x07FF +#define GREEN 0x07E0 +#define CYAN 0x07FF +#define AQUA 0x04FF +#define BLUE 0x001F +#define MAGENTA 0xF81F +#define PINK 0xF8FF +//#define ST7735 NEW 0xD500FF + + + + +AS726X sensor; +Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); + +int RawRed = 0; +int RawOrange = 0; +int RawYellow = 0; +int RawGreen = 0; +int RawBlue = 0; +int RawViolet = 0; +float CalcRed = 0.0; +float CalcOrange = 0.0; +float CalcYellow = 0.0; +float CalcGreen = 0.0; +float CalcBlue = 0.0; +float CalcViolet = 0.0; +int HeightRed = 0; +int HeightOrange = 0; +int HeightYellow = 0; +int HeightGreen = 0; +int HeightBlue = 0; +int HeightViolet = 0; + +byte gain = 3; // values: 0,1,2,3 +float gainValue = 64; +int menu_number = 0; // values:0 menu 1,2,3 bez led, 4,5,6 z LED +int LedPower = 0; +int GraphHeight = 128; +int GrapWidth = 25; +float ReadValues[6] = {0, 0, 0, 0, 0, 0}; +float maxValue = 0.0; +float minValue = 0.0; +float test_vle = 1.0; +char FloatInChar[20]; +char ChValue[20]; + + + + + + + +void setup() { + tft.initR(INITR_BLACKTAB); + tft.fillScreen(BLACK); + tft.setRotation(1); + tft.setTextSize(1); + tft.setTextColor(WHITE); + tft.setCursor(0, 0); + tft.println("Version:"); + tft.setCursor(0, 10); + tft.println(Version); + + delay(1000); + Wire.begin(); + Serial.begin(115200); + sensor.begin(); + pinMode(Btn1, INPUT); + pinMode(Btn2, INPUT); +} +void drawControls() { + tft.fillScreen(BLACK); + + // ////tft.setRotation(0); + // linia pozycyjna LED + tft.drawPixel(127, 24, WHITE); + if (LedPower == 1) { + tft.drawLine(127, 26, 127, 31, WHITE); + } + //gain: + tft.drawPixel(127, 0, WHITE); + if (gain >= 1) { + tft.drawPixel(127, 2, WHITE); + } + if (gain >= 2) { + tft.drawPixel(127, 4, WHITE); + } + if (gain >= 3) { + tft.drawPixel(127, 6, WHITE); + } + // menu + if (menu_number >= 1 ) { + tft.drawPixel(127, 10, WHITE); + } + if ((menu_number >= 2 && menu_number < 5 ) || menu_number >= 6 ) { + tft.drawPixel(127, 12, WHITE); + } + if ((menu_number >= 3 && menu_number < 5) || menu_number >= 7 ) { + tft.drawPixel(127, 14, WHITE); + } + if ((menu_number >= 4 && menu_number < 5 ) || menu_number >= 8 ) { + tft.drawPixel(127, 16, WHITE); + } + +} +void loop() { + tft.fillScreen(ST77XX_BLACK); + tft.setTextSize(1); + tft.setTextColor(WHITE); + +// //TESTY +// tft.setCursor(0, 0); +// tft.setTextColor(WHITE); +// tft.setTextWrap(true); +// tft.print("test"); +// delay(500); +// tft.fillRect(0, 64 , 25, 64, RED); +// tft.fillRect(25, 64 , 25, 64, ORANGE); +// tft.fillRect(50, 64 , 25, 64, YELLOW); +// tft.fillRect(75, 64 , 25, 64, GREEN); +// tft.fillRect(100, 64 , 25, 64, BLUE); +// tft.fillRect(125, 64 , 25, 64, MAGENTA); +// delay(1000); + + + + + //menu change + if (digitalRead(Btn2) == HIGH) { + if (menu_number < 8) { + menu_number = menu_number + 1; + } else { + menu_number = 0; + } + } + + + + + if (menu_number == 0 ) {//show menu + drawControls(); + tft.setCursor(0, 0); + tft.println("GAIN"); + tft.setCursor(32, 0); + tft.println(gainValue, 1); + tft.setCursor(64, 0); + tft.println("LED: 5-8"); + tft.setCursor(0, 8); + tft.println("0:Menu 1:Calculated"); + tft.setCursor(0, 16); + tft.println("2:Raw 3:Reltive Graph"); + tft.setCursor(0, 24); + tft.println("4:Calculated Graph"); + delay(0); + } + + // + if (menu_number == 1 || menu_number == 5 ) {//show calculated values + drawControls(); + //tft.setRotation(0); + tft.setCursor(0, 25); + tft.println("R:"); + tft.setCursor((GrapWidth), 25); + tft.println("O:"); + tft.setCursor((GrapWidth) * 2, 25); + tft.println("Y:"); + tft.setCursor((GrapWidth) * 3, 25); + tft.println("G:"); + tft.setCursor((GrapWidth) * 4, 25); + tft.println("B:"); + tft.setCursor((GrapWidth) * 5, 25); + tft.println("V:"); + ////tft.setRotation(3); + tft.setCursor(0, 4); + dtostrf(CalcRed, 10, 1, FloatInChar); + tft.println(FloatInChar); + tft.setCursor(0, (GrapWidth * 1) + 5); + dtostrf(CalcOrange, 10, 1, FloatInChar); + tft.println(FloatInChar); + tft.setCursor(0, (GrapWidth * 2) + 5); + dtostrf(CalcYellow, 10, 1, FloatInChar); + tft.println(FloatInChar); + tft.setCursor(0, (GrapWidth * 3) + 5); + dtostrf(CalcGreen, 10, 1, FloatInChar); + tft.println(FloatInChar); + tft.setCursor(0, (GrapWidth * 4) + 5); + dtostrf(CalcBlue, 10, 1, FloatInChar); + tft.println(FloatInChar); + tft.setCursor(0, (GrapWidth * 5) + 5); + dtostrf(CalcViolet, 10, 1, FloatInChar); + tft.println(FloatInChar); + } + + // ////tft.setRotation(0); + //show raw values + if (menu_number == 2 || menu_number == 6) { + drawControls(); + ////tft.setRotation(0); + tft.setCursor(0, 25); + tft.println("R"); + tft.setCursor((GrapWidth), 25); + tft.println("O"); + tft.setCursor((GrapWidth) * 2, 25); + tft.println("Y"); + tft.setCursor((GrapWidth) * 3, 25); + tft.println("G"); + tft.setCursor((GrapWidth) * 4, 25); + tft.println("B"); + tft.setCursor((GrapWidth) * 5, 25); + tft.println("V"); + ////tft.setRotation(3); + + tft.setCursor(0, 4); + dtostrf(RawRed, 10, 0, FloatInChar); + tft.println(FloatInChar); + tft.setCursor(0, (GrapWidth * 1) + 5); + dtostrf(RawOrange, 10, 0, FloatInChar); + tft.println(FloatInChar); + tft.setCursor(0, (GrapWidth * 2) + 5); + dtostrf(RawYellow, 10, 0, FloatInChar); + tft.println(FloatInChar); + tft.setCursor(0, (GrapWidth * 3) + 5); + dtostrf(RawGreen, 10, 0, FloatInChar); + tft.println(FloatInChar); + tft.setCursor(0, (GrapWidth * 4) + 5); + dtostrf(RawBlue, 10, 0, FloatInChar); + tft.println(FloatInChar); + tft.setCursor(0, (GrapWidth * 5) + 5); + dtostrf(RawViolet, 10, 0, FloatInChar); + tft.println(FloatInChar); + } + + + ////tft.setRotation(0); + + //show relative calculated values graph + if (menu_number == 3 || menu_number == 7 ){ + maxValue = 0; + drawControls(); + ////tft.setRotation(0); + + for (int i = 0; i < 5; i++) { + maxValue = max(maxValue, ReadValues[i]); + } + HeightRed = int((CalcRed / maxValue) * GraphHeight); + HeightOrange = int((CalcOrange / maxValue) * GraphHeight); + HeightYellow = int((CalcYellow / maxValue) * GraphHeight); + HeightGreen = int((CalcGreen / maxValue) * GraphHeight); + HeightBlue = int((CalcBlue / maxValue) * GraphHeight); + HeightViolet = int((CalcViolet / maxValue) * GraphHeight); + + + tft.setCursor(1 * GrapWidth -10, 10); + if (HeightRed >25){ + tft.setTextColor(BLACK); + } + + tft.fillRect(0 * GrapWidth, GraphHeight - HeightRed, GrapWidth, HeightRed, RED); + tft.fillRect(1 * GrapWidth + 1, GraphHeight - HeightOrange, GrapWidth, HeightOrange, ORANGE); + tft.fillRect(2 * GrapWidth + 2, GraphHeight - HeightYellow, GrapWidth, HeightYellow, YELLOW); + tft.fillRect(3 * GrapWidth + 3, GraphHeight - HeightGreen, GrapWidth, HeightGreen, GREEN); + tft.fillRect(4 * GrapWidth + 4, GraphHeight - HeightBlue, GrapWidth, HeightBlue, BLUE); + tft.fillRect(5 * GrapWidth + 5, GraphHeight - HeightViolet, GrapWidth, HeightViolet, MAGENTA); + tft.setCursor(1 * GrapWidth -10, 0); + if (HeightRed > 28){ + tft.setTextColor(BLACK); + }else { + tft.setTextColor(WHITE); + } + tft.println("R:"); + tft.setCursor(2 * GrapWidth -10, 0); + if (HeightOrange > 28){ + tft.setTextColor(BLACK); + }else { + tft.setTextColor(WHITE); + } + tft.println("O:"); + tft.setCursor(3 * GrapWidth -10, 0); + if (HeightYellow > 28){ + tft.setTextColor(BLACK); + }else { + tft.setTextColor(WHITE); + } + tft.println("Y:"); + tft.setCursor(4 * GrapWidth -10, 0); + if (HeightGreen > 28){ + tft.setTextColor(BLACK); + }else { + tft.setTextColor(WHITE); + } + tft.println("G:"); + tft.setCursor(5 * GrapWidth -10, 0); + if (HeightBlue > 28){ + tft.setTextColor(BLACK); + }else { + tft.setTextColor(WHITE); + } + tft.println("B:"); + tft.setCursor(6 * GrapWidth -10, 0); + if (HeightViolet > 28){ + tft.setTextColor(BLACK); + }else { + tft.setTextColor(WHITE); + } + tft.println("V:"); + + maxValue = 0.0; + } + + + + //show relative raw data graph + if (menu_number == 4 || menu_number == 8 ){ + maxValue = 0; + drawControls(); + ////tft.setRotation(0); + + for (int i = 0; i < 5; i++) { + maxValue = max(maxValue, ReadValues[i]); + } + for (int i = 0; i < 5; i++) { + minValue = min(minValue, ReadValues[i]); + } + HeightRed = int(((RawRed + abs(minValue)) / (maxValue + abs(minValue))) * GraphHeight); + HeightOrange = int(((RawOrange + abs(minValue)) / (maxValue + abs(minValue))) * GraphHeight); + HeightYellow = int(((RawYellow + abs(minValue)) / (maxValue + abs(minValue))) * GraphHeight); + HeightGreen = int(((RawGreen + abs(minValue)) / (maxValue + abs(minValue))) * GraphHeight); + HeightBlue = int(((RawBlue + abs(minValue)) / (maxValue + abs(minValue))) * GraphHeight); + HeightViolet = int(((RawViolet + abs(minValue)) / (maxValue + abs(minValue))) * GraphHeight); + + + tft.setCursor(1 * GrapWidth -10, 10); + if (HeightRed >25){ + tft.setTextColor(BLACK); + } + + tft.fillRect(0 * GrapWidth, GraphHeight - HeightRed, GrapWidth, HeightRed, RED); + tft.fillRect(1 * GrapWidth + 1, GraphHeight - HeightOrange, GrapWidth, HeightOrange, ORANGE); + tft.fillRect(2 * GrapWidth + 2, GraphHeight - HeightYellow, GrapWidth, HeightYellow, YELLOW); + tft.fillRect(3 * GrapWidth + 3, GraphHeight - HeightGreen, GrapWidth, HeightGreen, GREEN); + tft.fillRect(4 * GrapWidth + 4, GraphHeight - HeightBlue, GrapWidth, HeightBlue, BLUE); + tft.fillRect(5 * GrapWidth + 5, GraphHeight - HeightViolet, GrapWidth, HeightViolet, MAGENTA); + tft.setCursor(1 * GrapWidth -10, 0); + if (HeightRed > 28){ + tft.setTextColor(BLACK); + }else { + tft.setTextColor(WHITE); + } + tft.println("R"); + tft.setCursor(2 * GrapWidth -10, 0); + if (HeightOrange > 28){ + tft.setTextColor(BLACK); + }else { + tft.setTextColor(WHITE); + } + tft.println("O"); + tft.setCursor(3 * GrapWidth -10, 0); + if (HeightYellow > 28){ + tft.setTextColor(BLACK); + }else { + tft.setTextColor(WHITE); + } + tft.println("Y"); + tft.setCursor(4 * GrapWidth -10, 0); + if (HeightGreen > 28){ + tft.setTextColor(BLACK); + }else { + tft.setTextColor(WHITE); + } + tft.println("G"); + tft.setCursor(5 * GrapWidth -10, 0); + if (HeightBlue > 28){ + tft.setTextColor(BLACK); + }else { + tft.setTextColor(WHITE); + } + tft.println("B"); + + tft.setCursor(6 * GrapWidth -10, 0); + if (HeightViolet > 28){ + tft.setTextColor(BLACK); + }else { + tft.setTextColor(WHITE); + } + tft.println("V"); + + maxValue = 0.0; + } + delay(1000); + + if (menu_number > 4 ) { + LedPower = 1; + } else { + LedPower = 0; + } + + if (LedPower == 1) { + sensor.enableBulb(); + sensor.takeMeasurementsWithBulb(); + } else { + sensor.disableBulb(); + sensor.takeMeasurements(); + } + + //gain change + if (digitalRead(Btn1) == HIGH) { + if (gain < 3) { + gain = gain + 1; + sensor.setGain(gain); + + } else { + gain = 0; + sensor.setGain(gain); + } + } + + if (gain == 0 ) { + gainValue = 1; + } else if (gain == 1) { + gainValue = 3.7; + } else if (gain == 2) { + gainValue = 16; + } else { + gainValue = 64; + } + + + + //data haverest + RawRed = sensor.getRed(); + RawOrange = sensor.getOrange(); + RawYellow = sensor.getYellow(); + RawGreen = sensor.getGreen(); + RawBlue = sensor.getBlue(); + RawViolet = sensor.getViolet(); + + CalcRed = sensor.getCalibratedRed(); + CalcOrange = sensor.getCalibratedOrange(); + CalcYellow = sensor.getCalibratedYellow(); + CalcGreen = sensor.getCalibratedGreen(); + CalcBlue = sensor.getCalibratedBlue(); + CalcViolet = sensor.getCalibratedViolet(); + + ReadValues[0] = CalcRed; + ReadValues[1] = CalcOrange; + ReadValues[2] = CalcYellow; + ReadValues[3] = CalcGreen; + ReadValues[4] = CalcBlue; + ReadValues[5] = CalcViolet; +}