Skip to content

Commit aabc1fc

Browse files
committed
Add more examples
1 parent 3cda9a3 commit aabc1fc

File tree

10 files changed

+2041
-0
lines changed

10 files changed

+2041
-0
lines changed

examples/Inkplate6COLOR/Advanced/Communication/BluetoothSerial/BluetoothSerial.ino

Whitespace-only changes.
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
/**
2+
**************************************************
3+
*
4+
* @file Qwiic.ino
5+
* @brief Example demonstrating easyC (I2C) communication between Inkplate 6 and
6+
* a Soldered BME280 or BME680 environmental sensor, using the LVGL library
7+
* for display rendering.
8+
*
9+
* This example reads temperature, humidity, and pressure data from a
10+
* Soldered BME280 sensor connected via the easyC interface and displays
11+
* it on the Inkplate 6 e-paper screen using LVGL elements.
12+
*
13+
* Note: Both BME280 and BME680 sensors are supported by the same
14+
* Soldered BME280/BME680 library. In this example, the BME280 is used,
15+
* as defined in the code. The sensor communicates over easyC (I2C)
16+
* using the default 0x76 address.
17+
*
18+
* For setup instructions and more information about Inkplate 6, visit:
19+
* https://soldered.com/documentation/inkplate/6/overview/
20+
*
21+
* @hardware Inkplate 6COLOR (ESP32-based e-paper display)
22+
* @sensors Soldered BME280 (or BME680) via easyC connector
23+
* @library Soldered BME280/BME680 Gas Sensor Arduino Library
24+
* https://github.com/SolderedElectronics/Soldered-BME280-BME680-Gas-Sensor-Arduino-Library
25+
*
26+
* @authors Soldered
27+
* @date November 2025
28+
**************************************************
29+
*/
30+
31+
32+
#include <Inkplate-LVGL.h>
33+
#include <BME280-SOLDERED.h> // Soldered BME280/BME680 library (easyC/I2C)
34+
35+
// Inkplate in 1-bit mode (fast partial updates)
36+
Inkplate inkplate;
37+
BME280 bme280; // easyC/I2C (Soldered uses 0x76)
38+
39+
// Optional temperature calibration offset
40+
const float TEMPERATURE_OFFSET = 0.0f;
41+
42+
// UI elements
43+
static lv_obj_t *panel_data;
44+
static lv_obj_t *lbl_title;
45+
static lv_obj_t *lbl_temp;
46+
static lv_obj_t *lbl_hum;
47+
static lv_obj_t *lbl_press;
48+
static lv_obj_t *lbl_warn;
49+
50+
// Refresh policy (do a FULL every ~20 partials)
51+
static int partialCount = 0;
52+
static const int FULL_REFRESH_EVERY = 20;
53+
54+
// Helpers
55+
static inline int dispW() { auto *d = lv_display_get_default(); return lv_display_get_horizontal_resolution(d); }
56+
static inline int dispH() { auto *d = lv_display_get_default(); return lv_display_get_vertical_resolution(d); }
57+
58+
static void make_opaque(lv_obj_t *obj) {
59+
lv_obj_set_style_bg_color(obj, lv_color_hex(0xFFFFFF), 0);
60+
lv_obj_set_style_bg_opa(obj, LV_OPA_COVER, 0);
61+
lv_obj_set_style_border_width(obj, 0, 0);
62+
}
63+
64+
// Minimal LVGL UI (no GFX icons to keep it LVGL-only)
65+
static void ui_create() {
66+
lv_obj_set_style_bg_color(lv_screen_active(), lv_color_hex(0xFFFFFF), LV_PART_MAIN);
67+
68+
lbl_title = lv_label_create(lv_screen_active());
69+
lv_label_set_text(lbl_title, "Qwiic • BME280");
70+
lv_obj_set_style_text_color(lbl_title, lv_color_hex(0x000000), 0);
71+
lv_obj_set_pos(lbl_title, 8, 8);
72+
make_opaque(lbl_title);
73+
74+
panel_data = lv_obj_create(lv_screen_active());
75+
make_opaque(panel_data);
76+
lv_obj_set_style_pad_all(panel_data, 0, 0);
77+
lv_obj_set_style_border_width(panel_data, 0, 0);
78+
lv_obj_set_pos(panel_data, 0, 40);
79+
lv_obj_set_size(panel_data, dispW(), dispH() - 80);
80+
81+
lbl_temp = lv_label_create(panel_data);
82+
lv_obj_set_style_text_color(lbl_temp, lv_color_hex(0x000000), 0);
83+
lv_obj_set_pos(lbl_temp, 24, 40);
84+
85+
lbl_hum = lv_label_create(panel_data);
86+
lv_obj_set_style_text_color(lbl_hum, lv_color_hex(0x000000), 0);
87+
lv_obj_set_pos(lbl_hum, 24, 140);
88+
89+
lbl_press = lv_label_create(panel_data);
90+
lv_obj_set_style_text_color(lbl_press, lv_color_hex(0x000000), 0);
91+
lv_obj_set_pos(lbl_press, 24, 240);
92+
93+
lbl_warn = lv_label_create(panel_data); // shown only if sensor looks unresponsive
94+
lv_obj_set_style_text_color(lbl_warn, lv_color_hex(0x000000), 0);
95+
lv_obj_set_pos(lbl_warn, 24, 320);
96+
lv_label_set_text(lbl_warn, "");
97+
}
98+
99+
static void update_readings() {
100+
// Read sensor
101+
float tC = bme280.readTemperature() + TEMPERATURE_OFFSET; // °C
102+
float hum = bme280.readHumidity() / 10.0f; // library returns x10
103+
float hPa = bme280.readPressure() * 10.0f; // hPa (original style)
104+
105+
// Basic sanity check (some libs return 0 or extreme values if not connected)
106+
bool looks_bad = (hPa <= 0.0f) || (hum < 0.0f || hum > 100.0f) || (tC < -40.0f || tC > 85.0f);
107+
108+
char bufT[32], bufH[32], bufP[32];
109+
snprintf(bufT, sizeof(bufT), "Temperature: %.1f *C", tC);
110+
snprintf(bufH, sizeof(bufH), "Humidity: %.0f %%", hum);
111+
snprintf(bufP, sizeof(bufP), "Pressure: %.0f hPa", hPa);
112+
113+
lv_label_set_text(lbl_temp, bufT);
114+
lv_label_set_text(lbl_hum, bufH);
115+
lv_label_set_text(lbl_press, bufP);
116+
117+
if (looks_bad) {
118+
lv_label_set_text(lbl_warn, "Warning: sensor readings look invalid.\nCheck Qwiic cable and sensor power.");
119+
} else {
120+
lv_label_set_text(lbl_warn, "");
121+
}
122+
}
123+
124+
void setup() {
125+
Serial.begin(115200);
126+
127+
// LVGL + Inkplate in PARTIAL mode
128+
inkplate.begin(LV_DISP_RENDER_MODE_PARTIAL);
129+
130+
// Init BME280 (void return in this library)
131+
bme280.begin();
132+
133+
ui_create();
134+
update_readings();
135+
136+
// Initial FULL refresh
137+
lv_tick_inc(20);
138+
lv_timer_handler();
139+
inkplate.display();
140+
}
141+
142+
void loop() {
143+
update_readings();
144+
145+
lv_tick_inc(10);
146+
lv_timer_handler();
147+
inkplate.display(); // FULL
148+
149+
150+
delay(60000); // ~60 s between readings
151+
}

