analogRead Werte bei externer Spannung ändern sich

Hallo,

ich habe einen Arduino Micro bei dem alle Digital Pins belegt sind. Da ich aber einen simplen Schalter benötige, versuche ich diesen über analogRead (A0) zu realisieren.
Dazu habe ich den 5V Ausgang des Arduino auf einen Schalter gelegt und das andere Ende an A0 mit einem 10kOhm Pulldown an Masse.

analogRead zeigt mir im Serial Monitor ca. 280 als Wert bei offenem Schalter und ca. 320 bei geschlossenem Schalter, wenn der Arduino über USB betrieben wird.

Wenn ich nun aber den Micro über 12V extern betreibe, dann nähern sich diese Werte immer 300 an, egal was der Schalter macht. Es dauert ca. 3 Sekunden, dann sinkt der Wert bei geschlossenem Schalter von 320 auf 300 und ebenso bei offenem Schalter von 280 auf 300.

Wo darf ich also meinen Fehler vermuten?

Benutze A0 als Digitalpin.

Wo darf ich also meinen Fehler vermuten?

Natürlich in der Schaltung.
Dein Prosa ist da nicht hilfreich.

im Code sieht es so aus. Der Pin A0 als Schalter soll if/else schalten.

int swpin = A0;

void setup(){
pinMode(swpin, INPUT);
}

void loop(){
if (digitalRead(swpin)=HIGH){

macht er aber nicht. Er ist immer HIGH. Im Serial Montior steht nur "22".
Prosafrei.

= <> ==

if (digitalRead(swpin)=**=**HIGH){

Desweiteren muss A0 bei geschlossenem Schalter 1023 ausgeben. Wenn nicht, ist schaltungstechnisch was falsch

Schalter sollte man zwischen Eingang und Gnd legen, und dann am Eingang den internen Pullup oder einen externen (kleineren) nach Vcc verwenden.

Eine Analogmessung ist zwar schön zum Finden von Schaltungsfehlern, aber ein Schalter kann ja nur digital ein/aus sein.

Und sollte es nicht heißen = != ==? :wink:

Ich halte jeden Vergleich eines boolschen Wertes für falsch, auch wenn sowas vielfach zu finden ist. Wer sowas macht, hat boolsche Werte und Algebra nicht wirklich verstanden.

Zudem sollte es sich eigentlich auch zu den Schreibern des Styleguides rumgesprochen haben, daß bei Vergleichen in C die Konstanten für == auf der linken Seite stehen sollten, dann meckert nämlich schon der Compiler, wenn man versehentlich = statt == geschrieben hat.

ElEspanol:
= <> ==

if (digitalRead(swpin)=**=**HIGH){

Desweiteren muss A0 bei geschlossenem Schalter 1023 ausgeben. Wenn nicht, ist schaltungstechnisch was falsch

Wenn man ihn analog auslesen würde ja. Bei digitalRead() ergibt das 0 oder 1.
Grüße Uwe

Da der TE von werten um die 300 spricht, gehe ich davon aus, dass er analog ausliest.

if (digitalRead(swpin)==HIGH){
ist für Anfänger selbsterklärend

Ich bevorzuge auch

if (digitalRead(swpin)){
bzw.
if (!digitalRead(swpin)){

Was auch sein kann, die Betriebsspannung ist standardmäßig die Spannungsreferenz. Wenn zwischen USB und externer Versorgung 0,2V Unterschied sind - absolut reales Szenario.
Demzufolge werden analoge Eingangsspannungen unterschiedlich bewertet.
Schalte den Arduino auf externe Referenzspannung und besorge dir ein Referenzspannungselement
Mit 1,23 oder 2,5V Referenzspannung: http://www.tme.eu/de/katalog/halbleiter_112140/#id_category=100218&s_field=artykul&s_order=ASC&visible_params=2%2C10%2C10%2C35%2C39%2C364%2C365%2C367%2C368%2C368%2C909%2C2613&used_params=10%3A3244%3B368%3A26931%2C24989%3B
Die Referenzspannungsquelle kommt gegen Masse und ein Vorwiderstand kommt an die +5V, der Knotenpunkt auf den Ref Anschluss des Arduino - schon hat er ein verlässliches Referenzpotential :wink:

also mit digitalRead kommt auch immer 1 heraus, egal ob Schalter offen oder geschlossen.
Wenn ich analogRead verwende, dann näheren sich die Werte an, sobald der Arduino mit Extrern 12V umgehen muss. Versorge ich nur via USB funktioniert zumindest analogRead so wie es soll.

also mit digitalRead kommt auch immer 1 heraus, egal ob Schalter offen oder geschlossen.

Dann machst du was falsch.

combie:
Dann machst du was falsch.

Davon gehe ich aus. Alles nochmal gecheckt. Hatte im Code vor dem Setup int swpin = analogRead(A0). Jetzt gehts