Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
driverLifiRx.cpp
- Committer:
- pjr
- Date:
- 2019-04-04
- Revision:
- 4:3ec60ea204c6
- Parent:
- 2:e1fd30fce2f8
- Child:
- 5:5fe30df87772
File content as of revision 4:3ec60ea204c6:
#include "driverLifiRx.h" //typedef enum LIFI_Tx_Rx_Mode LIFI_Tx_Rx_Mode; //Lifi_RxTx_Mode vlc_tx_rx_mode = LIFI_Tx_Mode; //int vlc_tx_rx_mode_bool = 0; // //// RX 는 ADC PIN을 3.3V 로 연결한다. //Lifi_RxTx_Mode is_board_vlc_rx_mode_enum() //{ // float meas_r1; // float meas_v1; // // meas_r1 = adc_tx_rx_mode_select.read() ; // meas_v1 = meas_r1 * 3300; // if( ceil(meas_v1) > 1000 ) return LIFI_Tx_Mode; // else return Lifi_Rx_Mode; //} // Pull up setting. RX - Connect to GND int Lifi_IsRxMode() { #define USE_MODE_SELECT_BY_ADC 0 #if USE_MODE_SELECT_BY_ADC // 연결이 되지 않으면 기본으로 0 이다. // 따라서 ADC를 이용할 경우 3.3V와 연결하고나 저항을 이용해서 여러 입력값에 따른 모드를 선택할 수 있다. float meas_r1; float meas_v1; meas_r1 = adc_tx_rx_mode_select.read() ; meas_v1 = meas_r1 * 3300; printf("meas_r1 = %f, meas_v1 = %f",meas_r1, meas_v1 ); if( ceil(meas_v1) > 1000 ) return LIFI_Tx_Mode; else return Lifi_Rx_Mode; #else int value=1; value = lifi_TxRx_ModePin.read(); if( value == 0 ) { printf("RX mode (%d))", value); return 1; } else { printf("TX mode (%d))", value); return 0; } #endif } // https://forum.arduino.cc/index.php?topic=185158.0 float LifiRx_GetLuxFromPdVoltage(float volt_mili) { #if 0 float amps_mili = mili_volt / 10000.0; // across 10,000 Ohms float microamps = amps_mili * 1000; float lux = microamps * 2.0; return lux; #else return volt_mili / 5.0 ; #endif } // https://code.google.com/archive/p/davidegironi/downloads /* * get lux from voltage */ double LifiRx_GetLux_Temt6000(double vol) { //suppose we read the voltage from the emitter of temt6000, with a 10k pulldown resistor connected to gnd //V[V] = I[A]*R[ohm] = I[uA] * 1[A]/1000000[킕] * 10000[ohm] = I[uA] * 1[A]/1[uA] * 0.01[ohm] //1[uA] = V[V] / 0.01[ohm] = 100 * V[V/ohm] //the curve from datasheet seems y=2x+0, so lux = 2 * I[uA] = 2 * 100 * V[V/ohm] return 2*(100*vol); } float meas_v1_max=0; float meas_v1_min=3300; float meas_v2_max=0; float meas_v2_min=3300; float meas_v3_max=0; float meas_v3_min=3300; float meas_v4_max=0; float meas_v4_min=3300; void LifiRx_PdTunning() { float meas_r1; float meas_v1; float meas_r2; float meas_v2; float meas_r3; float meas_v3; float meas_r4; float meas_v4; meas_v1_max=0; meas_v1_min=3300; meas_v2_max=0; meas_v2_min=3300; meas_v3_max=0; meas_v3_min=3300; meas_v4_max=0; meas_v4_min=3300; // note myvalues for "office light" (ca. 200 lux) and direct sunlight, clear day (ca 50000lux) // https://www.dfrobot.com/wiki/index.php/DFRobot_Ambient_Light_Sensor_SKU:DFR0026 //Specification //Supply Voltage: 3.3V to 5V //Illumination range : 1 Lux to 6000 Lux //Responsive time : 15us //Interface: Analog //Size:22x30mm printf("\n4 LifiRx_PdTunning \n"); buttonInitSkipLoop(); while(1) { if( buttonCanSkipLoop() ) return; meas_r1 = adc_1.read(); // Read the analog input value (value from 0.0 to 1.0 = full ADC conversion range) meas_v1 = meas_r1 * 3300; // Converts value in the 0V-3.3V range meas_r2 = adc_2.read(); // Read the analog input value (value from 0.0 to 1.0 = full ADC conversion range) meas_v2 = meas_r2 * 3300; // Converts value in the 0V-3.3V range meas_r3 = adc_3.read(); // Read the analog input value (value from 0.0 to 1.0 = full ADC conversion range) meas_v3 = meas_r3 * 3300; // Converts value in the 0V-3.3V range meas_r4 = adc_4.read(); // Read the analog input value (value from 0.0 to 1.0 = full ADC conversion range) meas_v4 = meas_r4 * 3300; // Converts value in the 0V-3.3V range if( meas_v1_min > meas_v1 ) meas_v1_min = meas_v1; if( meas_v1_max < meas_v1 ) meas_v1_max = meas_v1; if( meas_v2_min > meas_v2 ) meas_v2_min = meas_v2; if( meas_v2_max < meas_v2 ) meas_v2_max = meas_v2; if( meas_v3_min > meas_v3 ) meas_v3_min = meas_v3; if( meas_v3_max < meas_v3 ) meas_v3_max = meas_v3; if( meas_v4_min > meas_v4 ) meas_v4_min = meas_v4; if( meas_v4_max < meas_v4 ) meas_v4_max = meas_v4; // Display values printf("measure 1 = %f = %4.0f mV = %5.0f uA = %5.0f lux delta = %5.0f \n", meas_r1, meas_v1, meas_v1/10.0, meas_v1/5.0, meas_v1_max - meas_v1_min); printf("measure 2 = %f = %4.0f mV = %5.0f uA = %5.0f lux delta = %5.0f \n", meas_r2, meas_v2, meas_v2/10.0, meas_v2/5.0, meas_v2_max - meas_v2_min); printf("measure 3 = %f = %4.0f mV = %5.0f uA = %5.0f lux delta = %5.0f \n", meas_r3, meas_v3, meas_v3/10.0, meas_v3/5.0, meas_v3_max - meas_v3_min); printf("measure 4 = %f = %4.0f mV = %5.0f uA = %5.0f lux delta = %5.0f \n", meas_r4, meas_v4, meas_v4/10.0, meas_v4/5.0, meas_v4_max - meas_v4_min); printf("\033[4A"); wait(0.1); } } int LifiRx_AdcRead(int num) { //floor(x) - round down //ceil(x) - round up float meas_r1; float meas_v1; float meas_r2; float meas_v2; float meas_r3; float meas_v3; float meas_r4; float meas_v4; float meas_r_average; float meas_v_average; int ret = 0; switch(num) { case LIFI_CHANNEL_1: meas_r1 = adc_1.read() ; meas_v1 = meas_r1 * 3300; ret = ceil(meas_v1); break; case LIFI_CHANNEL_2: meas_r2 = adc_2.read() ; meas_v2 = meas_r2 * 3300; ret = ceil(meas_v2); break; case LIFI_CHANNEL_3: meas_r3 = adc_3.read() ; meas_v3 = meas_r3 * 3300; ret = ceil(meas_v3); break; case LIFI_CHANNEL_4: meas_r4 = adc_4.read() ; meas_v4 = meas_r4 * 3300; ret = ceil(meas_v4); break; case LIFI_CHANNEL_ALL: default: meas_r1 = adc_1.read(); // Read the analog input value (value from 0.0 to 1.0 = full ADC conversion range) meas_v1 = meas_r1 * 3300; // Converts value in the 0V-3.3V range meas_r2 = adc_2.read(); // Read the analog input value (value from 0.0 to 1.0 = full ADC conversion range) meas_v2 = meas_r2 * 3300; // Converts value in the 0V-3.3V range meas_r3 = adc_3.read(); // Read the analog input value (value from 0.0 to 1.0 = full ADC conversion range) meas_v3 = meas_r3 * 3300; // Converts value in the 0V-3.3V range meas_r4 = adc_4.read(); // Read the analog input value (value from 0.0 to 1.0 = full ADC conversion range) meas_v4 = meas_r4 * 3300; // Converts value in the 0V-3.3V range meas_r_average = ( meas_r1 + meas_r2 + meas_r3 + meas_r4 ) / 4 ; meas_v_average = meas_r_average * 3300; ret = ceil(meas_v_average); break; } return ret; } void LifiRx_Run() { printf("\n======== LifiRx_Run =========\n"); #if USE_LOCAL_TICKER Ticker lifi_rx_timer; #endif // us_timestamp_t us_time; LifiRx_Init(); printf("Tx Symbol Feq=%f sec / %d us \n",LIFI_RX_SYMBOL_PERIOD_SEC,LIFI_RX_SYMBOL_PERIOD_US); printf("Rx Sample Feq=%f sec / %d us \n",LIFI_RX_SYMBOL_SAMPLE_PERIOD_SEC,LIFI_RX_SYMBOL_SAMPLE_PERIOD_US); printf("Rx Sample/Symbol=%d times / adc edge threshod=%d mV \n",LIFI_RX_SAMPLE_PER_SYMBOL,LIFI_RX_EDGE_THRESHOLD); printf("MIMO LIFI_MIMO_CHANNEL_NUM=%d / LIFI_ACTUAL_MAX_CHANNEL_NUM=%d \n",LIFI_MIMO_CHANNEL_NUM,LIFI_ACTUAL_MAX_CHANNEL_NUM); printf("Tx interval = %d sec \n",LIFI_DEMO_TX_PERIOD_SEC); lifi_rx_timer.attach(&LifiRx_SampleSignalEdge, LIFI_RX_SYMBOL_SAMPLE_PERIOD_SEC); printf("1"); // us_time = LIFI_RX_SYMBOL_SAMPLE_PERIOD_US; // lifi_rx_timer.attach_us(&LifiRx_SampleSignalEdge, us_time); //////// main loop /////// buttonInitSkipLoop(); //printf("2"); while(1) { //printf("3"); if( buttonCanSkipLoop() ) return; LifiRx_LoopOOK(); //printf("4"); //wait_ms(50); } } ////////////// #if USE_MBED_OS5 // https://os.mbed.com/blog/entry/Simplify-your-code-with-mbed-events/ // create an event queue #if USE_LIFI_RX_CHECK_QUEUE EventQueue queue; EventQueue lifi_tx_check_queue(32 * EVENTS_EVENT_SIZE); #endif void do_something() { // this now runs in the context of eventThread, instead of in the ISR //printf("!"); LifiRx_SampleSignalEdge(); } void LifiRx_RunWithEventQueue() { #if USE_LOCAL_TICKER Ticker lifi_rx_timer; #endif // create a thread that'll run the event queue's dispatch function Thread eventThread(osPriorityHigh); //Thread eventThread; eventThread.start(callback(&queue, &EventQueue::dispatch_forever)); #if (USE_MBED_OS5 && USE_LIFI_RX_CHECK_QUEUE) Thread lifiRxCheckThread(osPriorityNormal); lifiRxCheckThread.start(callback(&lifi_tx_check_queue, &EventQueue::dispatch_forever)); #endif printf("\n======== LifiRx_RunWithEventQueue =========\n"); LifiRx_Init(); printf("Tx Symbol Feq=%f sec / %d us \n",LIFI_RX_SYMBOL_PERIOD_SEC,LIFI_RX_SYMBOL_PERIOD_US); printf("Rx Sample Feq=%f sec / %d us \n",LIFI_RX_SYMBOL_SAMPLE_PERIOD_SEC,LIFI_RX_SYMBOL_SAMPLE_PERIOD_US); printf("Rx Sample/Symbol=%d times / adc edge threshod=%d mV \n",LIFI_RX_SAMPLE_PER_SYMBOL,LIFI_RX_EDGE_THRESHOLD); printf("MIMO LIFI_MIMO_CHANNEL_NUM=%d / LIFI_ACTUAL_MAX_CHANNEL_NUM=%d \n",LIFI_MIMO_CHANNEL_NUM,LIFI_ACTUAL_MAX_CHANNEL_NUM); printf("Tx interval = %d sec \n",LIFI_DEMO_TX_PERIOD_SEC); lifi_rx_timer.attach(queue.event(&do_something), LIFI_RX_SYMBOL_SAMPLE_PERIOD_SEC); // us_time = LIFI_RX_SYMBOL_SAMPLE_PERIOD_US; // lifi_rx_timer.attach_us(&LifiRx_SampleSignalEdge, us_time); //////// main loop /////// buttonInitSkipLoop(); //printf("2"); while(1) { #if (USE_LIFI_RX_CHECK_QUEUE==0) //printf("3"); if( buttonCanSkipLoop() ) return; LifiRx_LoopOOK(); //printf("4"); #endif wait_ms(50); if( buttonCanSkipLoop() ) return; } } #endif