Frank Vannieuwkerke
/
ISL29125_demo
ISL29125 Ambient Light Sensor demo (KL25Z)
main.cpp@0:cabd10c37640, 2014-05-28 (annotated)
- Committer:
- frankvnk
- Date:
- Wed May 28 18:25:49 2014 +0000
- Revision:
- 0:cabd10c37640
Initial release
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
frankvnk | 0:cabd10c37640 | 1 | #include "mbed.h" |
frankvnk | 0:cabd10c37640 | 2 | #include "ISL29125.h" |
frankvnk | 0:cabd10c37640 | 3 | |
frankvnk | 0:cabd10c37640 | 4 | DigitalOut myled(LED_GREEN); |
frankvnk | 0:cabd10c37640 | 5 | bool Overflow = 0; |
frankvnk | 0:cabd10c37640 | 6 | uint16_t GRBdata[3]; |
frankvnk | 0:cabd10c37640 | 7 | bool data_present; |
frankvnk | 0:cabd10c37640 | 8 | |
frankvnk | 0:cabd10c37640 | 9 | Timeout flipper; |
frankvnk | 0:cabd10c37640 | 10 | Ticker als; |
frankvnk | 0:cabd10c37640 | 11 | |
frankvnk | 0:cabd10c37640 | 12 | void RGBsensor_irq(void) |
frankvnk | 0:cabd10c37640 | 13 | { |
frankvnk | 0:cabd10c37640 | 14 | Overflow = 1; |
frankvnk | 0:cabd10c37640 | 15 | } |
frankvnk | 0:cabd10c37640 | 16 | |
frankvnk | 0:cabd10c37640 | 17 | // Different constructor calls |
frankvnk | 0:cabd10c37640 | 18 | ISL29125 RGBsensor(PTE0, PTE1, PTD7, &RGBsensor_irq); // ISR mode |
frankvnk | 0:cabd10c37640 | 19 | //ISL29125 RGBsensor(PTE0, PTE1, PTD7); // Sync mode |
frankvnk | 0:cabd10c37640 | 20 | //ISL29125 RGBsensor(PTE0, PTE1); // Free running mode |
frankvnk | 0:cabd10c37640 | 21 | |
frankvnk | 0:cabd10c37640 | 22 | void flip() |
frankvnk | 0:cabd10c37640 | 23 | { |
frankvnk | 0:cabd10c37640 | 24 | RGBsensor.Run(); // Only works in Sync mode, Delayed conversion start. |
frankvnk | 0:cabd10c37640 | 25 | } |
frankvnk | 0:cabd10c37640 | 26 | |
frankvnk | 0:cabd10c37640 | 27 | void ALSread() |
frankvnk | 0:cabd10c37640 | 28 | { |
frankvnk | 0:cabd10c37640 | 29 | data_present = RGBsensor.Read(ISL29125_RGB, GRBdata); |
frankvnk | 0:cabd10c37640 | 30 | if(data_present) printf("RGB : %04X-%04X-%04X\r\n", GRBdata[1], GRBdata[0], GRBdata[2]); |
frankvnk | 0:cabd10c37640 | 31 | if(Overflow) |
frankvnk | 0:cabd10c37640 | 32 | { |
frankvnk | 0:cabd10c37640 | 33 | printf("\r\nIRQ : %d\r\n",Overflow); |
frankvnk | 0:cabd10c37640 | 34 | myled = !myled; |
frankvnk | 0:cabd10c37640 | 35 | Overflow = 0; |
frankvnk | 0:cabd10c37640 | 36 | } |
frankvnk | 0:cabd10c37640 | 37 | } |
frankvnk | 0:cabd10c37640 | 38 | |
frankvnk | 0:cabd10c37640 | 39 | Serial pc(USBTX, USBRX); |
frankvnk | 0:cabd10c37640 | 40 | |
frankvnk | 0:cabd10c37640 | 41 | int main() |
frankvnk | 0:cabd10c37640 | 42 | { |
frankvnk | 0:cabd10c37640 | 43 | myled = 1; |
frankvnk | 0:cabd10c37640 | 44 | |
frankvnk | 0:cabd10c37640 | 45 | // Read ID register |
frankvnk | 0:cabd10c37640 | 46 | printf("Read ID register\r\nWhoAmI : %02X\r\n", RGBsensor.WhoAmI()); |
frankvnk | 0:cabd10c37640 | 47 | |
frankvnk | 0:cabd10c37640 | 48 | // Change threshold registers |
frankvnk | 0:cabd10c37640 | 49 | RGBsensor.Threshold(ISL29125_LTH_W, 0x0100); |
frankvnk | 0:cabd10c37640 | 50 | printf("Change threshold registers\r\n%04X\r\n", RGBsensor.Threshold(ISL29125_LTH_R)); |
frankvnk | 0:cabd10c37640 | 51 | RGBsensor.Threshold(ISL29125_HTH_W, 0x2345); |
frankvnk | 0:cabd10c37640 | 52 | printf("%04X\r\n", RGBsensor.Threshold(ISL29125_HTH_R)); |
frankvnk | 0:cabd10c37640 | 53 | |
frankvnk | 0:cabd10c37640 | 54 | // Get operating mode |
frankvnk | 0:cabd10c37640 | 55 | printf("Get operating mode\r\nRGB mode : %02X\r\n", RGBsensor.RGBmode()); |
frankvnk | 0:cabd10c37640 | 56 | |
frankvnk | 0:cabd10c37640 | 57 | // Change sensing range |
frankvnk | 0:cabd10c37640 | 58 | printf("Change sensing range\r\n%d %02X\r\n", RGBsensor.Range(ISL29125_375LX), RGBsensor.Range()); |
frankvnk | 0:cabd10c37640 | 59 | printf("%d %02X\r\n", RGBsensor.Range(ISL29125_10KLX), RGBsensor.Range()); |
frankvnk | 0:cabd10c37640 | 60 | printf("%d %02X\r\n", RGBsensor.Range(0x02), RGBsensor.Range()); //try invalid value |
frankvnk | 0:cabd10c37640 | 61 | |
frankvnk | 0:cabd10c37640 | 62 | // Change ADC resolution |
frankvnk | 0:cabd10c37640 | 63 | printf("Change ADC resolution\r\n%d %02X\r\n", RGBsensor.Resolution(ISL29125_12BIT), RGBsensor.Resolution()); |
frankvnk | 0:cabd10c37640 | 64 | printf("%d %02X\r\n", RGBsensor.Resolution(ISL29125_16BIT), RGBsensor.Resolution()); |
frankvnk | 0:cabd10c37640 | 65 | printf("%d %02X\r\n", RGBsensor.Resolution(0x02), RGBsensor.Resolution()); //try invalid value |
frankvnk | 0:cabd10c37640 | 66 | |
frankvnk | 0:cabd10c37640 | 67 | // Change persistence control |
frankvnk | 0:cabd10c37640 | 68 | printf("Change persistence control\r\n%d %02X\r\n", RGBsensor.Persist(ISL29125_PERS4), RGBsensor.Persist()); |
frankvnk | 0:cabd10c37640 | 69 | printf("%d %02X\r\n", RGBsensor.Persist(ISL29125_PERS1), RGBsensor.Persist()); |
frankvnk | 0:cabd10c37640 | 70 | |
frankvnk | 0:cabd10c37640 | 71 | // Change IRQ on conversion done |
frankvnk | 0:cabd10c37640 | 72 | printf("IRQ at end of RGB conversion: %d\r\n", RGBsensor.IRQonCnvDone()); |
frankvnk | 0:cabd10c37640 | 73 | RGBsensor.IRQonCnvDone(true); |
frankvnk | 0:cabd10c37640 | 74 | printf("Change IRQ at end of RGB conversion: ON\r\n%d\r\n", RGBsensor.IRQonCnvDone()); |
frankvnk | 0:cabd10c37640 | 75 | RGBsensor.IRQonCnvDone(false); |
frankvnk | 0:cabd10c37640 | 76 | printf("Change IRQ at end of RGB conversion: OFF\r\n%d\r\n", RGBsensor.IRQonCnvDone()); |
frankvnk | 0:cabd10c37640 | 77 | |
frankvnk | 0:cabd10c37640 | 78 | // Change Interrupt threshold assignemnt |
frankvnk | 0:cabd10c37640 | 79 | printf("Change Interrupt threshold assignemnt\r\n"); |
frankvnk | 0:cabd10c37640 | 80 | printf("G %d %02X\r\n", RGBsensor.IRQonColor(ISL29125_G), RGBsensor.IRQonColor()); |
frankvnk | 0:cabd10c37640 | 81 | printf("R %d %02X\r\n", RGBsensor.IRQonColor(ISL29125_R), RGBsensor.IRQonColor()); |
frankvnk | 0:cabd10c37640 | 82 | printf("B %d %02X\r\n", RGBsensor.IRQonColor(ISL29125_B), RGBsensor.IRQonColor()); |
frankvnk | 0:cabd10c37640 | 83 | printf("0FF %d %02X\r\n", RGBsensor.IRQonColor(ISL29125_OFF), RGBsensor.IRQonColor()); |
frankvnk | 0:cabd10c37640 | 84 | printf("INV %d %02X\r\n", RGBsensor.IRQonColor(0x10), RGBsensor.IRQonColor()); //try invalid value |
frankvnk | 0:cabd10c37640 | 85 | |
frankvnk | 0:cabd10c37640 | 86 | // Change IR compensation |
frankvnk | 0:cabd10c37640 | 87 | printf("Change IR compensation\r\n"); |
frankvnk | 0:cabd10c37640 | 88 | printf(" 0 %d %d\r\n", RGBsensor.IRcomp(0), RGBsensor.IRcomp()); |
frankvnk | 0:cabd10c37640 | 89 | printf(" 30 %d %d\r\n", RGBsensor.IRcomp(30), RGBsensor.IRcomp()); |
frankvnk | 0:cabd10c37640 | 90 | printf(" 64 %d %d\r\n", RGBsensor.IRcomp(64), RGBsensor.IRcomp()); //try invalid value |
frankvnk | 0:cabd10c37640 | 91 | printf("191 %d %d\r\n", RGBsensor.IRcomp(191), RGBsensor.IRcomp()); |
frankvnk | 0:cabd10c37640 | 92 | printf("192 %d %d\r\n", RGBsensor.IRcomp(192), RGBsensor.IRcomp()); //try invalid value |
frankvnk | 0:cabd10c37640 | 93 | |
frankvnk | 0:cabd10c37640 | 94 | RGBsensor.IRQonColor(ISL29125_G); // Enable Green threshold mode |
frankvnk | 0:cabd10c37640 | 95 | als.attach(&ALSread, 0.2); // Use this when IRQ on threshold is enabled |
frankvnk | 0:cabd10c37640 | 96 | flipper.attach(&flip, 5.0); // Only used with Sync mode test - Start conversion after 5 seconds. |
frankvnk | 0:cabd10c37640 | 97 | while(1) |
frankvnk | 0:cabd10c37640 | 98 | { |
frankvnk | 0:cabd10c37640 | 99 | // In IRQ mode, Read ISL29125 RGB values is automatically called every 200ms using a Ticker. |
frankvnk | 0:cabd10c37640 | 100 | // Reading the the RGB values too fast resluts in a i2c fail when an interrupt occurs. |
frankvnk | 0:cabd10c37640 | 101 | // Still investigating why this happens. |
frankvnk | 0:cabd10c37640 | 102 | // As a result, only enable the line below when no IRQ mode is used and als.attach / RGBsensor.IRQonColor are not enabled. |
frankvnk | 0:cabd10c37640 | 103 | // ALSread(); |
frankvnk | 0:cabd10c37640 | 104 | } |
frankvnk | 0:cabd10c37640 | 105 | } |
frankvnk | 0:cabd10c37640 | 106 | |
frankvnk | 0:cabd10c37640 | 107 | |
frankvnk | 0:cabd10c37640 | 108 | |
frankvnk | 0:cabd10c37640 | 109 | |
frankvnk | 0:cabd10c37640 | 110 |