This commit is contained in:
2021-12-11 19:25:55 +01:00
27 changed files with 83629 additions and 174 deletions

3
.gitmodules vendored
View File

@@ -16,3 +16,6 @@
[submodule "FW/leo_muziekdoos_esp32/lib/PN532_SPI"] [submodule "FW/leo_muziekdoos_esp32/lib/PN532_SPI"]
path = FW/leo_muziekdoos_esp32/lib/PN532_SPI path = FW/leo_muziekdoos_esp32/lib/PN532_SPI
url = http://192.168.2.3/Bonobo.Git.Server/rfid.PN532_SPI.git url = http://192.168.2.3/Bonobo.Git.Server/rfid.PN532_SPI.git
[submodule "FW/leo_muziekdoos_esp32/lib/ADC_ADS1x15"]
path = FW/leo_muziekdoos_esp32/lib/ADC_ADS1x15
url = http://192.168.2.3/Bonobo.Git.Server/ADC_ADS1X15.git

View File

@@ -25,9 +25,9 @@ Text Label 5700 2950 2 50 ~ 0
ESP_RX1 ESP_RX1
Text HLabel 5700 3150 2 50 Input ~ 0 Text HLabel 5700 3150 2 50 Input ~ 0
BTN_PWR BTN_PWR
Text HLabel 5700 3350 2 50 Output ~ 0 Text HLabel 5700 4150 2 50 Output ~ 0
MEAS_EN MEAS_EN
Text HLabel 5700 3250 2 50 Output ~ 0 Text HLabel 5700 3050 2 50 Output ~ 0
PW_HOLD PW_HOLD
Text HLabel 5700 4550 2 50 Input ~ 0 Text HLabel 5700 4550 2 50 Input ~ 0
NFC_SPI_MISO NFC_SPI_MISO
@@ -469,8 +469,6 @@ NoConn ~ 5200 4850
NoConn ~ 3600 2750 NoConn ~ 3600 2750
NoConn ~ 3600 2850 NoConn ~ 3600 2850
NoConn ~ 3600 2950 NoConn ~ 3600 2950
Wire Wire Line
5700 3350 5200 3350
Wire Wire Line Wire Wire Line
2850 1600 4300 1600 2850 1600 4300 1600
Wire Wire Line Wire Wire Line
@@ -644,10 +642,6 @@ F 4 "Espressive" H 4400 3850 50 0001 C CNN "Manufacturer"
1 4400 3850 1 4400 3850
1 0 0 -1 1 0 0 -1
$EndComp $EndComp
Wire Wire Line
5700 3150 5200 3150
Wire Wire Line
5700 3250 5200 3250
Wire Wire Line Wire Wire Line
5700 4350 5200 4350 5700 4350 5200 4350
Wire Wire Line Wire Wire Line
@@ -656,8 +650,7 @@ Wire Wire Line
5700 4550 5200 4550 5700 4550 5200 4550
Wire Wire Line Wire Wire Line
5700 3650 5200 3650 5700 3650 5200 3650
NoConn ~ 5200 3050 NoConn ~ 5200 3450
NoConn ~ 5200 4150
$Comp $Comp
L Device:C C22 L Device:C C22
U 1 1 61885C4A U 1 1 61885C4A
@@ -785,7 +778,6 @@ Wire Wire Line
7650 5600 7650 5450 7650 5600 7650 5450
Wire Wire Line Wire Wire Line
5700 3550 5200 3550 5700 3550 5200 3550
NoConn ~ 5200 3450
$Comp $Comp
L Analog_ADC:ADS1114IDGS U6 L Analog_ADC:ADS1114IDGS U6
U 1 1 6177DA48 U 1 1 6177DA48
@@ -801,4 +793,12 @@ Wire Wire Line
9050 5500 9550 5500 9050 5500 9550 5500
Wire Wire Line Wire Wire Line
9450 5600 9550 5600 9450 5600 9550 5600
Wire Wire Line
5700 4150 5200 4150
NoConn ~ 5200 3250
NoConn ~ 5200 3350
Wire Wire Line
5200 3050 5700 3050
Wire Wire Line
5700 3150 5200 3150
$EndSCHEMATC $EndSCHEMATC

View File

