Hallo,
Ich baue einen automatischen Kabeltest mit TFT Display als Bedienung und Ausgabe.
Soweit läuft der Code auch nur jedes Testergebnis zeigt Kurzschluss, selbst wenn kein Kabel angeschlossen ist. Viellicht kann mir jemand eine Tipp geben ?
Vielen Dank und Grüße !
#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <TouchScreen.h>
#define MINPRESSURE 50
#define MAXPRESSURE 1000
bool test_active = true;
const char* leitungsBezeichnung[] = {"U", "V", "W", "PE", "T1", "T2"};
// Fehlertypen
enum ergebnis { FEHLERFREI, KURZSCHLUSS, KEINEVERBINDUNG, FALSCHEVERBINDUNG };
// Pins für Kabelanfang und -ende
byte pinsKabelAnfang[] ={ 22, 24, 26, 28, 30, 32 };
byte pinsKabelEnde[] = { 42, 44, 46, 48, 50, 52 };
byte safeFEHLERFREI[] = { 0, 0, 0, 0, 0, 0 };
// ALL Touch panels and wiring is DIFFERENT
// copy-paste results from TouchScreen_Calibr_native.ino
const int XP = 8, XM = A2, YP = A3, YM = 9; //ID=0x9341
const int TS_LEFT = 112, TS_RT = 918, TS_TOP = 75, TS_BOT = 898;
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
Adafruit_GFX_Button on_btn, off_btn, start_btn;
int pixel_x, pixel_y; // Touch_getXY() updates global vars
bool Touch_getXY(void) {
TSPoint p = ts.getPoint();
pinMode(YP, OUTPUT); // restore shared pins
pinMode(XM, OUTPUT);
digitalWrite(YP, HIGH); // because TFT control pins
digitalWrite(XM, HIGH);
bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);
if (pressed) {
pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width());
pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());
}
return pressed;
}
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
// Vorwärtsdeklaration der Funktion
void Kabeltest();
void setup(void) {
Serial.begin(9600);
uint16_t ID = tft.readID();
Serial.print("TFT ID = 0x");
Serial.println(ID, HEX);
Serial.println("Calibrate for your Touch Panel");
if (ID == 0xD3D3) ID = 0x9486; // write-only shield
tft.begin(ID);
tft.setRotation(0); // PORTRAIT
tft.fillScreen(BLACK);
start_btn.initButton(&tft, 120, 230, 220, 140, BLACK, GREEN, BLACK, (char*)"START", 2); // cast to (char*)
start_btn.drawButton(false);
delay(200);
tft.fillRect(40, 60, 160, 80, BLACK);
}
void loop(void) {
bool down = Touch_getXY();
start_btn.press(down && start_btn.contains(pixel_x, pixel_y));
if (start_btn.justReleased()) {
start_btn.drawButton();
}
if (start_btn.justPressed()) {
start_btn.drawButton(true);
Kabeltest();
}
}
void setOutputPin(byte pinNumber) {
// Alle Pins auf INPUT setzen
for (unsigned int i = 0; i < sizeof(pinsKabelAnfang) / sizeof(pinsKabelAnfang[0]); i++) {
pinMode(pinsKabelAnfang[i], INPUT);
pinMode(pinsKabelEnde[i], INPUT);
}
// Einen Pin auf Output setzen
pinMode(pinNumber, OUTPUT);
}
void Kabeltest() {
tft.fillRect(10, 10, 220, 260, BLACK);
ergebnis result;
byte errorOtherPin;
for (unsigned int i = 0; i < sizeof(pinsKabelAnfang) / sizeof(pinsKabelAnfang[0]); i++) {
result = FEHLERFREI; // Fehlerfreiheit annehmen
setOutputPin(pinsKabelAnfang[i]);
digitalWrite(pinsKabelAnfang[i], LOW); // den zu testenden Pin LOW setzen
delay(60); // Wartezeit von 0,06 Sekunden
if (digitalRead(pinsKabelEnde[i]) != LOW) {
result = KEINEVERBINDUNG;
errorOtherPin = i;
}
for (unsigned int j = 0; j < sizeof(pinsKabelEnde) / sizeof(pinsKabelEnde[0]); j++) {
if (j != i && digitalRead(pinsKabelEnde[j]) == LOW) {
result = FALSCHEVERBINDUNG;
errorOtherPin = j;
}
}
for (unsigned int j = 1; j < sizeof(pinsKabelAnfang) / sizeof(pinsKabelAnfang[0]); j++) {
if (j != i && digitalRead(pinsKabelAnfang[j]) == LOW) {
result = KURZSCHLUSS;
errorOtherPin = j;
}
}
Serial.print("L ");
Serial.print(i + 1);
tft.setCursor(10, 10 + (25 * i));
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.print("Ader ");
tft.print(i + 1);
switch (result) {
case FEHLERFREI:
Serial.println(" - OK");
tft.setTextColor(GREEN);
tft.print(" - OK");
break;
case KURZSCHLUSS:
Serial.print(" - Kurzschluss an Leitung ");
Serial.println(errorOtherPin + 1);
tft.setTextColor(BLUE);
tft.print(" - NIO");
break;
case KEINEVERBINDUNG:
Serial.print(" - Keine Verbindung an Leitung ");
Serial.println(errorOtherPin + 1);
tft.setTextColor(RED);
tft.print(" - NIO ");
break;
case FALSCHEVERBINDUNG:
Serial.print(" - Falsche Verbindung an Leitung ");
Serial.println(errorOtherPin + 1);
tft.setTextColor(YELLOW);
tft.print(" - NIO ");
break;
}
test_active = true;
pinMode(pinsKabelAnfang[i], INPUT);
digitalWrite(pinsKabelAnfang[i], LOW);
}
delay(8000);
tft.fillRect(10, 10, 220, 260, BLACK);
}