Frage zur Beschaltung- Ein Pin belegt, alle Eingänge auf High

Hallo Community,

nachdem die Trockenversuche vorher recht gut funktioniert haben, kann ich gerade nicht ganz nachvollziehen, was mein Arduino macht.
Folgende Ausgangssituation:
Am Arduino sind die Eingänge A0 und A1 mit einem Signal zwischen 0 und 5V beschaltet.
An den Ausgängen D5 und D11 hängt je ein Mosfet. D5 gibt ein PWM Signal aus, D11 High/Low.

Das Signal am Eingang A0 entsteht durch einen Optokoppler, welcher das HDD Signal vom Computer bekommt und dann eine 5V Leitung schalten soll. (Scheint soweit auch zu funktionieren, auch wenn der Koppler bei 20mA nicht komplett durchschaltet - ich nehme an, dass das Board 20mA liefert)

Das Signal am Eingang A1 kommt von einem Rain-Sensor - ein Spanngungswert von 0 bis 5V in Abhängigkeit des gemessenen Widerstands der Detektorplatte. (Funktioniert für sich alleine auch problemlos).

Nun schaue ich mir im Serial Monitor die Eingänge an und stelle fest, dass sobald die 5V vom Rain Sensor an A1 anliegen, alle anderen Eingangänge ebenfalls zwischen 900 und 1023 liegen. Berühre ich einen benachbarten Pin, sinken alle Eingänge ohne Signal wieder auf einen Low Wert.
Ziehe ich den Stecker von A1 ab, ist auch alles wieder auf Low bzw. läuft in die Richtung.

Findet jemand einen Fehler in meiner Schaltung, der den globalen High-Level verursachen könnte?
Könnte ich das HDD Signal auch direkt auf A0 geben (es hängt alles an der gleichen Stromquelle / PC-NT)?

Vielen Dank im Voraus
Gruß
LJ

Du bringst da analog und digital durcheinander. Wenn du nur ein High/Low Signal hast, wieso misst du dann analog?

Der Ausgang des Optokopplers ist keine Diode, sondern ein Transistor. Der normal in einer Emitterschaltung betrieben wird. Du musst den internen Pullup des Eingangs aktivieren. Dann ist der Eingang normal High und wenn der Optokoppler schaltet wird er Low.

Also Optokoppler-Emitter auf Masse. Kollektor auf den Eingang. Dann per pinMode() INPUT_PULLUP aktivieren und mit digitalRead() abfragen

So:
http://www.siongboon.com/projects/2006-06-19_switch/opto-coupler.gif
Nur dass du am Ausgang 5V hast und der Widerstand bei dir intern im Prozessor ist. Du kannst auch einen externen Pullup nehmen und INPUT verwenden

Zum Schalten reichen übrigens schon 1-10mA. Vorwiderstand an der LED nicht vergessen

Hallo,

vielen Dank für die schnelle Antwort. Ich lesen beim Rain Sensor analog, da es ein variabler Spannungslevel ist und beim Optokoppler-Signal bin ich auf Analog gegangen, da ich vermutete, dass nicht ganz durchgeschaltet wird und daher vlt. kein High-Level zu Stande kommt.

Bei der derzeitigen Beschaltung bin ich nach dem Datenblatt gegangen (siehe Anhang), nur dass ich IF durchs MB vorgegeben wird (vermutlich 20mA) und da die Eingänge des Arduino hochohmig sein sollten (richtig?) habe ich mir den 1kOhm ebenfalls geschenkt. Der Kontakt unten rechts geht auf A0.

Hmm, den Optokoppler wie von Dir beschrieben zu beschalten macht Sinn, aber dürfte vom Platz her gerade nur schwierig umsetzbar zu sein. Wäre es alternativ möglich das HDD Sig. direkt auf den Arduino zu leiten (sollten ja auch nicht mehr als 5V sein)

Vom Optokoppler mal abgesehen, ist das Überstrahlen des High-Levels von A1 irgendwie zu erklären - oder habe ich mir den kleinen schon zerschossen?

Screenshot from 2016-06-26 20:07:37.png

Vom Optokoppler mal abgesehen, ist das Überstrahlen des High-Levels von A1 irgendwie zu erklären - oder habe ich mir den kleinen schon zerschossen?

da die Eingänge des Arduino sehr hochohmig sind, floaten sie sehr stark.
Wenn du ein definiertes Signal brauchst, verwende einen Pullup- Pudown Widerstand. Du hast deinen "kleinen" nicht zerschossen.

Ok, der Regensensor ist analog (auch wenn im Bild 5V/0V steht). Aber der HDD Sensor ist doch digital oder? Wenn du da keinen Pullup verwendest brauchst du dich nicht zu wundern, dass du da was wirres misst und eventuell der benachbarte Kanal reinspukt.

Mehr Platz braucht das nicht. Du musst nur den Optokoppler richtig anschließen. Emitter auf Masse und Kollektor auf A0. Für den Pullup-Widerstand kann man wie gesagt den internen des Prozessors verwenden.

ok, verstehe ich das richtig, dass ein Pulldown dann z.B. ein 1K Widerstand ist, der den Eingang auf Masse zurück führt und so die Ladung schneller abtransportiert?

Ist das Floating vergleichbar mit dem Übersprechen eines überbelichteten CCD-Sensors? Hilft dann ein Widerstand, um den Stromfluss auf den Eingang zu reduzieren? Ohne nennenswerten Strom, dürfte dann doch auch keine Spannung am Widerstand abfallen. Wie groß müsste der Widerstand ausfallen?

Das Hauptproblem mit dem Optokoppler ist, dass er auf der Rückseite der Platine verbaut ist ... Naja, habe zum Glück noch einen davon und das Ganze nun auf eine kleine Platine gelötet. Test folgt gleich.

