Pages: [1]   Go Down
Author Topic: bräuchte mal hilfe bei einen programm  (Read 851 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi
und zwar hab ich einen arduino nano 3.0 in einer tron legacy identity disc verbaut  und ein programm dazu geschrieben.
das board soll 12 smd leds mit einen abstand von 1 s anschalten und die dann leuchten lassen. gesteuert wird es über 1 schalter/magnetschalter und einen taster.
wenn der taster gedrückt wird sollen die leds wie beschrieben angehen und dann nach 60s wieder aus.
wenn der schalter geschaltet wird sollen sie auch wie beschrieben angehen aber erst wenn der schalter auf aus ist nach 60s ausgehen.

die leds sind auf den digitalpins 2-13 und der taster an digital pin 0/tx und der schalter auf digital pin 1/rx.

nun das problem ist das kaum das ich das board unter strom setzte gehen die leds an und beginnen alle nach einander zu leuchten dann dauerts 60s und sie gehen aus und das gleiche beginnt von vorne.
der schalter und der taster haben keinen einfluss darauf.

ich bin mit dem latein am ende hab schon alles durchprobiert was mir einfiel aber komme einfach net weiter

hier mal das programm  wo ich net weiter komme.

hoffe ihr könnt mir helfen
Code:
/////definieren der ein und ausgänge

// pins an denen die leds angeschlossen sind
int led1 = 13;
int led2 = 12;
int led3 = 11;
int led4 = 10;
int led5 = 9;
int led6 = 8;
int led7 = 7;
int led8 = 6;
int led9 = 5;
int led10 = 4;
int led11 = 3;
int led12 = 2;

// pins an denen die schalter sind
int taster = 0; //taster
int schalter = 1; // schalter und magnetschalter


// weitere festlegung
void setup () {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led8, OUTPUT);
  pinMode(led9, OUTPUT);
  pinMode(led10, OUTPUT);
  pinMode(led11, OUTPUT);
  pinMode(led12, OUTPUT);
  pinMode(taster, INPUT);
  digitalWrite(taster, HIGH);
  pinMode(schalter, INPUT);
  digitalWrite(schalter, HIGH); 
}


///// Programm bei Tasteraktivierung
void loop() { 
  int val = digitalRead(taster);
  if (val == HIGH) { // wenn taster gedrückt wird
    digitalWrite(led1,HIGH); // schaltet jede led nacheinander an mit 1s wartezeit
    delay(1000);
    digitalWrite(led2,HIGH);
    delay(1000);
    digitalWrite(led3,HIGH);
    delay(1000);
    digitalWrite(led4,HIGH);
    delay(1000);
    digitalWrite(led5,HIGH);
    delay(1000);
    digitalWrite(led6,HIGH);
    delay(1000);
    digitalWrite(led7,HIGH);
    delay(1000);
    digitalWrite(led8,HIGH);
    delay(1000);
    digitalWrite(led9,HIGH);
    delay(1000);
    digitalWrite(led10,HIGH);
    delay(1000);
    digitalWrite(led11,HIGH);
    delay(1000);
    digitalWrite(led12,HIGH);
    delay(60000); // sind alle leds an wird 60s gewartet und dann alle leds wieder abgeschaltet
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    digitalWrite(led9, LOW);
    digitalWrite(led10, LOW);
    digitalWrite(led11, LOW);
    digitalWrite(led12, LOW);
  } // ende des tastersprogramm



  /////Programm bei schalter/magnetschalter aktivierung

  val = digitalRead(schalter);
  if (val == HIGH) {
    digitalWrite(led1,HIGH);
    delay(1000);
    digitalWrite(led2,HIGH);
    delay(1000);
    digitalWrite(led3,HIGH);
    delay(1000);
    digitalWrite(led4,HIGH);
    delay(1000);
    digitalWrite(led5,HIGH);
    delay(1000);
    digitalWrite(led6,HIGH);
    delay(1000);
    digitalWrite(led7,HIGH);
    delay(1000);
    digitalWrite(led8,HIGH);
    delay(1000);
    digitalWrite(led9,HIGH);
    delay(1000);
    digitalWrite(led10,HIGH);
    delay(1000);
    digitalWrite(led11,HIGH);
    delay(1000);
    digitalWrite(led12,HIGH);

  }
  else {
    delay(60000); /// wenn schalter aus dann alle leds ausschalten nach 60s
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    digitalWrite(led9, LOW);
    digitalWrite(led10, LOW);
    digitalWrite(led11, LOW);
    digitalWrite(led12, LOW);
  }
}

Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 9
Posts: 642
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn Du die internen Pull-Ups verrwendest, liegen die Pins ja an 5V an. Du musst also den Taster bzw. Schalter mit GND verbinden und im Programm auf LOW prüfen.
Logged

