#include <TM1637Display.h>
#include "AiEsp32RotaryEncoder.h"
#include "AiEsp32RotaryEncoderNumberSelector.h"
TM1637Display codeTM(32,33);
AiEsp32RotaryEncoder *rotaryEncoder = new AiEsp32RotaryEncoder(19, 18, 17, -1, 4);
AiEsp32RotaryEncoderNumberSelector numberSelector = AiEsp32RotaryEncoderNumberSelector();
int codeGuess[] = {0,0,0,0};
int correctCode[] = {1,2,3,4};
int codePos = 0;
uint8_t displayData[] = { SEG_D, SEG_D, SEG_D, SEG_D };
bool blinkState = false;
unsigned long lastBlinkTime = 0;
const unsigned long BLINK_INTERVAL = 200; // blink interval in milliseconds
void IRAM_ATTR readEncoderISR()
{
rotaryEncoder->readEncoder_ISR();
}
void codeCheck(){
int digitsCorrect = 0;
if (codePos == 4){
for(int i=0; i <=3; i++){
if(codeGuess[i] > correctCode[i]){
displayData[i] = SEG_A;
}else if (codeGuess[i] < correctCode[i]){
displayData[i] = SEG_D;
}else if (codeGuess[i] == correctCode[i]){
Serial.print("Digit #");
Serial.print(i);
Serial.println(" correct!!!");
displayData[i] = codeTM.encodeDigit(codeGuess[i]);
digitsCorrect ++;
}
codeTM.setSegments(displayData);
if (digitsCorrect == 4){
Serial.println("GAME WON!!!!");
}
}
delay(3000);
}
}
void setup()
{
Serial.begin(115200);
rotaryEncoder->begin();
rotaryEncoder->setup(readEncoderISR);
numberSelector.attachEncoder(rotaryEncoder);
pinMode(23, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(23), codeCheck, FALLING);
/*
numberSelector.setRange parameters:
float minValue, set minimum value for example -12.0
float maxValue, set maximum value for example 31.5
float step, set step increment, default 1, can be smaller steps like 0.5 or 10
bool cycleValues, set true only if you want going to miminum value after maximum
unsigned int decimals = 0 precision - how many decimal places you want, default is 0
numberSelector.setValue - sets initial value
*/
numberSelector.setRange(0, 9, 1, true, 0);
numberSelector.setValue(0);
codeTM.setBrightness(3);
}
void loop()
{
// Blink the current digit
unsigned long currentTime = millis();
if (currentTime - lastBlinkTime >= BLINK_INTERVAL) {
lastBlinkTime = currentTime;
blinkState = !blinkState;
}
if (codePos == 0 && blinkState){
displayData[0] = SEG_D;
}else if (codePos == 0) {
displayData[0] = codeTM.encodeDigit(numberSelector.getValue());
}else {
displayData[0] = codeTM.encodeDigit(codeGuess[0]);
}
if (codePos == 1 && blinkState){
displayData[1] = SEG_D;
}else if (codePos == 1) {
displayData[1] = codeTM.encodeDigit(numberSelector.getValue());
}else {
displayData[1] = codeTM.encodeDigit(codeGuess[1]);
}
if (codePos == 2 && blinkState){
displayData[2] = SEG_D;
}else if (codePos == 2) {
displayData[2] = codeTM.encodeDigit(numberSelector.getValue());
}else {
displayData[2] = codeTM.encodeDigit(codeGuess[2]);
}
if (codePos == 3 && blinkState){
displayData[3] = SEG_D;
}else if (codePos == 3) {
displayData[3] = codeTM.encodeDigit(numberSelector.getValue());
}else {
displayData[3] = codeTM.encodeDigit(codeGuess[3]);
}
if (codePos == 4 && blinkState){
codeTM.clear();
}else if (codePos == 4){
displayData[0] = codeTM.encodeDigit(codeGuess[0]);
displayData[1] = codeTM.encodeDigit(codeGuess[1]);
displayData[2] = codeTM.encodeDigit(codeGuess[2]);
displayData[3] = codeTM.encodeDigit(codeGuess[3]);
}
codeTM.setSegments(displayData);
if (rotaryEncoder->encoderChanged())
{
Serial.print(numberSelector.getValue());
Serial.println(" ");
if (codePos == 0){
displayData[0] = codeTM.encodeDigit(numberSelector.getValue());
}else if (codePos == 1){
displayData[1] = codeTM.encodeDigit(numberSelector.getValue());
}else if (codePos == 2){
displayData[2] = codeTM.encodeDigit(numberSelector.getValue());
}else if (codePos == 3){
displayData[3] = codeTM.encodeDigit(numberSelector.getValue());
}
}
if (rotaryEncoder->isEncoderButtonClicked())
{
Serial.print("Selected value is ");
Serial.print(numberSelector.getValue(), 1);
Serial.println(" ***********************");
if (codePos == 0){
codeGuess[0] = numberSelector.getValue();
codePos = 1;
numberSelector.setValue(codeGuess[1]);
}else if (codePos == 1){
codeGuess[1] = numberSelector.getValue();
codePos = 2;
numberSelector.setValue(codeGuess[2]);
}else if (codePos == 2){
codeGuess[2] = numberSelector.getValue();
codePos = 3;
numberSelector.setValue(codeGuess[3]);
}else if (codePos == 3){
codeGuess[3] = numberSelector.getValue();
codePos = 4;
numberSelector.setValue(codeGuess[0]);
}else if (codePos == 4){
codePos = 0;
}
}
}