examples/Inkplate6COLOR/Advanced/IO/ExternalExpander/ExternalExpander.ino

Whitespace-only changes.
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/**
2+
**************************************************
3+
*
4+
* @file ImageFromBuffer.ino
5+
* @brief Example showing how to display a JPG image located in a buffer onto the display
6+
*
7+
* For info on how to quickly get started with Inkplate 6COLOR visit https://soldered.com/documentation/inkplate/6color/overview/
8+
*
9+
* The image array data was generated using the following tool: https://notisrac.github.io/FileToCArray/
10+
* The following options were used: - Code format: Hex(0x00)
11+
* - Palette mod: 24bit RGB
12+
* - Multi line
13+
* - Separate bytes of pixels
14+
* - rest of the options can stay default
15+
* Save the generated file and copy it to this example folder
16+
*
17+
* @authors Soldered
18+
* @date November 2025
19+
***************************************************/
20+
#include <Inkplate-LVGL.h>
21+
22+
// Include the image data
23+
#include "cat.h"
24+
// Create an instance of the Inkplate object
25+
Inkplate display;
26+
27+
lv_obj_t *screen;
28+
29+
// LVGL image descriptor
30+
const lv_image_dsc_t my_image = {
31+
.header = {
32+
.cf = LV_COLOR_FORMAT_RGB888, // RGB888 color format
33+
.w = CAT_WIDTH,
34+
.h = CAT_HEIGHT,
35+
},
36+
.data_size = CAT_WIDTH*CAT_HEIGHT*3,
37+
.data = cat,
38+
};
39+
40+
// Create an lvgl task which will tick the lvgl timer every 5 ms
41+
// and handle any animations needed
42+
void lvgl_task(void *arg) {
43+
for (;;) {
44+
lv_tick_inc(5);
45+
lv_timer_handler();
46+
vTaskDelay(pdMS_TO_TICKS(5));
47+
}
48+
}
49+
50+
void setup() {
51+
Serial.begin(115200);
52+
delay(1000);
53+
Serial.println("Starting LVGL image example...");
54+
55+
// Initialize the display as well as lvgl in full render mode
56+
display.begin(LV_DISP_RENDER_MODE_FULL);
57+
58+
// Enables dithering of the whole lvgl buffer
59+
// Note: Dithering is only supported in full render mode
60+
display.enableDithering(1);
61+
62+
// Create LVGL task on core 1 to run independently from the rest of the sketch
63+
xTaskCreatePinnedToCore(
64+
lvgl_task, // Function which will be pinned
65+
"lvgl_tick", // Symbolic name
66+
16000, // Stack depth
67+
nullptr, // No parameters
68+
2, // Priority
69+
nullptr, // No buffer, it will be allocated dynamically
70+
1 // core used
71+
);
72+
73+
delay(100);
74+
75+
// Create screen
76+
screen = lv_scr_act();
77+
lv_obj_set_style_bg_color(screen, lv_color_white(), 0);
78+
lv_obj_set_style_bg_opa(screen, LV_OPA_COVER, 0);
79+
80+
// Create LVGL image object
81+
lv_obj_t *img = lv_image_create(screen);
82+
lv_image_set_src(img, &my_image);
83+
lv_obj_center(img);
84+
85+
// Force initial render
86+
for (int i = 0; i < 5; i++) {
87+
lv_timer_handler();
88+
delay(10);
89+
}
90+
91+
display.display();
92+
Serial.println("Display updated with L8 image");
93+
}
94+
95+
void loop() {
96+
// Nothing required
97+
}

0 commit comments

Comments
 (0)