Fotowiderstand Problem

Hallo Forum,
Wir machen gerade ein Projekt mit dem Arduino.
Dabei verwenden wir einen Fotowiderstand, der die Lichtintensität messen soll. Ist ein bestimmter Wert unterschritten, soll sich ein Servomotor beginnen zu drehen z.B. um 5 Grad. Ansonsten bleibt der Motor so wie er ist. Der Motor soll sich jedoch immer nur um z.B. die 5 Grad drehen und danach sollen erneut die Werte, die der Fotowiderstand liefert, abgerufen werden. Wird der Wert dann wieder unterschritten soll sich der Motor erneut drehen. Wir verwenden in dem Programm dabei das if/else Prinzip. Das Problem liegt darin, dass wenn der Wert unterschritten wird der Motor sich zwar zu drehen beginnt aber nach den 5 Grad dann auch nicht aufhört. Das heißt alle if´s werden zu Beginn einmal aktiviert und dann läuft das Programm einfach durch, ohne anzuhalten und den Sensorwert erneut abzufragen. Erst wenn die gesamte loop einmal durchgelaufen ist, fängt der Sensor wieder an Werte auszulesen.

Über Eure Hilfe wären wir wirklich dankbar! :slight_smile:

Zur Orientierung: Das ist unser bisheriges Programm.

#include <Servo.h>
Servo jia ;
int licht; 

void setup() {
Serial.begin(9600);
jia.attach(12);
}

void loop() {
licht = analogRead(0);
Serial.println(licht);

if (licht < 650) {
 jia.write(0);
 delay(1500);
}
else {
 jia.write(LOW);
}
if (licht < 650) {
 jia.write(5);
 delay(1500);
}
else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(10);
 delay(1500);
}
else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(15);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(20);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(25);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(30);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(35);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(40);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(45);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(50);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(55);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(60);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(65);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(70);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(75);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(80);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(85);
 delay(1500);
}else {
 jia.write(LOW);
}
if (licht < 650) {  
 jia.write(90);
 delay(1500);
}else {
 jia.write(LOW);
}}

Setze doch bitte deinen Sketch in Code-Tags, damit wir den auch gut lesen können.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Code-Tags erledigt.
Danke Uwe.

Edit:

Was soll das sein ?

Ist doch klar, wenn der abgefragte Lichtwert immer gleich ist, läuft der auch überall durch.

Und darauf achten, ob Du mit viel, oder wenig
Licht beginnen möchtest (if Bedingung)
Sonst fährt er mit jedem loop zu und bis zur "Lichtgrenze" wieder auf :wink:

Stefan

Hallo zusammen,

leider wurde unsere Frage falsch verstanden. Das Problem liegt darin, dass der Lichtwert je nach Position des Servomotors und somit auch des Widerstandes schwankt. Deshalb soll immer nach jeder Drehung neu gemessen werden. Ist der Wert höher als die if-Angabe (die immer >650 ist) soll der Motor stehen bleiben. Ist der Wert unterschritten soll der Motor weiter drehen. Jetzt ist die Frage, wie man dies erreichen kann. Momentan ist es noch so, dass der Lichtwert nur einmal am Anfang abgefragt wird und dann das gesamte Programm durchläuft.

Wir bitten um Eure Hilfe!

JIAFFM:
leider wurde unsere Frage falsch verstanden.

Nein, deine Frage haben wir schon verstanden.
Nur du evtl. die Antwort nicht.

Du musst deine Messwerte in den "if-Abfragen" einzeln definieren.

Wenn du einen Wert von 600 misst, dann läuft er komplett durch, da er immer unter 650 liegt.

Könntest du uns bitte ein Beispiel geben, wie das dann aussehen sollte.

Danke

JIAFFM:
Könntest du uns bitte ein Beispiel geben, wie das dann aussehen sollte.

Danke

Das hängt von den gemessenen Werten ab, die im Sketch am analogen Pin lest.
Die Werte kenne ich nicht.

Könnte sein: 1. Wert "<10", 2. Wert "<20" usw.

Gibt es auch eine Möglichkeit, dass der Widerstand auch bei immer gleichbleibender Angabe während der loop mehrmals misst?

JIAFFM:
Gibt es auch eine Möglichkeit, dass der Widerstand auch bei immer gleichbleibender Angabe während der loop mehrmals misst?

Das wird automatisch durch die Loop so ablaufen.

Es sei denn, die Loop ist langsam, weil du sie absichtlich anhältst.

Du kannst auch in einer if-Abfrage einen Wert vorgeben, ab dem er eine Messung akzeptieren soll und dann erst den Servo bewegen muss.

du könntest es z.B. mal so versuchen.
Frage: Was soll passieren wenn der Servo 90° erreicht hat?

#include <Servo.h>
Servo jia ;
int licht, x;

void setup() {
Serial.begin(9600);
jia.attach(12);
}

void loop() {
licht = analogRead(0);
Serial.println(licht);

if (licht < 650) {
 jia.write(x);
 x += 5;
 delay(1500);
}
else {
 x = 0; 
 jia.write(x);
}
}

JIAFFM:
Das ist unser bisheriges Programm.

Wenn ich mir das so anschaue, dann würde ich als erstes alle delay() raus werfen.
Und den Rest als endlichen Automaten ausbilden.

Die Verhaltensvorschrift scheint ja recht einfach zu sein.

ardubu:
Frage: Was soll passieren wenn der Servo 90° erreicht hat?

Der Servo soll sich wieder auf 0° zurückdrehen.

Der Servo soll sich wieder auf 0° zurückdrehen.

dann solltest du vor die if (licht < 650) {noch eine Zeile if (x >90) x =0; einfügen