Input zu ouput? Resultat aus Spannungsinput.

Guten Abend, ich habe eben von meinem Lehrer ein Arduino Uno ausgeliehen bekommen , und ich hab auch eigentlich genaue Pläne, ich weiß allerdings nicht wie man das umsetzen kann. Ich möchte das eine LED angeht , wenn ein Wecker klingelt, Das ist ein bisschen verwirrent. Ich möchte das "Ding" was im Wecker klingelt , abklemmen , und die Kabel am Arduino anschließen. Aber ich glaube es funktioniert nicht. Ist es Möglich , dass ein Pinn erkennt , wann er strom bekommt? Inputs funktionieren ja eigentlich so , dass ein Stromkreis herrschen muss , gibt es denn eine Möglichkeit , es so zu regeln , dass wenn der Wecker klingeln würde , der Arduino es als Input erkennt? Ich hoffe ihr versteht was ich meine , und könnt mir helfen.

lg. Findo1

Soll der Wecker dann noch klingeln? Wenn ja, nehm einen Sound Detector. Dann musste nicht am Wecker rumbasteln.

Du solltest dir zuerst ein paar Grundlagen aneigenen. Nicht nur das Programmieren sondern auch Verständnis in Elektrotechnik.

Für dein Projekt reicht es vermutlich nicht, einfach alles zusammen anzuklemmen. Da macht es schon Sinn, das Signal des Weckers mit einem Optokoppler (zB. 4N35) abzugreifen. Widerstand vom Wecker zum 4N35 muss anhand der Versorgungsspannung errechnet werden.

Der Programmablauf ist relativ simple, jedoch sollte man sich mit der IDE und vorallem mit dem Code vorher auseinandergesetzt haben. Vorallen millis().

An sich ließt du später mit dem Arduino, ob an dem Eingang der Zustand von LOW auf HIGH gewechselt ist. Da der Summer des Weckers gepulst ist für die Tonlage, wird es nötig sein, sich einen Merker zu setzen für die Lampen. Erst wenn nach x-Sekunden keine Zustandsänderung mehr erfolgt ist, kann das Licht wieder ausgeschaltet werden.

Findo1: Ist es Möglich , dass ein Pinn erkennt , wann er strom bekommt? Inputs funktionieren ja eigentlich so , dass ein Stromkreis herrschen muss , gibt es denn eine Möglichkeit , es so zu regeln , dass wenn der Wecker klingeln würde , der Arduino es als Input erkennt?

Möglich ist vieles.

Wie wird denn der Wecker mit Strom versorgt? Ist das ein batteriebetriebener Wecker? Z.B. mit 2x 1,5V Batterie in Reihe geschaltet = 3 Volt Betriebsspannung? Wieviel Volt kannst Du mit einem Multimeter an der "Klingel" des Weckers messen, wenn er klingelt?

Es ist ein handelsüblicher Wecker , mit 3 AAA-Baterien , also 4,5 V. Die Ausgangsspannung hab ich noch nicht nachgemessen.

Findo1: Es ist ein handelsüblicher Wecker , mit 3 AAA-Baterien , also 4,5 V. Die Ausgangsspannung hab ich noch nicht nachgemessen.

Bei einem Wecker mit 4,5 V hast Du gute Chancen, dass auch an einem Digitaleingang des Arduino-Boards ein "HIGH" erkannt wird. Digitaleingänge erkennen ab ca. 3V einen High-Pegel.

Bei fast leeren Batterien (1,0V) im Wecker könnte es allerdings knapp werden, denn die Spannung an der "Klingel" dürfte einige Zehntel niedriger liegen als die Batteriespannung im Batteriefach des Weckers.

In dem Fall müßtest Du an der Weckerklingel eine analoge Spannungsmessung machen und einen Analogeingang verwenden.

Als Schaltung sollte funktionieren (ohne Garantie): - GND vom Arduino mit Minuspol im Wecker-Batteriefach verbinden - Plusseite der Wecker-Klingel mit Digital- oder Analogeingang am Arduino verbinden

Als Schaltung sollte funktionieren (ohne Garantie): - GND vom Arduino mit Minuspol im Wecker-Batteriefach verbinden - Plusseite der Wecker-Klingel mit Digital- oder Analogeingang am Arduino verbinden

