Pull-Down Widerstand am Schalter

Hallo,
will per Kippschalter meine Funksteckdosen ein/ausschalten... (das Skript dafür habe ich hier ausm Forum.)
Frage:
Lese immer von einem10kOhm Widerstand den man nutzt. Ginge auch ein 9.1kOhm Widerstand? Davon habe ich hier zufällig noch 10 rumliegen. Funktionieren tuts, mich interessiert nur ob die auch langfristig reichen?
Alternativ hätte ich noch 12kOhm

2.Frage:
Kann ich mehrere Schalter über einen WIderstand laufen lassen und sollte jeder einen eigenen bekommen?

Gruß

Ob 9k1 oder 12k ist so ziemlich egal. Alternativ kannst du auch den internen PullUp des Atmega328 aktivieren und sparst die Bauteile. Damit erübrigt sich auch Frage 2. :wink: Bei externen PullUps/PullDowns würde ich jedoch für jeden Schalter oder Taster einen Widerstand vorsehen.

Hi sth77,
in etwa so?:
pinMode(32, INPUT);
digitalWrite(32, HIGH); // turn on pullup resistors
pinMode(34, INPUT);
digitalWrite(34, HIGH);
etc.....

=> Mach ich das dann für jeden digitalen EIngang, an dem ich einen Schalter anlege?
Muss ich dann trotzdem noch die Verbindung zu Ground erstellen und durch den intern PullUp wird das Board dann nicht kurzgeschlossen?

Was ist denn besser/sicherer? Intern oder Extern? Sind immerhin 6-9 Schalter die ich anlege.

Gruß

Dein Programmschnipsel ist soweit richtig: Für jeden angeschlossenen Schalter oder Taster muss der interne PullUp aktiviert werden. Du musst jetzt aber darauf achten, wie du deinen Code aufstellst: Eine Abfrage des Tastendrucks erfolgt nach Low-Level, im ungedrückten Zustand liegt also permanent High an. Und natürlich brauchst du die Verbindung des Schalters zur Masse, der kann ja nicht einfach in der Luft hängen. :wink: Deine Befürchtung, da etwas kurzzuschließen kann ich dir nehmen: Es fließt zwar ein Strom, es ist aber kein Kurzschluss, sondern ein sehr geringer Strom über den PullUp-Widerstand. Dieser wird oft mit 20k angenommen. kannst dir ja mal ausrechnen, wie groß die Stromstärke bei 5V ist. Das Ohmsche Gesetz lässt grüßen...

Ein "besser" und/oder "sicherer" gibt es meines Erachtens bei den Varianten nicht. Einzig die inverse Logik muss bei den internen PullUps (natürlich auch bei externen) beachtet werden.

Grundsätzlich ist der Widerstand, den du benutzt relativ egal. Wenn er kleiner ist, hast du ein stärkeres Signal, verbrauchst aber auch mehr Strom. Je größer er wird, desto weniger Strom verbrauchst du, dafür wird aber dein Signal auch immer schwächer. Irgendwann wird es so schwach, dass es nicht mehr funktioniert.
Die 10k haben sich einfach in der Praxis bewährt, man kann davon aber auch abweichen. Die internen Pullup Widerstände sind ja auch 20k und es geht.

Ich persönlich würde bei unkritischer Versorgung IMMER den internen Pullup verwenden und den Pin dann mit dem Button auf Masse ziehen. Einfach weil man so Bauteile spart.
In einer Anwendung, bei der es auf den Stromverbrauch ankommt, ist es denke ich sinnvoller den Pin mit dem Button hochzuziehen und ansonsten auf Masse zu belassen, weil man so weniger Strom verbraucht.

Zusammenfassend heisst das, dass digital.Read=LOW => SchalterOn(Kreislauf geschlossen) und digital.Read=HIGH => SchalterOff (Kreislauf offen) richtig?
SPiel ich heut abend mal mit rum.

