Hallo,
okay Skoby, irgendwie haste auch wieder wahr, ich steck da schon zu tief drin. 
Ich werde die Namen ändern in access_protect, dann wird das verständlicher.
Code kommt gleich ....
die vielen Änderungen der Namen ist auch nicht ganz trivial und die Kommentare auch noch, sonst kommt man wieder durcheinander. So, ich hoffe das ist nicht zu sehr gekürzt, das westentlich sollte vorhanden sein. Für die Taster nutze ich die Bounce2.h Library.
Der Code ist mittlerweile ausgebaut. In der loop wird jetzt der Rückgabewert true/false der Funktion "SD_Access_Protection" ausgewertet.
global
byte Taster_SDread = 5; // Taster an Pin 5
byte Taster_SDread_Zustand = LOW;
byte Taster_SDread_Zustand_vorher = LOW;
byte Taster_SD_access_protect = 7; // Taster für SD Schreibschutz an Pin 7
byte Taster_SD_access_protect_Zustand = LOW; // nur erneutes Taster drücken, Low Pegel, wird detektiert
boolean SD_access_protect_Zustand = true; // Hilfsvariable, ob SD schon gesperrt wurde oder nicht
setup
// After setting up the button, setup debouncer
debouncer1.attach(Taster_SDread);
debouncer1.interval(50); // Entprellzeit 50ms
debouncer2.attach(Taster_BTmodul);
debouncer2.interval(50); // Entprellzeit 50ms
debouncer3.attach(Taster_SD_access_protect);
debouncer3.interval(50); // Entprellzeit 50ms
// digitalen Eingang mit PullUp aktivieren
pinMode(Taster_SDread, INPUT); // setzt Pin als Eingang
digitalWrite(Taster_SDread, HIGH); // und aktiviert dessen PullUp Widerstand
pinMode(Taster_BTmodul, INPUT); // setzt Pin als Eingang
digitalWrite(Taster_BTmodul, HIGH); // und aktiviert dessen PullUp Widerstand
pinMode(Taster_SD_access_protect, INPUT); // setzt Pin als Eingang
digitalWrite(Taster_SD_access_protect, HIGH); // und aktiviert dessen PullUp Widerstand
loop
SD_access_protect_Zustand = SD_Access_Protection(); // SD-Karten Schreibschutz aktiv oder nicht ?
if ( actual_runtime-last_SDcard_writing >= Intervall_SD && SD_access_protect_Zustand == false ) // aller x min Daten auf SD-Karte schreiben
{
digitalWrite(SDcard_aktiv_LED, HIGH); // SDcard Aktivität anzeigen
refresh_SD_Dateiname(); // aktualisiert den Dateinamen auf der SD-Karte laut RTC-Datum
if ( write_to_SDcard() == false ) // schreibe Daten auf SD-Karte und gibt Fehlerstatus zurück
{ // false = fehlerfrei, true = es trat ein Fehler auf
lcd.setCursor(0,2); lcd.print(F(" File closed "));
}
digitalWrite(SDcard_aktiv_LED, LOW); // SD-Karten Aktivitätsende
last_SDcard_writing = actual_runtime; // aktualisiere alten Zeitpunkt
SDcardLastActiveTime = millis(); // verlängere die Info Anzeige,
lastShow_LcdPage_1 = SDcardLastActiveTime; // setzen der nächsten Eintrittsbedingung, gleich setzen
lastShow_LcdPage_2 = SDcardLastActiveTime; // gleich setzen
}
debouncer1.update(); // Update the debouncer
Taster_SDread_Zustand = debouncer1.read(); // Update TasterZustand und speichern in dieser
if (Taster_SDread_Zustand_vorher != Taster_SDread_Zustand) // hat sich der Tastenzustand geändert?
{ // aktuelle Datei der SD Karte auslesen
if ( Taster_SDread_Zustand == LOW && SD_access_protect_Zustand == false ) { // Tasterabfrage ob gedrückt? Nur bei erneuten Wechsel von HIGH auf LOW
digitalWrite(SDcard_aktiv_LED, HIGH); // SDcard Aktivität mit LED anzeigen
refresh_SD_Dateiname(); SERIAL_IMPL.println(SD_Dateiname); // aktueller Dateiname
if ( read_from_SDcard() == false) { // lese von SD-Karte und gib Status zurück
lcd.setCursor(0,2); lcd.print(F(" File closed "));
}
SDcardLastActiveTime = millis(); // längere Infoanzeige, ansonsten andere Displayanzeigen
digitalWrite(SDcard_aktiv_LED, LOW); // SD-Karten Aktivitätsende
lastShow_LcdPage_1 = millis(); // setzen der nächsten Eintrittsbedingung
lastShow_LcdPage_2 = lastShow_LcdPage_1; // gleich setzen
} // Ende "Taster gedrückt?"
if (Taster_SDread_Zustand == LOW && SD_access_protect_Zustand == true) {
SERIAL_IMPL.print(RtcDateTimeBuf); // RTC Datum und Zeit ausgeben
SERIAL_IMPL.println(F(" SD Zugriff gesperrt"));
lcd.setCursor(0,2); lcd.print(F(" SD gesperrt "));
SDcardLastActiveTime = millis(); // längere Infoanzeige, ansonsten andere Displayanzeigen
}
Taster_SDread_Zustand_vorher = Taster_SDread_Zustand; // Tastenzustand meckern
} // Ende: Hat sich der Tasterzustand 0/1 "dauerhaft" geändert?
Unterfunktionen
// prüft ob SD-Kartenzugriff gesperrt werden muß oder nicht
boolean SD_Access_Protection ()
{
boolean protection_status = false;
if ( SD_Protect_Taster() == true || check_Arduino_Ub() == false ) {
protection_status = true;
}
else {
protection_status = false;
}
//Serial.print(F("SD_Access_Protection: ")); Serial.println(protection_status);
return protection_status;
}
// SD Karten Zugriffsschutz per Taster aktivieren oder aufheben
boolean SD_Protect_Taster()
{ // nur erneutes drücken des Tasters (Low Pegel) wird ausgewertet!
static boolean status_protect = false;
boolean stateChanged = debouncer3.update(); // Update the debouncer3
int state = debouncer3.read();
if ( stateChanged && state == LOW ) { // Wurde Taster gedrückt? Nur erneutes drücken wird erkannt!
if ( Taster_SD_access_protect_Zustand == LOW ) {
Taster_SD_access_protect_Zustand = HIGH; // HIGH Schreibschutz aktiv, LOW nicht aktiv
digitalWrite(LED1, HIGH); // optische Anzeige
status_protect = true;
SERIAL_IMPL.println(F("SD Zugriff mit Taster gesperrt"));
}
else {
Taster_SD_access_protect_Zustand = LOW;
digitalWrite(LED1, LOW); // optische Anzeige
status_protect = false;
SERIAL_IMPL.println(F("SD Sperre mit Taster aufgehoben"));
}
}
//Serial.print(F("SD_Protect_Taster: ")); Serial.println(status_protect);
return status_protect;
}
boolean check_Arduino_Ub ()
{
boolean status_Ub = false;
// Zugriffsschutz wegen zu niedriger Arduino Ub aktiv?
if ( Kanal_1 > 2.0 ) { // Kanal x wird überwacht
digitalWrite(LED_Ub, LOW); // optische Anzeige
status_Ub = true; // alles i.O., Zugriffsschutz deaktiviert
}
else { // Betriebsspannung zu niedrig
digitalWrite(LED_Ub, HIGH); // optische Anzeige
status_Ub = false; // Zugriffsschutz aktiviert, sperrt SD-Kartenzugriff
}
//Serial.print(F("check_Arduino_Ub: ")); Serial.println(status_Ub);
return status_Ub;
}