A concept design laboratory prototype for measuring ambient light value. The high levels typically mean that there is high rates of UVA and UVB radiation as well. A warning of this is displayed on a small screen. NXP FRDM-K64F, Digilent Pmod modules Pmod OLEDrgb and Pmod ALS. Tested as well on ST L432KC.
Dependencies: Adafruit_SSD1331_Mbed Adafruit-GFX
main.cpp@1:fde67a85d481, 2020-05-16 (annotated)
- Committer:
- timo_k2
- Date:
- Sat May 16 15:45:45 2020 +0000
- Revision:
- 1:fde67a85d481
- Parent:
- 0:87339e72a5eb
- Child:
- 2:0eed70300cb4
Pmod OLEDrgb display and Pmod ALS sensor are tested with board ST L432KC. Both are using the SPI communication.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
timo_k2 | 0:87339e72a5eb | 1 | /* mbed Microcontroller Library |
timo_k2 | 0:87339e72a5eb | 2 | * Copyright (c) 2019 ARM Limited |
timo_k2 | 0:87339e72a5eb | 3 | * SPDX-License-Identifier: Apache-2.0 |
timo_k2 | 1:fde67a85d481 | 4 | ************************************************************************ |
timo_k2 | 1:fde67a85d481 | 5 | * |
timo_k2 | 1:fde67a85d481 | 6 | * Test of the Pmod small OLED display and ambient light sensor |
timo_k2 | 1:fde67a85d481 | 7 | * |
timo_k2 | 1:fde67a85d481 | 8 | ************************************************************************* |
timo_k2 | 1:fde67a85d481 | 9 | * Description: Pmod_OLED_ALS1 |
timo_k2 | 1:fde67a85d481 | 10 | * The message "Test module Pmod Digilent Lextronic" will be display on OLEDrgb module |
timo_k2 | 1:fde67a85d481 | 11 | * with different size and colors..... and sensor value as well. |
timo_k2 | 1:fde67a85d481 | 12 | * |
timo_k2 | 1:fde67a85d481 | 13 | * Material |
timo_k2 | 1:fde67a85d481 | 14 | * 1. ST L432KC ( or some other micro controller board with SPI communication ) |
timo_k2 | 1:fde67a85d481 | 15 | * 2. Digilent Pmod OLEDrgb and the libraries |
timo_k2 | 1:fde67a85d481 | 16 | * Adafruit_SSD1331_Mbed |
timo_k2 | 1:fde67a85d481 | 17 | * Adafruit-GFX |
timo_k2 | 1:fde67a85d481 | 18 | * These libraries can be found with search on the page |
timo_k2 | 1:fde67a85d481 | 19 | * https://www.mbed.com/en/platform/mbed-os/ |
timo_k2 | 1:fde67a85d481 | 20 | * Please connect L432KC - Pmod_OLEDrgb with lines: |
timo_k2 | 1:fde67a85d481 | 21 | * L432KC D13 - OLED 4 SCK hardware defined for the SPI |
timo_k2 | 1:fde67a85d481 | 22 | * L432KC D11 - OLED 2 MOSI hardware definef for the SPI |
timo_k2 | 1:fde67a85d481 | 23 | * L432KC D9 - OLED 1 CS or any other free |
timo_k2 | 1:fde67a85d481 | 24 | * L432KC D10 - OLED 7 DC or any other free |
timo_k2 | 1:fde67a85d481 | 25 | * L432KC D6 - OLED 8 RES or any other free |
timo_k2 | 1:fde67a85d481 | 26 | * VCC - OLED 9 VCCEN Enable - VCC |
timo_k2 | 1:fde67a85d481 | 27 | * VCC - OLED10 PMODEN Pmod Enable - VCC |
timo_k2 | 1:fde67a85d481 | 28 | * GND - OLED 5 Ground |
timo_k2 | 1:fde67a85d481 | 29 | * VCC - OLED 6 Power supply 3,3 V |
timo_k2 | 1:fde67a85d481 | 30 | * |
timo_k2 | 1:fde67a85d481 | 31 | ************************************************************************* |
timo_k2 | 1:fde67a85d481 | 32 | * 3. Digilent Pmod ALS ambient light sensor |
timo_k2 | 1:fde67a85d481 | 33 | * Please connect L432KC - PmodALS with lines: |
timo_k2 | 1:fde67a85d481 | 34 | * L432KC D13 - ALS 4 SCK hardware defined for the SPI |
timo_k2 | 1:fde67a85d481 | 35 | * L432KC D12 - ALS 3 MISO hardware defined for the SPI |
timo_k2 | 1:fde67a85d481 | 36 | * L432KC D4 - ALS 1 CS or any other free |
timo_k2 | 1:fde67a85d481 | 37 | * GND - ALS 5 GND |
timo_k2 | 1:fde67a85d481 | 38 | * Vcc - ALS 6 Vcc |
timo_k2 | 1:fde67a85d481 | 39 | |
timo_k2 | 1:fde67a85d481 | 40 | ALS data on the SPI |
timo_k2 | 1:fde67a85d481 | 41 | D15 ... D13 - three zeros |
timo_k2 | 1:fde67a85d481 | 42 | D12 ... D04 - 8 bits of ambient light data |
timo_k2 | 1:fde67a85d481 | 43 | D03 ... D00 - four zeros |
timo_k2 | 1:fde67a85d481 | 44 | |
timo_k2 | 1:fde67a85d481 | 45 | Details on the connection of ADC IC chip on ALS board are given |
timo_k2 | 1:fde67a85d481 | 46 | http://www.ti.com/lit/ds/symlink/adc081s021.pdf |
timo_k2 | 1:fde67a85d481 | 47 | * |
timo_k2 | 1:fde67a85d481 | 48 | * Timo Karppinen 16.05.2020 |
timo_k2 | 1:fde67a85d481 | 49 | **************************************************************/ |
timo_k2 | 1:fde67a85d481 | 50 | |
timo_k2 | 0:87339e72a5eb | 51 | |
timo_k2 | 0:87339e72a5eb | 52 | #include "mbed.h" |
timo_k2 | 1:fde67a85d481 | 53 | #include "Adafruit_SSD1331.h" // By using the Adafruit SSD1331 library and Adafruit GFX library |
timo_k2 | 1:fde67a85d481 | 54 | #include "Adafruit_GFX.h" // we will get similar code than in Arduino-boards working. |
timo_k2 | 1:fde67a85d481 | 55 | // There are other SSD1331 libraries, too. https://os.mbed.com/search/?q=ssd1331 |
timo_k2 | 1:fde67a85d481 | 56 | |
timo_k2 | 0:87339e72a5eb | 57 | // PmodOLEDrgb |
timo_k2 | 1:fde67a85d481 | 58 | Adafruit_SSD1331 OLED(D9, D6, D10, D11, NC, D13); // cs, res, dc, mosi, (nc), sck |
timo_k2 | 0:87339e72a5eb | 59 | |
timo_k2 | 1:fde67a85d481 | 60 | //DigitalOut LED(LED1); // LED1, LED2, LED3 and LED4 are the D13 PB_3 pin in this board and can not be used because of the SPI |
timo_k2 | 1:fde67a85d481 | 61 | DigitalOut VCCEN(D3); |
timo_k2 | 0:87339e72a5eb | 62 | DigitalOut PMODEN(D5); |
timo_k2 | 0:87339e72a5eb | 63 | |
timo_k2 | 0:87339e72a5eb | 64 | // Definition of colors on the OLED display |
timo_k2 | 0:87339e72a5eb | 65 | #define Black 0x0000 |
timo_k2 | 0:87339e72a5eb | 66 | #define Blue 0x001F |
timo_k2 | 0:87339e72a5eb | 67 | #define Red 0xF800 |
timo_k2 | 0:87339e72a5eb | 68 | #define Green 0x07E0 |
timo_k2 | 0:87339e72a5eb | 69 | #define Cyan 0x07FF |
timo_k2 | 0:87339e72a5eb | 70 | #define Magenta 0xF81F |
timo_k2 | 0:87339e72a5eb | 71 | #define Yellow 0xFFE0 |
timo_k2 | 0:87339e72a5eb | 72 | #define White 0xFFFF |
timo_k2 | 0:87339e72a5eb | 73 | |
timo_k2 | 0:87339e72a5eb | 74 | // PmodALS |
timo_k2 | 0:87339e72a5eb | 75 | SPI spi(D11, D12, D13); // mosi, miso, sck |
timo_k2 | 0:87339e72a5eb | 76 | |
timo_k2 | 0:87339e72a5eb | 77 | |
timo_k2 | 0:87339e72a5eb | 78 | DigitalOut alsCS(D4); // chip select for sensor SPI communication |
timo_k2 | 0:87339e72a5eb | 79 | char alsByte0 = 0; // 8 bit data from sensor board, char is the unsigned 8 bit |
timo_k2 | 0:87339e72a5eb | 80 | char alsByte1 = 0; // 8 bit data from sensor board |
timo_k2 | 0:87339e72a5eb | 81 | char alsByteSh0 = 0; |
timo_k2 | 0:87339e72a5eb | 82 | char alsByteSh1 = 0; |
timo_k2 | 0:87339e72a5eb | 83 | char als8bit = 0; |
timo_k2 | 0:87339e72a5eb | 84 | unsigned short alsRaw = 0; // unsigned 16 bit |
timo_k2 | 0:87339e72a5eb | 85 | float alsScaledF = 0; // 32 bit floating point |
timo_k2 | 0:87339e72a5eb | 86 | void getALS(); |
timo_k2 | 0:87339e72a5eb | 87 | |
timo_k2 | 0:87339e72a5eb | 88 | |
timo_k2 | 0:87339e72a5eb | 89 | char Time[50],Date[50]; |
timo_k2 | 0:87339e72a5eb | 90 | void getTime(); |
timo_k2 | 1:fde67a85d481 | 91 | int first = 0; |
timo_k2 | 0:87339e72a5eb | 92 | |
timo_k2 | 0:87339e72a5eb | 93 | int main() |
timo_k2 | 0:87339e72a5eb | 94 | { |
timo_k2 | 0:87339e72a5eb | 95 | // Showing with a LED that program has started |
timo_k2 | 1:fde67a85d481 | 96 | // LED = 0; |
timo_k2 | 0:87339e72a5eb | 97 | VCCEN = 1; // if you did not connect VCCEN permanently to Vcc |
timo_k2 | 0:87339e72a5eb | 98 | PMODEN = 1; // if you did not connect PMODEN permanently to Vcc |
timo_k2 | 1:fde67a85d481 | 99 | ThisThread::sleep_for(2000); |
timo_k2 | 1:fde67a85d481 | 100 | // LED = 1; |
timo_k2 | 1:fde67a85d481 | 101 | ThisThread::sleep_for(2000); |
timo_k2 | 1:fde67a85d481 | 102 | // LED = 0; |
timo_k2 | 0:87339e72a5eb | 103 | // Initalize the PmodOLEDrgb |
timo_k2 | 1:fde67a85d481 | 104 | OLED.begin(); // initialization of display object |
timo_k2 | 0:87339e72a5eb | 105 | |
timo_k2 | 0:87339e72a5eb | 106 | // SPI for the ALS |
timo_k2 | 0:87339e72a5eb | 107 | alsCS = 1; |
timo_k2 | 0:87339e72a5eb | 108 | // Setup the spi for 8 bit data, high steady state clock, |
timo_k2 | 0:87339e72a5eb | 109 | // second edge capture, with a 12MHz clock rate |
timo_k2 | 0:87339e72a5eb | 110 | spi.format(8,0); |
timo_k2 | 1:fde67a85d481 | 111 | spi.frequency(12000000); |
timo_k2 | 1:fde67a85d481 | 112 | |
timo_k2 | 1:fde67a85d481 | 113 | OLED.clearScreen(); |
timo_k2 | 0:87339e72a5eb | 114 | |
timo_k2 | 0:87339e72a5eb | 115 | while (true) { |
timo_k2 | 0:87339e72a5eb | 116 | while(first < 3) |
timo_k2 | 0:87339e72a5eb | 117 | { |
timo_k2 | 0:87339e72a5eb | 118 | first += 1; |
timo_k2 | 0:87339e72a5eb | 119 | OLED.fillScreen(Black); // background screen in black |
timo_k2 | 0:87339e72a5eb | 120 | OLED.setTextColor(Cyan); // color of text in cyan |
timo_k2 | 0:87339e72a5eb | 121 | OLED.setCursor(0,0); // cursor is in x=0 and y=15 |
timo_k2 | 0:87339e72a5eb | 122 | OLED.printf("Test module Pmod"); // display text |
timo_k2 | 1:fde67a85d481 | 123 | ThisThread::sleep_for(500); // wait 500 ms |
timo_k2 | 0:87339e72a5eb | 124 | OLED.setCursor(0,15); // cursor is in x=0 and y=15 |
timo_k2 | 0:87339e72a5eb | 125 | OLED.setTextSize(2); // size of text |
timo_k2 | 0:87339e72a5eb | 126 | OLED.setTextColor(Red); // text in red color |
timo_k2 | 0:87339e72a5eb | 127 | OLED.printf("DIGILENT"); // display text |
timo_k2 | 0:87339e72a5eb | 128 | OLED.setCursor(20,40); // cursor is in x=20 and y=40 |
timo_k2 | 0:87339e72a5eb | 129 | OLED.setTextSize(1); // size of text |
timo_k2 | 0:87339e72a5eb | 130 | OLED.setTextColor(Green); // text in green color |
timo_k2 | 0:87339e72a5eb | 131 | OLED.printf("LEXTRONIC"); // display text |
timo_k2 | 0:87339e72a5eb | 132 | OLED.drawFastHLine(1, 60, OLED.width()-1, Blue); // blue line x=1 to screen width-1 and y=60 |
timo_k2 | 1:fde67a85d481 | 133 | ThisThread::sleep_for(2000); // wait 2 s |
timo_k2 | 0:87339e72a5eb | 134 | OLED.fillScreen(Black); // background display in black (erase display) |
timo_k2 | 0:87339e72a5eb | 135 | OLED.fillRoundRect(5, 5, 30, 40, 1, Blue); // French flag bleu blanc rouge |
timo_k2 | 0:87339e72a5eb | 136 | OLED.fillRoundRect(35, 5, 30, 40, 1, White); |
timo_k2 | 0:87339e72a5eb | 137 | OLED.fillRoundRect(65, 5, 30, 40, 1, Red); |
timo_k2 | 0:87339e72a5eb | 138 | OLED.fillCircle(90, 55, 5, Yellow); // yellow circle with radius=5 in x=90 and y=55 |
timo_k2 | 1:fde67a85d481 | 139 | ThisThread::sleep_for(2000); // wait 2 s |
timo_k2 | 0:87339e72a5eb | 140 | } |
timo_k2 | 0:87339e72a5eb | 141 | |
timo_k2 | 0:87339e72a5eb | 142 | getTime(); |
timo_k2 | 1:fde67a85d481 | 143 | OLED.clearScreen(); |
timo_k2 | 0:87339e72a5eb | 144 | OLED.fillScreen(Black); // background screen in black |
timo_k2 | 0:87339e72a5eb | 145 | OLED.setTextColor(Cyan); // color of text in cyan |
timo_k2 | 1:fde67a85d481 | 146 | ThisThread::sleep_for(300); |
timo_k2 | 0:87339e72a5eb | 147 | OLED.setCursor(0,0); // cursor is in x=0 and y=0 |
timo_k2 | 1:fde67a85d481 | 148 | OLED.printf("Rec '%s' \n",Time); |
timo_k2 | 0:87339e72a5eb | 149 | |
timo_k2 | 0:87339e72a5eb | 150 | getALS(); |
timo_k2 | 1:fde67a85d481 | 151 | OLED.printf("LUX = '%0.1f' \n",alsScaledF); |
timo_k2 | 0:87339e72a5eb | 152 | |
timo_k2 | 0:87339e72a5eb | 153 | if (alsScaledF > 100) |
timo_k2 | 0:87339e72a5eb | 154 | { |
timo_k2 | 0:87339e72a5eb | 155 | OLED.setTextColor(Yellow); |
timo_k2 | 0:87339e72a5eb | 156 | OLED.printf("Be aware of high UV radiation!"); |
timo_k2 | 0:87339e72a5eb | 157 | OLED.fillRoundRect(10, 35, 50, 3 , 1, Yellow); |
timo_k2 | 0:87339e72a5eb | 158 | } |
timo_k2 | 0:87339e72a5eb | 159 | OLED.setCursor(0,40); // cursor is in x=0 and y=0 |
timo_k2 | 0:87339e72a5eb | 160 | OLED.printf("Test completed"); |
timo_k2 | 1:fde67a85d481 | 161 | OLED.drawFastHLine(1, 60, OLED.width()-1, Blue); // blue line x=1 to screen width-1 and y=60 |
timo_k2 | 0:87339e72a5eb | 162 | printf("printed on OLED"); |
timo_k2 | 0:87339e72a5eb | 163 | |
timo_k2 | 1:fde67a85d481 | 164 | ThisThread::sleep_for(3000); |
timo_k2 | 0:87339e72a5eb | 165 | } |
timo_k2 | 0:87339e72a5eb | 166 | } |
timo_k2 | 0:87339e72a5eb | 167 | |
timo_k2 | 0:87339e72a5eb | 168 | void getTime() |
timo_k2 | 0:87339e72a5eb | 169 | { |
timo_k2 | 0:87339e72a5eb | 170 | time_t seconds = time(NULL); |
timo_k2 | 0:87339e72a5eb | 171 | strftime(Time,40,"%H:%M:%S", localtime(&seconds)); |
timo_k2 | 0:87339e72a5eb | 172 | strftime(Date,40,"%d-%b-%Y", localtime(&seconds)); |
timo_k2 | 0:87339e72a5eb | 173 | printf("Recorded '%s' \r\n",Time); |
timo_k2 | 0:87339e72a5eb | 174 | } |
timo_k2 | 0:87339e72a5eb | 175 | |
timo_k2 | 0:87339e72a5eb | 176 | void getALS() |
timo_k2 | 0:87339e72a5eb | 177 | { |
timo_k2 | 0:87339e72a5eb | 178 | alsCS = 0; |
timo_k2 | 0:87339e72a5eb | 179 | |
timo_k2 | 0:87339e72a5eb | 180 | alsByte0 = spi.write(0x00); |
timo_k2 | 0:87339e72a5eb | 181 | alsByte1 = spi.write(0x00); |
timo_k2 | 0:87339e72a5eb | 182 | |
timo_k2 | 0:87339e72a5eb | 183 | alsCS = 1; |
timo_k2 | 0:87339e72a5eb | 184 | |
timo_k2 | 0:87339e72a5eb | 185 | alsByteSh0 = alsByte0 << 4; |
timo_k2 | 0:87339e72a5eb | 186 | alsByteSh1 = alsByte1 >> 4; |
timo_k2 | 0:87339e72a5eb | 187 | |
timo_k2 | 0:87339e72a5eb | 188 | als8bit =( alsByteSh0 | alsByteSh1 ); |
timo_k2 | 0:87339e72a5eb | 189 | |
timo_k2 | 0:87339e72a5eb | 190 | alsRaw = als8bit; // |
timo_k2 | 0:87339e72a5eb | 191 | alsScaledF = (float(alsRaw))*(float(6.68)); // The value 6.68 is 64 bit double precision floating point of type double. |
timo_k2 | 0:87339e72a5eb | 192 | // Conversions to 32 bit floating point of type float. |
timo_k2 | 0:87339e72a5eb | 193 | printf("Ambient light raw 8 bit 0...255 = '%d' \r\n",alsRaw); |
timo_k2 | 0:87339e72a5eb | 194 | printf("Ambient light scaled to LUX = '%0.1f' \r\n",alsScaledF); |
timo_k2 | 1:fde67a85d481 | 195 | ThisThread::sleep_for(100); |
timo_k2 | 0:87339e72a5eb | 196 | } |
timo_k2 | 0:87339e72a5eb | 197 |