A concept design laboratory prototype for measuring ambient light value. The high levels typically mean that there is high rates of UVA nad 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.

Dependencies:   Adafruit_SSD1331_Mbed Adafruit-GFX

Revision:
0:87339e72a5eb
Child:
1:2f167213fd2d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Apr 19 16:06:25 2020 +0000
@@ -0,0 +1,147 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2019 ARM Limited
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include "mbed.h"
+#include "Adafruit_SSD1331.h"
+#include "Adafruit_GFX.h"
+
+
+// PmodOLEDrgb
+Adafruit_SSD1331 OLED(D8, D7, D10, D11, NC, D13); // cs, res, dc, mosi, (nc), sck  
+
+DigitalOut LED(LED2); 
+DigitalOut VCCEN(D6);
+DigitalOut PMODEN(D5);
+
+// Definition of colors on the OLED display
+#define Black 0x0000
+#define Blue 0x001F
+#define Red 0xF800
+#define Green 0x07E0
+#define Cyan 0x07FF
+#define Magenta 0xF81F
+#define Yellow 0xFFE0
+#define White 0xFFFF
+
+// PmodALS
+SPI spi(D11, D12, D13); // mosi, miso, sck
+ 
+
+DigitalOut alsCS(D4);        // chip select for sensor SPI communication
+char alsByte0 = 0;           // 8 bit data from sensor board, char is the unsigned 8 bit
+char alsByte1 = 0;           // 8 bit data from sensor board
+char alsByteSh0 = 0;
+char alsByteSh1 = 0;
+char als8bit = 0;
+unsigned short alsRaw = 0;   // unsigned 16 bit
+float alsScaledF = 0;       // 32 bit floating point
+void getALS();
+
+
+char Time[50],Date[50];
+void getTime();
+int first(0);
+
+int main()
+{
+  // Showing with a LED that program has started
+        LED = 0;
+        VCCEN = 1;    // if you did not connect VCCEN permanently to Vcc
+        PMODEN = 1;   // if you did not connect PMODEN permanently to Vcc
+        wait_ms(2000);
+        LED = 1;
+        wait_ms(2000);
+        LED = 0;
+  // Initalize the PmodOLEDrgb    
+        OLED.begin(); // initialization of display objcet
+        
+// SPI for the ALS      
+        alsCS = 1;
+        // Setup the spi for 8 bit data, high steady state clock,
+        // second edge capture, with a 12MHz clock rate
+        spi.format(8,0);           
+        spi.frequency(12000000);   
+
+    while (true) {
+        while(first < 3)
+            {
+                first += 1; 
+                OLED.fillScreen(Black); // background screen in black
+                OLED.setTextColor(Cyan); // color of text in cyan
+                OLED.setCursor(0,0); // cursor is in x=0 and y=15
+                OLED.printf("Test module Pmod"); // display text
+                wait_ms(500); // wait 500 ms
+                OLED.setCursor(0,15); // cursor is in x=0 and y=15
+                OLED.setTextSize(2); // size of text
+                OLED.setTextColor(Red); // text in red color
+                OLED.printf("DIGILENT"); // display text
+                OLED.setCursor(20,40); // cursor is in x=20 and y=40
+                OLED.setTextSize(1); // size of text
+                OLED.setTextColor(Green); // text in green color
+                OLED.printf("LEXTRONIC"); // display text
+                OLED.drawFastHLine(1, 60, OLED.width()-1, Blue); // blue line x=1 to screen width-1 and y=60
+                wait_ms(2000); // wait 2 s
+                OLED.fillScreen(Black); // background display in black (erase display)
+                OLED.fillRoundRect(5, 5, 30, 40, 1, Blue); // French flag bleu blanc rouge
+                OLED.fillRoundRect(35, 5, 30, 40, 1, White);
+                OLED.fillRoundRect(65, 5, 30, 40, 1, Red);
+                OLED.fillCircle(90, 55, 5, Yellow); // yellow circle with radius=5 in x=90 and y=55
+                wait_ms(2000); // wait 2 s
+            }
+
+        getTime();
+        OLED.fillScreen(Black); // background screen in black
+        OLED.setTextColor(Cyan); // color of text in cyan
+        wait_ms(300);
+        OLED.setCursor(0,0); // cursor is in x=0 and y=0
+        OLED.printf("Rec '%s' \r\n",Time);
+        
+        getALS(); 
+        OLED.printf("LUX = '%0.1f' \r\n",alsScaledF);
+
+        if (alsScaledF > 100)
+        { 
+            OLED.setTextColor(Yellow);
+            OLED.printf("Be aware of high UV radiation!");
+            OLED.fillRoundRect(10, 35, 50, 3 , 1, Yellow);
+        }
+        OLED.setCursor(0,40); // cursor is in x=0 and y=0
+        OLED.printf("Test completed");
+        printf("printed on OLED");
+        
+        wait(1);
+}
+}
+
+void getTime()
+{    
+    time_t seconds = time(NULL);
+    strftime(Time,40,"%H:%M:%S", localtime(&seconds));
+    strftime(Date,40,"%d-%b-%Y", localtime(&seconds));
+    printf("Recorded '%s' \r\n",Time);
+}
+
+void getALS()
+{
+    alsCS = 0; 
+    
+    alsByte0 = spi.write(0x00);
+    alsByte1 = spi.write(0x00);
+  
+    alsCS = 1;
+   
+    alsByteSh0 = alsByte0 << 4;
+    alsByteSh1 = alsByte1 >> 4;
+    
+    als8bit =( alsByteSh0 | alsByteSh1 );
+    
+    alsRaw = als8bit; // 
+    alsScaledF = (float(alsRaw))*(float(6.68)); // The value 6.68 is 64 bit double precision floating point of type double.
+                                                // Conversions to 32 bit floating point of type float.
+    printf("Ambient light raw 8 bit 0...255 =  '%d' \r\n",alsRaw);
+    printf("Ambient light scaled to LUX =  '%0.1f' \r\n",alsScaledF);
+    wait_ms(100);
+}
+