... | ... |
@@ -19,9 +19,13 @@ |
19 | 19 |
|
20 | 20 |
//Uncomment the board you are using |
21 | 21 |
// heltec.h : Wemos TTGO LoRa, Heltech LoRa |
22 |
-// M5Stick.h : Orange M5 Stick |
|
23 |
-//#include <heltec.h> |
|
24 |
-#include <M5StickC.h> |
|
22 |
+// M5Stick.h : Orange M5 Stick C |
|
23 |
+#ifdef ARDUINO_M5Stick_C |
|
24 |
+ #include <M5StickC.h> |
|
25 |
+#elif ARDUINO_HELTEC_WIFI_LORA_32 |
|
26 |
+ #include <heltec.h> |
|
27 |
+#endif //ARDUINO_M5Stick_C & ARDUINO_HELTEC_WIFI_LORA_32 |
|
28 |
+ |
|
25 | 29 |
#include "sys/time.h" |
26 | 30 |
|
27 | 31 |
#include "BLEDevice.h" |
... | ... |
@@ -32,11 +36,13 @@ |
32 | 36 |
#include "beacon.h" |
33 | 37 |
#include "display.h" |
34 | 38 |
#include "button.h" |
39 |
+#include "serial.h" |
|
35 | 40 |
|
36 | 41 |
#include <EEPROM.h> |
37 | 42 |
#define EEPROM_SIZE 1 // To save BeaconType upon restart |
38 | 43 |
|
39 | 44 |
//#define DISABLE_BT //For Battery charging test |
45 |
+//#define DEBUG_PAYLOAD //TO print the payload to be sent |
|
40 | 46 |
|
41 | 47 |
BLEAdvertising *pAdvertising; |
42 | 48 |
|
... | ... |
@@ -69,23 +75,24 @@ void setBeacon() { |
69 | 75 |
advertising_data[AD_IDX_INSTANCE_ALL+AD_SHIFT+2], advertising_data[AD_IDX_INSTANCE_ALL+AD_SHIFT+3], |
70 | 76 |
advertising_data[AD_IDX_INSTANCE_ALL+AD_SHIFT+4], advertising_data[AD_IDX_INSTANCE_ALL+AD_SHIFT+5]); |
71 | 77 |
DisplayButtonStatus(); |
72 |
- |
|
78 |
+ |
|
79 |
+ #ifdef DEBUG_PAYLOAD |
|
73 | 80 |
uint8_t *ptr=(uint8_t*)strServiceData.c_str(); |
74 | 81 |
for(int i = 0; i < 36; i++ ) { |
75 | 82 |
Serial.printf("%02x", ptr[i]); |
76 | 83 |
} |
77 | 84 |
Serial.println(""); |
85 |
+ #endif //DEBUG_PAYLOAD |
|
78 | 86 |
oAdvertisementData.addData(strServiceData); |
79 | 87 |
pAdvertising->setAdvertisementData(oAdvertisementData); |
80 | 88 |
pAdvertising->setScanResponseData(oScanResponseData); |
81 | 89 |
} |
82 | 90 |
|
83 | 91 |
void setup() { |
84 |
- #ifdef _HELTEC_H_ |
|
92 |
+ #ifdef ARDUINO_HELTEC_WIFI_LORA_32 |
|
85 | 93 |
Heltec.begin(true /*DisplayEnable Enable*/, false /*LoRa Enable*/, true /*Serial Enable*/, false /*LoRa use PABOOST*/, 0 /*LoRa RF working band*/); |
86 | 94 |
Heltec.display->clear(); |
87 |
- #endif //_HELTEC_H_ |
|
88 |
- #ifdef _M5STICKC_H_ |
|
95 |
+ #elif ARDUINO_M5Stick_C |
|
89 | 96 |
M5.begin(); |
90 | 97 |
M5.Lcd.setRotation(3); |
91 | 98 |
double BatteryOrUSB = M5.Axp.GetIusbinData(); |
... | ... |
@@ -94,7 +101,7 @@ void setup() { |
94 | 101 |
backlight_level = MIN_BACKLIGHT;//Minimum backlight |
95 | 102 |
} |
96 | 103 |
M5.Axp.ScreenBreath(backlight_level); |
97 |
- #endif //_M5STICKC_H_ |
|
104 |
+ #endif //ARDUINO_M5Stick_C & ARDUINO_HELTEC_WIFI_LORA_32 |
|
98 | 105 |
Serial.begin(115200); |
99 | 106 |
EEPROM.begin(EEPROM_SIZE); |
100 | 107 |
|
... | ... |
@@ -183,6 +190,7 @@ void loop() { |
183 | 190 |
ad_running = 1; |
184 | 191 |
DisplayButtonStatus(); |
185 | 192 |
pAdvertising->start(); |
193 |
+ Serial.println("Advertizing started instance : "+String(instanceStr)); |
|
186 | 194 |
Serial.println("Advertizing started type : "+beaconTypeStr); |
187 | 195 |
delay(BEACON_ADV_DURATION); |
188 | 196 |
pAdvertising->stop(); |
... | ... |
@@ -195,6 +203,7 @@ void loop() { |
195 | 203 |
|
196 | 204 |
//PRG Button |
197 | 205 |
pollPrg(); |
206 |
+ pollSerial(); |
|
198 | 207 |
|
199 | 208 |
#ifndef DISABLE_BT |
200 | 209 |
delay(BEACON_SLEEP_ADV); |
... | ... |
@@ -8,9 +8,9 @@ int buttonState = 0; // variable for reading the pushbutton status |
8 | 8 |
#ifdef _HELTEC_H_ |
9 | 9 |
const int BUTTON_PRG = 0; // PRG Button |
10 | 10 |
#endif //_HELTEC_H_ |
11 |
-#ifdef _M5STICKC_H_ |
|
11 |
+#ifdef ARDUINO_M5Stick_C |
|
12 | 12 |
const int BUTTON_PRG = M5_BUTTON_HOME; // Home Button |
13 |
-#endif //_M5STICKC_H_ |
|
13 |
+#endif //ARDUINO_M5Stick_C |
|
14 | 14 |
const int ledPin = 13; // the number of the LED pin |
15 | 15 |
|
16 | 16 |
void pollPrg() |
... | ... |
@@ -9,26 +9,25 @@ |
9 | 9 |
#define LINE3 24 |
10 | 10 |
#define LINE4 36 |
11 | 11 |
#define LINE5 48 |
12 |
-#ifndef _M5STICKC_H_ |
|
13 |
- #define LINEBOTTOM 54 |
|
14 |
-#else |
|
12 |
+#ifdef ARDUINO_M5Stick_C |
|
15 | 13 |
#define LINE6 60 //M5Only |
16 | 14 |
#define LINEBOTTOM 72 |
17 | 15 |
//Battery see : http://community.m5stack.com/topic/1361/ischarging-and-getbatterylevel/5 |
18 | 16 |
#define VMAX 4000.0f // Observed Maximum: 4161.3 after 7h charge |
19 | 17 |
#define VMIN 2973.0f // Observed Minimum: 2973.0 |
20 | 18 |
#define COLUMN_BAT 80 |
21 |
-#endif //_M5STICKC_H_ |
|
19 |
+#elif ARDUINO_HELTEC_WIFI_LORA_32 |
|
20 |
+ #define LINEBOTTOM 54 |
|
21 |
+#endif //ARDUINO_M5Stick_C & ARDUINO_HELTEC_WIFI_LORA_32 |
|
22 | 22 |
|
23 | 23 |
//----------------------------------------------------------------------------------- |
24 |
-#ifdef _M5STICKC_H_ |
|
25 |
-//uint8_t backlight_level = 15; //15 High Luminosity, 7 lowest luminosity |
|
26 |
-#define MIN_BACKLIGHT 7 |
|
27 |
-#define MID_BACKLIGHT 11 |
|
28 |
-#define MAX_BACKLIGHT 15 |
|
29 |
-#define DEFAULT_BACKLIGHT MID_BACKLIGHT |
|
30 |
-uint8_t backlight_level = DEFAULT_BACKLIGHT; //15 High Luminosity, 7 lowest luminosity |
|
31 |
-#endif //_M5STICKC_H_ |
|
24 |
+#ifdef ARDUINO_M5Stick_C |
|
25 |
+ #define MIN_BACKLIGHT 7 |
|
26 |
+ #define MID_BACKLIGHT 11 |
|
27 |
+ #define MAX_BACKLIGHT 15 |
|
28 |
+ #define DEFAULT_BACKLIGHT MID_BACKLIGHT |
|
29 |
+ uint8_t backlight_level = DEFAULT_BACKLIGHT; //15 High Luminosity, 7 lowest luminosity |
|
30 |
+#endif //ARDUINO_M5Stick_C |
|
32 | 31 |
//----------------------------------------------------------------------------------- |
33 | 32 |
|
34 | 33 |
|
... | ... |
@@ -39,7 +38,7 @@ char macStr[18] = ""; |
39 | 38 |
int ad_running = 0; |
40 | 39 |
uint32_t beacon_count = 0; |
41 | 40 |
|
42 |
-#ifdef _M5STICKC_H_ |
|
41 |
+#ifdef ARDUINO_M5Stick_C |
|
43 | 42 |
float getBatteryLevel(void) |
44 | 43 |
{ |
45 | 44 |
uint16_t vbatData = M5.Axp.GetVbatData(); |
... | ... |
@@ -47,10 +46,10 @@ float getBatteryLevel(void) |
47 | 46 |
//return 100.0 * ((vbat - 3000) / (4070 - 3000)); |
48 | 47 |
return 100.0 * ((vbat - VMIN) / (VMAX - VMIN)); |
49 | 48 |
} |
50 |
-#endif //_M5STICKC_H_ |
|
49 |
+#endif //ARDUINO_M5Stick_C |
|
51 | 50 |
//--------------------------------------------------------------------- |
52 | 51 |
void DisplayButtonStatus() { |
53 |
- #ifdef _HELTEC_H_ |
|
52 |
+ #ifdef ARDUINO_HELTEC_WIFI_LORA_32 |
|
54 | 53 |
Heltec.display->clear(); |
55 | 54 |
Heltec.display->drawString(0, LINE1, "BT: "+String(macStr)); |
56 | 55 |
Heltec.display->drawString(0, LINE2, "I : "+String(instanceStr)); |
... | ... |
@@ -61,13 +60,12 @@ void DisplayButtonStatus() { |
61 | 60 |
Heltec.display->drawString(120, LINEBOTTOM, running); |
62 | 61 |
} |
63 | 62 |
Heltec.display->display(); |
64 |
- #endif //_HELTEC_H_ |
|
65 |
- #ifdef _M5STICKC_H_ |
|
63 |
+ #elif ARDUINO_M5Stick_C //ARDUINO_TTGO_LoRa32_V1 |
|
66 | 64 |
//M5.Lcd.fillScreen(BLACK); |
67 | 65 |
M5.Lcd.setTextColor(0x7bef, BLACK); |
68 | 66 |
M5.Lcd.setCursor(0, LINE1, 1);M5.Lcd.println("BT: "+String(macStr)); |
69 | 67 |
M5.Lcd.setCursor(0, LINE2, 1);M5.Lcd.println("I : "+String(instanceStr)); |
70 |
- M5.Lcd.setCursor(0, LINE4, 1);M5.Lcd.setTextColor(GREEN, BLACK); M5.Lcd.println(beaconTypeStr); |
|
68 |
+ M5.Lcd.setCursor(0, LINE4, 2);M5.Lcd.setTextColor(GREEN, BLACK); M5.Lcd.println(beaconTypeStr); |
|
71 | 69 |
M5.Lcd.setCursor(0, LINE6, 1);M5.Lcd.setTextColor(0x7bef, BLACK); M5.Lcd.println( "Cnt: "+String(beacon_count)); |
72 | 70 |
if( 1 == ad_running ) { |
73 | 71 |
M5.Lcd.setCursor(150, LINEBOTTOM, 1);M5.Lcd.setTextColor(WHITE, GREEN); M5.Lcd.println(String("X")); |
... | ... |
@@ -83,15 +81,15 @@ void DisplayButtonStatus() { |
83 | 81 |
M5.Lcd.fillRect(0, LINEBOTTOM, 50, 10, BLACK); |
84 | 82 |
M5.Lcd.fillRect(COLUMN_BAT, LINEBOTTOM, 60, 10, BLACK); |
85 | 83 |
M5.Lcd.printf("%.1fmV",BatteryValue); |
86 |
- if( BatteryPercent > 95 ) { M5.Lcd.setCursor(COLUMN_BAT, LINEBOTTOM, 1);M5.Lcd.setTextColor(GREEN, BLACK);M5.Lcd.printf("%.3f%%",BatteryPercent); } |
|
84 |
+ if( BatteryPercent == 100 ) { M5.Lcd.setCursor(COLUMN_BAT, LINEBOTTOM, 1);M5.Lcd.setTextColor(GREEN, BLACK);M5.Lcd.printf("%.0f%%",BatteryPercent); } |
|
85 |
+ else if( BatteryPercent > 95 ) { M5.Lcd.setCursor(COLUMN_BAT, LINEBOTTOM, 1);M5.Lcd.setTextColor(GREEN, BLACK);M5.Lcd.printf("%.3f%%",BatteryPercent); } |
|
87 | 86 |
else if( BatteryPercent > 90 ) { M5.Lcd.setCursor(COLUMN_BAT, LINEBOTTOM, 1);M5.Lcd.setTextColor(GREEN, BLACK);M5.Lcd.printf("%.2f%%",BatteryPercent); } |
88 | 87 |
else if( BatteryPercent > 60 ) { M5.Lcd.setCursor(COLUMN_BAT, LINEBOTTOM, 1);M5.Lcd.setTextColor(GREEN, BLACK);M5.Lcd.printf("%.1f%%",BatteryPercent); } |
89 | 88 |
else if( BatteryPercent > 60 ) { M5.Lcd.setCursor(COLUMN_BAT, LINEBOTTOM, 1);M5.Lcd.setTextColor(GREEN, BLACK);M5.Lcd.printf("%.1f%%",BatteryPercent); } |
90 | 89 |
else if( BatteryPercent > 40 ) { M5.Lcd.setCursor(COLUMN_BAT, LINEBOTTOM, 1);M5.Lcd.setTextColor(0xff80, BLACK);M5.Lcd.printf("%.0f%%",BatteryPercent); } //Yellow |
91 | 90 |
else if( BatteryPercent > 30 ) { M5.Lcd.setCursor(COLUMN_BAT, LINEBOTTOM, 1);M5.Lcd.setTextColor(0xfbe4, BLACK);M5.Lcd.printf("%.0f%%",BatteryPercent); } //Orange |
92 | 91 |
else { M5.Lcd.setCursor(COLUMN_BAT, LINEBOTTOM, 1);M5.Lcd.setTextColor(RED, BLACK);M5.Lcd.printf("%.0f%%",BatteryPercent); } //Red |
93 |
- |
|
94 |
- Serial.println(BatteryValue); |
|
95 |
- #endif //_M5STICKC_H_ |
|
92 |
+ //Serial.println(BatteryValue); |
|
93 |
+ #endif //ARDUINO_M5Stick_C & ARDUINO_HELTEC_WIFI_LORA_32 |
|
96 | 94 |
} |
97 | 95 |
#endif //_DISPLAY_H |
... | ... |
@@ -0,0 +1,81 @@ |
1 |
+#ifndef _SERIAL_H |
|
2 |
+#define _SERIAL_H |
|
3 |
+ |
|
4 |
+#include "beacon.h" |
|
5 |
+ |
|
6 |
+#define SERIAL_MAX_LINES 32 |
|
7 |
+void serialHelp() { |
|
8 |
+ Serial.println("Available commands: "); |
|
9 |
+ Serial.println("- help: Display this screen"); |
|
10 |
+ Serial.println("- beacon: Display beacon details"); |
|
11 |
+ Serial.println("- type X: Set type of Beacon"); |
|
12 |
+} |
|
13 |
+ |
|
14 |
+void serialBeacon() { |
|
15 |
+ String serialOut = "{\"command\": \"beacon\", \"status\": { "; |
|
16 |
+ serialOut += "\"mac\": \""+String(macStr)+"\", "; |
|
17 |
+ serialOut += "\"instance\": \""+String(instanceStr)+"\", "; |
|
18 |
+ serialOut += "\"count\": \""+String(beacon_count)+"\", "; |
|
19 |
+ serialOut += "\"type\": \""+beaconTypeStr+"\""; |
|
20 |
+ serialOut += "}"; |
|
21 |
+ serialOut += "}"; |
|
22 |
+ Serial.println(serialOut); |
|
23 |
+} |
|
24 |
+ |
|
25 |
+void serialType(EN_BEACON_TYPE type) { |
|
26 |
+ beacon_type = type; |
|
27 |
+ switch( type ) { |
|
28 |
+ case EN_BEACON_TYPE_entry: |
|
29 |
+ beaconTypeStr="Entry "; |
|
30 |
+ break; |
|
31 |
+ case EN_BEACON_TYPE_hazard: |
|
32 |
+ beaconTypeStr="Hazard "; |
|
33 |
+ break; |
|
34 |
+ case EN_BEACON_TYPE_safe: |
|
35 |
+ beaconTypeStr="Safe "; |
|
36 |
+ break; |
|
37 |
+ case EN_BEACON_TYPE_exit: |
|
38 |
+ beaconTypeStr="Exit "; |
|
39 |
+ break; |
|
40 |
+ case EN_BEACON_TYPE_other: |
|
41 |
+ beaconTypeStr="Other "; |
|
42 |
+ break; |
|
43 |
+ default: |
|
44 |
+ beaconTypeStr="Safe "; |
|
45 |
+ break; |
|
46 |
+ } |
|
47 |
+ String serialOut = "{\"command\": \"beacon\", \"status\": { "; |
|
48 |
+ serialOut += "\"type\": \""+String(beaconTypeStr)+"\""; |
|
49 |
+ serialOut += "}"; |
|
50 |
+ Serial.println(serialOut); |
|
51 |
+ EEPROM.write(0, beacon_type); |
|
52 |
+ EEPROM.commit(); |
|
53 |
+} |
|
54 |
+ |
|
55 |
+void pollSerial() { |
|
56 |
+ if (Serial.available() > 0) { |
|
57 |
+ char command[SERIAL_MAX_LINES]; |
|
58 |
+ int sizeCommand = Serial.readBytesUntil('\r', command, sizeof(command) / sizeof(char) ); |
|
59 |
+ command[sizeCommand]='\0'; |
|
60 |
+ if(command[sizeCommand-1]=='\n') command[sizeCommand-1]='\0'; |
|
61 |
+ Serial.println("[CMD] received: "+String(command)); |
|
62 |
+ if( 0 == strcmp(command,"help") ) { |
|
63 |
+ serialHelp(); |
|
64 |
+ } else if( 0 == strcmp(command,"beacon") ) { |
|
65 |
+ serialBeacon(); |
|
66 |
+ } else if( 0 == strcmp(command,"type 1") ) { |
|
67 |
+ serialType(EN_BEACON_TYPE_entry); |
|
68 |
+ } else if( 0 == strcmp(command,"type 2") ) { |
|
69 |
+ serialType(EN_BEACON_TYPE_exit); |
|
70 |
+ } else if( 0 == strcmp(command,"type 3") ) { |
|
71 |
+ serialType(EN_BEACON_TYPE_hazard); |
|
72 |
+ } else if( 0 == strcmp(command,"type 4") ) { |
|
73 |
+ serialType(EN_BEACON_TYPE_safe); |
|
74 |
+ } else if( 0 == strcmp(command,"type 5") ) { |
|
75 |
+ serialType(EN_BEACON_TYPE_other); |
|
76 |
+ } else { |
|
77 |
+ Serial.println("{\"command\": \""+String(command)+"\", \"status\": \"error\" }"); |
|
78 |
+ } |
|
79 |
+ } |
|
80 |
+} |
|
81 |
+#endif //_SERIAL_H |