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)?
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
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?
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?
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);
}
}