#include <SPI.h>
#include <IRremote.h>
#define DIN_PIN 21 // Data In pin
#define CS_PIN 18 // Chip Select pin
#define CLK_PIN 19 // Clock pin
#define IR_PIN 15 // IR receiver
byte font[10][8] = {
{0x7E, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7E}, // 0
{0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}, // 1
{0x7E, 0x60, 0x60, 0x7E, 0x7E, 0x06, 0x06, 0x7E}, // 2
{0x7E, 0x60, 0x60, 0x7E, 0x7E, 0x60, 0x60, 0x7E}, // 3
{0x66, 0x66, 0x66, 0x7E, 0x7E, 0x60, 0x60, 0x60}, // 4
{0x7E, 0x06, 0x06, 0x7E, 0x7E, 0x60, 0x60, 0x7E}, // 5
{0x7E, 0x06, 0x06, 0x7E, 0x7E, 0x66, 0x66, 0x7E}, // 6
{0x7E, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60}, // 7
{0x7E, 0x66, 0x66, 0x7E, 0x7E, 0x66, 0x66, 0x7E}, // 8
{0x7E, 0x66, 0x66, 0x7E, 0x7E, 0x60, 0x60, 0x7E}, // 9
};
bool isLEDon = false;
int digit1 = 0;
int digit2 = 0;
String pSelect = "";
// Clear all LEDs on all modules
void clearLED() {
for (int module = 0; module < 2; module++) {
for (int row = 0; row < 8; row++) {
sendData(module, row, 0x00);
}
}
}
// Send a command to all MAX7219 modules
void sendCommand(byte address, byte data) {
digitalWrite(CS_PIN, LOW);
for (int i = 0; i < 2; i++) { // Update only 2 modules
SPI.transfer(address);
SPI.transfer(data);
}
digitalWrite(CS_PIN, HIGH);
}
// Send data to a specific MAX7219 module
void sendData(byte module, byte row, byte data) {
digitalWrite(CS_PIN, LOW);
for (int i = 0; i < 2; i++) {
if (i == module) {
SPI.transfer(row + 1); // Select row (1 to 8)
SPI.transfer(data); // Send LED data
} else {
SPI.transfer(0);
SPI.transfer(0);
}
}
digitalWrite(CS_PIN, HIGH);
}
// Display a digit on a specific MAX7219 module
void displayDigit(int module, int digit, bool show) {
if (show) {
// Display the digit
for (int row = 0; row < 8; row++) {
byte rowData = font[digit][row];
sendData(module, row, rowData);
}
} else {
// Clear the digit by sending empty data to all rows
for (int row = 0; row < 8; row++) {
sendData(module, row, 0x00); // 0x00 turns off all LEDs in the row
}
}
}
void setup() {
// Initialize SPI and MAX7219 pins
SPI.begin(CLK_PIN, -1, DIN_PIN, CS_PIN);
// SPI.begin();
IrReceiver.begin(IR_PIN, DISABLE_LED_FEEDBACK);
pinMode(CS_PIN, OUTPUT);
// Initialize MAX7219 modules
sendCommand(0x0C, 0x01); // Turn on display
sendCommand(0x0F, 0x00); // Disable test mode
sendCommand(0x09, 0x00); // No decoding mode
sendCommand(0x0B, 0x07); // Use all 8 rows
clearLED();
Serial.begin(115200);
}
void loop() {
if (IrReceiver.decode()) {
uint32_t value = IrReceiver.decodedIRData.decodedRawData; // Get raw data
String hexValue = String(value, HEX); // Convert to hex string
Serial.println(hexValue);
if (hexValue == "5da2ff00") {
isLEDon = !isLEDon;
if (isLEDon) {
displayDigit(0, digit1, true);
displayDigit(1, digit2, true);
} else {
clearLED();
}
}
if (isLEDon) {
if (hexValue == "1fe0ff00") {
pSelect = "p1";
clearLED();
displayDigit(1, digit2, true);
for (int i = 0; i < 3; i++) {
displayDigit(0, digit1, false);
delay(200);
displayDigit(0, digit1, true);
delay(200);
}
} else if (hexValue == "6f90ff00") {
pSelect = "p2";
clearLED();
displayDigit(0, digit1, true);
for (int i = 0; i < 3; i++) {
displayDigit(1, digit2, false);
delay(200);
displayDigit(1, digit2, true);
delay(200);
}
}
if (pSelect == "p1") {
if (hexValue == "fd02ff00") {
displayDigit(0, digit1, false);
digit1 ++;
displayDigit(0, digit1, true);
Serial.println(digit1);
} else if (hexValue == "6798ff00") {
displayDigit(0, digit1, false);
digit1 --;
displayDigit(0, digit1, true);
Serial.println(digit1);
}
} else if (pSelect == "p2") {
if (hexValue == "fd02ff00") {
displayDigit(1, digit2, false);
digit2 ++;
displayDigit(1, digit2, true);
Serial.println(digit2);
} else if (hexValue == "6798ff00") {
displayDigit(1, digit2, false);
digit2 --;
displayDigit(1, digit2, true);
Serial.println(digit2);
}
}
}
IrReceiver.resume();
}
}
Loading
esp32-s2-devkitm-1
esp32-s2-devkitm-1