[Gelöst] Programmieren verlernt? Kann bitte jemand drüberschauen?

Hallo!

Ich möchte mal euch Gurus befragen, ob ich die ganze Woche mit einem Brett vorm Kopf programmiert habe. Lange ist es her, dass ich was programmiert habe und von können kann ich auch nicht reden. Naja.
Im Grunde soll dieser Code 4 Eingänge nach HIGH oder LOW checken und dann entsprechend nach Ergebnis Grüne LEDs bzw rote LEDs bei Misserfolg aufleuchten lassen. Hört sich nicht schwer an aber will nicht so wirklich. Der Hardware-Aufbau ist auch entsprechend simpel:
5 Taster mit Pulldown-Widerständen
8 LEDs (4x rot 4x grün, wird noch erwietert)
Arduino Nano (Klon)

//Debuggen mit Textschnippsel nicht vergessen ;)

int DUT_detect = 2;
int DUT_short = 3;
int DUT_lm317 = 4;
int DUT_diode = 5;
int DUT_mosfet = 6;

int OK_detect = 8;
int OK_short = 9;
int OK_lm317 = 10;
int OK_diode = 11;
int OK_mosfet = 12;

int NG_detect = A0;
int NG_short = A1;
int NG_lm317 = A2;
int NG_diode = A3;
int NG_mosfet = A4;

void setup() {
  Serial.begin(9600);
  Serial.println("Setup gestartet");

  /*
  pinMode(*hier Pin einfügen*, OUTPUT); //beliebig oft wiederholen
  pinMode(*hier Pin einfügen*, INPUT);  //beliebig oft wiederholen
  */

  pinMode(DUT_detect, INPUT);
  pinMode(DUT_short, INPUT);
  pinMode(DUT_lm317, INPUT);
  pinMode(DUT_diode, INPUT);
  pinMode(DUT_mosfet, INPUT);

  //OUTPUT definieren fuer GUT
  pinMode(OK_detect, OUTPUT);
  pinMode(OK_short, OUTPUT);
  pinMode(OK_lm317, OUTPUT);
  pinMode(OK_diode, OUTPUT);
  pinMode(OK_mosfet, OUTPUT);

  //OUTPUT definieren fuer FEHLER
  pinMode(NG_detect, OUTPUT);
  pinMode(NG_short, OUTPUT);
  pinMode(NG_lm317, OUTPUT);
  pinMode(NG_diode, OUTPUT);
  pinMode(NG_mosfet, OUTPUT);
}

void loop() {

  //Spannung für Testschaltung wird ausgegeben
  digitalWrite(7, HIGH);
  Serial.println("Spannung für Testschaltung wird ausgegeben");

  //Ist die Baugruppe anwesend? Wenn ja, Alle anderen Testspannungen freigeben
  //Baugruppe eingelegt?
  while (digitalRead(DUT_detect), HIGH) {

    Serial.println("In der While-Schleife");

    //Spannungsregler gut
    if (digitalRead(DUT_lm317), HIGH) {
      Serial.println("Spannungsregler OK");
      //Fehler-LED ausschalten
      digitalWrite(NG_lm317, LOW);
      //OK-LED einschalten
      digitalWrite(OK_lm317, HIGH);
    }
    //Spannungsregler nicht gut:
    if (digitalRead(DUT_lm317), LOW) {
      Serial.println("Spannungsregler NG");
      //OK-LED ausschalten
      digitalWrite(OK_lm317, LOW);
      //NG-LED einschalten
      digitalWrite(NG_lm317, HIGH);
    }

    delay(500);

    //Dioden gut
    if (digitalRead(DUT_diode), HIGH) {
      Serial.println("Dioden OK");
      //Fehler-LED ausschalten
      digitalWrite(NG_diode, LOW);
      //OK-LED einschalten
      digitalWrite(OK_diode, HIGH);
    }
    //Dioden nicht gut:
    if (digitalRead(DUT_diode), LOW) {
      Serial.println("Dioden NG");
      //OK-LED ausschalten
      digitalWrite(OK_diode, LOW);
      //NG-LED einschalten
      digitalWrite(OK_diode, HIGH);
    }

    delay(500);

    //MOSFET gut
    if (digitalRead(DUT_mosfet), HIGH) {
      Serial.println("MOSFET OK");
      //Fehler-LED ausschalten
      digitalWrite(NG_mosfet, LOW);
      //OK-LED einschalten
      digitalWrite(OK_mosfet, HIGH);
    }
    //MOSFET nicht gut:
    if (digitalRead(DUT_mosfet), LOW) {
      Serial.println("MOSFET NG");
      //GUT-LED ausschalten
      digitalWrite(OK_mosfet, LOW);
      //NG-LED einschalten
      digitalWrite(NG_mosfet, HIGH);
    }

    delay(500);
  }

  Serial.println("Nach der While-Schleife");

  delay(500);
}

