Forum: Mikrocontroller und Digitale Elektronik Arduino, Schwellenwert per Knopfdruck einstellen


von Carsten L. (carsten91)


Lesenswert?

Guten Morgen,
Zuerst einmal ich bin neu hier, heiße Carsten bin 24 und komme aus NRW. 
Auch wenn ich schon früher kleine Schaltungen etc aufgebaut habe, 
beschränken sich meine Mikrocontroller Erfahrungen auf 3 Wochen. D.h ist 
gerade das schreiben von Sketches noch oft nicht ganz so einfach und 
logisch für mich wie es für die meisten hier sein dürfte, d.h bitte ich 
zu entschuldigen wenn meine Frage sehr doof ist :D

Folgendes ist mein Problem.Thema Licht.
Ich löse mit dem Arduino eine Kamera aus, wahlweise per Licht 
(Photowiderstand) oder Ton.
Das klappt auch alles wunderbar, mein großes Problem habe ich allerdings 
beim
Und  zwar liegt der Photowiderstand an A1 an, und im Sketch wird eben 
gesagt
1
int val = analogRead(1); 
2
if (val >500)
... und so weiter, genau hier ist mein Knackpunkt, 500 ist mein 
Schwellenwert für Innen, draußen im Dunkeln brauche ich maximal 100 wenn 
nicht sogar nur 50, um eben sehr feinfühlig und sehr empfindlich 
auslösen zu können.
Nun ist die Frage wie ich also die Empfindlichkeit des Lichtauslößers, 
möglichst einfach verstellbar gestalten kann.
Meine erste Idee war ein Poti zwischen Photowiderstand und A1.
Getestet habe ich 1k, 10k, 100k allerdings kann ich das Poti drehen 
wohin ich will, der wert im Serial Monitor bleibt identisch.

Hat jemand eine Lösung für mich ?
Gibt es z.b die Möglichkeit die Empfindlichkeit stufenweise auf 
Tasterdruck zu verstellen ?
Also z.b Startwert 50
1. drücken = 100
nochmal drücken = 200,
nochmal drücken =  300 und so weiter...

oder gibt es eine andere Möglichkeit das ganze möglichst einfach zu 
gestalten ?
Am PC umstellen, ist zwar drinnen ne nette Lösung, aber spätestens im 
Feldeinsatz sehr unpraktisch.

Ich würde mich sehr freuen wenn mir da jemand helfen kann. Google habe 
ich damit schon gefüttert, leider Ergebnislos, villeicht weil ich auch 
nach den Falschen Begriffen suche.
gruß
Carsten

: Bearbeitet durch User
von chris_ (Gast)


Lesenswert?

Du könntest ein Potentiomenter an einen zweiten analogen Eingang 
anschließen. Dann misst Du dort die Spannung und veränderst den 
Schwellwert mit diesem Wert in der Software.

von Ökoprodukte (Gast)


Lesenswert?

Vollständiges Programm und Hardware.

Die Zeit Deiner Niederschrift, investiert in das Nachdenken über eine 
Lösung wäre schon zielführender gewesen.
Gestalte den Schwellvert als Variable und überlege, wie man diese von 
außen stellbar machen kann.
Im Prinzip tut das Dein "Programm" ja schon.
Porti, Taster, Drehencoder, da gibt es sicher tausende Besipiele.

von U. M. (oeletronika)


Lesenswert?

Hallo,
> Carsten L. schrieb:
> Ich löse mit dem Arduino eine Kamera aus, wahlweise per Licht
> (Photowiderstand) oder Ton.
was heißt das den praktisch?

Soll mit einem Lichtempuls ausgelöst werden oder soll beim 
Unterschreiten oder überschreiten einer bestimmten Helligkeitsschwelle 
ausgelöst werden?
Woher kommt dann das Helligkeitssignal?

Für den ersten Fall braucht man keine Einstellerei. Das sollte man eher 
hardwaremäßig lösen, indem z.B. ein Differenzierglied benutzt und die 
Empfangselektronik so baut, dass sie bei Tag und Nacht funktioniert.

