Steuerung von Ventilen und Kamera für TaT-Aufnahmen

Hat das einen Grund, dass du die Boolschen Variablen am Anfang alle auf false gesetzt hast und im Programmablauf dann auf true
oder könte man das auch andersrumski machen?

mit if (... == millis()) geht es nicht, da das zu kurz für das Programm ist

kann auch zu lang sein.
Sollte ganz egal sein, ob loop weniger als eine Millisekunde braucht oder mehr.

Das ich da nicht selber drauf gekommen bin... :blush:

Alle anderen (ausser uns beiden) sind da von allein draufgekommen :grin:

Hat das einen Grund, dass du die Boolschen Variablen am Anfang alle auf false gesetzt hast und im Programmablauf dann auf true
oder könte man das auch andersrumski machen?

Geht auch andersrum, kostet aber beim Start 62 ns mehr, da bei Reset alle Variablen erstmal auf 0 gesetzt werden.

Viel wichtiger ist eigentlich, dass ein Variablename auch das bedeutet was er sagt.

if ( ! ende ) {
  // mach was bis das Ende erreicht ist
   if (xyz) ende = true;
}

obiwan:
Hat das einen Grund, dass du die Boolschen Variablen am Anfang alle auf false gesetzt hast und im Programmablauf dann auf true
oder könte man das auch andersrumski machen?

So wie Michael geschrieben hat:
Boolsche Variablen sollten im Namen so gewählt werden, dass er die Bedeutung widerspiegelt.
In dem Falle: DoneAction1 bedeutet: die Aktion 1 ist erledigt.
Und am besten so initialisieren, dass bei ersten Programmaufruf alles so ist, dass das PRogramm reibungslos durchläuft.

Wenn DoneAction1 = true intialisiert würde, dann würde beim ersten Tastendruck nix passieren.
Wenn RunAction = true initialisiert werden würde, dann würde beim programmstart gleich die komplette Sequenz mal durchlaufen und alle Aktionen einmal ausgeführt.

Es gibt also keine Regel "alles false", es muß für jede Variable einzeln überlegt werden: "welchen Wert soll sie beim Start haben."

Ok, habe nun dein Programm mit dem Serial Monitor verfolgt - alles super durchgelaufen. Dafür gibt's nochmal ein Karma für dich XD (ok, sth77 und michael_x haben auch eins verdient :grin:)

Werde mich nun daran machen, diesen Sketch für "meine Bedürfnisse" (also die Ein-/Ausschaltzeiten der Ventile und Kamera(s)) umzuschreiben.

Drückt mir die Daumen... :smiley:

Na, dann drücke ich auch mal die Daumen ...

viel Spaß mit den Tropfen :slight_smile:

IMGP9865.jpg

Ich habe jetzt testweise mal 2-3 Widerstände auf eine Platine gelötet...

Also wenn ich die "Beinchen" weit genug auseinander durch die Löcher stecke (min. 2 freie Löcher zwischen den Beinchen) kann ich das "gut" festlöten.
Nun sind die "Beinchen" vom Optokoppler aber sehr klein (also nicht so lang wie bei den Widerständen) und liegen direkt nebeneinander (also keine 2 Löcher Abstand).
Wie ich das festlöten soll ohne die Beinchen miteinander zu verbinden weis ich wirklich noch nicht :blush:

Hat da jemand einen Tipp für mich?

Und wie stark sollte die Litze sein? Aktuell habe ich Ø 1,00 mm² - das finde ich schon sehr dick.
Was empfehlt ihr für eine Litze mit der ich auch die 12V Ventile mit verkabeln kann (zu klein darf der Ø ja auch nicht sein)?

Also wenn du das Rastermaß von 2,54mm nicht löten kannst, solltest du vielleicht weniger Kaffee trinken. :wink: Wahrscheinlicher ist jedoch, dass deine Lötspitze bzw. der ganze Lötkolben zu groß ist. Womit lötest du denn?

Platinenrückseiten sehen bei mir in etwa so aus:

obiwan:
Und wie stark sollte die Litze sein? Aktuell habe ich Ø 1,00 mm² - das finde ich schon sehr dick.
Was empfehlt ihr für eine Litze mit der ich auch die 12V Ventile mit verkabeln kann (zu klein darf der Ø ja auch nicht sein)?

Du hast die Frage schonmal gestellt, und ich habe sie dir schonmal beantwortet:

guntherb:
Die Lötstation ist ok.

Du brauchst Elektronikzinn, Lötpumpe ist hilfreich, geht aber auch ohne.
Die "Dritte Hand" habe ich nie gewollt, aber das ist persönliche Vorliebe.
Ferner einen Seitenschneider, eine Spitzzange, evtl Pinzette.
Als Lupe für die feineren Arbeiten habe ich mir mal diese Stirnlupe gekauft, damit komme ich (Brillenträger!) ganz gut zurecht.

Litze: Schaltlitze 0,5mm² oder 0,25mm² ein paar Farben.
und: ich würde einfach mal eine Lochrasterplatine hernehmen, auf die dann ungefähr 100 Widerstände drauflöten, wahlweise drahtbrücken aus Silberschaltdraht. Dann hast du zumindest eine gewisse Grundfertigkeit im löten.
Und schau dir mal ein paar Lehrvideos auf Youtube an. Auch Löten will gelernt sein...

Grüße

Gunther

P.S.:

obiwan:
Mann, mann, mann.... wenn ich das alles mal durchrechne hätte ich mir für das Geld ja fast schon einen fertigen Tropfengenerator kaufen können... $)

Richtig!
Selber bauen ist selten billiger.
Macht aber mehr Spaß!

Schau' dir mal dieses Video an:
Technik für Kinder - 2 - Löten
Hier ist das recht anschaulich, und vor allem, fachlich richtig!
(bei vielen anderen "Lehrvideos" wird teilweise völliger nonsens gezeigt)

sth77:
Platinenrückseiten sehen bei mir in etwa so aus:

Aber da sind doch das rote und das schwarze Kabel auf der Rückseite der Platine eindeutig miteinander verbunden (sieht roter Pfeil im angehängten Bild). Das geht doch so nicht - oder wo ist da mein Denkfehler?

lötpunkte.jpg

guntherb:
Hier ist das recht anschaulich, und vor allem, fachlich richtig!

Ha! Genau das hatte ich mir im Vorfeld schon angeschaut.
Wie stark soll den nun die Litze sein? Reichen 0,25 oder doch lieber 0,5?

obiwan:
Aber da sind doch das rote und das schwarze Kabel auf der Rückseite der Platine eindeutig miteinander verbunden (sieht roter Pfeil im angehängten Bild).

Hier mal eine Detailansicht von der Bestückungsseite, diese Verbindung ist nur von einer Drahtschlaufe, die bei mir als Kabelzugentlastung dient. Also keine Sorge, da gibt es keinen Kurzschluss. Natürlich darf man diese Stelle nicht so lange erhitzen, bis sich die Drahtschlaufe durch die Isolierung der roten und schwarzen Litze geschmolzen hat. Denn dann gibt es tatsächlich einen Kurzschluss.

Detail.jpg

sth77:
Natürlich darf man diese Stelle nicht so lange erhitzen, bis sich die Drahtschlaufe durch die Isolierung der roten und schwarzen Litze geschmolzen hat. Denn dann gibt es tatsächlich einen Kurzschluss.

Moment mal... die Drähte (also rot und schwarz) sind doch aber auf der Rückseite der Platine durch die Lötpunkte miteinander verbunden - von daher müsste es doch einen Kurzschluss geben. Oder "leiten" die Lötpunkte nicht sondern dienen nur der "Befestigung" der Teile auf der Platine???

Zwei verbundene Lötpunkte leiten natürlich auch. Das ist zweimal die gleiche Schaltung, kannst anhand der Löcher auch auszählen, wo die rote und schwarze Litze endet, nämlich direkt vor dem Spannungsregler. Die Schlaufe hat keinerlei Verbindung zur Schaltung und ist einfach nur ein befestigter Drahtbügel.

Nochmal zur Verdeutlichung: Die Schlaufe liegt in der ersten durchgehenden Lötreihe (von unten gezählt), die Litzen sind in der 3. Reihe verlötet.

@sth77: Wie bekommst Du die Verbindungen zwischen den Lötaugen so sauber hin? Ich habe dabei immer das Problem, das sich beim entfernen des Lötkolbens das noch flüssige Lötzinn auf die Lötaugen zurückzieht und die Verbdingung wieder getrennt ist.
Mario.

Gute Frage. Klappt einfach so. :wink: Ich setze jeweils etwas Lötzinn entlang der späteren Leitungsbahn. Diese verbinde ich dann jeweils zu Zweiergruppen und setze wieder an, um zwei Zweiergruppen zu einer Vierergruppe zu verbinden. Dadurch teilt man sich die Bahn ja in mehrere Einzelglieder, die zwischenzeitig auch mal etwas auskühlen können. Die Leiterbahn in einem Rutsch durchzuziehen ist mir auch noch nicht gelungen.
Einfacher ist es übrigens, ein Stück Draht auf der Lötseite in die Bahn einzulegen, dann ziehen sich die Lötstellen nicht auf ihr Pad zurück. So musste ich vorgehen, als ich auf den Prototypenplatinen löten musste, da ist zusätzlich noch Lötstopplack zwischen den Durchkontaktierungen.

Hallo guntherb,

ich habe deinen Code von hier:

guntherb:
Um ein Ventil ein und wieder auszuschalten, brauchst du also 2 Aktionen.

jetzt mal umgesetzt, wobei ich ja bei der Kamera keine Ausschaltzeiten habe. Ich hoffe ich habe das so "richtig" umgesetzt?

// Sketch zur Steuerung von drei Ventilen und einer Kamera

const int VENTIL1 = 8;   // Pin 8  = Ventil 1
const int VENTIL2 = 9;   // Pin 9  = Ventil 2
const int VENTIL3 = 10;  // Pin 10 = Ventil 3
const int FOCUS = 11;    // Pin 11 = fucus
const int SHUTTER = 12;  // Pin 12 = shutter
const int TRIP = 13;     // Pin 13 = Starttaste

// Steuerungszeiten Veintile

unsigned long ven1_on = 1000;
unsigned long ven1_of = 1050;
unsigned long ven2_on = 1100;
unsigned long ven2_of = 1180;
unsigned long ven3_on = 1150;
unsigned long ven3_of = 1200;

// Steuerungszeiten Kamera

unsigned long focus_on = 1000;
unsigned long shutter_on = 1060;

// Steuerungszeiten sonstige

unsigned long endzeit = 2000;
unsigned long startzeit = 0;
unsigned long timestamp = 0;

// Boolsche Variablen zum starten/anhalten der einzelnen Aktionen

boolean ven1on = false;
boolean ven1of = false;
boolean ven2on = false;
boolean ven2of = false;
boolean ven3on = false;
boolean ven3of = false;
boolean focuson = false;
boolean shutteron = false;
boolean action = false;

void setup()
{
   pinMode(VENTIL1, OUTPUT);
   pinMode(VENTIL2, OUTPUT);
   pinMode(VENTIL3, OUTPUT);
   pinMode(FOCUS, OUTPUT);
   pinMode(SHUTTER, OUTPUT);
   pinMode(TRIP, INPUT_PULLUP);
}

void loop()
{
   if (digitalRead(TRIP) == LOW && !action)
   {
      delay(100);
      action = true;
      startzeit = millis();
   }
   if (action && !ven1on && startzeit + ven1_on < millis())
   {
   timestamp = millis();
   digitalWrite(VENTIL1, HIGH);
   ven1on = true;
   }
   if (action && !ven1of && startzeit + ven1_of < millis())
   {
   timestamp = millis();
   digitalWrite(VENTIL1, LOW);
   ven1of = true;
   }
   if (action && !ven2on && startzeit + ven2_on < millis())
   {
   timestamp = millis();
   digitalWrite(VENTIL2, HIGH);
   ven2on = true;
   }
   if (action && !ven2of && startzeit + ven2_of < millis())
   {
   timestamp = millis();
   digitalWrite(VENTIL2, LOW);
   ven2of = true;
   }
   if (action && !ven3on && startzeit + ven3_on < millis())
   {
   timestamp = millis();
   digitalWrite(VENTIL3, HIGH);
   ven3on = true;
   }
   if (action && !ven3of && startzeit + ven3_of < millis())
   {
   timestamp = millis();
   digitalWrite(VENTIL3, LOW);
   ven3of = true;
   }
   if (action && !focuson && startzeit + focus_on < millis())
   {
   timestamp = millis();
   digitalWrite(FOCUS, HIGH);
   focuson = true;
   }
   if (action && !shutter && startzeit + shutter_on < millis())
   {
   timestamp = millis();
   digitalWrite(SHUTTER, HIGH);
   delay(10);
   digitelWrite(SHUTTER; LOW);
   shutter = true;
   }
   if (action && !shutter && startzeit + endzeit < millis())
   {
   action = false;
   ven1on = false;
   ven1of = false;
   ven2on = false;
   ven2of = false;
   ven3on = false;
   ven3of = false;
   fucuson = false;
   shutteron = false;
   }
}

obiwan:
Ich hoffe ich habe das so "richtig" umgesetzt?

Hast du es denn probiert? Das ist immer noch die einfachste Methode um es zu testen...

die vielen "timestamp = millis();" machen keinen Sinn, oder?

Gunther

guntherb:
Hast du es denn probiert?

Ich muss doch erst noch meine Platine "belöten" - das ist für einen Anfänger doch ziemlich fummelig und ich bin noch am Üben...

guntherb:
die vielen "timestamp = millis();" machen keinen Sinn, oder?

?? Die habe ich doch von dir übernommen:

guntherb:
ich habe dir unten mal einen Beispielcode eingefügt ...
...
void loop()
{
...

if (RunAction && !DoneAction1 && startzeit + Action1time < millis()){
timestamp = millis();
Serial.print(" Ausfuehren Aktion1 nach ");
Serial.print(timestamp-startzeit);Serial.println("ms");
DoneAction1 = true;
}
if (RunAction && !DoneAction2 && startzeit + Action2time < millis()){
timestamp = millis();
Serial.print(" Ausfuehren Aktion2 nach ");
Serial.print(timestamp-startzeit);Serial.println("ms");
DoneAction2 = true;
}
if (RunAction && !DoneAction3 && startzeit + Action3time < millis()){
timestamp = millis();
Serial.print(" Ausfuehren Aktion3 nach ");
Serial.print(timestamp-startzeit);Serial.println("ms");
DoneAction3 = true;
...

Ach so, das war nur um das am Bildschirm auszugeben - ich kann das natürlich weglassen... :blush:

Hier nochmal der angepasste Sketch:

// Sketch zur Steuerung von drei Ventilen und einer Kamera

const int VENTIL1 = 8;   // Pin 8  = Ventil 1
const int VENTIL2 = 9;   // Pin 9  = Ventil 2
const int VENTIL3 = 10;  // Pin 10 = Ventil 3
const int FOCUS = 11;    // Pin 11 = fucus
const int SHUTTER = 12;  // Pin 12 = shutter
const int TRIP = 13;     // Pin 13 = Starttaste

// Steuerungszeiten Veintile

unsigned long ven1_on = 1000;
unsigned long ven1_of = 1050;
unsigned long ven2_on = 1100;
unsigned long ven2_of = 1180;
unsigned long ven3_on = 1150;
unsigned long ven3_of = 1200;

// Steuerungszeiten Kamera

unsigned long focus_on = 1000;
unsigned long shutter_on = 1060;

// Steuerungszeiten sonstige

unsigned long endzeit = 2000;
unsigned long startzeit = 0;

// Boolsche Variablen zum starten/anhalten der einzelnen Aktionen

boolean ven1on = false;
boolean ven1of = false;
boolean ven2on = false;
boolean ven2of = false;
boolean ven3on = false;
boolean ven3of = false;
boolean focuson = false;
boolean shutteron = false;
boolean action = false;

void setup()
{
   pinMode(VENTIL1, OUTPUT);
   pinMode(VENTIL2, OUTPUT);
   pinMode(VENTIL3, OUTPUT);
   pinMode(FOCUS, OUTPUT);
   pinMode(SHUTTER, OUTPUT);
   pinMode(TRIP, INPUT_PULLUP);
}

void loop()
{
   if (digitalRead(TRIP) == LOW && !action)
   {
      delay(100);
      action = true;
      startzeit = millis();
   }
   if (action && !ven1on && startzeit + ven1_on < millis())
   {
   digitalWrite(VENTIL1, HIGH);
   ven1on = true;
   }
   if (action && !ven1of && startzeit + ven1_of < millis())
   {
   digitalWrite(VENTIL1, LOW);
   ven1of = true;
   }
   if (action && !ven2on && startzeit + ven2_on < millis())
   {
   digitalWrite(VENTIL2, HIGH);
   ven2on = true;
   }
   if (action && !ven2of && startzeit + ven2_of < millis())
   {
   digitalWrite(VENTIL2, LOW);
   ven2of = true;
   }
   if (action && !ven3on && startzeit + ven3_on < millis())
   {
   digitalWrite(VENTIL3, HIGH);
   ven3on = true;
   }
   if (action && !ven3of && startzeit + ven3_of < millis())
   {
   digitalWrite(VENTIL3, LOW);
   ven3of = true;
   }
   if (action && !focuson && startzeit + focus_on < millis())
   {
   digitalWrite(FOCUS, HIGH);
   focuson = true;
   }
   if (action && !shutteron && startzeit + shutter_on < millis())
   {
   timestamp = millis();
   digitalWrite(SHUTTER, HIGH);
   delay(10);
   digitelWrite(SHUTTER, LOW);
   shutteron = true;
   }
   if (action && startzeit + endzeit < millis())
   {
   action = false;
   ven1on = false;
   ven1of = false;
   ven2on = false;
   ven2of = false;
   ven3on = false;
   ven3of = false;
   fucuson = false;
   shutteron = false;
   }
}

Sieht erstmal gut aus, aber ich bin kein Compiler....

ich würde auf dem Steckbrett das Ganze aufbauen, mit LED + 1k als Last an den Pins, dann kannst du am einfachsten prüfen, ob dein Sketch funktioniert.

Denn, wenn du dann die neue Schaltung testest, solltest du wissen, dass dein Sketch funktioniert, sonst suchst du dir den Wolf, wenn du nicht weißt, ob der Fehler in der Software oder in der Hardware liegt.