1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
#include <Arduino.h>
#define GxEPD2_DISPLAY_CLASS GxEPD2_BW
#include <GxEPD2_BW.h>
#include <GxEPD2_3C.h>
#include <Fonts/FreeMonoBold9pt7b.h>
#include <Fonts/FreeMonoBold24pt7b.h>
#include <NimBLEDevice.h>
#include <WiFi.h>
#include <ArduinoOTA.h>
#include "badge_config.h"
#if defined(BADGE_SSID_NAME) && defined(BADGE_SSID_PASS)
#define BADGE_USE_WIFI 1
#else
#define BADGE_USE_WIFI 0
#endif
NimBLEServer *server;
#if UVOK_EPAP_DISPLAY == 219
// HINT: Update the library code, set budy timeout to 30 or 60 seconds!
// Small color
GxEPD2_3C<GxEPD2_213_Z19c, GxEPD2_213_Z19c::HEIGHT> display(GxEPD2_213_Z19c(22, 21, 17, 16));
#elif UVOK_EPAP_DISPLAY == 290
// larger b/w
// or T5
// GxEPD2_BW<GxEPD2_290_T5D, GxEPD2_290_T5D::HEIGHT> display(GxEPD2_290_T5D(22, 21, 17, 16));
GxEPD2_BW<GxEPD2_290_M06, GxEPD2_290_M06::HEIGHT> display(GxEPD2_290_M06(22, 21, 17, 16));
#else
#error "define display"
#endif
unsigned long pressedTime = 0;
unsigned long releasedTime = 0;
#define BUTTON_PIN 0
#define LONG_PRESS_TIME 3000
#define SLEEP_TIME 10000
NimBLEAdvertising *pAdvertising;
void display_helloWorld();
void setup()
{
Serial.begin(115200);
Serial.println("Yes, it works!");
NimBLEDevice::init("Espadge");
server = NimBLEDevice::createServer();
NimBLEService *service = new NimBLEService("ca260000-b4bb-46b2-bd06-b7b7a61ea990");
auto c = service->createCharacteristic("ca260001-b4bb-46b2-bd06-b7b7a61ea990");
service->start();
c->setValue("1");
server->addService(service);
pAdvertising = NimBLEDevice::getAdvertising();
pAdvertising->setName("NimBLE");
Serial.println("Init display...");
display.init(115200, true, 2, false); // USE THIS for Waveshare boards with "clever" reset circuit, 2ms reset pulse
display_helloWorld();
display.hibernate();
Serial.println("Display done.");
#if BADGE_USE_WIFI
WiFi.begin(BADGE_SSID_NAME, BADGE_SSID_PASS);
while (WiFi.status() != WL_CONNECTED)
delay(500);
ArduinoOTA.begin();
#endif
// doesn't work as expected?
// gpio_wakeup_enable(GPIO_NUM_0, GPIO_INTR_LOW_LEVEL);
// esp_sleep_enable_gpio_wakeup();
// esp_light_sleep_start();
}
void loop()
{
#if BADGE_USE_WIFI
ArduinoOTA.handle();
#endif
static int lastState = HIGH;
int buttonState = digitalRead(BUTTON_PIN);
if (lastState == HIGH && buttonState == LOW)
{
Serial.println("``\\__");
pressedTime = millis();
lastState = LOW;
}
else if (lastState == LOW && buttonState == HIGH)
{
lastState = HIGH;
Serial.println("__/``");
releasedTime = millis();
long pressDuration = releasedTime - pressedTime;
if (pressDuration > LONG_PRESS_TIME && !pAdvertising->isAdvertising())
{
Serial.println("Long press detected. Starting advertising...");
pAdvertising->start(10000);
}
// if (millis() - releasedTime > SLEEP_TIME && !pAdvertising->isAdvertising())
// {
// Serial.println("Go to sleep...");
// esp_light_sleep_start();
// }
};
}
void display_helloWorld()
{
// display.clearScreen();
static const char HelloWorld[] = "Hello World!";
display.setRotation(1);
display.setFont(&FreeMonoBold24pt7b);
display.setTextColor(GxEPD_BLACK);
int16_t tbx, tby;
uint16_t tbw, tbh;
display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
// center the bounding box by transposition of the origin:
uint16_t x = ((display.width() - tbw) / 2) - tbx;
uint16_t y = ((display.height() - tbh) / 2) - tby;
display.setFullWindow();
display.firstPage();
do
{
display.fillScreen(GxEPD_YELLOW);
display.setCursor(x, y);
display.print(HelloWorld);
} while (display.nextPage());
}
|