Hallo liebes Forum,
bin frisch hier angekommen weil ich vor einem Problem stehe.
Vorgeschichte: habe mir einen Arduino Nano V3 bestellt und nachdem ich ihn hatte überlegt, was ich damit anstellen möchte. Ergebnis: Ich möchte einen Trigger für die Kamera bauen, welcher auf diverse externe Auslöseevents reagiert, aber auch einene Timer-Events besitzen soll.
Aktuell habe ich folgendes:
- Arduino Nano V3
- OLED-Display (https://www.az-delivery.de/collections/displays/products/1-3zoll-i2c-oled-display?variant=6571890704411)
Zur Auslösung nutze ich aktuell den Pin 13 (welcher ja auch die LED ansteuert, richtig?) mit einer Funktion, die wie folgt aussieht:
Funktion zum Auslösen der Kamera:
void takePicture(int timingMS, int breakMS, int howOften, int pin){
for (int i =0; i >=howOften ; i ++ ) {
digitalWrite (pin , HIGH);
delay(timingMS);
digitalWrite(pin , LOW);
delay(breakMS);
}
}
Zu meinem Problem:
Ich nutze die Display-Bibliothek U8G2, welche gleich ein nettes Menü bereitstellt. Leider auch bisher die einzige Bibliothek die mit dem Display funktioniert. Auch wenn auf der Händlerseite was anderes steht.
Meine einzelnen Funktionen realisiere ich jetzt nicht über die Menüfunktionen von U8G2, sondern über die normalen Ausgabe-Funktionen. Funktioniert so weit sehr gut, aber wenn ich jetzt zum Auslösen komme geht es in die Hose, bzw. sind aktuell vermutlich zwei Fehler drin. Die Auslösefunktion (eben schon gepostet) scheint nicht zu funktionieren, die LED bleibt nämlich immer dunkel, ich erhalte aber beim Compilieren keine Fehler.
Code für das Display, über welches die Auslösezeit eingestellt wird und dann auch ausgelöst wird:
while (digitalRead(cancel) == HIGH) {
do {
delay(10);
} while (digitalRead(select) == LOW);
u8g2.clearBuffer();
u8g2.setCursor(5, 25);
u8g2.print("BULB");
u8g2.setCursor(5, 45);
u8g2.print(String(triggerTime) + " ms");
u8g2.sendBuffer();
if (digitalRead(left) == HIGH) triggerTime = triggerTime + 1000;
if ((triggerTime > 1000) and (digitalRead(right) == HIGH)) triggerTime = triggerTime - 1000;
if (digitalRead(select) == HIGH) {
do {
delay(10);
} while (digitalRead(select) == LOW);
takePicture(triggerTime, 0, 1, shutterPin);
u8g2.clearBuffer();
u8g2.setCursor(5, 25);
u8g2.print("*** SHUTTER ***");
u8g2.sendBuffer();
delay (triggerTime);
}
}
Die beiden "do while"-Schleifen hab ich drin, um die Zeitverzögerung abzufangen, bis der jeweilige Pin-Status hergestellt ist und es nicht einfach einen "Durchmarsch" gibt.
Wenn ich diese Schleifen raus lasse, reagiert er auf nichts mehr. Wenn ich sie drin habe, kann ich die Werte von triggerTime verändern, aber nach einmaliger Bestätigung bleibt er in einer Schleife. Theoretisch sollte das Ganze aber ohne die beiden "do while"-Schleifen funktionieren. Oder hab ich einen Denkfehler?
Die Verkabelung für die Schalter läuft auf Masse, sollte also theoretisch auf "INPUT_PULLUP" gestellt sein, weil diese Anschlussvariante ist für U8G2 so beschrieben.
Aktuell betätige ich die einzelnen "Taster" nur durch Kabel, die ich auf dem Steck-Board kurzschließe, da ich noch auf die bestellten Folientaster warte.
Hier nochmal die Konstanten und Variablen:
const int shutterPin = 13; // =LED
const int cancel = 4;
const int up = 9;
const int down = 7;
const int left = 8;
const int right = 6;
const int select = 5;
const char *string_main_title = "PT v0.05a"; // UP TO 22 SIGNS
const char *string_list_main =
"1) Bulb \n"
"2) HDR \n"
"3) Countdown \n"
"4) Zeitraffer \n"
"5) Blitz \n"
"6) Schall \n"
"7) Lichtschranke\n"
"8) Info ";
int triggerTime = 1000;
Hier nochmal das Setup:
void setup(void) {
u8g2.begin(/*Select=*/ select, /*Right/Next=*/ right, /*Left/Prev=*/ left, /*Up=*/ up, /*Down=*/ down, /*Home/Cancel=*/ cancel); // Arduboy 10 (Production)
u8g2.setFont(u8g2_font_6x12_tr);
u8g2.enableUTF8Print();
pinMode(shutterPin, OUTPUT);
}
Ich hänge nochmal den kompletten Code als Datei an.
Ich hoffe Ihr habt eine Idee oder seht, was ich falsch mache, bzw. wo ich einen Denkfehler habe.