Files
trueheme-firmware/HPOS-V0.ino
Shanmukha Innovations 0c5ac14ad4 Adding V0 firmware code
2024-02-09 06:06:14 +00:00

617 lines
16 KiB
C++

#include "ADS1X15.h"
#include <SPI.h>
#include <Wire.h>
//BLOOD
//DEV_7
//int LED1_dac = 406;
//int LED2_dac = 160;
//int LED3_dac = 218;
//int LED4_dac = 248;
//DEV_8
//int LED1_dac = 340;
//int LED2_dac = 144;
//int LED3_dac = 502;
//int LED4_dac = 190;
//DEV_7
int LED1_dac = 3096;
int LED2_dac = 1900;
int LED3_dac = 3532;
int LED4_dac = 3980;
int LED1_unstable_samples = 20;
int LED2_unstable_samples = 20;
int LED3_unstable_samples = 20;
int LED4_unstable_samples = 20;
int LED1_sample_size = 50;
int LED2_sample_size = 50;
int LED3_sample_size = 50;
int LED4_sample_size = 50;
const int PIN_CS_DAC1 = 10;
const int PIN_CS_DAC2 = 9;
const int GAIN_1 = 0x1;
const int GAIN_2 = 0x0;
const int PD1G1 = 6;
const int PD1G2 = 8;
const int PD2G1 = 9;
const int PD2G2 = 7;
const int LEDR = A0;
const int LEDB = A2;
const int LEDG = A1;
ADS1115 ADS(0x48);
int loopcounter = 0;
unsigned long long intensity_storage = 0;
int temp_counter = 0;
//long long data_storage=0;
float avg_storage = 0;
float avg_green = 0;
float avg_blue = 0;
float old_green = 0;
float old_blue = 0;
int flag = 0;
int split_counter = 0;
int intensity_display = 1;
int plotter = 0;
int moving_average_array[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int sorting_array[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int moving_average = 0;
int j = 0;
int temp_sort = 0;
int unstable_samples = 20;
int number_of_readings = 50;
int skip = 0;
float average_readings = 0;
float avg_LED1B = 0;
float avg_LED2B = 0;
float avg_LED3B = 0;
float avg_LED4B = 0;
float avg_LED1S = 0;
float avg_LED2S = 0;
float avg_LED3S = 0;
float avg_LED4S = 0;
void setup()
{
Serial.begin(9600);
pinMode(PIN_CS_DAC1, OUTPUT);
pinMode(PIN_CS_DAC2, OUTPUT);
pinMode(PD1G1, OUTPUT);
pinMode(PD1G2, OUTPUT);
pinMode(PD2G1, OUTPUT);
pinMode(PD2G2, OUTPUT);
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
digitalWrite(LEDR, LOW);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, HIGH);
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV2);
ADS.begin();
}
void setOutput(byte channel, byte gain, byte shutdown, unsigned int val, int DACselect)
{
byte lowByte = val & 0xff;
byte highByte = ((val >> 8) & 0xff) | channel << 7 | gain << 5 | shutdown << 4;
if (DACselect == 1)
{
PORTB &= 0xfb;
SPI.transfer(highByte);
SPI.transfer(lowByte);
PORTB |= 0x4;
}
else
{
PORTB &= 0xfd;
SPI.transfer(highByte);
SPI.transfer(lowByte);
PORTB |= 0x2;
}
}
float detector(int unstable_samples, int number_of_readings, int detector_select, int PD1G1_gain_set, int PD1G2_gain_set, int PD2G1_gain_set, int PD2G2_gain_set)
{
if (PD1G1_gain_set == 0)
{
digitalWrite(PD1G1, LOW);
}
else
{
digitalWrite(PD1G1, HIGH);
}
if (PD1G2_gain_set == 0)
{
digitalWrite(PD1G2, LOW);
}
else
{
digitalWrite(PD1G2, HIGH);
}
if (PD2G1_gain_set == 0)
{
digitalWrite(PD2G1, LOW);
}
else
{
digitalWrite(PD2G1, HIGH);
}
if (PD2G2_gain_set == 0)
{
digitalWrite(PD2G2, LOW);
}
else
{
digitalWrite(PD2G2, HIGH);
}
memset (moving_average_array, 0, 10);
temp_counter = 0;
skip = 0;
intensity_storage = 0;
int16_t detector_val = 0;
for (int i = 0; i < unstable_samples + number_of_readings; i += 1)
{
int16_t val_0 = ADS.readADC(0);
int16_t val_1 = ADS.readADC(1);
int16_t val_2 = ADS.readADC(2);
int16_t val_3 = ADS.readADC(3);
if (detector_select == 1)
{
detector_val = val_0;
}
else
{
detector_val = val_1;
}
moving_average_array[i % 10] = detector_val;
for (int j = 0; j < 10; j++)
{
sorting_array[j] = moving_average_array[j];
}
if (i >= unstable_samples)
{
for (int j = 0; j < 6; j++)
{
for (int k = 0; k < (9 - j); k++)
{
if (sorting_array[k] > sorting_array[k + 1])
{
temp_sort = sorting_array[k];
sorting_array[k] = sorting_array[k + 1];
sorting_array[k + 1] = temp_sort;
}
}
}
moving_average = (sorting_array[4] / 2) + (sorting_array[5] / 2);
if ((detector_val > (moving_average * 0.9)) and (detector_val < (moving_average * 1.1)))
{
intensity_storage += detector_val;
temp_counter++;
}
else
{
skip++;
}
}
if (intensity_display == 1)
{
}
}
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
average_readings = intensity_storage / temp_counter;
return average_readings;
}
void loop()
{
ADS.setGain(0);
loopcounter = 0;
avg_storage = 0;
split_counter = 0;
if (Serial.available()) {
char data = Serial.read();
if (data == 'B') {
startTask1();
}
else if (data == 'S') {
startTask2();
}
else if (data == 'P') { //Check if the received character is 1
Serial.print("RESULT"); Serial.println(" "); Serial.print("LB1 "); Serial.println(avg_LED1B); Serial.print("LB2 "); Serial.println(avg_LED2B);
Serial.print("LB3 "); Serial.println(avg_LED3B); Serial.print("LB4 "); Serial.println(avg_LED4B);
Serial.print("LS1 "); Serial.println(avg_LED1S); Serial.print("LS2 "); Serial.println(avg_LED2S); Serial.print("LS3 "); Serial.println(avg_LED3S);
Serial.print("LS4 "); Serial.println(avg_LED4S); Serial.println("REND");
delay(100);
}
else if (data == 'D') { //Check if the received character is 1
startTask3();
}
else if (data == 'C') { //Check if the received character is 1
startTask4();
}
else if (data == 'I') { //Check if the received character is 1
Serial.println("SNS HCV-000-3008 SNE");
}
}
}
void startTask1() {
Serial.println("#BS");
digitalWrite(LEDB, HIGH);
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, LOW);
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
delay(100);
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
//Serial.println("LED1 is ON");
setOutput(0, GAIN_1, 1, LED1_dac, 1);
delay(100);
avg_LED1B = detector(LED1_unstable_samples, LED1_sample_size, 1, 0, 0, 0, 0);
//Serial.print("Average LED1 intensity :"); Serial.println(avg_LED1);
delay(1000);
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
setOutput(1, GAIN_1, 1, LED2_dac, 1);
delay(100);
avg_LED2B = detector(LED2_unstable_samples, LED2_sample_size, 1, 0, 0, 0, 0);
//Serial.print("Average LED2 intensity :"); Serial.println(avg_LED2);
delay(1000);
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, LED3_dac, 2);
delay(100);
avg_LED3B = detector(LED3_unstable_samples, LED3_sample_size, 1, 1, 0, 0, 0);
//Serial.print("Average LED3 intensity :"); Serial.println(avg_LED3);
delay(1000);
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
setOutput(1, GAIN_1, 1, LED4_dac, 2);
delay(100);
avg_LED4B = detector(LED4_unstable_samples, LED4_sample_size, 1, 0, 0, 0, 0);
//Serial.print("Average LED4 intensity :"); Serial.println(avg_LED4);
delay(100);
// Serial.print("LED1B : "); Serial.print(avg_LED1B); Serial.print("\t"); Serial.print("LED2B : "); Serial.print(avg_LED2B); Serial.print("\t"); Serial.print("LED3B : "); Serial.print(avg_LED3B); Serial.print("\t"); Serial.print("LED4B : "); Serial.println(avg_LED4B);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, LOW);
digitalWrite(LEDR, HIGH);
Serial.println("#BC");
}
void startTask2() {
Serial.println("#SS");
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
delay(100);
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
digitalWrite(LEDB, HIGH);
digitalWrite(LEDG, LOW);
digitalWrite(LEDR, HIGH);
// digitalWrite(LED1, HIGH);
// digitalWrite(LED2, LOW);
// digitalWrite(LED3, LOW);
// digitalWrite(LED4, LOW);
//Serial.println("LED1 is ON");
setOutput(0, GAIN_1, 1, LED1_dac, 1);
delay(100);
avg_LED1S = detector(LED1_unstable_samples, LED1_sample_size, 1, 0, 0, 0, 0);
// Serial.print("Average LED1 intensity :"); Serial.println(avg_LED1);
delay(1000);
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
setOutput(1, GAIN_1, 1, LED2_dac, 1);
delay(100);
avg_LED2S = detector(LED2_unstable_samples, LED2_sample_size, 1, 0, 0, 0, 0);
//Serial.print("Average LED2 intensity :"); Serial.println(avg_LED2);
delay(1000);
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, LED3_dac, 2);
delay(100);
avg_LED3S = detector(LED3_unstable_samples, LED3_sample_size, 1, 1, 0, 0, 0);
// Serial.print("Average LED3 intensity :"); Serial.println(avg_LED3);
delay(1000);
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
// digitalWrite(LED1, LOW);
// digitalWrite(LED2, LOW);
// digitalWrite(LED3, LOW);
// digitalWrite(LED4, HIGH);
//Serial.println("LED4 is ON");
setOutput(1, GAIN_1, 1, LED4_dac, 2);
delay(100);
avg_LED4S = detector(LED4_unstable_samples, LED4_sample_size, 1, 0, 0, 0, 0);
//Serial.print("Average LED4 intensity :"); Serial.println(avg_LED4);
delay(100);
//Serial.print("LED1S : "); Serial.print(avg_LED1S); Serial.print("\t"); Serial.print("LED2S : "); Serial.print(avg_LED2S); Serial.print("\t"); Serial.print("LED3S : "); Serial.print(avg_LED3S); Serial.print("\t"); Serial.print("LED4S : "); Serial.println(avg_LED4S);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDR, LOW);
digitalWrite(LEDB, HIGH);
Serial.println("#SC");
}
void startTask3() {
ADS.setGain(0);
loopcounter = 0;
avg_storage = 0;
split_counter = 0;
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
Serial.println("LED1 is ON");
delay(1000);
for (int i = 100; i < 1200; i += 300)
{
setOutput(0, GAIN_1, 1, i, 1);
delay(50);
int16_t val_0 = ADS.readADC(0);
Serial.print(val_0); Serial.print("__"); Serial.println(i);
}
//setOutput(0, GAIN_1, 1, LED1_dac, 1);
//delay(100);
//avg_LED1=detector(LED1_unstable_samples, LED1_sample_size, 1, 0, 0, 0, 0);
//Serial.print("Average LED1 intensity :");Serial.println(avg_LED1);
delay(1000);
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
Serial.println("LED2 is ON");
delay(1000);
for (int i = 100; i < 1200; i += 300)
{
setOutput(1, GAIN_1, 1, i, 1);
delay(50);
int16_t val_0 = ADS.readADC(0);
Serial.print(val_0); Serial.print("__"); Serial.println(i);
}
//setOutput(1, GAIN_1, 1, LED2_dac, 1);
//delay(100);
//avg_LED2=detector(LED2_unstable_samples, LED2_sample_size, 1, 0, 0, 0, 0);
//Serial.print("Average LED2 intensity :");Serial.println(avg_LED2);
delay(1000);
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
Serial.println("LED3 is ON");
delay(1000);
for (int i = 100; i < 1200; i += 300)
{
setOutput(0, GAIN_1, 1, i, 2);
delay(50);
int16_t val_0 = ADS.readADC(0);
Serial.print(val_0); Serial.print("__"); Serial.println(i);
}
//setOutput(0, GAIN_1, 1, LED3_dac, 2);
//delay(100);
//avg_LED3=detector(LED3_unstable_samples, LED3_sample_size, 1, 0, 0, 0, 0);
//Serial.print("Average LED3 intensity :");Serial.println(avg_LED3);
delay(1000);
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
Serial.println("LED4 is ON");
delay(1000);
for (int i = 100; i < 1200; i += 300)
{
setOutput(1, GAIN_1, 1, i, 2);
delay(50);
int16_t val_0 = ADS.readADC(0);
Serial.print(val_0); Serial.print("__"); Serial.println(i);
}
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
}
void startTask4() {
ADS.setGain(0);
loopcounter = 0;
avg_storage = 0;
split_counter = 0;
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
delay(100);
flag = 0;
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
delay(1000);
Serial.println("LED1 is ON");
for (int i = 0; i < 500; i += 2)
{
setOutput(0, GAIN_1, 1, i, 1);
delay(500);
int16_t val_0 = ADS.readADC(0);
Serial.print(val_0); Serial.print("__"); Serial.println(i);
if ((val_0 > 22000) && (flag == 0))
{
LED1_dac = i;
flag = 1;
}
}
setOutput(0, GAIN_1, 1, LED1_dac, 1);
// delay(100);
// avg_LED1=detector(LED1_unstable_samples, LED1_sample_size, 1, 1, 0, 0, 0);
// Serial.print("Average LED1 intensity :");Serial.println(avg_LED1);
// delay(1000);
flag = 0;
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
delay(1000);
Serial.println("LED2 is ON");
for (int i = 0; i < 500; i += 2)
{
setOutput(1, GAIN_1, 1, i, 1);
delay(500);
int16_t val_0 = ADS.readADC(0);
Serial.print(val_0); Serial.print("__"); Serial.println(i);
if ((val_0 > 22000) && (flag == 0))
{
LED2_dac = i;
flag = 1;
}
}
//setOutput(1, GAIN_1, 1, LED2_dac, 1);
//delay(100);
//avg_LED2=detector(LED2_unstable_samples, LED2_sample_size, 1, 0, 0, 0, 0);
//Serial.print("Average LED2 intensity :");Serial.println(avg_LED2);
delay(1000);
flag = 0;
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
delay(1000);
Serial.println("LED3 is ON");
digitalWrite(PD1G1, HIGH);
for (int i = 100; i < 700; i += 2)
{
setOutput(0, GAIN_1, 1, i, 2);
delay(500);
int16_t val_0 = ADS.readADC(0);
Serial.print(val_0); Serial.print("__"); Serial.println(i);
if ((val_0 > 22000) && (flag == 0))
{
LED3_dac = i;
flag = 1;
}
}
setOutput(0, GAIN_1, 1, LED3_dac, 2);
delay(100);
// avg_LED3=detector(LED3_unstable_samples, LED3_sample_size, 1, 1, 0, 0, 0);
// Serial.print("Average LED3 intensity :");Serial.println(avg_LED3);
delay(1000);
digitalWrite(PD1G1, LOW);
flag = 0;
setOutput(1, GAIN_1, 1, 0, 1);
setOutput(0, GAIN_1, 1, 0, 1);
setOutput(1, GAIN_1, 1, 0, 2);
setOutput(0, GAIN_1, 1, 0, 2);
delay(1000);
Serial.println("LED4 is ON");
for (int i = 0; i < 500; i += 2)
{
setOutput(1, GAIN_1, 1, i, 2);
delay(500);
int16_t val_0 = ADS.readADC(0);
Serial.print(val_0); Serial.print("__"); Serial.println(i);
if ((val_0 > 22000) && (flag == 0))
{
LED4_dac = i;
flag = 1;
}
}
// setOutput(1, GAIN_1, 1, LED4_dac, 2);
//delay(100);
//avg_LED4=detector(LED4_unstable_samples, LED4_sample_size, 1, 0, 0, 0, 0);
//Serial.print("Average LED4 intensity :");Serial.println(avg_LED4);
delay(1000);
Serial.print("LED1 DAC :"); Serial.print(LED1_dac); Serial.print("\t"); Serial.print("LED2 DAC :"); Serial.print(LED2_dac); Serial.print("\t"); Serial.print("LED3 DAC :"); Serial.print(LED3_dac); Serial.print("\t"); Serial.print("LED4 DAC :"); Serial.println(LED4_dac);
delay(5000);
}