PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Leonardo+Ultraschall SRF02 -ein Codeproblem??



Jaffi
20.09.2013, 12:59
Hallo liebes Forum,

aus voller Verzweiflung und mit der grossen Hoffnung das mir Profis wie Ihr es seid weiterhelfen können, habe ich mich nun hier angemeldet und hoffe Ihr könnt mir helfen.. :(
Ich befasse mich erst seit kurzem mit dem Thema Elektronik und Mikrocontrollern. Programmiert habe ich zwar schon einige Kleinigkeiten, aber auch hier würde ich mich als Einsteiger bezeichnen.

Ich bin in der Versuchs-, bzw. Anfangsphase, ein kleines Wegleitsystem aufzubauen. Ich nutze bisher dafür ein Arduino Leonardo mit zwei Ultraschallsensoren SRF 02, einem LDR und drei LED´s (Kanal 1, 2, 3) um
mir das erfolgreiche Auslösen der Sensoren anzeigen zu lassen.
Folgendes soll vorerst einmal passieren:

Sensor Links löst aus und die LED´s sollen in entsprechender Reihenfolge angehen. Der Sonsor rechts ist jetzt nur noch für das Ausschalten zuständig. D.h. wenn er auslöst wird geprüft ob die LED´s schon an sind.
Ist dies der Fall, wird in entsprechender Reihenfolge ausgeschaltet.
Das ganze soll natürlich in anderer Richtung laufen, wenn der Sensor rechts als erstes ausgelöst hat.

Der u.s. Code funktioniert eigentlich auch FAST..mit einem kleinen Haken, der aber eine grosse Wirkung hat: Das ganze ist bisher Unbrauchbar !! :)
Denn wie hat schon mein alter Physikleher immer gesagt: "Computer machen nicht das was du willst, sondern nur das was du ihnen sagst" :p

Was habe ich dem Controller also gesagt:

Löst der linke Sensor aus, gehen die LED´s brav an und ein weiteres Auslösen ist nicht mehr möglich. Löst nun der rechte Sensor aus, gehen die LED´s auch brav wieder aus so wie es sein soll, alles wunderbar!
ABER: gleich nachdem die LED´s ausgegangen sind, schalten sie wieder ein als ob der rechte Sensor als erstes ausgelöst hat. Andersherum natürlich genauso..

Ich nehme an, dass ich irgendeinen Denkfehler mit der Variable "Status" habe. Denn diese wird ja beim Ausschalten nach dem Auslösen des "Ausschaltsensors" wieder auf NULL gesetzt.
Ich habe den Eindruck, dass der jeweilige Sensorwert nach dem Ausschalten nun wieder mit an den Anfang des Sketches genommen wird. Und da der STATUS dort ja während der Abfrage wieder NULL ist, schaltet er eben wieder ein.
Dies kann aber meines Verständnisses nach garnicht sein, da doch der Sensorwert am Anfang des Sketches wieder neu eingelesen wird, oder nicht?
Ich habe auch mal testweise versucht den Sensorwert nach dem Aufruf
Status = 0; mit
SensorLinks = ' '; zu löschen. Das half auch nichts.

Desweiteren habe ich nach dem Einschalten der LED´s mal den LDR beleuchtet und siehe da: Löse ich dann den "Ausschaltsensor" aus, gehen die LED´s aus und bleiben es auch, da die Abfrage bezgl. der Helligkeit NICHT wahr ist.
Es muss also irgendwie an der "Einschaltabfrage" und an der Status-Variable liegen denke ich!!??

Könnt Ihr bitte mal drüber schauen und mir einen Tip geben wo ich was falsch mache?? Ich bin seit zwei Nächten echt am verzweifeln...

Tausend mal Danke im voraus!!!


#include "Wire.h"
#include "SRF02.h"

SRF02 Sensor[2] =
{
SRF02(0x70, SRF02_CENTIMETERS),
SRF02(0x71, SRF02_CENTIMETERS)
};


unsigned long laufzeit = 0;
int Pause = 750;
int SensorRechts = 0;
int SensorLinks = 0;
int Status = 0;
int LDRWert = 0;

int MindHell = 600;
int DurchgRechts = 40;
int DurchgLinks = 80;
int Brenndauer = 25;

int Kanal_1 = 9;
int Kanal_2 = 10;
int Kanal_3 = 11;
int LDRPin = 0;

void setup()
{
Serial.begin(9600);
Wire.begin();
SRF02::setInterval(200);
}

void loop()
{
SRF02::update();
SensorRechts=Sensor[0].read();
SensorLinks=Sensor[1].read();
LDRWert = analogRead(LDRPin);

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++
if ( (SensorRechts <= DurchgRechts) && (SensorRechts > 0) && (Status == 0) && (LDRWert < MindHell) )
{
laufzeit = millis (); // 1
for (int i=0; i<=255; i+=5)
{
analogWrite(Kanal_1, i);
delay(5);
}
Status = 1 ;
}

if ( (millis() > (laufzeit + Pause)) && (Status == 1) )
{
for (int i=0; i<=255; i+=5) // 2
{
analogWrite(Kanal_2, i);
delay(5);
}
Status = 2;
}

if ( (millis() > (laufzeit + Pause * 2 )) && (Status == 2) )
{
for (int i=0; i<=255; i+=5) // 3
{
analogWrite(Kanal_3, i);
delay(5);
}
Status = 3;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++
if ( (SensorLinks <= DurchgLinks) && (SensorLinks > 0) && (Status == 0) && (LDRWert < MindHell) )
{
laufzeit = millis (); // 1
for (int i=0; i<=255; i+=5)
{
analogWrite(Kanal_3, i);
delay(5);
}
Status = 11 ;
}

if ( (millis() > (laufzeit + Pause)) && (Status == 11) )
{
for (int i=0; i<=255; i+=5) // 2
{
analogWrite(Kanal_2, i);
delay(5);
}
Status = 12;
}

if ( (millis() > (laufzeit + Pause * 2 )) && (Status == 12) )
{
for (int i=0; i<=255; i+=5) // 3
{
analogWrite(Kanal_1, i);
delay(5);
}
Status = 13;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++


//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++
if ( (Status == 3) && (SensorLinks>0) && (SensorLinks < DurchgLinks) )
{
for (int i=255; i>=0; i-=5)
{
analogWrite(Kanal_1, i);
analogWrite(Kanal_2, i);
analogWrite(Kanal_3, i);
delay(10);
}
Status = 0;


}
//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++
if ( (Status == 13) && (SensorRechts>0) && (SensorRechts < DurchgRechts) )
{
for (int i=255; i>=0; i-=5)
{
analogWrite(Kanal_1, i);
analogWrite(Kanal_2, i);
analogWrite(Kanal_3, i);
delay(10);
}
Status = 0;


}
//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++
}