Du braucht hier einen Pullup-Widerstand. Der dient dazu dass der Eingang einen definierten Pegel hat. "Floating" heißt dass der Eingang offen ist und dadurch einen mehr oder weniger beliebigen Wert hat. Durch den Pullup liegt der Eingang fest auf +5V. Wenn der Transistor durchschaltet auf Masse.

Am besten sieht man es bei mechanischen Tastern:

Ohne Pullup wäre das Potential am Eingang bei geöffnetem Taster undefiniert. Ersetze den Taster durch einen Transistor und du hast das gleiche.

Die Arduino Pins haben alle intern relativ hochohmige Pullups, die man durch pinMode(..., INPUT_PULLUP) aktivieren kann

Vorhin hat es mal kurz funktioniert, allerdings musste ich analog auslesen - der Optokoppler hatte den Eingang auf Masse (0) gezogen, ohne Signal pendelte sich der Wert um 300 ein.
Nach einem Neustart pendelt sich der Wert nun um 350 ein, auch ein direktes Verbinden des Eingangs mit Masse ändert nichts.

// For LED FADE
	int led = 5;    // LED1 connected to analog pin 5 - 5 and 6 have 980Hz
	int hdd = 1;   // hdd input on pin A1
	int fadeValue = 100;  //dimmed flash at startup


void setup() {
	//For LED FADE
  		//pinMode(led, OUTPUT);     // no pinmode for analog write necessary
  		pinMode(hdd, INPUT_PULLUP);      	// sets the pin 1 as input
 
        // For Serial Debugging output
               Serial.begin(9600);  
}

void loop() {
	//For LED FADE ---------------------------------------------------------------

Serial.println(analogRead(A1));

   if (analogRead(hdd)<80) {
        if  (fadeValue<=250) fadeValue +=2;
	analogWrite(led, fadeValue);
	delay(10); 		
        digitalRead(hdd);
   }

   if (analogRead(hdd)>=120) {
	if (fadeValue>=2) fadeValue -=2;
	analogWrite(led, fadeValue);

        if (fadeValue >=16)delay(30);
        if (fadeValue<16 && fadeValue >=0)delay(40);
   }
}

EDIT:
Wenn ich den Eingang direkt am Arduino auf Masse brücke, geht der Wert wieder auf 0 - scheint wohl ein Kabelbruch bzw. schlecht gecrimpter Stecker zu sein.
Der Pullup geht zwar nicht auf 5V aber immerhin geht der Pegel auf 0V. Das Problem mit der HDD-LED sollte somit wohl gelöst sein.

Den Rain-Sensor werde ich mir morgen nochmal ansehen. Solange alles OK ist, liefert dieser einen 5V Pegel. Sollte ich dann einen Pulldown auf Masse legen? Können die 5V auf A0 weiterhin mit A1 interferieren?

int hdd = 1; // hdd input on pin A1

Pin 1 ist nicht Pin A1
Pin 0 und 1 werden für RX und TX verwendet und sollten nicht unbedingt für den Sketch verwendet werden

if (analogRead(hdd)<80) {

if (analogRead(hdd)>=120) {

kann man am pin 1 nicht verwenden, nur digitalRead

Ah... da habe ich mich wohl mit der Anschlussnomenklatur etwas versehen.
Vielen Dank für den Hinweis, nun funktioniert alles.

// For LED FADE
	int led = 5;    // LED1 connected to analog pin 5 - 5 and 6 have 980Hz
	int hdd = A1;   // hdd input on pin A1 / schwarzes Kabel
	int fadeValue = 100;  //dimmed flash at startup


// For Leakage Sensor      
        int water_sens = A0;    //water sensor on A0 /gruenes Kabel
	int buzzer = 11;           // buzzer connected to digital pin 11


void setup() {
	//For LED FADE
  		pinMode(hdd, INPUT_PULLUP); 
	// For Leakage Sensor
                pinMode(water_sens, INPUT);
		pinMode(buzzer, OUTPUT);

        // For Serial Debugging output
               Serial.begin(9600);  
}

void loop() {
	//For LED FADE ---------------------------------------------------------------

   if (analogRead(hdd)<1000) {
        while  (fadeValue<=120) {fadeValue +=2;
	  analogWrite(led, fadeValue);
	  delay(15); 
        }
   }     
   if (analogRead(hdd)<500) {
        while  (fadeValue<=252) {fadeValue +=2;
	   analogWrite(led, fadeValue);
	   delay(10); 
        }
     }

   if (analogRead(hdd)>=1000) {
	while (fadeValue>=120) {fadeValue -=2;
	analogWrite(led, fadeValue);
        delay(25);
        }
     }
     
   if (analogRead(hdd)>=1000) {
	while (fadeValue>=2) {fadeValue -=2;
	analogWrite(led, fadeValue);
        if (fadeValue >=15)delay(25);
        if (fadeValue<15 && fadeValue >=0)delay(30);
        }
     }


// For Leakage Sensor ------------------------------------------------------

        if (analogRead(A0)<500){
            delay(100);
            if (analogRead(A0)<500) digitalWrite(buzzer, 1);
            Serial.println("LEAK");
        }
        
        if (analogRead(A0)>500){
            digitalWrite(buzzer, 0);
        }
}

ardubu:

if (analogRead(hdd)<80) {

if (analogRead(hdd)>=120) {


kann man am pin 1 nicht verwenden, nur digitalRead

analogRead versteht sowohl A1 als auch 1 (bzw Ax und x).

Bei pinMode, digitalRead oder digitalWrite beziehen sich Ax und x auf verschiedene Pins.