/*
* ====================================================================
* ZKOUŠECKA RJ45 KABELU (STM32 + NOKIA 5110)
* ====================================================================
*/
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// Piny Nokia 5110: (CLK, DIN, DC, CE, RST)
#define PIN_CLK PA9 // A9
#define PIN_DIN PB15 // B15
#define PIN_DC PB14 // B14
#define PIN_CE PB13 // B13
#define PIN_RST PB12 // B12
Adafruit_PCD8544 display = Adafruit_PCD8544(PIN_CLK, PIN_DIN, PIN_DC, PIN_CE, PIN_RST);
#define BUTTON_PIN PB9 // B9
// Piny RJ45: TX (A0..A7) a RX (B0, B1, B10, B11, B5, B6, B7, B8)
const uint8_t TX_PINS[8] = {PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7};
const uint8_t RX_PINS[8] = {PB0, PB1, PB10, PB11, PB5, PB6, PB7, PB8};
struct WireResult {
int connectedRx;
bool isShort;
int shortWith;
};
WireResult results[8];
bool allConnected = true;
bool isStraight = true;
bool isCrossover = true;
bool anyShort = false;
int openCount = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
for (int i = 0; i < 8; i++) {
pinMode(RX_PINS[i], INPUT_PULLDOWN);
pinMode(TX_PINS[i], INPUT);
}
display.begin();
display.setContrast(55);
display.setTextWrap(false); // Zabrání přetékání a posunu textu
display.clearDisplay();
display.setCursor(0, 0);
// Úvodní obrazovka
display.fillRect(0, 0, 84, 8, BLACK);
display.setTextColor(WHITE, BLACK);
display.setCursor(8, 0);
display.print("RJ45 TESTER");
display.setTextColor(BLACK);
display.setCursor(14, 14);
display.print("ZKOUSECKA");
display.setCursor(24, 24);
display.print("KABELU");
display.drawRect(2, 36, 80, 6, BLACK);
display.fillRect(4, 38, 76, 2, BLACK);
display.display();
delay(1200);
}
void loop() {
performCableTest();
drawResultsScreen();
// Testovací cyklus / reakce na tlačítko
for (int t = 0; t < 6; t++) {
if (digitalRead(BUTTON_PIN) == LOW) {
delay(50);
break;
}
delay(50);
}
}
void performCableTest() {
allConnected = true;
isStraight = true;
anyShort = false;
openCount = 0;
for (int tx = 0; tx < 8; tx++) {
for (int k = 0; k < 8; k++) {
pinMode(TX_PINS[k], INPUT);
}
pinMode(TX_PINS[tx], OUTPUT);
digitalWrite(TX_PINS[tx], HIGH);
delayMicroseconds(60);
int activeRxCount = 0;
int firstRx = -1;
int secondRx = -1;
for (int rx = 0; rx < 8; rx++) {
if (digitalRead(RX_PINS[rx]) == HIGH) {
activeRxCount++;
if (firstRx == -1) firstRx = rx;
else secondRx = rx;
}
}
if (activeRxCount == 0) {
results[tx].connectedRx = -1;
results[tx].isShort = false;
results[tx].shortWith = -1;
allConnected = false;
isStraight = false;
openCount++;
} else if (activeRxCount == 1) {
results[tx].connectedRx = firstRx;
results[tx].isShort = false;
results[tx].shortWith = -1;
if (firstRx != tx) isStraight = false;
} else {
results[tx].connectedRx = firstRx;
results[tx].isShort = true;
results[tx].shortWith = secondRx;
anyShort = true;
isStraight = false;
}
pinMode(TX_PINS[tx], INPUT);
}
isCrossover = false;
if (!anyShort && openCount == 0) {
if (results[0].connectedRx == 2 && results[2].connectedRx == 0 &&
results[1].connectedRx == 5 && results[5].connectedRx == 1 &&
results[3].connectedRx == 3 && results[4].connectedRx == 4 &&
results[6].connectedRx == 6 && results[7].connectedRx == 7) {
isCrossover = true;
}
}
}
void drawResultsScreen() {
display.clearDisplay();
display.setCursor(0, 0); // VŽDY resetujeme pozici kurzoru!
// 1. Řádek 1: Černý pruh s bílým písmem
display.fillRect(0, 0, 84, 8, BLACK);
display.setTextColor(WHITE, BLACK);
display.setCursor(6, 0);
display.print("RJ45 WIREMAP");
display.setTextColor(BLACK);
// 2. Řádek 2: TX piny
display.setCursor(2, 10);
display.print("TX: 12345678");
// 3. Řádek 3: RX piny
display.setCursor(2, 19);
display.print("RX: ");
for (int i = 0; i < 8; i++) {
if (results[i].isShort) {
display.print("S"); // S = Zkrat
} else if (results[i].connectedRx == -1) {
display.print("-"); // - = Přerušeno
} else {
display.print(results[i].connectedRx + 1);
}
}
// 4. Dělící linka
display.drawLine(0, 28, 83, 28, BLACK);
// 5. Řádek 4 a 5: Výsledný stav kabelu
if (openCount == 8) {
display.setCursor(2, 31);
display.print("KABEL ODPOJEN");
display.setCursor(2, 40);
display.print("Zapojte kabel");
} else if (anyShort) {
display.setCursor(2, 31);
display.print("POZOR: ZKRAT!");
display.setCursor(2, 40);
for (int i = 0; i < 8; i++) {
if (results[i].isShort) {
display.print("Zkrat: ");
display.print(i + 1);
display.print("-");
display.print(results[i].shortWith + 1);
break;
}
}
} else if (isStraight && allConnected) {
display.setCursor(2, 31);
display.print("STAV: 100% OK!");
display.setCursor(2, 40);
display.print("PRIMY T568B");
} else if (isCrossover) {
display.setCursor(2, 31);
display.print("STAV: 100% OK!");
display.setCursor(2, 40);
display.print("KRIZENY (CROSS)");
} else if (openCount > 0) {
display.setCursor(2, 31);
display.print("CHYBA: PRERUS.");
display.setCursor(2, 40);
display.print("Zila: ");
for (int i = 0; i < 8; i++) {
if (results[i].connectedRx == -1) {
display.print(i + 1);
display.print(" ");
}
}
} else {
display.setCursor(2, 31);
display.print("CHYBA: PREHOZ.");
display.setCursor(2, 40);
display.print("Vadny par");
}
// Odeslání do displeje
display.display();
}Loading
nokia-5110
nokia-5110