_______
Manfred

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

sry ich bin zwar ein mädel aber das kapier ich schon. ich habs mit 5v am pin 0 und pin 1probiert und gegenseite an gnd als auch alle beide anschlüsse an 5v. es hat nichts gebracht.
ich könnte auch die schalter auf analog legen aber ich hab keine ahnung wie ich das dann einschreibe ins programm.
das ich die schalter so anspreche hab ich aus dem buch und wüsste jetzt nicht wie ich das anders machen sollte.
sry es ist das erste mal das ich was programmiere und da sind meine kenntnisse leider  nur minimal drum brauch ich hilfe.
Logged

Meran/BZ/IT
Offline Offline
Full Member
***
Karma: 0
Posts: 184
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
was meinst Du mit:
Quote
gegenseite an gnd
Was genau meinst Du mit "Gegenseite"?

Durch digitalwrite HIGH liegen am Pin durch den Arduino selbst die +5V an.
Ein Statuswechsel tritt für den Controller erst ein, wenn durch den Schalter eine direkte Verbindung zu GND gesetzt wird.
So kann der Arduino "0" erkennen.

Die auszuführende Aktion startet also, wenn dieBedingung am Schalter LOW ist.

mfg
Reinhard
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ich meine das ich an pin 0 und pin 1 beides schon hatte anliegen also gnd und 5v aber das gab keinerlei einfluss.

wenn ich aber für die schalter statt pin 0 und 1  also zb 15 und 16 eingebe startet das programm nicht automatisch


ich hab bei den leds 2-14 das plus an den pins und masse an gnd, der taster ist an pin0 und das andere ende der leitung an gnd, der schalter ist an pin 1 und das andere ende der leitung an gnd.

aber es funzt einfach net so wie ich das will

verkabelung glaub ich net das die falsch ist ich tipp auf das programm aber weiss net wo da der fehler ist
Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Du aktivierst ja die internen Pull-Up-Widerstände, fragst aber in der Routine den High-Status ab, der ja durch die Pull-Ups immer da ist. Da passt erst mal was nicht, die Abfrage muss nach LOW erfolgen.
Pin 0 und 1 zu verwenden finde ich sehr unglücklich gelöst, der Bootloader erwartet hier schließlich Daten, wenn man da feste Pegel durch Taster und/oder Pull-Up-Widerstände drauflegt, kann das mächtig in die Hose gehen.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Meran/BZ/IT
Offline Offline
Full Member
***
Karma: 0
Posts: 184
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
hast Du schon mal mittels serial.print überprüft, was an den Pins für Werte anliegen?
Dann weiß man wenigstens, obs an der Hard, oder Software liegt.

Kleiner Tip: Reduzier den Code auf das minimalste (mit /* */) auf ein einfaches Led-Ein/Aus...

mfg
Reinhard
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
hast Du schon mal mittels serial.print überprüft, was an den Pins für Werte anliegen?
Dann weiß man wenigstens, obs an der Hard, oder Software liegt.

Kleiner Tip: Reduzier den Code auf das minimalste (mit /* */) auf ein einfaches Led-Ein/Aus...

mfg
Reinhard

hä??? serial.print??????????? menno ich bin neuling auf dem gebiet programmieren

ich weiss das ich mit // ein bissel zumülle aber es ist für mich wichtig das ich weiss was da gerade passiert, meine freundin die sich etwas mit c# und c++ und einiges anderes auskennt hat auch schon gemeckert wie chaotisch ich das mache

Du aktivierst ja die internen Pull-Up-Widerstände, fragst aber in der Routine den High-Status ab, der ja durch die Pull-Ups immer da ist. Da passt erst mal was nicht, die Abfrage muss nach LOW erfolgen.
Pin 0 und 1 zu verwenden finde ich sehr unglücklich gelöst, der Bootloader erwartet hier schließlich Daten, wenn man da feste Pegel durch Taster und/oder Pull-Up-Widerstände drauflegt, kann das mächtig in die Hose gehen.

