#define SW_VERS "v1.6"
// Target
// ESP32C3 Dev Module
// USB CDC On Boot: Enabled
// DEBUG Const
#define DEBUG true //set to true for debug output, false for no debug output
#define DEBUG_SERIAL \
if (DEBUG) Serial
// Add HW target (eventually boards installed)
// Add External Library
// RTC
#include <Wire.h>
#include <RTClib.h>
// Adafruit Neopixel
#include <Adafruit_NeoPixel.h>
// FastLED
#include <FastLED.h>
// Bluetooth
#include <NimBLEDevice.h>
//#include <esp_bt_main.h> // Include le API di basso livello (btStart, btStop)
// Button
#include "BTN.h"
// Pin assignment
#define PIN_WS2812B 10
#define PIN_BTN1 1 // Change H-M or Set Time
#define PIN_BTN2 0 // Plus or Sync Bluetooth
#define PIN_RTC_SDA 3
#define PIN_RTC_SCL 9
// HW Constants
#define NUM_PIXELS 100
#define BRIGHTNESS 10 // 255 max
// SW Constants
// HW Global variables
Adafruit_NeoPixel rgbLed(1, 8, NEO_GRB + NEO_KHZ800);
CRGB ws2812b[NUM_PIXELS];
RTC_DS3231 rtc;
MyBtn btnChangeSet; //TODO Giallo
MyBtn btnPlusSync; //TODO Blu
// SW Global variables
enum clockStateEnum {INIT, GET_TIME, SHOW_TIME, WAIT_NEW_TIME, CHANGE_TIME_MANUAL, CHANGE_TIME_AUTO_BT_START, CHANGE_TIME_AUTO_BT_ONGOING, NEW_TIME_OK, NEW_TIME_NOK};
enum clockStateEnum clockState = INIT;
enum clockStateEnum clockStateOld = GET_TIME;
bool first = false;
DateTime now;
uint8_t lastHour, lastMinute;
uint8_t newHour, newMinute;
// UUID del servizio Current Time Service (CTS)
static NimBLEUUID serviceUUID("1805");
// UUID della caratteristica Current Time
static NimBLEUUID timeCharacteristicUUID("2A2B");
// Indirizzo del dispositivo trovato
static NimBLEAddress *pServerAddress;
// Puntatori per il client
NimBLEClient* pClient;
NimBLEScan *pScan;
NimBLEAdvertisedDevice* advDevice;
bool BT_serviceFound = false;
bool BT_timeGot = false;
long timerGetTime = 0;
long timerBTSync = 0;
long timerOKTime = 0;
// Internal Library
#include "WordClock.h"
void setup() {
Serial.begin(115200);
while(!Serial);
DEBUG_SERIAL.println("SETUP");
DEBUG_SERIAL.println(SW_VERS);
/** Initialize NimBLE and set the device name */
NimBLEDevice::init("WordClock");
pClient = NimBLEDevice::createClient();
pScan = NimBLEDevice::getScan();
pScan->setScanCallbacks(new MyAdvertisedDeviceCallbacks());
rgbLed.begin();
rgbLed.setPixelColor(0, 0);
rgbLed.show();
FastLED.addLeds<NEOPIXEL, PIN_WS2812B>(ws2812b, NUM_PIXELS);
FastLED.setBrightness(BRIGHTNESS);
FastLED.clear();
FastLED.show();
pinMode(PIN_BTN1, INPUT_PULLUP);
btnChangeSet.configPin(PIN_BTN1);
pinMode(PIN_BTN2, INPUT_PULLUP);
btnPlusSync.configPin(PIN_BTN2);
}
void loop() {
// Leggo pulsanti
if (readButtons()) {}
// First evaluation for first time in new state
if (clockStateOld != clockState) {
first = true;
clockStateOld = clockState;
}
switch (clockState) {
case INIT:
if (first) {
first = false;
Wire.begin(PIN_RTC_SDA, PIN_RTC_SCL, 100000);
DEBUG_SERIAL.println("INIT");
}
// SDA, SCL
if (rtc.begin(&Wire)) {
if (rtc.lostPower()) {
DEBUG_SERIAL.println("WARNING: RTC sync needed!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
clockState = GET_TIME;
}
else {
DEBUG_SERIAL.println("ERROR: RTC not found!");
delay(1000);
}
break;
case GET_TIME:
if (first) {
first = false;
//BLEDevice::deinit(true);
//delay(100);
now = rtc.now();
timerGetTime = millis();
DEBUG_SERIAL.println("GET_TIME");
}
if ((millis() - timerGetTime) > ((60-now.second())*1000)) {
now = rtc.now();
timerGetTime = millis();
}
if ((lastMinute != now.minute()) || (lastHour != now.twelveHour())) {
newHour = now.twelveHour();
newMinute = now.minute();
clockState = SHOW_TIME;
}
if (btnPlusSync.wasLongPressed()) {
btnPlusSync.clearAllEvents();
clockState = CHANGE_TIME_AUTO_BT_START;
}
if (btnChangeSet.wasLongPressed()) {
btnChangeSet.clearAllEvents();
clockState = CHANGE_TIME_MANUAL;
}
break;
case SHOW_TIME:
if (first) {
first = false;
DEBUG_SERIAL.println("SHOW_TIME");
}
if (showNewTime_Simple(lastHour, lastMinute, newHour, newMinute)) {
lastHour = newHour;
lastMinute = newMinute;
clockState = GET_TIME;
}
break;
case CHANGE_TIME_MANUAL:
if (first) {
first = false;
FastLED.clear();
DEBUG_SERIAL.println("CHANGE_TIME_MANUAL");
}
if (changeTimeManual(lastHour, lastMinute)) {
clockState = GET_TIME;
}
break;
case CHANGE_TIME_AUTO_BT_START:
if (first) {
first = false;
BT_serviceFound = false;
BT_timeGot = false;
DEBUG_SERIAL.println("CHANGE_TIME_AUTO_BT_START");
}
searchTimeDevice(30);
timerBTSync = millis();
clockState = CHANGE_TIME_AUTO_BT_ONGOING;
break;
case CHANGE_TIME_AUTO_BT_ONGOING:
if (first) {
first = false;
DEBUG_SERIAL.println("CHANGE_TIME_AUTO_BT_ONGOING");
}
if (BT_serviceFound && !BT_timeGot) {
getTimeFromTimeDevice();
}
if (BT_timeGot) {
clockState = NEW_TIME_OK;
}
if ((millis() - timerBTSync) > 31000) {
DEBUG_SERIAL.println("CTS NOT Found!");
clockState = NEW_TIME_NOK;
}
break;
case NEW_TIME_OK:
if (first) {
first = false;
colorWord(SYNC, 0x00FF00);
FastLED.show();
timerOKTime = millis();
DEBUG_SERIAL.println("NEW_TIME_OK");
}
if ((millis() - timerOKTime) > 1000) {
colorWord(SYNC, 0x000000);
FastLED.show();
clockState = GET_TIME;
}
break;
case NEW_TIME_NOK:
if (first) {
first = false;
colorWord(SYNC, 0xFF0000);
FastLED.show();
timerOKTime = millis();
DEBUG_SERIAL.println("NEW_TIME_NOK");
}
if ((millis() - timerOKTime) > 1000) {
colorWord(SYNC, 0x000000);
FastLED.show();
clockState = GET_TIME;
}
break;
default:
clockState = SHOW_TIME;
break;
}
}
Loading
esp32-c3-devkitm-1
esp32-c3-devkitm-1