Das kling doch schonmal vielversprechend. Hast du vllt auch ein Codebeispiel , wie man dann testen kann ob es "high" ist. Ich habe mich bis jetzt nicht sehr viel mit den Inputs beschäftigt, Aber vielen Dank schonmal

Ich habe nun das hier gefunden : http://my.safaribooksonline.com/book/hardware/arduino/9783868999235/5dot-einfacher-digitaler-und-analoger-input/id655347

Der Serial Monitor zeigt mir , wenn keine Batterie (bzw später die Uhr) angeschlossen ist , um die 1,3 Volt an. Nun möchte ich Abfragen , das eine LED an Pin 13 , dann Leuten soll , wenn die Voltzahl (in dem Fall die Variable volts) , über 1.5 geht. Scheint mit einer ganz normalen If abfrage nicht zu klappen : if(volts > 1.5){ }

Findo1: Das kling doch schonmal vielversprechend. Hast du vllt auch ein Codebeispiel , wie man dann testen kann ob es "high" ist. Ich habe mich bis jetzt nicht sehr viel mit den Inputs beschäftigt,

Ich glaube, Du hast Dich noch überhaupt nicht mit dem Arduino beschäftigt. Das müßtest Du dringend mal nachholen.

Abfrage digital mit Klingel an D8 Pin:

#define KLINGEL 8  // Klingel an Pin-8
#define LED 13     // UNO hat eine Board-LED an Pin-13
void setup() {
  pinMode(KLINGEL,INPUT);  // KLINGEL als INPUT setzen
  pinMode(LED,OUTPUT);     // LED als OUTPUT setzen
}

void loop() {
  if (digitalRead(KLINGEL)==HIGH)
    digitalWrite(LED,HIGH);
  else  
    digitalWrite(LED,LOW);
}

Abfrage analog mit Klingel an A0 Pin:

#define KLINGEL A0  // Klingel an Analogeingang A0
#define LED 13     // UNO hat eine Board-LED an Pin-13
void setup() {
  pinMode(KLINGEL,INPUT);  // KLINGEL als INPUT setzen
  pinMode(LED,OUTPUT);     // LED als OUTPUT setzen
}

void loop() {
  if (analogRead(KLINGEL)>250)
    digitalWrite(LED,HIGH);
  else  
    digitalWrite(LED,LOW);
}

Die "Klingel" muss dazu am Wecker nicht ausgebaut oder abgelötet werden, sondern kann weiterhin eingebaut und angeschlossen bleiben. Du müßtest aber mit einem Multimeter herausbekommen, welches die "Plus" Seite der Klingel ist, denn dort muß der Arduino-Eingang angeschlossen werden. Eventuell kann man auch direkt sehen, ob die Minusseite der Klingel irgendwo direkt an Minus (Ground, GND, Masse) angeschlossen ist, dann ist die andere Seite der Pluspol. Im Notfall kannst Du es ausprobieren: Da Du den Anschluss an einem INPUT am Arduino vornimmst, darf der Pegel zwischen 0V und 5V sein, ohne dass ein Kurzschluss entsteht.

Eine extra LED brauchst Du nicht anschließen, die beiden Beispiele arbeiten mit der Board-LED an Pin-13. Wenn Du nicht weißt, wo die auf dem Arduino-Board ist, lade Dir das "Blink" Beispielprogramm drauf und lasse sie testweise blinken.

Der Unterschied zwischen beiden Programmen ist: Mit der digitalRead-Abfrage wird abgefragt, ob der Pin HIGH gesetzt ist. Das ist üblicherweise bei einer Spannung zwischen 3 und 5 Volt zuverlässig der Fall, ggf. auch mit etwas niedrigerer Spannung.