@@ -787,7 +787,7 @@ F 0 "R12" H 2850 2650 50 0000 C CNN
F 1 "10K" H 2900 2550 50 0000 C CNN F 1 "10K" H 2900 2550 50 0000 C CNN
F 2 "Resistor_SMD:R_0402_1005Metric" V 2680 2600 50 0001 C CNN F 2 "Resistor_SMD:R_0402_1005Metric" V 2680 2600 50 0001 C CNN
F 3 "~" H 2750 2600 50 0001 C CNN F 3 "~" H 2750 2600 50 0001 C CNN
F 4 "R03K3_0402" H 2750 2600 50 0001 C CNN "StockRef" F 4 "R10K_0402" H 2750 2600 50 0001 C CNN "StockRef"
F 5 "2447170" H 2750 2600 50 0001 C CNN "ordercode" F 5 "2447170" H 2750 2600 50 0001 C CNN "ordercode"
F 6 "farnell" H 2750 2600 50 0001 C CNN "supplier" F 6 "farnell" H 2750 2600 50 0001 C CNN "supplier"
1 2750 2600 1 2750 2600

View File

@@ -804,6 +804,8 @@ F 6 "farnell" H 6200 2400 50 0001 C CNN "supplier"
1 6200 2400 1 6200 2400
0 1 1 0 0 1 1 0
$EndComp $EndComp
Wire Wire Line
7250 1150 7250 1300
Text Label 2900 1800 1 20 ~ 0 Text Label 2900 1800 1 20 ~ 0
MCP_STAT MCP_STAT
Text HLabel 4250 3800 2 50 Input ~ 0 Text HLabel 4250 3800 2 50 Input ~ 0
@@ -986,19 +988,4 @@ Wire Wire Line
8500 1450 9000 1450 8500 1450 9000 1450
Wire Wire Line Wire Wire Line
9000 1450 9000 1850 9000 1450 9000 1850
$Comp
L USB4105_REVA:USB4105_REVA J?
U 1 1 618A8036
P 4550 5200
F 0 "J?" H 4550 5867 50 0000 C CNN
F 1 "USB4105_REVA" H 4550 5776 50 0000 C CNN
F 2 "Connector_USB:GCT_USB4105_REVA" H 4550 5200 50 0001 L BNN
F 3 "" H 4550 5200 50 0001 L BNN
F 4 "0.2" H 4550 5200 50 0001 L BNN "PARTREV"
F 5 "3.31 mm" H 4550 5200 50 0001 L BNN "MAXIMUM_PACKAGE_HEIGHT"
F 6 "Manufacturer Recommendations" H 4550 5200 50 0001 L BNN "STANDARD"
F 7 "GCT" H 4550 5200 50 0001 L BNN "MANUFACTURER"
1 4550 5200
1 0 0 -1
$EndComp
$EndSCHEMATC $EndSCHEMATC

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,10 @@
{ {
"tags": [{ "tags": [{
"TagUID" : "63 7E 1B 16", "TagUID" : "B3 26 D0 15",
"audiofile" : "Billy-Jean.mp3" "audiofile" : "Billy-Jean.mp3"
}, },
{ {
"TagUID" : "63 7E 1B 17", "TagUID" : "1F E8 20 00",
"audiofile" : "Let_it_be.mp3" "audiofile" : "Let_it_be.mp3"
}, },
{ {

View File

@@ -1 +0,0 @@
test_test_test

View File

@@ -9,16 +9,14 @@
; https://docs.platformio.org/page/projectconf.html ; https://docs.platformio.org/page/projectconf.html
[env:esp32-pico] [env:esp32-pico]
platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-upstream platform = espressif32
board = m5stack-atom board = m5stack-atom
framework = arduino framework = arduino
lib_deps = lib_deps =
bblanchon/ArduinoJson@^6.18.5 bblanchon/ArduinoJson@^6.18.5
joaolopesf/SerialDebug@^0.9.82
monitor_speed = 115200 monitor_speed = 115200
lib_ldf_mode = deep+ lib_ldf_mode = deep+
extra_scripts = ./littlefsbuilder.py extra_scripts = ./littlefsbuilder.py
build_flags = build_flags =
-DHARDWARE=2 -DHARDWARE=2
;upload_protocol = espota -DCORE_DEBUG_LEVEL=3
;upload_port = 192.168.2.254

View File

@@ -6,10 +6,13 @@ AudioFileSourceLittleFS *file;
AudioOutputI2S *out; AudioOutputI2S *out;
uint8_t audio_current_Song = 0; uint8_t audio_current_Song = 0;
const char* nextAudioFile = "";
uint8_t n = 0; uint8_t n = 0;
bool audio_start = false; bool audio_start = false;
bool audioInitOk = false;
const char *waveFile[] = const char *waveFile[] =
{"/ringoffire.mp3", {"/ringoffire.mp3",
"/Let_it_be.mp3", "/Let_it_be.mp3",
@@ -19,24 +22,7 @@ const char *waveFile[] =
void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string)
{ {
(void)cbData; (void)cbData;
Serial.printf("ID3 callback for: %s = '", type); log_i("ID3 callback for: %s = '", type);
if (isUnicode)
{
string += 2;
}
while (*string)
{
char a = *(string++);
if (isUnicode)
{
string++;
}
Serial.printf("%c", a);
}
Serial.printf("'\n");
Serial.flush();
} }
// Called when there's a warning or error (like a buffer underflow or decode hiccup) // Called when there's a warning or error (like a buffer underflow or decode hiccup)
@@ -47,24 +33,36 @@ void StatusCallback(void *cbData, int code, const char *string)
char s1[64]; char s1[64];
strncpy_P(s1, string, sizeof(s1)); strncpy_P(s1, string, sizeof(s1));
s1[sizeof(s1) - 1] = 0; s1[sizeof(s1) - 1] = 0;
Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1); log_i("STATUS(%s) '%d' = '%s'\n", ptr, code, s1);
Serial.flush();
} }
void playSong(uint8_t index) void playSong(uint8_t index)
{ {
if (index > AUDIONSONGS) if (index > AUDIONSONGS)
return; return;
Serial.printf("now playing %s\n", waveFile[index]); log_i("now playing %s\n", waveFile[index]);
file = new AudioFileSourceLittleFS(waveFile[index]); file = new AudioFileSourceLittleFS(waveFile[index]);
id3 = new AudioFileSourceID3(file); id3 = new AudioFileSourceID3(file);
id3->RegisterMetadataCB(MDCallback, (void *)"ID3TAG"); id3->RegisterMetadataCB(MDCallback, (void *)"ID3TAG");
mp3->begin(id3, out); mp3->begin(id3, out);
} }
void playSong(String filename)
{
if(filename != "")
{
log_i("now playing %s\n", filename.c_str());
file = new AudioFileSourceLittleFS(filename.c_str());
id3 = new AudioFileSourceID3(file);
id3->RegisterMetadataCB(MDCallback, (void *)"ID3TAG");
mp3->begin(id3, out);
}
}
void initAudio() void initAudio()
{ {
Serial.println("init Audio"); log_i("init Audio");
audioLogger = &Serial; audioLogger = &Serial;
delay(500); delay(500);
out = new AudioOutputI2S(); out = new AudioOutputI2S();
@@ -73,28 +71,39 @@ void initAudio()
mp3 = new AudioGeneratorMP3(); mp3 = new AudioGeneratorMP3();
mp3->RegisterStatusCB(StatusCallback, (void *)"mp3"); mp3->RegisterStatusCB(StatusCallback, (void *)"mp3");
Serial.println("init Audio Done"); audioInitOk = true;
log_i("init Audio Done");
//playSong(audio_current_Song); //playSong(audio_current_Song);
} }
bool getAudioInitStatus(void)
{
return audioInitOk;
}
void setAudioFileName(String filename)
{
nextAudioFile = filename;
}
void handleAudio() void handleAudio()
{ {
// if (hallIsIdle()) if (hallIsIdle())
// { {
// if (mp3->isRunning()) if (mp3->isRunning())
// { {
// Serial.println("Audio: stop playback"); log_w("Audio: stop playback");
// mp3->stop(); mp3->stop();
// audio_start = false; audio_start = false;
// } }
// } }
// else else
// { {
// if(!audio_start) if(!audio_start)
// { {
// playSong(audio_current_Song); playSong(audio_current_Song);
// audio_start = true; audio_start = true;
// } }
if (mp3->isRunning()) if (mp3->isRunning())
{ {
@@ -104,5 +113,5 @@ void handleAudio()
playSong(audio_current_Song); playSong(audio_current_Song);
} }
} }
//} }
} }

View File

@@ -17,4 +17,7 @@
void initAudio(void); void initAudio(void);
void handleAudio(void); void handleAudio(void);
bool getAudioInitStatus(void);
void playSong(String filename);

View File

@@ -18,10 +18,15 @@
#define PWR_HOLD 4 #define PWR_HOLD 4
#define PWR_BTN 5 #define PWR_BTN 5
#define MEAS_EN 12 #define MEAS_EN 22
#define MEAS_ADC 35 //ADC1_CH7
#define HALL_INPUT 36 //ADC1_CH0 #define I2C_SDA 33
#define I2C_SCL 32
#define MEAS_ADC 1 //ADC1_CH7
#define HALL_INPUT 0 //ADC1_CH0
#define LED_PIN 12
#endif #endif
#if HARDWARE == 1 #if HARDWARE == 1

View File

@@ -5,8 +5,11 @@
#include "ArduinoJson.h" #include "ArduinoJson.h"
const char *tagConfigfile = "/tagconfig.json"; const char *tagConfigfile = "/tagconfig.json";
DynamicJsonDocument tagDoc(512);
struct tagConfig { bool configInitOK = false;
struct tagConfig
{
char filename[64]; char filename[64];
char tagID[64]; char tagID[64];
}; };
@@ -15,28 +18,67 @@ std::vector<tagConfig> tags;
void loadConfig(const char *fname) void loadConfig(const char *fname)
{ {
Serial.println("config: load"); log_i("config: load");
File file = LITTLEFS.open(fname); File file = LITTLEFS.open(fname);
StaticJsonDocument<512> doc;
DeserializationError error = deserializeJson(doc, file); DeserializationError error = deserializeJson(tagDoc, file);
if (error) if (error)
Serial.println(F("Failed to read file")); {
log_e("Failed to deserialize err=%s", error.c_str());
serializeJsonPretty(doc, Serial); }
Serial.println("config: load done"); else
{
serializeJsonPretty(tagDoc, Serial);
JsonArray array = tagDoc["tags"].as<JsonArray>();
log_i("JsonArray size = %d", array.size());
bool hasError = false;
for (JsonVariant v : array)
{
if (!v.containsKey("TagUID"))
{
log_e("key TAGUID not found");
hasError = true;
}
if (!v.containsKey("audiofile"))
{
log_e("Key: audiofile not found");
hasError = true;
}
}
configInitOK = !hasError;
}
log_i("config: load done");
} }
void initConfig(void) void initConfig(void)
{ {
Serial.println("config: init"); log_i("config: init start");
loadConfig(tagConfigfile); loadConfig(tagConfigfile);
Serial.println("config: init done"); log_i("config: init done");
} }
void handleConfig(void) void handleConfig(void)
{ {
}
String getConfigSong(String uid)
{
JsonArray array = tagDoc["tags"].as<JsonArray>();
const char* filename = "";
for (JsonVariant v : array)
{
const char *taguid = v["TagUID"];
if (!strcmp(uid.c_str(), taguid))
{
filename = v["audiofile"];
String retval(filename);
return retval;
}
}
log_e("taguid %s not found",uid );
return "";
} }

View File

@@ -6,22 +6,127 @@ uint32_t last_hall_read;
uint16_t last_hall_sample; uint16_t last_hall_sample;
uint8_t hall_idle_count; uint8_t hall_idle_count;
bool hall_is_Idle = true; bool hall_is_Idle = true;
bool newState = true;
uint32_t idleTime = 0;
GamneStates gameState = GamneStates::stateInit;
void initGame(void) void initGame(void)
{ {
printlnI("Game: init"); log_i("Game: init: done");
pinMode(HALL_INPUT, ANALOG); }
//analogReadResolution(10);
analogSetAttenuation(ADC_11db); void setState(GamneStates newstate)
printlnI("Game: init: done"); {
gameState = newstate;
newState = true;
} }
void handleGame(void) void handleGame(void)
{
switch (gameState)
{
case stateInit:
{
if(newState)
{
log_i("activeState = Init");
newState = false;
}
if (getSensorInitStatus() && getAudioInitStatus() && getRFIDInitStatus())
{
setState(stateIdle);
log_i("nextState = idle");
}
}
break;
case stateIdle:
{
uint32_t timeNow = millis();
if(newState)
{
log_i("activeState = Idle");
newState = false;
idleTime = millis();
}
if (getRFIDlastUID() == "")
{
setState(stateScanning);
log_i("nextState = Scanning");
}
else
{
if(!hallIsIdle())
{
setState(stateStartPlaying);
log_i("nextState = Start playing");
}
if(timeNow - idleTime > TIMEOUT_IDLE)
{
clearRFIDlastUID();
}
}
}
break;
case stateScanning:
{
if(newState)
{
log_i("activeState = RFID scanning");
setRFIDscanState(true);
newState = false;
}
if (getRFIDlastUID() != "")
{
setState(stateIdle);
setRFIDscanState(false);
log_i("nextState = idle");
}
}
break;
case stateStartPlaying:
{
if(newState)
{
log_i("activeState = startPlaying");
newState = false;
}
setState(statePlaying);
}
break;
case statePlaying:
{
}
break;
case stateStopPlaying:
{
}
break;
case stateStopped:
{
}
break;
default:
{
}
break;
}
}
bool hallIsIdle(void)
{
return hall_is_Idle;
}
void handleHallSensor(void)
{ {
uint32_t timeNow = millis(); uint32_t timeNow = millis();
if (timeNow - last_hall_read > HALLINTERVAL) if (timeNow - last_hall_read > HALLINTERVAL)
{ {
uint16_t hall_sample = analogRead(HALL_INPUT); uint16_t hall_sample = getHall();
uint16_t hall_delta = (last_hall_sample > hall_sample) ? (last_hall_sample - hall_sample) : (hall_sample - last_hall_sample); uint16_t hall_delta = (last_hall_sample > hall_sample) ? (last_hall_sample - hall_sample) : (hall_sample - last_hall_sample);
if (hall_delta > HALLIDLETHRESHOLD) if (hall_delta > HALLIDLETHRESHOLD)
{ {
@@ -29,6 +134,7 @@ void handleGame(void)
{ {
hall_is_Idle = false; hall_is_Idle = false;
hall_idle_count = HALLPLAYSAMPLES; hall_idle_count = HALLPLAYSAMPLES;
log_i("Game: playing");
} }
else else
{ {
@@ -40,24 +146,18 @@ void handleGame(void)
if (hall_idle_count == 0) if (hall_idle_count == 0)
{ {
hall_is_Idle = true; hall_is_Idle = true;
printlnI("Game: Idle");
} }
else else
{ {
hall_idle_count--; hall_idle_count--;
} }
} }
Serial.printf("HallSensor: val=%d, delta=%d, count=%d, idle=%s\n", log_v("HallSensor: val=%d, delta=%d, count=%d, idle=%s\n",
hall_sample, hall_sample,
hall_delta, hall_delta,
hall_idle_count, hall_idle_count,
(hall_is_Idle? "yes":"no")); (hall_is_Idle ? "yes" : "no"));
last_hall_sample = hall_sample; last_hall_sample = hall_sample;
last_hall_read = timeNow; last_hall_read = timeNow;
} }
} }
bool hallIsIdle(void)
{
return hall_is_Idle;
}

View File

@@ -2,13 +2,31 @@
#include "Arduino.h" #include "Arduino.h"
#include "board.h" #include "board.h"
#include "SerialDebug.h" #include "sensor.h"
#include "audio.h"
#include "rfid.h"
#define HALLINTERVAL 100 #define HALLINTERVAL 100
#define HALLIDLETHRESHOLD 4 #define HALLIDLETHRESHOLD 4
#define HALLIDLESAMPLES 4 #define HALLIDLESAMPLES 4
#define HALLPLAYSAMPLES 8 #define HALLPLAYSAMPLES 8
#define TIMEOUT_IDLE 20000
typedef enum{
stateInit,
stateIdle,
stateScanning,
stateStartPlaying,
statePlaying,
stateStopPlaying,
stateStopped,
stateLAST
}GamneStates;
void initGame(void); void initGame(void);
void handleGame(void); void handleGame(void);
bool hallIsIdle(void); bool hallIsIdle(void);
void handleHallSensor(void);

View File

@@ -1,37 +1,44 @@
#include <Arduino.h> #include <Arduino.h>
#include "SerialDebug.h"
#include "power.h" #include "power.h"
#include "storage.h" #include "storage.h"
#include "audio.h" #include "audio.h"
#include "rfid.h" #include "rfid.h"
#include "sensor.h"
#include "config.h" #include "config.h"
#include "ota.h" #include "ota.h"
#include "game.h" #include "game.h"
uint32_t looptime = 0;
void setup() void setup()
{ {
initPower(); initPower();
Serial.begin(115200); Serial.begin(115200);
delay(2000); Serial.setDebugOutput(true);
log_i("muziekdoos v2");
Serial.flush();
delay(1000);
initStorage(); initStorage();
initConfig(); initConfig();
//initOta(); //initOta();
initAudio(); initAudio();
initRfid(); initRfid();
initSensor();
initGame(); initGame();
} }
void loop() void loop()
{ {
debugHandle(); looptime = millis();
handleAudio(); handleAudio();
//handleRfid(); handleRfid();
//handleGame(); handleSensor();
handleGame();
handlePower(); handlePower();
//handleOta(); //handleOta();
log_v("main: looptime = %d", millis() - looptime);
} }

View File

@@ -1,62 +1,68 @@
#include "power.h" #include "power.h"
bool powerbutton_released = true; bool powerbutton_released = true;
#define DR_REG_RTCCNTL_BASE 0x3ff48000 uint32_t PowerLastKeepAlive = 0;
#define RTC_CNTL_BROWN_OUT_REG (DR_REG_RTCCNTL_BASE + 0xd4)
void initPowerOn(void) void initPowerOn(void)
{ {
//disable brownout // disable brownout
//WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector if (digitalRead(PWR_BTN))
if(digitalRead(PWR_BTN))
{ {
//enable LDO // enable LDO
pinMode(PWR_HOLD, OUTPUT); pinMode(PWR_HOLD, OUTPUT);
pinMode(PWR_BTN, INPUT); pinMode(PWR_BTN, INPUT);
digitalWrite(PWR_HOLD, HIGH); digitalWrite(PWR_HOLD, HIGH);
powerbutton_released = false; powerbutton_released = false;
//dac_sdMode // dac_sdMode
pinMode(DAC_SDMODE, OUTPUT); pinMode(DAC_SDMODE, OUTPUT);
digitalWrite(DAC_SDMODE, HIGH); digitalWrite(DAC_SDMODE, HIGH);
//powerstate = poweringOn; // powerstate = poweringOn;
//buttonPower.begin(); // buttonPower.begin();
} }
else else
{ {
ESP.deepSleep(10000); ESP.deepSleep(10000);
} }
}
void powerDown(uint16_t delayMs)
{
log_w("poweringDown!");
digitalWrite(PWR_HOLD, LOW);
delay(delayMs);
ESP.restart();
} }
void initPower(void) void initPower(void)
{ {
printlnI(F("Power: init")); log_i("Power: init");
initPowerOn(); initPowerOn();
printlnI(F("Power: init: done")); log_i("Power: init: done");
} }
void handlePower(void) void handlePower(void)
{ {
if(digitalRead(PWR_BTN) && powerbutton_released) if (digitalRead(PWR_BTN) && powerbutton_released)
{ {
printlnA("poweringDown!"); while (digitalRead(PWR_BTN))
debugHandle(); {
while(digitalRead(PWR_BTN)) {} }
digitalWrite(PWR_HOLD, LOW); powerDown(1000);
delay(1000);
ESP.restart();
} }
else{ else
{
powerbutton_released = true; powerbutton_released = true;
} }
// check timeout
if ( millis() - PowerLastKeepAlive > TIMEOUT_POWER)
{
powerDown(1000);
}
} }
void PowerKeepAlive(void)
{
PowerLastKeepAlive = millis();
}

View File

@@ -2,8 +2,8 @@
#include "board.h" #include "board.h"
#include "Arduino.h" #include "Arduino.h"
#include "SerialDebug.h"
#define TIMEOUT_POWER (5 * 1000 * 60) //5minutes timeout
void initPower(void); void initPower(void);
void handlePower(void); void handlePower(void);

View File

@@ -5,27 +5,55 @@ NfcAdapter nfc = NfcAdapter(pn532spi);
uint32_t lastRFID = 0; uint32_t lastRFID = 0;
String lastUid = "";
bool RfidinitOK = false;
bool RfidScanActive = false;
//*****************************************************************************************// //*****************************************************************************************//
void initRfid() void initRfid()
{ {
// int8_t sck=-1, int8_t miso=-1, int8_t mosi=-1, int8_t ss=-1); log_i("RFID init:"); // shows in serial that it is ready to read
nfc.begin(true); nfc.begin(true);
Serial.println(F("rfid init done")); // shows in serial that it is ready to read RfidinitOK = true;
log_i("RFID init: OK"); // shows in serial that it is ready to read
} }
//*****************************************************************************************// //*****************************************************************************************//
void handleRfid() void handleRfid()
{ {
uint32_t timeNow = millis(); uint32_t timeNow = millis();
if (lastRFID - timeNow > RFIDINTERVAL) if (lastRFID - timeNow > RFIDINTERVAL && RfidScanActive)
{ {
log_i("scanning");
if (nfc.tagPresent()) if (nfc.tagPresent())
{ {
NfcTag tag = nfc.read(); NfcTag tag = nfc.read();
String uid = tag.getUidString(); lastUid = tag.getUidString();
Serial.println(uid); log_i("found tag %s",lastUid.c_str());
} }
lastRFID = timeNow;
} }
} }
bool getRFIDInitStatus(void)
{
return RfidinitOK;
}
String getRFIDlastUID(void)
{
return lastUid;
}
void setRFIDscanState(bool state)
{
RfidScanActive = state;
}
void clearRFIDlastUID( void)
{
log_i("cleard lasttag");
lastUid = "";
}
//*****************************************************************************************// //*****************************************************************************************//

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include "board.h" #include "board.h"
#include "game.h"
#include <SPI.h> #include <SPI.h>
#include "PN532_SPI.h" #include "PN532_SPI.h"
@@ -12,3 +13,7 @@
void initRfid(void); void initRfid(void);
void handleRfid(void); void handleRfid(void);
bool getRFIDInitStatus(void);
String getRFIDlastUID(void);
void setRFIDscanState(bool state);
void clearRFIDlastUID(void);

View File

@@ -0,0 +1,66 @@
#include "sensor.h"
ADS1115 ADS(0x48);
uint32_t lastADS = 0;
uint32_t lastVbatt = 0;
uint16_t BatterySensor = 0;
uint16_t HallSensor = 0;
bool hallinitOK = false;
void initSensor(void)
{
log_i("sensor init ADS1x15:");
bool result = ADS.begin(I2C_SDA, I2C_SCL);
pinMode(MEAS_EN, OUTPUT);
if (!result)
{
log_e("sensor init: FAIL");
}
else
{
log_i("sensor init: OK");
hallinitOK = true;
}
}
bool getSensorInitStatus(void)
{
return hallinitOK;
}
void handleSensor(void)
{
uint32_t timeNow = millis();
if (lastADS - timeNow > ADSINTERVAL)
{
HallSensor = ADS.readADC(HALL_INPUT);
lastADS = timeNow;
}
if (lastVbatt - timeNow > VBATTINTERVALL - VBATTMEASPRECHARGE)
{
digitalWrite(MEAS_EN, HIGH);
log_v("precharge vbatt measurement");
}
if (lastVbatt - timeNow > VBATTINTERVALL)
{
BatterySensor = ADS.readADC(MEAS_ADC);
digitalWrite(MEAS_EN, LOW);
lastVbatt = timeNow;
}
log_v("Read sensor: Hall=%d, vbatt=%d", HallSensor, BatterySensor);
}
uint16_t getHall(void)
{
return HallSensor;
}
uint16_t getvbatt(void)
{
return BatterySensor;
}

View File

@@ -0,0 +1,15 @@
#pragma once
#include "ADS1X15.h"
#include "board.h"
#define ADSINTERVAL 250
#define VBATTINTERVALL 1000
#define VBATTMEASPRECHARGE 250
void initSensor(void);
void handleSensor(void);
uint16_t getHall( void );
uint16_t getvbatt( void );
bool getSensorInitStatus(void);

View File

@@ -3,11 +3,15 @@
#include <Arduino.h> #include <Arduino.h>
#include "FS.h" #include "FS.h"
#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 0)
#include <littleFS.h> #if defined ESP_ARDUINO_VERSION_VAL
#else #if (ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 0)
#include <LITTLEFS.h> #include <LittleFS.h>
#endif #define ESP_V2
#endif
#else
#include <LITTLEFS.h>
#endif
#ifndef CONFIG_LITTLEFS_FOR_IDF_3_2 #ifndef CONFIG_LITTLEFS_FOR_IDF_3_2
#include <time.h> #include <time.h>
@@ -17,17 +21,17 @@
void listDir(fs::FS &fs, const char *dirname, uint8_t levels) void listDir(fs::FS &fs, const char *dirname, uint8_t levels)
{ {
Serial.printf("Listing directory: %s\r\n", dirname); log_i("Listing directory: %s\r\n", dirname);
File root = fs.open(dirname); File root = fs.open(dirname);
if (!root) if (!root)
{ {
Serial.println("- failed to open directory"); log_e("- failed to open directory");
return; return;
} }
if (!root.isDirectory()) if (!root.isDirectory())
{ {
Serial.println(" - not a directory"); log_e(" - not a directory");
return; return;
} }
@@ -36,15 +40,14 @@ void listDir(fs::FS &fs, const char *dirname, uint8_t levels)
{ {
if (file.isDirectory()) if (file.isDirectory())
{ {
Serial.print(" DIR : "); log_i(" DIR : ");
#ifdef CONFIG_LITTLEFS_FOR_IDF_3_2 #ifdef CONFIG_LITTLEFS_FOR_IDF_3_2
Serial.println(file.name()); Serial.println(file.name());
#else #else
Serial.print(file.name());
time_t t = file.getLastWrite(); time_t t = file.getLastWrite();
struct tm *tmstruct = localtime(&t); struct tm *tmstruct = localtime(&t);
Serial.printf(" LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec); log_i("FILE: %s LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",file.name(), (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec);
#endif #endif
if (levels) if (levels)
@@ -54,17 +57,13 @@ void listDir(fs::FS &fs, const char *dirname, uint8_t levels)
} }
else else
{ {
Serial.print(" FILE: ");
Serial.print(file.name());
Serial.print(" SIZE: ");
#ifdef CONFIG_LITTLEFS_FOR_IDF_3_2 #ifdef CONFIG_LITTLEFS_FOR_IDF_3_2
Serial.println(file.size()); Serial.println(file.size());
#else #else
Serial.print(file.size());
time_t t = file.getLastWrite(); time_t t = file.getLastWrite();
struct tm *tmstruct = localtime(&t); struct tm *tmstruct = localtime(&t);
Serial.printf(" LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec); log_i(" FILE: %s, SIZE: %d LAST WRITE: %d-%02d-%02d %02d:%02d:%02d" ,file.name(), file.size(), (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec);
#endif #endif
} }
file = root.openNextFile(); file = root.openNextFile();
@@ -74,16 +73,16 @@ void listDir(fs::FS &fs, const char *dirname, uint8_t levels)
void readFile(fs::FS &fs, const char *path) void readFile(fs::FS &fs, const char *path)
{ {
Serial.printf("Reading file: %s\r\n", path); log_i("Reading file: %s\r\n", path);
File file = fs.open(path); File file = fs.open(path);
if (!file || file.isDirectory()) if (!file || file.isDirectory())
{ {
Serial.println("- failed to open file for reading"); log_e("- failed to open file for reading");
return; return;
} }
Serial.println("- read from file:"); log_i("- read from file:");
while (file.available()) while (file.available())
{ {
Serial.write(file.read()); Serial.write(file.read());
@@ -95,7 +94,7 @@ void initStorage()
{ {
if (!LITTLEFS.begin(FORMAT_LITTLEFS_IF_FAILED)) if (!LITTLEFS.begin(FORMAT_LITTLEFS_IF_FAILED))
{ {
Serial.println("LITTLEFS Mount Failed"); log_e("LITTLEFS Mount Failed");
return; return;
} }
listDir(LITTLEFS, "/", 0); listDir(LITTLEFS, "/", 0);

View File

@@ -1,7 +1,4 @@
#pragma once #pragma once
#include "SerialDebug.h"
void initStorage(); void initStorage();