ok wie muss das dann aussehen wenn ich den taster und den schalter auf die analog pins a0 und a1 lege anstatt das ich pin 1 und pin 0 verwende. das umlöten ist ja kein prob wenn ich weiss was wo ran aber wie muss das in der code abfrage aussehen  das der die analog eingänge abfragt ob schalter oder taster aktiviert sind. ich bin auch schon auf den gedanken mit pin 1 und pin 0 gekommen nur hab ich echt null ahnung wie man das mit den analogen kram abfragt.

und erwartet bitte nicht orbitante programmierkenntnis den ich versuche mich durchzuwursteln das wenigestenss das programm funzt und es ist mein erste programmierung
Logged

Meran/BZ/IT
Offline Offline
Full Member
***
Karma: 0
Posts: 184
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
probier mal folgendes:
Code:
int led1 = 13;
int taster = 0; //taster

void setup ()
{
  Serial.begin(9600);
  pinMode(led1, OUTPUT);
  pinMode(taster, INPUT);
  digitalWrite(taster, HIGH);
 
  // Gibt Aktuellen Taster-Status aus
  Serial.println(taster);
  delay(1000);
}


void loop()

  int val = digitalRead(taster);

  Serial.println(val); //gibt val aus

  if (val == LOW) { // wenn taster gedrückt wird
  digitalWrite(led1,HIGH); // schaltet jede led nacheinander an mit 1s wartezeit
  delay(1000);
  digitalWrite(led1, LOW);
  delay(1000);
}
 
Ich hab mir erlaubt, den Code einzudampfen (nur 1 Led, nur der Taster).
Serial.println(x) gibt Dir am Computer über den "Serial Monitor" der Ardu-Entwicklerumgebung den Wert x aus und geht in die nächste Zeile...

mfg
Reinhard
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20281
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Edora
Bitte verwende 2 Analoge Eingänge statt Pin 0 und Pin1.
Die analogen Eingänge A0 bis A5 können einfach als digitale verwendet werden. Sie haben die Nummern 14 bis 19 wobei A0 wird 14. ecc.
einfach so:

Code:
...
// pins an denen die schalter sind
int taster = 14; //taster  an A0
int schalter = 15; // schalter und magnetschalter an A1
...

NB: die Analogen Eingänge A6 und A7 die der ATmega328 in SMD Gehäße hat und die beim Arduino Nano herausgeführt sind, können NICHT als Digitale Ein/Ausgänge verwendet werden.

Grüße Uwe

« Last Edit: September 17, 2011, 06:41:42 am by uwefed » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

so habs nun auf a0 und a1 geändert und umgelötet und wie folgt geschrieben

Code:

/////definieren der ein und ausgänge

// pins an denen die leds angeschlossen sind
int led1 = 13;
int led2 = 12;
int led3 = 11;
int led4 = 10;
int led5 = 9;
int led6 = 8;
int led7 = 7;
int led8 = 6;
int led9 = 5;
int led10 = 4;
int led11 = 3;
int led12 = 2;

// pins an denen die schalter sind
int taster = 14; //taster A0
int schalter = 15; // schalter und magnetschalter A1


// weitere festlegung
void setup () {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led8, OUTPUT);
  pinMode(led9, OUTPUT);
  pinMode(led10, OUTPUT);
  pinMode(led11, OUTPUT);
  pinMode(led12, OUTPUT);
  pinMode(taster, INPUT);
  digitalWrite(taster, LOW);
  pinMode(schalter, INPUT);
  digitalWrite(schalter, LOW); 
}