> Nun ist die Frage wie ich also die Empfindlichkeit des Lichtauslößers,
> möglichst einfach verstellbar gestalten kann.
Erkläre mal genauer, was du eigentlich damit bezwecken willst.
Gruß Öletronika

von Dieter S. (Gast)


Lesenswert?

Der einfachste Weg ist einen Schalter einzusetzen, den du auf Low 
abfragst und per Switch/Case die unterschiedlichen Werte des Sensors 
zuordnest.

Beschäftige dich mit den Basics, da wirst du alles dazu finden.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn du nur wissen willst, ob die Spannung des Fotowiderstandes grösser 
oder kleiner als die am Poti eingestellte Spannung ist, kannst du auch 
den Analog Comparator des Mega nehmen (Pins AIN0 und AIN1).

Da du nicht schreibst, welchen Arduino du benutzt, gehe ich mal vom Uno 
aus, der einen Mega328 trägt.

Carsten L. schrieb:
> das schreiben von Sketches noch oft nicht ganz so einfach

Auch Loriot hat mal klein angefangen und es dann bis zur Perfektion 
ausgebaut. Wieso heisst das eigentlich nicht 'Programme', wie bei allen 
anderen Plattformen?

von Carsten L. (carsten91)


Lesenswert?

Danke Schon einmal für eure Antworten.

chris_ schrieb:
> Du könntest ein Potentiomenter an einen zweiten analogen Eingang
> anschließen. Dann misst Du dort die Spannung und veränderst den
> Schwellwert mit diesem Wert in der Software.
Das klinkt interessant, nur nun die Anfänger Frage, hast du ein Beispiel 
dafür, wie ich den Wert vom Poti auslese und den ausgelesen wert nutze 
um die Variabel zu verändern ? Leider bin ich da vollkommen überfragt 
wie ich das Softwaretechnisch zusammen basteln soll

Ökoprodukte schrieb:
> Vollständiges Programm und Hardware.
>
> Die Zeit Deiner Niederschrift, investiert in das Nachdenken über eine
> Lösung wäre schon zielführender gewesen.
> Gestalte den Schwellvert als Variable und überlege, wie man diese von
> außen stellbar machen kann.
> Im Prinzip tut das Dein "Programm" ja schon.
> Porti, Taster, Drehencoder, da gibt es sicher tausende Besipiele.

Darüber habe ich mir wie gesagt Gedanken gemacht, und auch 
Experimentiert, leider habe ich es eben nicht hinbekommen, d.h die 
Frage.

U. M. schrieb:
> was heißt das den praktisch?
>
> Soll mit einem Lichtempuls ausgelöst werden oder soll beim
> Unterschreiten oder überschreiten einer bestimmten Helligkeitsschwelle
> ausgelöst werden?
> Woher kommt dann das Helligkeitssignal?
>
> Für den ersten Fall braucht man keine Einstellerei. Das sollte man eher
> hardwaremäßig lösen, indem z.B. ein Differenzierglied benutzt und die
> Empfangselektronik so baut, dass sie bei Tag und Nacht funktioniert.
>
>> Nun ist die Frage wie ich also die Empfindlichkeit des Lichtauslößers,
>> möglichst einfach verstellbar gestalten kann.
> Erkläre mal genauer, was du eigentlich damit bezwecken willst.
> Gruß Öletronika

Also, z.b soll die Kamera dann Auslösen wenn ein kleiner Feuerball 
entsteht.

Das Signal kommt also z.b von Feuer, einem Streichholz oder auch einem 
anderen Blitz.

Jetzt habe ich ja aber logischerweise verschieden Lichsituationen. Im 
Studio z.b ist es deutlich heller als Nachts draußen, und genau dieses 
Hintergrundlicht will ich mit dieser Schwelle ignorieren.

Im Grund möchte ich also so lange die Empfindlichkeit verstellen bis das 
Umgebungslicht ignoriert wird, so das dann jeder anstieg in der 
Helligkeit zum Umgebungslicht regestriert und zum auslösen genutzt wird. 
Das ganze klappt auch echt gut, allerdings muss ich eben die Variable 
>500 am Pc verstellen, und da suche ich eine Möglichkeit entweder das 
Eingangs signal an A0 regelbar zu machen, oder eben die Variable zu 
verändern.
Also ja, im grunde soll er immer reagieren wenn ein Schwellenwert 
überschritten wird

Dieter S. schrieb:
> Der einfachste Weg ist einen Schalter einzusetzen, den du auf Low
> abfragst und per Switch/Case die unterschiedlichen Werte des Sensors
> zuordnest.
>
> Beschäftige dich mit den Basics, da wirst du alles dazu finden.
Einen Schalter ? wie denn das ? ich hatte kurz an einen 12 Poligen 
Schalter gedacht mit verschieden Widerständen, aber da ich ja auch bei 
einem Poti am Seriell Monitor keinen unterschied an A1 beim drehen 
messe, hab ich das für wenig vielversprechend gehalten.

Leider habe ich in den Grundlagen und Beispielen dazu nichts passendes 
gefunden.


Gruß
Carsten

von JJ (Gast)


Lesenswert?

Zum auslesen eines Poti schau mal hier:
http://funduino.de/index.php/3-programmieren/nr-7-drehregler

von Dieter S. (Gast)


Lesenswert?

Du solltest einfach anfangen und das mit einem Schalter an einem Port
starten und das langsam erweitern. Als Schalter kannst du Dipschalter 
nehmen.
Und wenn das läuft, kannst du es mit einem Taster und Zähler bauen.

von U. M. (oeletronika)


Lesenswert?

Hallo,
> Carsten L. schrieb:
> Das Signal kommt also z.b von Feuer, einem Streichholz oder auch einem
> anderen Blitz.
Aha, also willst du das Hintergrundlicht gar nicht auswerten, sondern 
eigentlich ganz weg haben.

Das macht eben genau eine Schaltung, die nur die schnelle Änderung , 
also den Blitz durchläßt, aber das Gleichlicht eben nicht.

> Jetzt habe ich ja aber logischerweise verschieden Lichsituationen. Im
> Studio z.b ist es deutlich heller als Nachts draußen, und genau dieses
> Hintergrundlicht will ich mit dieser Schwelle ignorieren.
Die Herangehensweise ist suboptimal.

> Im Grund möchte ich also so lange die Empfindlichkeit verstellen bis das
> Umgebungslicht ignoriert wird, so das dann jeder anstieg in der
> Helligkeit zum Umgebungslicht regestriert und zum auslösen genutzt wird.
Das ist eben Fummelei, die du kaum benötigst.

> Also ja, im grunde soll er immer reagieren wenn ein Schwellenwert
> überschritten wird
Nö, es soll eigentlich reagieren, wenn ein rel. schnelles Ereignis 
eintritt sich also etwas reändert. Langsamer Änderungen willst du ja gar 
nicht auswerten.

Mit einer Schaltung nach dem Prinzip wie hier kann man das erreichen:
http://uwiatwerweisswas.schmusekaters.net/Uwi/ELEKTRONIK/Opto_Laser/Fotoverst%e4rker.PDF
Der linke Teil (mit U1A, D1) ist der eigentliche Fotodetektor 
(Transimpedanzverstärker).

Mit R2 kann man die Verstärkung einstellen. C4/C5 unterdücken die 
Schwingneigung der Schaltung. Bei Tageslicht darf die Schaltung noch 
nicht übersteuern. Entsprechend ist R2 nicht zu groß zu machen.
Wie empfindlich das reagiert, hängt dann auch von der Optik ab. Die 
Optik muß ja nicht in die Sonne blicken, sondern sollte in den Bereich 
schauen, wo das der Lichtblitz zu erwarten ist und andere Bereich eher 
ausblenden.

Der  Spannungsteiler R3 + R4 + R5 ist schon etwas spezieller und in den 
meisten Schaltungen zum Transimpedanzverst. nicht zu finden.
Damit kann man Wechsellicht mehr verstärken als das Gleichlicht, weil 
der Spannungsteiler als Hochpass kein Gleichlicht durchlässt.

Im weiteren geht das Signal über das Differenzierglied C6 zum OPV U1B 
weiter. C6 läßt auch kein Gleichsignal durch, so dass U1B nur Änderungen 
der Helligkeit verstärken kann. C7 macht hinten nochmal das gleiche.

Die Grenzfrequenz für die Gleichtlichtunterdrückung kann man durch 
Einstellen der Werte für C5, C6 und C7 und auch durch die Werte R3/R4 
verändern.
Mit dem Poti R7 kann man auch nochmal die Ansprechempfindlichkeit 
festlegen. Wenn die Schaltung zu empfindlich wird, dann reagiert sie 
auch schon auch winzigste Änderungen der Helligkeit.

So kannst du die Emfindlichkeit gegen einen Lichtblitz um das 
tausendfache empfindlicher machen als gegen das Gleichlicht und mußt 
dazu nix umstellen.

Gruß Öletronika

: Bearbeitet durch User
von Harald (Gast)


Lesenswert?

Servus,

Du schreibst: Das klappt auch alles wunderbar.

Dann würde ich das softwaremäßig lösen.
z.b.
Einmalig beim Start, Reset oder auch Knopfdruck

eine variable mit

int umgebungslicht = analogRead(1);

setzen.

dann in deiner Hauptschleife

int val = analogRead(1);
if (val > umgebungslicht + 30)

auf plötzliche Lichterhöhung reagieren.

gruß Harald

von Carsten L. (carsten91)


Lesenswert?

Harald schrieb:
> Servus,
>
> Du schreibst: Das klappt auch alles wunderbar.
>
> Dann würde ich das softwaremäßig lösen.
> z.b.
> Einmalig beim Start, Reset oder auch Knopfdruck
>
> eine variable mit
>
> int umgebungslicht = analogRead(1);
>
> setzen.
>
> dann in deiner Hauptschleife
>
> int val = analogRead(1);
> if (val > umgebungslicht + 30)
>
> auf plötzliche Lichterhöhung reagieren.
>
> gruß Harald

Hallo,
Ich hab das heute mal Versucht, da es sehr schlüssig klingt. Leider 
schein ich was Falsch zu machen.
Denn er lößt dauer aus, ergo ich muss immer noch per hand verstellen, 
als würde er das "umgebungslicht" ignorieren.

1
void loop()
2
//Begin des Lichtprogrammes
3
{ {
4
  int val = analogRead(1); 
5
  if (val > umgebungslicht + 50) 
6
  {
7
  digitalWrite(ledpinlicht,HIGH);
8
  digitalWrite(flashPin,HIGH); 
9
  Serial.println(val); 
10
  }
11
  else
12
  {
13
    digitalWrite(ledpinlicht,LOW); 
14
    digitalWrite(flashPin,LOW);

Natürlich steht vor dem Setup :
1
 int umgebungslicht = analogRead(1);
Jemand eine Idee warum er das ignoriert ?
Gruß
Carsten

: Bearbeitet durch User
von Powerbank (Gast)


Lesenswert?

Deklariere die Variable außerhalb der geschweiften Klammern. Und im 
setup setzt du umgebunglicht, so wie du es gemacht hast,  ohne int 
vorne.

int umgebungslicht
Muss vor allem außerhalb der geschweiften klammer stehen.

von Loddaar (Gast)


Lesenswert?

Powerbank schrieb:
> int umgebungslicht
> Muss vor allem außerhalb der geschweiften klammer stehen.

da wird es auch stehen sonst lässt sich das Programm nicht kompilieren
(wenn es denn der wirkliche Quelltext ist)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.