Hallo in die Runde,
meine ersten Erfahrungen mit dem Arduino sind gut 10 Jahren her (kauf und Installation der IDE), wirklich angefangen habe ich im November 22, hier ging es darum coole Lichteffekte für das Lightpainting zu bekommen.
Seit langem Spukt mir ein Gerät im Kopf herum, mit dem ich Wassertopfen fotografieren kann. Da mir die am Markt gängigen Produkte nicht zugesagt haben, habe ich versucht es selbst um zu setzen.
Ein Grundprogramm welches über die Arduino IDE steuern lässt, inkl. Stromlaufplan, war schnell gefunden. Soweit läuft das Programm auch ohne "erkennbare" Störung!
Jetzt kam aber der Spieltrieb und der Wunsch das ganze Autark zu betrieben ins Spiel.
Also kamen 6 Encoder inkl. Taster dazu (Einstellen der Tropfengröße & Wartezeiten zw. den Tropfen, Starten des Programms usw.) und noch ein LCD 4x20 (ohne I2C) dazu.
Und damit nahm der Ärger seinen Lauf Das ganze läuft auf einem "Mega 2560"
Das Display stürzt immer mit Programmablauf ab, mal beim ersten Durchlauf mal hält es ein paar Durchläufe durch - damit ist dann das Thema "Autark" leider nicht umsetzbar.
Meine E-Technik Kenntnisse sind ähnlich rudimentär, wie die der Programmiersprache. Vielleicht habt ihr einen Blick, für das, was meiner Schaltung / Programm fehlt.
So, der Text ist geschrieben... jetzt muss ich nur noch finden wo und wie ich den Schaltplan & das PRG hochladen kann...
Gruß
Timo
Der Stromlaufplan aus der Vorlage
Der IST-Stromlaufplan mit meinen Anpassungen - der ursprüngliche Stromlaufplan ist cyan-Farben umrandet. Die Pins habe ich dazu geschrieben, da mir beim Anschluss des Boardes die Übersichtlichkeit gefehlt hat. Ebenso sind noch Ergänzungen zu den Bauteilen im Plan enthalten.
```cpp
/*
################################################################################################################################################
### Tropfengestalter *Halbautomatik* ###
### Kamera-, Blitz- und Wassersteuerung ###
### 6 Encoder Steuern die Tropfen, sowie die Wartezeit zwischen Tropfen 1, 2 & 3 & die Blitzauslösezeit ###
### Version 1.13b / 11.02.23 ###
### TimothyBK79 ###
################################################################################################################################################
*/
//##############################################################################################################################################
//Kameraversatz wird bei halbautomatik Betrieb benötigt - Kamera per Hand auslösen, Blitz & Tropfen per Tropfengenerator
//Tropfdauer & Verweilzeit wird für das Positionieren einer Schraube benötigt (Fokussierhilfe)
unsigned long Kameraversatz = 120;
unsigned long Tropfdauer = 20; //Testtropfenlänge
unsigned long Verweilzeit = 750; //Wartezeit zwischen den Testtropfen
//##############################################################################################################################################
#define ST_Pin 31 //Starttaster
#define Kamera_Pin 6 //Kameraanschluss (bei Sony wird Kamera & Blitz gesteuert)
#define Tropfen_Pin 7 //Magnetventil
#define Blitz_Pin 5 //Blitzsteuerung (für Leica)
#define LEDGruen 15 //LED Gruen, zeigt Bereitschaftsstatus
#define LEDRot 16 //LED Rot - Gerät arbeitet
#define Testtropfen 4 //Testtropfen zum Fokussieren - 10 Wiederholungen a 500ms (Encoder-PIN 1)
#define Handschalter 44 //externer Handschalter zum Programmstart
#define Leertaster 30 //Vorratsbehälter leeren
//#define Taster3 31
//#define Taster5 40
//#define Taster6 17
//#define Tropfen_Pin2 43 //Vorbereitend für 2. Magnetventil
//#define Tropfen_Pin3 45 //Vorbereitend für 3. Magnetventil
#include <Encoder.h>
Encoder Tropfen1(2, 8); //Encoder für die Tropfengröße und die Wartezeiten dazwischen
Encoder Tropfen2(9, 3);
Encoder Tropfen3(20, 12);
Encoder Warte1(18, 10);
Encoder Warte2(19, 11);
Encoder Blitz(14, 21);
#include <LiquidCrystal.h> //LCD Einbinden ohne I2C
LiquidCrystal lcd(51, 50, 49, 48, 47, 46); //Pinanschluesse LCD
void setup()
{
pinMode(ST_Pin, INPUT_PULLUP);
pinMode(Testtropfen, INPUT_PULLUP);
pinMode(Leertaster, INPUT_PULLUP);
pinMode(Kamera_Pin, OUTPUT);
pinMode(Tropfen_Pin, OUTPUT);
pinMode(Blitz_Pin, OUTPUT);
pinMode(LEDGruen, OUTPUT);
pinMode(LEDRot, OUTPUT);
lcd.begin(20, 4); //LCD hat 20 Zeichen & 4 Zeilen
lcd.setCursor(0, 0);
lcd.print("------ Tropfen -----");
lcd.setCursor(5, 1);
lcd.print(" | ");
lcd.setCursor(12, 1);
lcd.print(" | ");
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print("Blitz | Verweilzeit");
lcd.setCursor(5, 3);
lcd.print(" | ");
lcd.setCursor(12, 3);
lcd.print(" | ");
}
//Encoderbereich muss noch definiiert werden - nur wie?!
long oldTropfen1 = -999;
long oldTropfen2 = -999;
long oldTropfen3 = -999;
long oldWarte1 = -999;
long oldWarte2 = -999;
long oldBlitz = -999;
void loop()
{
digitalWrite(LEDGruen, HIGH); //Gerätestatus bereit
long newTropfen1 = Tropfen1.read()/2;
if (newTropfen1 != oldTropfen1)
{
oldTropfen1 = newTropfen1;
}
long newTropfen2 = Tropfen2.read()/4;
if (newTropfen2 != oldTropfen2)
{
oldTropfen2 = newTropfen2;
}
long newTropfen3 = Tropfen3.read()/4;
if (newTropfen3 != oldTropfen3)
{
oldTropfen3 = newTropfen3;
}
long newWarte1 = Warte1.read()/4;
if (newWarte1 != oldWarte1)
{
oldWarte1 = newWarte1;
}
long newWarte2 = Warte2.read()/4;
if (newWarte2 != oldWarte2)
{
oldWarte2 = newWarte2;
}
long newBlitz = Blitz.read()/2;
if (newBlitz != oldBlitz)
{
oldBlitz = newBlitz;
}
if (digitalRead(Testtropfen) == HIGH)
{
Tropfenlang();
}
if (digitalRead(Leertaster) == HIGH) //Leeren des Vorratsbehälters
{
Leeren();
}
lcd.setCursor(2, 1);
lcd.print(newTropfen1);
lcd.print(" ");
lcd.setCursor(9, 1);
lcd.print(newTropfen2);
lcd.print(" ");
lcd.setCursor(16, 1);
lcd.print(newTropfen3);
lcd.print(" ");
lcd.setCursor(2, 3);
lcd.print(newBlitz);
lcd.print(" ");
lcd.setCursor(9, 3);
lcd.print(newWarte1);
lcd.print(" ");
lcd.setCursor(16, 3);
lcd.print(newWarte2);
lcd.print(" ");
if (digitalRead(ST_Pin) == HIGH)
{
if ((newWarte1 + newTropfen2 + newWarte2) < newBlitz)
{
digitalWrite(LEDGruen, LOW); //schaltet um von bereit auf in Betrieb
digitalWrite(LEDRot, HIGH);
Kamera(); //löst Kamera aus
delay(Kameraversatz);
Tropfen(newTropfen1); //Erster Tropfen wird ausgelöst
uint32_t millisNow = millis();
while (millis() < millisNow + newBlitz)
{
if (millis() == millisNow + newWarte1)
{ //Wartezeit bis 2. Tropfen auslöst
Tropfen(newTropfen2); //zweiter Tropfen wird ausgelöst
}
if (millis() == millisNow + newWarte2 + newTropfen2)
{
Tropfen(newTropfen3);
}
}
BlitzSender();
delay(2500); //Sperrt den Taster gegen Doppelauslösung
digitalWrite(LEDRot, LOW); //schaltet um auf Bereit
digitalWrite(LEDGruen, HIGH);
}
else
{
digitalWrite(LEDRot, HIGH); //schaltet um auf Bereit
digitalWrite(LEDGruen, HIGH);
delay(1500);
}
}
else
{
digitalWrite(LEDRot, LOW); //schaltet um auf Bereit
digitalWrite(LEDGruen, HIGH);
}
if (digitalRead(Handschalter) == HIGH)
{
if (!((newWarte1 + newTropfen2 + newWarte2) > newBlitz)) {
digitalWrite(LEDGruen, LOW); //schaltet um von bereit auf in Betrieb
digitalWrite(LEDRot, HIGH);
Kamera(); //löst Kamera aus
delay(Kameraversatz);
Tropfen(newTropfen1); //Erster Tropfen wird ausgelöst
uint32_t millisNow = millis();
while (millis() < millisNow + newBlitz)
{
if (millis() == millisNow + newWarte1)
{ //Wartezeit bis 2. Tropfen auslöst
Tropfen(newTropfen2); //zweiter Tropfen wird ausgelöst
}
if (millis() == millisNow + newWarte2 + newTropfen2)
{
Tropfen(newTropfen3);
}
}
BlitzSender();
delay(2500); //Sperrt den Taster gegen Doppelauslösung
digitalWrite(LEDRot, LOW); //schaltet um auf Bereit
digitalWrite(LEDGruen, HIGH);
}
else
{
digitalWrite(LEDRot, HIGH); //schaltet um auf Bereit
digitalWrite(LEDGruen, HIGH);
delay(1500);
}
}
else
{
digitalWrite(LEDRot, LOW); //schaltet um auf Bereit
digitalWrite(LEDGruen, HIGH);
}
}
void Kamera()
{
digitalWrite(Kamera_Pin, HIGH);
delay(5); //Auslöseverzögerung + Reservezeit X (Sony Auslöseverzögerung 100ms) (einmalig)
digitalWrite(Kamera_Pin, LOW);
}
void Tropfen(int ms)
{
digitalWrite(Tropfen_Pin, HIGH);
delay(ms); //Zeit wird im LOOP-Teil definiert
digitalWrite(Tropfen_Pin, LOW);
}
void BlitzSender()
{
digitalWrite(Blitz_Pin, HIGH);
delay(2); //Zeit muss so angepasst werden, das Blitz auslöst (einmalig)
digitalWrite(Blitz_Pin, LOW);
}
void Tropfenlang() //Testtropfen fällt 6x, in der Zeit springt LED Grün auf Rot
{
digitalWrite(LEDGruen, LOW);
digitalWrite(LEDRot, HIGH);
for (int i = 0; i <6; i++)
{
digitalWrite(Tropfen_Pin, HIGH);
delay(Tropfdauer);
digitalWrite(Tropfen_Pin, LOW);
delay(Verweilzeit);
}
}
void Leeren() //leert den Wasservoratsbehälter, solange wie gedrückt wird
{
digitalWrite(LEDGruen, LOW);
digitalWrite(LEDRot, HIGH);
digitalWrite(Tropfen_Pin, HIGH);
delay(750);
digitalWrite(Tropfen_Pin, LOW);
digitalWrite(LEDRot, LOW);
digitalWrite(LEDGruen, HIGH);
}