///// Programm bei Tasteraktivierung
void loop() { 
  int val = digitalRead(taster);
  if (val == HIGH) { // wenn taster gedrückt wird
    digitalWrite(led1,HIGH); // schaltet jede led nacheinander an mit 1s wartezeit
    delay(1000);
    digitalWrite(led2,HIGH);
    delay(1000);
    digitalWrite(led3,HIGH);
    delay(1000);
    digitalWrite(led4,HIGH);
    delay(1000);
    digitalWrite(led5,HIGH);
    delay(1000);
    digitalWrite(led6,HIGH);
    delay(1000);
    digitalWrite(led7,HIGH);
    delay(1000);
    digitalWrite(led8,HIGH);
    delay(1000);
    digitalWrite(led9,HIGH);
    delay(1000);
    digitalWrite(led10,HIGH);
    delay(1000);
    digitalWrite(led11,HIGH);
    delay(1000);
    digitalWrite(led12,HIGH);
    delay(30000); // sind alle leds an wird 30s gewartet und dann alle leds wieder abgeschaltet
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    digitalWrite(led9, LOW);
    digitalWrite(led10, LOW);
    digitalWrite(led11, LOW);
    digitalWrite(led12, LOW);
  } // ende des tastersprogramm



  /////Programm bei schalter/magnetschalter aktivierung

  val = digitalRead(schalter);
  if (val == HIGH) {
    digitalWrite(led1,HIGH);
    delay(1000);
    digitalWrite(led2,HIGH);
    delay(1000);
    digitalWrite(led3,HIGH);
    delay(1000);
    digitalWrite(led4,HIGH);
    delay(1000);
    digitalWrite(led5,HIGH);
    delay(1000);
    digitalWrite(led6,HIGH);
    delay(1000);
    digitalWrite(led7,HIGH);
    delay(1000);
    digitalWrite(led8,HIGH);
    delay(1000);
    digitalWrite(led9,HIGH);
    delay(1000);
    digitalWrite(led10,HIGH);
    delay(1000);
    digitalWrite(led11,HIGH);
    delay(1000);
    digitalWrite(led12,HIGH);

  }
  else {
    delay(15000); /// wenn schalter aus dann alle leds ausschalten nach 15s
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    digitalWrite(led9, LOW);
    digitalWrite(led10, LOW);
    digitalWrite(led11, LOW);
    digitalWrite(led12, LOW);
  }
}


soweit alles nun ok ausser das wenn man den taster drückt einmal für ein paar s bis es angeht das ganze sich 2-3 mal wiederholt. beim schalter geht es trotz eingeschalteten schalter irgendwann aus und das ganze spiel geht von vorne los und wiederholt sich auch ewig.

gibts da nen befehl der dieses wiederholen verhindert  und beim eingeschalteten schalter es auch an bleibt bis man ihn ausstellt


man da ist ein prob behoben kommt ein neues
Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Das Programm ist noch immer fehlerhaft. Du kannst keinen Pin als Input setzen und dann ein digitalWrite Low drauf geben, das schaltet die PullUps einfach wieder ab. Die Folge sind unbestimmte Pegel an den Eingängen - gar nicht gut. Also erst mal die digitalWrite wieder auf High setzen und dann die if-Abfrage in der loop() auf Low umschreiben, wie schon mehrfach gesagt.
« Last Edit: September 17, 2011, 02:41:54 pm by sth77 » Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20281
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
gibts da nen befehl der dieses wiederholen verhindert  und beim eingeschalteten schalter es auch an bleibt bis man ihn ausstellt
Es gibt keinen "Befehl" oder Funktion der das verhindert.

Du mußt einfach eine Variable beim ersten Durchgang, wenn der Taster gedrückt wird auf 1 setzen. Beim nächsten Durchgang wenn die Variable 1 ist dann werden die Led nicht mehr eingeschaltet.

Also mußt du nicht nur den Taster kontrollieren sondern auch die Variable

 int val = digitalRead(taster);
    if (val == LOW && Statustaster ==0) { // wenn taster gedrückt wird

Außerdem rate ich Dir nicht delay() zu verwenden sondern millis() wie in "blink without delay" http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Viele Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

so es funzt endlich hab die high und low sachen getauscht und dann an die 2 schalter gnd angelegt und damit klappt es endlich und keine wiederholungen ode rselbstständiges angehen. nur den magnetschalter konnt ich net testen zwecks fehlenden magneten aber das mach ich morgen in berlin wieder


danke für die hilfe  jetzt ist es gelöst nun kann ich mich daran machen das anders zu schreiben ^^ ich bin nunmal anfängerin in der sache
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 9
Posts: 642
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Und mach aus den Pin-Variablen Konstanten. Das ist für Werte, die sich nicht ändern, die geeignetere Methode.
Also anstelle
Code:
int led1 = 13;
schreibst Du
Code:
#define led1 13
Dadurch werden die Werte beim compilieren direkt in den Code eingefügt und verbrauchen keinen Speicherplatz.
Es ist nicht schlecht, sich so etwas von Anfang an anzugewöhnen. Wenn Du mal ein größeres Programm schreibst, kann das bei dem begrenzten RAM eines ATmega 328 durchaus entscheidend sein.
Logged

_______
Manfred

Pages: [1]   Go Up
Jump to: