//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////TRUEHEME CODE V0.0.3/////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include "ADS1X15.h" #include #include int LED_sequence[] = {1,2,3,4}; int LED_dac[] = {1640,1680,2104,2088}; String Device_ID = "SNS HCV-000-3010 SNE"; //Device ID String Firmware_version_Auto=__FILE__; String Firmware_version = "TruehemeV0.0.3"; int LED_unstable_samples[] = {20,20,20,20}; int LED_sample_size[] = {50,50,50,50}; int LED_DS_threshold[] = {22000,22000,22000,22000}; int LED_settling_time[] = {10000,10000,10000,10000}; int extra_delay_per_LED =10000; int LED_reading_delay[] = {0,0,0,0}; int DAC_Sweep_start_limit[] = {1000,1000,1000,1000}; int DAC_Sweep_end_limit[] = {4000,4000,4000,4000}; int DacSweep_gain_combinations[] = {0,0,0,0}; int incr=8; //DAC sweep increment int del=500; //DAC delay int appmode=1; int moving_average_activation=0; int raw_ADC_print=1; int limit_printer=1; long limit_average_storage=0; int Blank_gain_combinations[] = {0,0,0,0}; int Sample_gain_combinationsG1[] = {0,0,0,0}; int Sample_gain_combinationsG2[] = {1,1,1,1}; int Sample_gain_combinationsG3[] = {2,2,2,2}; int Sample_gain_combinationsG4[] = {4,4,4,4}; int Sample_gain_combinationsG5[] = {8,8,8,8}; ///////////////////////////////////////////DO NOT CHANGE ANY VALUES BELOW ////////////////////////////////////////////////////////////////////////////////////////////// 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); ///////////////////////////////////////////DO NOT CHANGE ANY VALUES ABOVE ////////////////////////////////////////////////////////////////////////////////////////////// const char compile_date[] = __DATE__ " " __TIME__; int loopcounter = 0; unsigned long long intensity_storage = 0; int temp_counter = 0; float avg_storage = 0; float avg_green = 0; float avg_blue = 0; float old_green = 0; float old_blue = 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 skip = 0; float average_readings = 0; float avg_blank[]={0,0,0,0}; float avg_sample[]={0,0,0,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(); if(appmode==0) { Serial.print("Initial DAC Settings: "); for (int i =0; i<4;i++) { Serial.print("\t");Serial.print(LED_dac[i]); } Serial.println(); } if(appmode==0) { Serial.print("Process: Setup End; Timestamp: ");Serial.println(millis()); } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void all_LEDs_turnoff() { setOutput(GAIN_1, 0, 1); //LED 1 setOutput(GAIN_1, 0, 2); //LED 2 setOutput(GAIN_1, 0, 3); //LED 3 setOutput(GAIN_1, 0, 4); //LED 4 } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void secondary_gain_select(int gain_combo) { bool gain_choice1=bitRead(gain_combo, 0); bool gain_choice2=bitRead(gain_combo, 1); bool gain_choice3=bitRead(gain_combo, 2); bool gain_choice4=bitRead(gain_combo, 3); digitalWrite(PD1G1, gain_choice1); digitalWrite(PD1G2, gain_choice2); digitalWrite(PD2G1, gain_choice3); digitalWrite(PD2G2, gain_choice4); if(appmode==0) { Serial.print("Gains Used\t G1:");Serial.print(gain_choice1);Serial.print("\t G2:");Serial.print(gain_choice2);Serial.print("\t G3:");Serial.print(gain_choice3);Serial.print("\t G4:");Serial.println(gain_choice4); } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //void setOutput(byte channel, byte gain, byte shutdown, unsigned int val, int DACselect) void setOutput(byte gain, unsigned int val, int LEDselect) { byte channel=0; byte shutdown=1; if(LEDselect%2==0) { channel=1; } else { channel=0; } byte lowByte = val & 0xff; byte highByte = ((val >> 8) & 0xff) | channel << 7 | gain << 5 | shutdown << 4; if (LEDselect <= 2) { PORTB &= 0xfb; SPI.transfer(highByte); SPI.transfer(lowByte); PORTB |= 0x4; } else { PORTB &= 0xfd; SPI.transfer(highByte); SPI.transfer(lowByte); PORTB |= 0x2; } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int setDAC_LED() { int LED_flags[]={0,0,0,0}; int flags_combined=0; if(appmode==0) { Serial.println("#DAC Sweep Start"); } all_LEDs_turnoff(); delay(1000); ////////////////////////////////////////FIRST FORLOOP TO DISCARD STARTS///////////////////////////////////////////////// for (int i=3000;i<4096;i+=incr) { setOutput(GAIN_1, i, 1); delay(del); int16_t val_0 = ADS.readADC(0); if((val_0>24000)) { break; } } all_LEDs_turnoff(); delay(1000); ////////////////////////////////////////FIRST FORLOOP TO DISCARD ENDS///////////////////////////////////////////////// //for (int j=0;jLED_DS_threshold[j])&&(LED_flags[j]==0)) { LED_dac[j]=i; LED_flags[j]=1; break; } } all_LEDs_turnoff(); if (appmode==0) { Serial.print("LED ");Serial.print(j+1);Serial.print(" DACsweep Completed");Serial.print("\t");Serial.print("NEW DAC VALUE : ");Serial.println(LED_dac[j]); } delay(1000); } all_LEDs_turnoff(); flags_combined=(LED_flags[3]*1)+(LED_flags[2]*10)+(LED_flags[1]*100)+(LED_flags[0]*1000); if(appmode==0) { Serial.println("#DAC Sweep End"); } return flags_combined; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// float detector(int unstable_samples, int number_of_readings, int detector_select, int gain_combo, int settling_time, int reading_delay) { if(appmode==0) { Serial.print("Process: Detector Start for any one LED; Timestamp: ");Serial.println(millis()); } secondary_gain_select(gain_combo); memset (moving_average_array, 0, 10); temp_counter = 0; skip = 0; intensity_storage = 0; int16_t detector_val = 0; if (moving_average_activation==1) { 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); 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++; } } } } else { int start_time=millis(); int current_time=millis(); int lower_limit=0; int upper_limit=0; limit_average_storage=0; while((current_time-start_time)