So sollte es stimmen. Auch wenn die Syntax nicht ganz korrekt ist. Aber das bekommt man ja spätestens hin, wenn man die Arduino-IDE meckert. :wink:

sth77:
So sollte es stimmen. Auch wenn die Syntax nicht ganz korrekt ist. Aber das bekommt man ja spätestens hin, wenn man die Arduino-IDE meckert. :wink:

yip-die war auch nur in der eile so dahingehauen :wink: Der Inhalt zählt!

Hallo,
so ganz wills noch nicht klappen, ich schließe den Ardunino immer wieder kurz ohne Widerstand.
Hier zunächst mal der Code:

int ledPin=12;
int buttonPin=32;
int buttonState;   

void setup() {
  pinMode(ledPin, OUTPUT);      
  pinMode(buttonPin, INPUT); 
digitalWrite(buttonPin, HIGH);  
}

void loop(){
  buttonState = digitalRead(buttonPin);
  if (buttonState == LOW) {     
  
    digitalWrite(ledPin, HIGH);  
  } 
  else {

    digitalWrite(ledPin, HIGH); 
  }
}

Muss kann ich diese Verkabelung übernhemen (ohne Widerstand) oder was muss ich ändern?

Gruß

Das sollte eigentlich so klappen. Welche Anzeichen eines Kurzschlusses hast du denn? Kannst du ein Bild deines Schaltungsaufbaus machen und hier einstellen?

if (buttonState == LOW) {     
  
    digitalWrite(ledPin, HIGH);  
  } 
  else {

    digitalWrite(ledPin, HIGH); 
  }

Das ist natürlich Käse. So ist dein ledPin immer HIGH.
Im Else Block musst du den Pin auf LOW setzen.

Mit Kurzschluss meinst du, dass du einfach Pin32 auf Masse verbindest oder? Oder meinst du damit, dass der Arduino nen Kurzen hat und daher die Sicherung fliegt?

hi,
habs auch grad gesehen....
dämlicher fehler :frowning:

Gut aufgepasst, TelosNox! Hab ich gar nicht gesehen...

Funktioniert es denn jetzt, currymuetze?

durch den dummen fehler funktionierte es natürlich nicht also hab ich es jetzt doch mit 10k Widerständen extern verlötet.
Wollte einfach fertig werden und nicht noch mehr fummeln.
Jetzt gehts auf jedenFAll :wink:

Mag ja sein das ich irgendwie was verpasst habe, aber wieso willst du einen Kippschalter mit Pull-Down-Widerstand betreiben und über deinen Arduino steuern?
Es würde doch einfach reichen einen mechanischen Kippschalter (AN/AUS) vor die Funksteckdose geschaltet wird, oder nicht?
Dabei will ich jetzt aber auch gesagt haben das ich in der Elektro-Welt gerade mal 8 Monate dabei bin... :confused:

Hallo mmutantl

Die Funksteckdosen die currymuetze verwendet sind solche mit den den Controllern HX2262 als Sender/Codierer und HX2272 als Empfänger/Decodierer. Da sind 2 Tasten für eine Steckdose vorgesehen; eine zum Einschalten und eine zum Ausschalten.
Die Funksteckdosen verwendet currymuetze aus Sicherheitsgründen und weil er sich die Verkabelung erspart. In einer anderen Diskussion kannst Du das Nachlesen.
http://arduino.cc/forum/index.php/topic,54082.45.html

Die Verwendung der Funksteckdosen finde ich einen eleganten Weg, Verbraucher einfach zu steuern ohne sich die Kabel in einen Schaltkasten zu klemmen und Probleme mit der Gesamtleistung zu haben.

Grüße Uwe

