From 0c5ac14ad4504ea827d571285d971c56ce57dd67 Mon Sep 17 00:00:00 2001 From: Shanmukha Innovations Date: Fri, 9 Feb 2024 06:06:14 +0000 Subject: [PATCH] Adding V0 firmware code --- HPOS-V0.ino | 616 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 616 insertions(+) create mode 100644 HPOS-V0.ino diff --git a/HPOS-V0.ino b/HPOS-V0.ino new file mode 100644 index 0000000..3d53c0d --- /dev/null +++ b/HPOS-V0.ino @@ -0,0 +1,616 @@ +#include "ADS1X15.h" +#include +#include +//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); +}