Die unterschiedlichen Varianten zum Abfragen von den Pins ist auch Absicht, nach 3 mal neu anfangen war ich einfach zu verzweifelt, um mich da festzulegen. Auch einheitlich hat der Code nicht das gemacht, was ich will.

Die delays habe ich mal zu debug-Zwecken drin gelassen, so lässt es sich am seriellen Monitor einfacher ablesen :wink:

PS: Es hat sich ja ganz schön was im Forum verändert. WOW!

Hallio
Was macht der Sketch was du nicht bedacht hast ?

Dann erklär doch mal, was er machen soll :wink:

Bis dahin:
Die PIN's auf byte und const stellen.
Du belegst die LED's nicht vor.
Ich würde die Fehler-LED's evtl. als Standard "ein"stellen.

Wenn Die Bedingung:

if (digitalRead(DUT_lm317), HIGH) {

nicht stimmt, muss die Bedingung:

if (digitalRead(DUT_lm317), LOW) {

stimmen. Da macht dann else mehr Sinn, als eine erneute Prüfung.
Wenn Du das sowieso mit 3 Durchläufen machen und danach in Ausgangsstellung willst, mach das mit Switch / case.

Was soll die Verbundanweisung(comma operator) dort?

Würdest du die Warnungen aktivieren, könnte dir der Compiler auch die Sinnlosigkeit melden.

Also machen soll er:
Prüfen ob Baugruppe anwesend ist (durch DUT_detect)
und dann Nacheinander checken, ob:

  • der LM317 eine Spannung ausgibt (DUT-lm317)
  • Dioden bestückt sind (DUT_diode)
  • Das Mosfet bestückt ist und funktioniert (DUT_mosfet)

Dann soll nach (Miss-)Erfolg die LEDs leuchten.
Wurde die Baugruppe entnommen (also DUT_detect LOW o.ä.) soll nichts mehr leuchten.

für DUT_short muss ich mir Hardwaretechnisch noch was überlegen, das kann man erstmal noch vernachlässigen.
cc @paulpaulson

@combie Wie im Text geschrieben: Lange nichts mehr gemacht und kaum Erfahrung. Sorry! Ich dachte, das kann man auch so schreiben wie wenn ich direkt auf den Pin verweise. Wie gehts dann richtig? Das mit den Warnungen war mir nicht bewusst, ich schau mal wo man die zu sehen bekommt, danke!

Vermutlich meinst du sowas:
if (digitalRead(DUT_mosfet) == HIGH)

Oder einfacher:
if (digitalRead(DUT_mosfet))

Falsch: if (digitalRead(DUT_lm317), LOW)
Besser: if (not digitalRead(DUT_lm317))

Ja, wahrscheinlich eher das. Vielen Dank für das helfen.

So hatte ich das auch mal im Kopf

Ich habe die IDE mal offen, wo finde ich denn die compiler-Warnungen genau?
Voreinstellungen --> Compiler-Warnungen [Alle]
So siehts im Moment aus. Warnungen spuckt er mir aber nicht aus :thinking: Nur ein Gewirr aus Zwischengespeicherten Dateien in meinem Dokumente-Ordner und unter AppData

C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -hardware C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -tools C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\kurzschlusselektroniker\Documents\Arduino\libraries -fqbn=arduino:avr:nano:cpu=atmega328 -vid-pid=1A86_7523 -ide-version=10813 -build-path C:\Users\kurzschlusselektroniker\AppData\Local\Temp\arduino_build_949802 -warnings=all -build-cache C:\Users\kurzschlusselektroniker\AppData\Local\Temp\arduino_cache_958483 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avrdude.path=C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.arduinoOTA.path=C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -verbose C:\Users\kurzschlusselektroniker\Desktop\temp\temp.ino
C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -hardware C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -tools C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\kurzschlusselektroniker\Documents\Arduino\libraries -fqbn=arduino:avr:nano:cpu=atmega328 -vid-pid=1A86_7523 -ide-version=10813 -build-path C:\Users\kurzschlusselektroniker\AppData\Local\Temp\arduino_build_949802 -warnings=all -build-cache C:\Users\kurzschlusselektroniker\AppData\Local\Temp\arduino_cache_958483 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avrdude.path=C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.arduinoOTA.path=C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -verbose C:\Users\kurzschlusselektroniker\Desktop\temp\temp.ino
Using board 'nano' from platform in folder: C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3
Using core 'arduino' from platform in folder: C:\Users\kurzschlusselektroniker\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3
Detecting libraries used...
"C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.3\\cores\\arduino" "-IC:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.3\\variants\\eightanaloginputs" "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802\\sketch\\temp.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE
Generating function prototypes...
"C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.3\\cores\\arduino" "-IC:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.3\\variants\\eightanaloginputs" "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802\\sketch\\temp.ino.cpp" -o "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802\\preproc\\ctags_target_for_gcc_minus_e.cpp" -DARDUINO_LIB_DISCOVERY_PHASE
"C:\\Program Files (x86)\\Arduino\\tools-builder\\ctags\\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802\\preproc\\ctags_target_for_gcc_minus_e.cpp"
Sketch wird kompiliert...
"C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.3\\cores\\arduino" "-IC:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.3\\variants\\eightanaloginputs" "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802\\sketch\\temp.ino.cpp" -o "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802\\sketch\\temp.ino.cpp.o"
Compiling libraries...
Compiling core...
Using precompiled core: C:\Users\kurzschlusselektroniker\AppData\Local\Temp\arduino_cache_958483\core\core_arduino_avr_nano_cpu_atmega328_50bd6adae50595cb81c6fa0c8e411ebc.a
Linking everything together...
"C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -Wall -Wextra -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802/temp.ino.elf" "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802\\sketch\\temp.ino.cpp.o" "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802/..\\arduino_cache_958483\\core\\core_arduino_avr_nano_cpu_atmega328_50bd6adae50595cb81c6fa0c8e411ebc.a" "-LC:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802" -lm
"C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy" -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802/temp.ino.elf" "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802/temp.ino.eep"
"C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy" -O ihex -R .eeprom "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802/temp.ino.elf" "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802/temp.ino.hex"
"C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-size" -A "C:\\Users\\kurzschlusselektroniker\\AppData\\Local\\Temp\\arduino_build_949802/temp.ino.elf"
Der Sketch verwendet 2504 Bytes (8%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 308 Bytes (15%) des dynamischen Speichers, 1740 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

image

Stimmt, bei mir auch kein Warnung!

Dass es nicht funktionieren kann lässt sich leicht überprüfen, wenn man die Anweisung auseinander zieht:

  bool test = digitalRead(DUT_lm317), HIGH;
  if (test) Serial.print(2);
E:\Programme\arduino\portable\sketchbook\sketch_may26b\sketch_may26b.ino: In function 'void setup()':
E:\Programme\arduino\portable\packages\arduino\hardware\avr\1.8.3\cores\arduino/Arduino.h:40:14: error: expected unqualified-id before numeric constant
   40 | #define HIGH 0x1
      |              ^~~
E:\Programme\arduino\portable\sketchbook\sketch_may26b\sketch_may26b.ino:10:39: note: in expansion of macro 'HIGH'
   10 |   bool test = digitalRead(DUT_lm317), HIGH;
      |                                       ^~~~

Kannst ja mal testen

// Forumcode - ungetestet aber compiliert fehlerfrei.

//Debuggen mit Textschnippsel nicht vergessen ;)

const byte DUT_detect = 2;
const byte DUT_short = 3;
const byte DUT_lm317 = 4;
const byte DUT_diode = 5;
const byte DUT_mosfet = 6;

const byte OK_detect = 8;
const byte OK_short = 9;
const byte OK_lm317 = 10;
const byte OK_diode = 11;
const byte OK_mosfet = 12;

const byte NG_detect = A0;
const byte NG_short = A1;
const byte NG_lm317 = A2;
const byte NG_diode = A3;
const byte NG_mosfet = A4;

enum {warten, startTest, spannungTest, diodeTest, mosfetTest, endeTest};
unsigned int schritt = warten;
boolean messungAktiv = false;

void setup() {
  Serial.begin(9600);
  Serial.println("Setup gestartet");

  /*
    pinMode(*hier Pin einfügen*, OUTPUT); //beliebig oft wiederholen
    pinMode(*hier Pin einfügen*, INPUT);  //beliebig oft wiederholen
  */

  pinMode(DUT_detect, INPUT);
  pinMode(DUT_short, INPUT);
  pinMode(DUT_lm317, INPUT);
  pinMode(DUT_diode, INPUT);
  pinMode(DUT_mosfet, INPUT);

  //OUTPUT definieren fuer GUT
  pinMode(OK_detect, OUTPUT);
  pinMode(OK_short, OUTPUT);
  pinMode(OK_lm317, OUTPUT);
  pinMode(OK_diode, OUTPUT);
  pinMode(OK_mosfet, OUTPUT);

  //OUTPUT definieren fuer FEHLER
  pinMode(NG_detect, OUTPUT);
  pinMode(NG_short, OUTPUT);
  pinMode(NG_lm317, OUTPUT);
  pinMode(NG_diode, OUTPUT);
  pinMode(NG_mosfet, OUTPUT);
}

void loop() {

  //Spannung für Testschaltung wird ausgegeben
  digitalWrite(7, HIGH);
  Serial.println("Spannung für Testschaltung wird ausgegeben");

  //Ist die Baugruppe anwesend? Wenn ja, Alle anderen Testspannungen freigeben
  //Baugruppe eingelegt?
  if (digitalRead(DUT_detect))  // Baugruppe eingesteckt? ...
  {
    if (!messungAktiv)          // ... bisher keine Messung gestartet? ...
    {
      schritt = startTest;      // ... los gehts
    }
  }
  else                          // Baugruppe entfernt? ...
  {
    if (messungAktiv)           // ... bei aktiver Mesunng? ...
    {
      Serial.println(F(" Baugruppe während Messung entnommen! Abbruch!"));
      schritt = endeTest;       // ... Schluss mit Messung
    }
  }

  // Schrittweise messen....
  switch (schritt)
  {
    case warten:
      // Hier passiert wirklich nichts ausser warten
      break;
    case startTest:
      messungAktiv = true;
      digitalWrite(NG_lm317, LOW);
      digitalWrite(OK_lm317, LOW);
      digitalWrite(NG_diode, LOW);
      digitalWrite(OK_diode, LOW);
      digitalWrite(NG_mosfet, LOW);
      digitalWrite(OK_mosfet, LOW);
      schritt=spannungTest;
      break;

    case spannungTest:
      if (digitalRead(DUT_lm317))
      {
        Serial.println("Spannungsregler OK");
        //OK-LED einschalten
        digitalWrite(OK_lm317, HIGH);
      }
      //Spannungsregler nicht gut:
      else
      {
        Serial.println("Spannungsregler NG");
        //NG-LED einschalten
        digitalWrite(NG_lm317, HIGH);
      }
      schritt = diodeTest;
      break;

    case diodeTest:
      if (digitalRead(DUT_diode))
      {
        Serial.println("Dioden OK");
        //OK-LED einschalten
        digitalWrite(OK_diode, HIGH);
      }
      //Dioden nicht gut:
      else
      {
        Serial.println("Dioden NG");
        //NG-LED einschalten
        digitalWrite(NG_diode, HIGH);
      }
      schritt = mosfetTest;
      break;

    case mosfetTest:
      //MOSFET gut
      if (digitalRead(DUT_mosfet))
      {
        Serial.println("MOSFET OK");
        //OK-LED einschalten
        digitalWrite(OK_mosfet, HIGH);
      }
      //MOSFET nicht gut:
      else
      {
        Serial.println("MOSFET NG");
        //NG-LED einschalten
        digitalWrite(NG_mosfet, HIGH);
      }
      schritt = endeTest;
      break;

    case endeTest:
      Serial.println(F("Ende Messung"));
      delay(1000);
      if (!digitalRead(DUT_detect))
      {
        messungAktiv = false;
        schritt = warten;
      }
      break;
  }
}

soll bedeuten, der Compiler erwartet sowas wie
bool test = digitalRead(DUT_lm317), test2 = HIGH;
aber das wäre ganz was anderes...

Was @combie eigentlich erwartet hat, wäre
warning: left operand of comma operator has no effect [-Wunused-value]

Das kommt z.B. bei

int i = LOW;  // bool wäre auch möglich
if (i , HIGH) Serial.println("Test");

aber im Problem-Fall stimmt es ja nicht, dass die linke Seite des Komma Operators keinen Effekt habe, denn was die Funktion digitalRead nun genau macht, kann und will der Compiler gar nicht wissen.

Fazit: Wenn man sich Mühe gibt, kann man den Compiler (oder sich selbst) immer verwirren.

Ja, du hast wahr.

Wie ich zugeben muss, habe ich sofort gesehen "Das wird so keiner!", der Rest war ein Schnellschuss aus der Hüfte.
Naja....

Okay, ich habe den Code mal getestet. Geht soweit ganz gut, war auch ungefähr das, was ich mir vorgestellt hatte. Jedoch komme ich aus

.....
switch (schritt)
  {
    case warten:
      // Hier passiert wirklich nichts ausser warten
      break;
.....
case endeTest:
      Serial.println(F("Ende Messung"));
      delay(1000);
      if (!digitalRead(DUT_detect))
      {
        messungAktiv = false;
        schritt = warten;
      }

nicht mehr heraus. Nur wenn ich den µC resette. War das denn von dir beabsichtigt? Ich frage nur, weil der Teil unkommentiert ist und mir als Laie wurde das so erklärt: Kommentare = das soll passieren

Die LEDs wollen auch nicht alle leuchten aber das wird dan wohl doch an den hochwertigen LEDs aus meinem Klon-Anfänger-Set liegen. Ich messe mal nach und schau mal woran es liegen könnte

Das ist alles soweit richtig.

Deine Beschreibung ist zu ungenau gewesen (5 Taster angegeben, aber 4 Eingänge mit 8 LED, aber 10 im Code) da hab ich mir mal was zusammengestrickt :wink:

Der Anfang ist in Zeile 65 zu finden.
Dort löst der switch den schritt startTest aus.
Mit dem schritt startTest wird der Merker messungAktiv gesetzt.

Der bleibt solange aktiv, bis der schritt endeTest durchgelaufen ist.
Der schritt endeTest wird aber erst dann beendet, wenn die Baugruppe wieder den switch freigibt. (Zeile 153)

Erst dann kannst Du wieder durch neueinlegen der Baugruppe eine neue Messung starten.(Zeile 67)

Ich hab da gestern aus einem PAP einer anderen Anwendung abgekupfert, die genau das macht.
Leiterplatte einlegen - Kontakte prüfen - Ergebnis anzeigen - Ende ist, wenn die Leiterplatte entnommen wird.
Dann wartet der Code auf das neue einlegen ... und so weiter.

Das Verweilen in warten stört Dich nicht und den restlichen Code auch nicht - der geht da rein und sofort wieder raus. Es ist nur ein "blockadefreier Haltepunkt".

Ich hab nochmal in Dein Ausgangspost geschaut, hab das aber noch immer nicht vollständig aufgenommen.
In der while fragst Du DUT_detect auf HIGH ab, damit der Rest durchläuft.
Damit würde aber die LED NG_detect keinen Sinn ergeben.

Nu hab ich das mal umgeschrieben.
Es sind zwei Kommentare drin, die Du beachten musst.
Einmal in Zeile 80 musst Du festlegen, wann der Test starten soll. Ich gehe jetzt auch mit DUT_detect los, macht aber wie gesagt keinen Sinn, denn wenn der nicht OK ist, startet das nicht.
In Zeile 163 dann genau das Selbe noch einmal.

Ich würde mir einen weiteren PIN als TasterEingang festlegen und mit Tastendruck starten.
Damit ginge der Durchlauf einmal durch - am Ende die Ausgabe und fertig.
Dann würde auch gehen, das mit genau einem Tastendruck genau ein weiterer Prüfschriit durchgeführt wird. Na mal sehen...

// Forumcode - ungetestet aber compiliert fehlerfrei.

//Debuggen mit Textschnippsel nicht vergessen ;)

const byte DUT_detect = 2;
const byte DUT_short = 3;
const byte DUT_lm317 = 4;
const byte DUT_diode = 5;
const byte DUT_mosfet = 6;

const byte OK_detect = 8;
const byte OK_short = 9;
const byte OK_lm317 = 10;
const byte OK_diode = 11;
const byte OK_mosfet = 12;

const byte NG_detect = A0;
const byte NG_short = A1;
const byte NG_lm317 = A2;
const byte NG_diode = A3;
const byte NG_mosfet = A4;

enum {warten, detectTest, shortTest, spannungTest, diodeTest, mosfetTest, endeTest};
unsigned int schritt = warten;

void setup() {
  Serial.begin(9600);
  Serial.println("Setup gestartet");

  /*
    pinMode(*hier Pin einfügen*, OUTPUT); //beliebig oft wiederholen
    pinMode(*hier Pin einfügen*, INPUT);  //beliebig oft wiederholen
  */

  pinMode(DUT_detect, INPUT);
  pinMode(DUT_short, INPUT);
  pinMode(DUT_lm317, INPUT);
  pinMode(DUT_diode, INPUT);
  pinMode(DUT_mosfet, INPUT);

  //OUTPUT definieren fuer GUT
  pinMode(OK_detect, OUTPUT);
  pinMode(OK_short, OUTPUT);
  pinMode(OK_lm317, OUTPUT);
  pinMode(OK_diode, OUTPUT);
  pinMode(OK_mosfet, OUTPUT);

  //OUTPUT definieren fuer FEHLER
  pinMode(NG_detect, OUTPUT);
  pinMode(NG_short, OUTPUT);
  pinMode(NG_lm317, OUTPUT);
  pinMode(NG_diode, OUTPUT);
  pinMode(NG_mosfet, OUTPUT);
}

void loop() {

  //Spannung für Testschaltung wird ausgegeben
  digitalWrite(7, HIGH);
  Serial.println("Spannung für Testschaltung wird ausgegeben");

  //Ist die Baugruppe anwesend? Wenn ja, Alle anderen Testspannungen freigeben
  //Baugruppe eingelegt?

  // Schrittweise messen....
  switch (schritt)
  {
    case warten:
      // vorbereiten der LED: alle aus
      digitalWrite(NG_lm317, LOW);
      digitalWrite(OK_lm317, LOW);
      digitalWrite(NG_diode, LOW);
      digitalWrite(OK_diode, LOW);
      digitalWrite(NG_mosfet, LOW);
      digitalWrite(OK_mosfet, LOW);
      digitalWrite(NG_detect, LOW);
      digitalWrite(OK_detect, LOW);
      digitalWrite(NG_short, LOW);
      digitalWrite(OK_short, LOW);
      if (digitalRead(DUT_detect))   // Hier ist die Startbedingung einzutragen
      {
        schritt = detectTest;
      }
      break;
    case detectTest:                       // faengt mit detect an
      if (digitalRead(DUT_detect))
      {
        digitalWrite(OK_detect, HIGH);
      }
      else
      {
        digitalWrite(NG_detect, HIGH);
      }
      schritt = shortTest;
      break;
    case shortTest:                        // naechster Test
      if (digitalRead(DUT_short))
      {
        digitalWrite(OK_short, HIGH);
      }
      else
      {
        digitalWrite(NG_short, HIGH);
      }
      schritt = spannungTest;
      break;

    case spannungTest:                    // prueft Spannung
      if (digitalRead(DUT_lm317))
      {
        Serial.println("Spannungsregler OK");
        //OK-LED einschalten
        digitalWrite(OK_lm317, HIGH);
      }
      //Spannungsregler nicht gut:
      else
      {
        Serial.println("Spannungsregler NG");
        //NG-LED einschalten
        digitalWrite(NG_lm317, HIGH);
      }
      schritt = diodeTest;
      break;

    case diodeTest:
      if (digitalRead(DUT_diode))
      {
        Serial.println("Dioden OK");
        //OK-LED einschalten
        digitalWrite(OK_diode, HIGH);
      }
      //Dioden nicht gut:
      else
      {
        Serial.println("Dioden NG");
        //NG-LED einschalten
        digitalWrite(NG_diode, HIGH);
      }
      schritt = mosfetTest;
      break;

    case mosfetTest:
      //MOSFET gut
      if (digitalRead(DUT_mosfet))
      {
        Serial.println("MOSFET OK");
        //OK-LED einschalten
        digitalWrite(OK_mosfet, HIGH);
      }
      //MOSFET nicht gut:
      else
      {
        Serial.println("MOSFET NG");
        //NG-LED einschalten
        digitalWrite(NG_mosfet, HIGH);
      }
      schritt = endeTest;
      break;

    case endeTest:
      Serial.println(F("Ende Messung"));
      delay(1000);
      if (!digitalRead(DUT_detect))   // Hier ist die Bedingung einzutragen, mit der der Zyklus beendet wird
      {
        schritt = warten;             // geht in Wartestellung
      }
      break;
  }
}

Also wenn man im Breadboard auch alles richtig aufgebaut hat, funktioniert es auch wie programmiert! :upside_down_face:
Vielen Dank für deine/eure Hilfe!

Gerne.
Schön, wenns jetzt funktioniert.
Danke fürs Feedback!

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