#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
const uint8_t ROWS = 3;
const uint8_t COLS = 8;
char scoreMatrix[ROWS][COLS] = {
{10, 11, 12, 13, 14, 15, 16, 17},
{20, 21, 22, 23, 24, 25, 26, 27},
{30, 31, 32, 33, 34, 35, 36, 37}
};
uint8_t colPins[COLS] = {13, 12, 14, 27, 26, 25, 33, 32};
uint8_t rowPins[ROWS] = {19, 18, 5};
bool prevState[ROWS][COLS] = {0};
const unsigned long resetTime = 500;
unsigned long colTime;
// Per simulare l'azione della dartboard in parallelo, avvio un task indipendente dal loop()
TaskHandle_t scanTaskHandler = NULL;
void scanTask(void *param)
{
uint8_t extRowPins[ROWS] = {23, 22, 21};
for (int i = 0; i < ROWS; i++)
{
digitalWrite(extRowPins[i], HIGH);
pinMode(extRowPins[i], OUTPUT);
}
while (true)
{
for (int i = 0; i < ROWS; i++)
{
digitalWrite(extRowPins[i], LOW);
vTaskDelay(pdMS_TO_TICKS(1));
digitalWrite(extRowPins[i], HIGH);
}
vTaskDelay(pdMS_TO_TICKS(1));
}
vTaskDelete(scanTaskHandler);
}
void setup()
{
Serial.begin(115200);
Serial.println("START");
// Configura le RIGHE
for (int i = 0; i < ROWS; i++)
{
pinMode(rowPins[i], INPUT_PULLUP);
}
// Configura le COLONNE
for (int j = 0; j < COLS; j++)
{
pinMode(colPins[j], INPUT_PULLUP);
}
xTaskCreate(&scanTask, "scanTask", 4096, NULL, 4, &scanTaskHandler);
}
void loop()
{
// Scansione delle righe che vengono messe a LOW dal task parallelo
for (int i = 0; i < ROWS; i++)
{
// Se lo stato della riga == LOW faccio anche la scansione delle colonne
if (!digitalRead(rowPins[i]))
{
// Scansione delle colonne
for (int j = 0; j < COLS; j++)
{
bool colState = digitalRead(colPins[j]) == LOW;
// Reset di prevState (se non si esegue non vengono segnati due punti consecutivi sulla stessa zona)
if (colState && millis() - colTime > resetTime) {
prevState[i][j] = false;
}
// Rilevamento fronte di salita (HIGH -> LOW) sulle colonne e debounce segnale
if (colState && colState != prevState[i][j])
{
Serial.print("Colpito segmento: R");
Serial.print(i);
Serial.print(" C");
Serial.print(j);
Serial.print(" - Punti: ");
Serial.println((int)scoreMatrix[i][j]);
// Aggiorno lo stato precedente della colonna e memorizzo il tempo
prevState[i][j] = colState;
colTime = millis();
break;
}
}
while (!digitalRead(rowPins[i])) ;
}
}
}