Ausgangsspannung variiert

Hallo liebe Leute.

Ich versuche gerade mit zwei Lichtsensoren (TCRT5000) über den analogen Ausgang zwei LED zum leuchten zu bringen. soweit funktioniert es auch!

Problem: an Pin 3 vom Arduino kommen 5 Volt raus wenn der Sensor etwas erkennt, an Pin 8 aber leider nur 2,5 Volt...
habe den Arduino mit einer externen Quelle (9Volt) gespeißt und die Sensoren bekommen von einer externen Quelle die 5 Volt.
Wenn ich im Sketch die Pinnummern änder ist immer das selbe Problem. Der im Sketch als erstes genannte Pin liefert immer die vollen 5 Volt und der zweite Pin nur 2,5 Volt.
kann mir einer Helfen das beide die vollen 5 Volt ausgeben?

LG

int ledPin = 3;
int ledPin1 = 8;
int analogPin = 5;
int analogPin1 = 4;
int val = 0;
void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  val = analogRead(analogPin);
  Serial.print("val = ");
  Serial.print(val);
  if (val > 500) {
    digitalWrite(ledPin, LOW);
}
else {
  digitalWrite(ledPin, HIGH);
  }
  delay (100);
  val = analogRead(analogPin1);
  Serial.print("val = ");
  Serial.print(val);
  if (val > 500) {
    digitalWrite(ledPin1, LOW);
}
else {
  digitalWrite(ledPin1, HIGH);
  }
  delay (100);
}

[quote=

Was für Arduino ist das?
Zeichne mall genau wie und was angeklemmt.

und ledPin1 ???

Der Hinweis hat schon gereicht. Kaum den passenden Fehler im Sketch ausgebügelt, haben beide ihre 5 Volt anliegen!

Danke!

Anschlussfrage:

Was muss ich im Sketch ändern das die Led nicht nur an ist wenn das Signal vom Analogpin kommt sondern bei Signal für sagen wir mal 5 Sec an bleibt?

Ein (software) Mono Flop

Was fehlt?

Ich weiß, darum war ich so knapp.

Wenn Du ein Pin nicht mittels pinMode() als Ausgang definierst ist e ein Eingang.
Dadurch mit

digitalWrite(ledPin1, HIGH);

bzw

digitalWrite(ledPin1, LOW);

schaltest Du nur den internen Pullupwiderstand ein bzw aus.

Zusammen mi einem Hochohmigen Meßgerät mißt Du 2,5V die bei der geringsten Belastung (auch weniger als 1mA) zusammenbrechen.

Grüße Uwe

Das ist ja meine Frage.
Was muss ich im Sketch ändern/anpassen damit die Led nicht nur beim Signal vom TCRT5000 an ist, sondern auch für eine bestimmte Zeit an bleibt obwohl das Signal wieder weg ist?

Wer soll Dir denn helfen, wenn nicht bekannt ist, wie Dein Sketch jetzt aussieht? :thinking:
Du hast ja schon eine Antwort bekommen. Die passt.

Sketch sieht jetzt so aus.

int ledPin = 3;
int ledPin1 = 8;
int analogPin = 5;
int analogPin1 = 4;
int val = 0;
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin1, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  val = analogRead(analogPin);
  Serial.print("val = ");
  Serial.print(val);
  if (val > 500) {
    digitalWrite(ledPin, LOW);
}
else {
  digitalWrite(ledPin, HIGH);
  }
  delay (100);
  val = analogRead(analogPin1);
  Serial.print("val = ");
  Serial.print(val);
  if (val > 500) {
    digitalWrite(ledPin1, LOW);
}
else {
  digitalWrite(ledPin1, HIGH);
  }
  delay (100);
}

Welcher Pin löst aus?
Welcher Pin soll getriggert werden?

Blindflug.

struct TIK
{
  const uint8_t ledPin;
  const uint8_t sensorPin;
  const uint32_t onTime;
  const uint16_t triggerValue;
  uint16_t sensorValue;
  uint32_t startTime;
};

constexpr uint8_t anzahl {2};
TIK tik[anzahl]
{
  {3, A5, 500, 5000, 0, 0},
  {8, A4, 400, 3000, 0, 0},
};


void setup()
{
  Serial.begin(9600);
  Serial.println(F("Start...."));
  for (byte b = 0; b < anzahl; b++)
  {
    pinMode(tik[b].ledPin, OUTPUT);
    digitalWrite(tik[b].ledPin, LOW);
    pinMode(tik[b].sensorPin, INPUT);
  }
}

void loop()
{
  checkSensors();
  setActor();
}

void checkSensors()
{
  for (byte b = 0; b < anzahl; b++)
  {
    tik[b].sensorValue = analogRead(tik[b].sensorPin);
  }
}

void setActor()
{
  for (byte b = 0; b < anzahl; b++)    // durchzählen
  {
    if (!digitalRead(tik[b].ledPin))   // LED ist aus
    {
      if (tik[b].sensorValue > tik[b].triggerValue) // Vergleich 
      {
        digitalWrite(tik[b].ledPin, HIGH);  // 
        tik[b].startTime = millis();        // Startzeit merken
      }
    }
    else if (digitalRead(tik[b].ledPin))    // LED ist an -> Das ist Absicht
    {
      if (millis() - tik[b].startTime > tik[b].onTime) // Zeit ist abgelaufen
      {
        digitalWrite(tik[b].ledPin, LOW);
      }
    }
  }
}

Warum?

Ich würde auch dazu raten einen wert hoch/runterzählen zulassen und dann bei überschreiten erst dann den pin ändern auszulösen.

Ich als Anfänger würde das so umsetzten nicht schön aber einfach verständlich.

int ledPin = 3;
int ledPin1 = 8;
int analogPin = 5;
int analogPin1 = 4;
int timer = 0 ;
int timer2 = 0 ;
int val = 0;
int val2 = 0;
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin1, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  val = analogRead(analogPin);
  Serial.print("ADC Wert an Pin 1 = "); //val 0 ist 0 Volt val 511 ist ca 2,5x Vol und  1023 ist 5 Volt nur mal so
  Serial.println(val);
Serial.println();
  if (val > 500) {
    timer = 0;
    digitalWrite(ledPin, HIGH);
  }
  else
  {
    timer++;
  }
  if (timer > 5000)
  {
    timer = 5000;
    digitalWrite(ledPin, LOW);
  }
  //----------------------------------------
  val2 = analogRead(analogPin1);
   Serial.print("ADC Wert an Pin 2 = ");
  Serial.println(val2);
Serial.println();
  if (val2 > 500) {
    timer2 = 0;
    digitalWrite(ledPin1, HIGH);
  }
  else {
    timer2++;
  }
  if (timer2 > 5000)
  {
    timer2 = 5000;
    digitalWrite(ledPin1, LOW);
  }
}

ob die 5000 in etwa 5 Sek. sind musste mal ausprobieren wenn nicht den wert verändern.
Das ADC auslesen und Serial print braucht halt ein kleinen Moment.
Ich gehe mal davon aus das Serial print nur zum testen trine ist und später rauskommt.

Warum willst du raten, wenn du über millis() eine "genaue" Zeitangabe bekommen kannst?