SO, hab jetzt noch mal ne Frage:
Ich habe heute mal meine Schaltung getestet, per Schalter wollte ich meine Dosierpumpe schalten (siehe ParallelThread von mir)
Das Problem ist, dass (nicht immer) häufig wenn ich schalte, die Displayausgabe verrückt spielt.
Ab und dann stürzt die Geschichte dann auch mal ab, sprich ich kann nichts mehr an oder aus schalten.

Hier mal der Code:

#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson
#include <LiquidCrystal.h>
LiquidCrystal lcd(39, 41, 43, 45, 47, 49); 
int buttonPin=46;
int buttonState; 
int lcdmillis=0;
int pumpe1=35;
int pumpe2=33;
int pumpe3=31;
int pumpe4=29;

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(buttonPin, INPUT); 
  pinMode(pumpe1, OUTPUT);
    pinMode(pumpe2, OUTPUT);
      pinMode(pumpe3, OUTPUT);
        pinMode(pumpe4, OUTPUT);
        digitalWrite(pumpe1, HIGH);  
        digitalWrite(pumpe2, LOW);  
        digitalWrite(pumpe3, HIGH);  
        digitalWrite(pumpe4, LOW);  
        digitalWrite(13, HIGH);  
        
 /*

  RTC.stop();
  RTC.set(DS1307_SEC,10);        //set the seconds
  RTC.set(DS1307_MIN,01);     //set the minutes
  RTC.set(DS1307_HR,15);       //set the hours
  RTC.set(DS1307_DOW,4);       //set the day of the week
  RTC.set(DS1307_DATE,25);       //set the date
  RTC.set(DS1307_MTH,6);        //set the month
  RTC.set(DS1307_YR,11);         //set the year
  RTC.start();*/
  lcd.begin(20, 4);

}

void loop()
{
if (millis() - lcdmillis > 1000) {
  lcd.clear();
lcd.setCursor(0,0);
  lcd.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
  lcd.print(":");
  lcd.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
  lcd.print(":");
  lcd.print(RTC.get(DS1307_SEC,false));//read seconds
  lcd.print("  ");                 // some space for a more happy life
  lcd.print(RTC.get(DS1307_DATE,false));//read date
  lcd.print("/");
  lcd.print(RTC.get(DS1307_MTH,false));//read month
  lcd.print("/");
  lcd.print(RTC.get(DS1307_YR,false)); //read year 
  lcdmillis=millis();
}
buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {     
  digitalWrite(13, LOW);
    digitalWrite(pumpe1, LOW);  
  } 
  if (buttonState == HIGH){
digitalWrite(13, HIGH);
    digitalWrite(pumpe1, HIGH); 
  }

}

Idee woran das liegen könnte?
Die Schalter habe ich nich intern sondern extern über nen 10Kohm Widerstand an Ground angeschlossen.
Ich muss dazu sagen, ich habe ne recht große Platine gelötet, auf der ich alle meine Schaltungen integriert habe.
D.h. über eine GND Leitung oder 5v Leitung fließen recht viele verschieden Schaltungen, aber das kann ja nicht das Problem sein oder?

Gruß

Hallo currymuetze,
ich hab ja auch schon mal einen Thread über meine Heizungssteuerung aufgemacht, in dem ich über meine Probleme mit dem LCD-display geschrieben habe. Hab auch immer wieder Abstürze des Displays gehabt, die ich bis heute nicht in den Griff bekommen habe.
Stürzt bei dir die gesamte Schaltung ab oder nur das Display und alles andere geht.
So ist es bei mir, ich hab mir wie folgt geholfen:
Schreib mal dein "lcd.begin(20, 4);" nicht in die void setup sondern am eine beliebige Stelle in die void loop,
z.B wenn du die Schalter abfragst.
Löst das Problem zwar nicht, aber zumindest läuft bei mir alles seit Wochen problemlos und immer wenn ich per Schalter oder Taster
etwas abfrage wird das LCD-Display neu gestartet.
gruß

HI,
zu 95% nur das Display, selten aber leider auch die Steuerung.
gruß