Skip to content

Commit ae05087

Browse files
authored
Merge pull request #241 from SolderedElectronics/dev
Dev to master
2 parents aba019c + 9fba273 commit ae05087

File tree

36 files changed

+1573
-134
lines changed

36 files changed

+1573
-134
lines changed
Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
/*
2+
Inkplate4TEMPERA_APDS9960 example for Soldered Inkplate 4 TEMPERA
3+
For this example you will need only a USB-C cable and Inkplate 4 TEMPERA.
4+
Select "Soldered Inkplate 4 TEMPERA" from Tools -> Board menu.
5+
Don't have "Soldered Inkplate 4 TEMPERA" option? Follow our tutorial and add it:
6+
https://soldered.com/learn/add-inkplate-6-board-definition-to-arduino-ide/
7+
8+
This example will show you how to read gestures, proximity, color and
9+
ambient light from the built-in APDS9960 sensor.
10+
11+
Want to learn more about Inkplate? Visit www.inkplate.io
12+
Looking to get support? Write on our forums: https://forum.soldered.com/
13+
20 Nov 2023 by Soldered
14+
*/
15+
16+
// Next 3 lines are a precaution, you can ignore those, and the example would also work without them
17+
#ifndef ARDUINO_INKPLATE4TEMPERA
18+
#error "Wrong board selection for this example, please select Inkplate 4 TEMPERA in the boards menu."
19+
#endif
20+
21+
#include "Inkplate.h" // Include Inkplate library to the sketch
22+
#include "background.h" // Include background image
23+
24+
25+
Inkplate display(INKPLATE_1BIT); // Create an object on Inkplate library and also set library into 1 Bit mode (BW)
26+
27+
// Display update
28+
#define NUM_UPDATES_BEFORE_FULL_REFRESH 30 // How many partial updates to do before a full refresh
29+
// Variables to help control program flow
30+
bool dataHasChanged = true; // Set to true so initial data is shown
31+
int numUpdates = 0;
32+
33+
// Remember last read values from the sensor so the display can only be updated when there's new values
34+
uint8_t lastProximityMeasured = 0;
35+
uint16_t lastRedLightMeasured = 0;
36+
uint16_t lastGreenLightMeasured = 0;
37+
uint16_t lastBlueLightMeasured = 0;
38+
uint16_t lastAmbientLightMeasured = 0;
39+
40+
// Setup code, runs only once
41+
void setup()
42+
{
43+
display.begin(); // Init Inkplate library (you should call this function ONLY ONCE)
44+
display.clearDisplay(); // Clear frame buffer of display
45+
display.display(); // Put clear image on display
46+
display.setTextSize(3); // Set text to be 3 times bigger than classic 5x7 px text
47+
display.setTextColor(BLACK);
48+
49+
// Draw the background grid from buffer
50+
display.drawImage(background, 0, 0, 600, 600, WHITE, BLACK);
51+
52+
// Let's confiugure the APDS!
53+
display.wakePeripheral(INKPLATE_APDS9960); // First, wake it from sleep
54+
// Initialize the APDS
55+
if (!display.apds9960.init())
56+
{
57+
// There's an error with the initialization, inform the user
58+
display.setCursor(50, 50);
59+
display.print("Can't init APDS!");
60+
display.display();
61+
62+
// Go straight to sleep in this case
63+
esp_deep_sleep_start();
64+
}
65+
66+
// Individual elements of the sensor have to be enabled explicitly for it to work
67+
// First, enable the proximity sensor without interrupts
68+
display.apds9960.enableProximitySensor(false);
69+
display.apds9960.setProximityGain(1); // Set gain to lower so it's less sensitive
70+
// Enable the gesture sensor as well
71+
display.apds9960.enableGestureSensor();
72+
display.apds9960.setGestureGain(0); // Also set gain to lower so it's less sensitive
73+
// Finally, enable the light sensor
74+
display.apds9960.enableLightSensor(false);
75+
// Config is done
76+
77+
// Show the initial picture on the display with a full refresh
78+
display.display();
79+
}
80+
81+
// This code runs repeteadly
82+
void loop()
83+
{
84+
// Make all the readings from the APDS in order
85+
// Review these functions for details on how it works
86+
readProximity();
87+
detectGesture();
88+
readColor();
89+
readLight();
90+
91+
// Update the display if different data was read
92+
if (dataHasChanged)
93+
{
94+
updateDisplay();
95+
}
96+
97+
delay(250); // Add a small delay between readings
98+
}
99+
100+
// Detect a swiping gesture in front of the sensor
101+
void detectGesture()
102+
{
103+
if (display.apds9960.isGestureAvailable())
104+
{
105+
// The sensor has detected a gesture, so it should get printed
106+
107+
dataHasChanged = true; // Set the flag which updates the display
108+
109+
// Clear previously written data and set the cursor in the correct place
110+
display.fillRect(323, 72, 263, 118, WHITE);
111+
display.setCursor(423, 125);
112+
display.setTextSize(4);
113+
114+
// Read the gesture
115+
int gesture = display.apds9960.readGesture();
116+
switch (gesture)
117+
{
118+
// Depending on which gesture was recorded, print different data
119+
case DIR_UP:
120+
display.print("Up");
121+
break;
122+
123+
case DIR_DOWN:
124+
display.print("Down");
125+
break;
126+
127+
case DIR_LEFT:
128+
display.print("Left");
129+
break;
130+
131+
case DIR_RIGHT:
132+
display.print("Right");
133+
break;
134+
135+
default:
136+
// Do nothing
137+
break;
138+
}
139+
}
140+
}
141+
142+
// Get data for proximity as an 8-bit value
143+
void readProximity()
144+
{
145+
// Get the proximity the sensor is reading at thism moment
146+
// Note the datatype is uint8_t
147+
uint8_t proximity = 0;
148+
display.apds9960.readProximity(proximity);
149+
150+
// If it's different than last time, print it
151+
if (proximity != lastProximityMeasured)
152+
{
153+
dataHasChanged = true; // Set the flag which updates the display
154+
155+
display.fillRect(21, 72, 249, 118, WHITE);
156+
display.setTextSize(4);
157+
display.setCursor(75, 125);
158+
display.print(proximity);
159+
lastProximityMeasured = proximity; // Remember new data for later
160+
}
161+
}
162+
163+
// Read the red, green and blue light values
164+
void readColor()
165+
{
166+
167+
// Same principle as readProximity, note the data type
168+
uint16_t redLight = 0;
169+
uint16_t greenLight = 0;
170+
uint16_t blueLight = 0;
171+
display.apds9960.readRedLight(redLight);
172+
display.apds9960.readGreenLight(greenLight);
173+
display.apds9960.readBlueLight(blueLight);
174+
175+
// If any of these has changed from before, print new data
176+
if (redLight != lastRedLightMeasured || greenLight != lastGreenLightMeasured || blueLight != lastBlueLightMeasured)
177+
{
178+
dataHasChanged = true; // Set the flag which updates the display
179+
180+
// Clear old data in the frame buffer, set the cursors in the correct place and write new data
181+
display.fillRect(21, 409, 249, 126, WHITE);
182+
display.setTextSize(3);
183+
display.setCursor(32, 409);
184+
display.print("Red: ");
185+
display.print(redLight);
186+
display.setCursor(32, 434);
187+
display.print("Green: ");
188+
display.print(greenLight);
189+
display.setCursor(32, 459);
190+
display.print("Blue: ");
191+
display.print(blueLight);
192+
193+
// Remember this for later so we only have to update the display when this changes
194+
lastRedLightMeasured = redLight;
195+
lastGreenLightMeasured = greenLight;
196+
lastBlueLightMeasured = blueLight;
197+
}
198+
}
199+
200+
// Read the ambient light sensor data for all light
201+
void readLight()
202+
{
203+
// Same principle as in readColor()
204+
uint16_t ambientLight = 0;
205+
display.apds9960.readAmbientLight(ambientLight);
206+
207+
// If the value has changed, print the data to the screen
208+
if (ambientLight != lastAmbientLightMeasured)
209+
{
210+
dataHasChanged = true; // Set the flag which updates the display
211+
212+
display.fillRect(323, 409, 249, 126, WHITE); // Clear old value
213+
display.setTextSize(4);
214+
display.setCursor(413, 425);
215+
display.print(ambientLight);
216+
217+
lastAmbientLightMeasured = ambientLight;
218+
}
219+
}
220+
221+
// This function updates the display with the new data in the frame buffer
222+
// It does partial updates until NUM_UPDATES_BEFORE_FULL_REFRESH is reached
223+
// Then it does a full refresh and resets the coutner
224+
void updateDisplay()
225+
{
226+
if (numUpdates >= NUM_UPDATES_BEFORE_FULL_REFRESH)
227+
{
228+
display.display();
229+
numUpdates = 0;
230+
}
231+
else
232+
{
233+
display.partialUpdate(false, true);
234+
numUpdates++;
235+
}
236+
dataHasChanged = false;
237+
}

0 commit comments

Comments
 (0)