Beim anderen Programm mit der analogRead-Abfrage wird die Spannung am Pin abgelesen, und zwar in 1024 Stufen zwischen 0 und 5V. D.h. ein analogRead von 0 entspricht 0.0 Volt und ein Wert von 1023 entspricht der Betriebsspannung des Arduino, die ca. 5,0 Volt beträgt. Die Abfrage: if (analogRead(KLINGEL)>250) fragt also daraufhin ab, ob der Messwert größer als 250 ist, entsprechend ca. 5V *250/1023= 1,2 Volt. Das zweite Programm würde die Board-LED also bereits einschalten, wenn mehr als ca. 1.2 Volt an der Klingel anliegen.

Findo1: Nun möchte ich Abfragen , das eine LED an Pin 13 , dann Leuten soll , wenn die Voltzahl (in dem Fall die Variable volts) , über 1.5 geht. Scheint mit einer ganz normalen If abfrage nicht zu klappen : if(volts > 1.5){ }

Wenn Du irgendwelche Fragen hast: Erkläre genau, was das Problem ist UND POSTE DEN CODE! So kann man nur raten. Ich rate mal: Du hast den LED-Pin in der setup() -Funktion nicht auf OUTPUT gesetzt, und daher leuchtet die LED nicht, wenn Du den LED-Pin auf HIGH setzt?

Vielen Danke! , Das klappt perfekt, Ich habe jetzt ein wenig weiter daran gearbeitet.
Ich habe es nun so gemacht , das LED dauerhaft leuchtet , auch wenn der wecker nicht mehr klingelt , bzw keine Spannung mehr am Input ankommt, Ich möchte , dass die LEs erst ausgeht , wenn man einen Knopf drückt , bzw die Spannung in einem anderen Input auch wieder HIGH ist.

Ich habe bis jetzt das :

int KLINGEL = A0;  // Klingel an Analogeingang A0
int SCHALTER = A5;
int LED = 8;     // UNO hat eine Board-LED an Pin-13
int mod = 0;


void setup() {
  pinMode(KLINGEL,INPUT);  // KLINGEL als INPUT setzen
  pinMode(SCHALTER,INPUT);  // KLINGEL als INPUT setzen
  pinMode(LED,OUTPUT);     // LED als OUTPUT setzen
}

void loop() {
if (analogRead(KLINGEL)>500){
mod = 1;
}else  { }
     
if (mod == 1){
  digitalWrite(LED,HIGH);
}else { 
 digitalWrite(LED,LOW);
}
   
   
    
}

Deine Variable mod ist eigentlich unnötig, stört aber auch nicht weiter. Du fragst jetzt in der Loop einfach noch den Taster mit ab und setzt wenn gedrückt dann mod wieder auf 0.

Wie bei allen Inputs sollten die nicht offen sein, also schalte den Taster gegen GND und aktiviere für den Schalterinput den eingebauten Pullup-Widerstand.

Findo1: Vielen Danke! , Das klappt perfekt, Ich habe jetzt ein wenig weiter daran gearbeitet. Ich habe es nun so gemacht , das LED dauerhaft leuchtet , auch wenn der wecker nicht mehr klingelt , bzw keine Spannung mehr am Input ankommt, Ich möchte , dass die LEs erst ausgeht , wenn man einen Knopf drückt , bzw die Spannung in einem anderen Input auch wieder HIGH ist.

Mit "Knopf" meinst Du jetzt aber nicht den Abschaltknopf am Wecker, sondern einen eigenen Schalter?

Zum Abfragen von Schaltern gibt es im Playground ein Button-Beispiel.

Zum Anschließen von Schaltern gibt es im wesentlichen zwei Grundschaltungen: - Schalter mit externem PullDown-Widerstand - Schalter mit internem PullUp-Widerstand

Schalter, die Du mit einer Digitalschaltung abfragen möchtest, dürfen keine "offenen" (nicht angeschlossenen") Enden haben, und zwar weder im betätigten noch im unbetätigten Zustand. "Offene" Eingänge sind schwebend und können beliebige Werte annehmen, die PullWiderstände sorgen für einen definierten Pegel, wenn der Schalter unbetätigt ist.

Hast Du Dir schon überlegt, ob Du Deinen Schalter mit PullDown-Widerstand anschließen möchtest, benötigtes Material ein Schalter und ein 4.7K Widerstand? Oder ob Du die im Arduino vorhandenen PullUp-Widerstände nutzen möchtest, benötigtes Material nur der Schalter?