Kabeltest mit Arduino Mega

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);
}

setze mal auf INPUT_PULLUP

1 Like

ich habe so was ähnliches mal mit externen Pull-Down Widerständen gemacht und das hat funktioniert.

Das INPUT_PULLUP war die Lösung! Jetzt funktioniert es. Danke !

Dann markiere bitte noch den Beitrag als Lösung.

Dir ist bewußt, daß Du nur eine statische Messung mit niederspannung machst.
Wenn Du die Adern des Kabels U, V und W benennst wird das ein Drehstromkabel für 400V sein.
Ein Kabel für 400V hat andere Probleme.

Grüße Uwe

Hallo, Ja das ist mir bewusst, es geht hier lediglich um das Testen der richtigen Verbindung.

LG

Leider war es nur eine zeitweilige Lösung. Es hat eine ganze Zeit funktioniert, jetzt sind die ersten 5 Adern immer auf Kurzschluss, nur der Test an Ader 6 zeigt richtig an... :thinking:

Dann musst du jetzt debuggen.

Was ist jetzt anders als vorher?

@t6m60: Willst du mal den aktuellen Codestand und Aufbau zeigen?

es hat sich weder am code noch am aufbau was geändert, hat ca 100x funtioniert und dann plötzlich der fehler..

Dir ist doch hoffentlich klar, das mit diesen spärlichen Angaben keine Hilfe gibt.

Mache alles von dem MEGA ab.
Schreibe Dir einen Sketch, der erstmal austestet, ob Deine Pins nicht einen Schock bekommen haben und nun im Eimer sind.

Ist die Pinbelegung noch wie im Ausgangspost?

Wenn ich nachher Zeit habe, suche ich mal was dazu raus.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.