INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Programmieranfänger benötigt Hilfe
19.02.2015, 06:26
Beitrag #1
Programmieranfänger benötigt Hilfe
Ich versuche mich an einem simplen Sketch. Tun soll erfolgendes: Unterschreitet die Helligkeit einen vorgegebenen Wert (Ermittelt über einen Fotowiderstand), dann wird Pin 10 High, wodurch ein Licht angeht. So weit funktioniert das auch.

Code:
int licht;

void setup () {
  pinMode(10, OUTPUT);
}

void loop() {
  licht = analogRead(1);
  
  if (licht < 500) {
    digitalWrite(10, HIGH);
  }
  else {
    digitalWrite(10, LOW);
  }
  
}

Die Schaltung soll nun um einen Taster an A2 erweitert werden. Drückt man diesen einmalig, soll für X Sekunden ebenfalls Pin 10 High werden. Da ich nicht weiß, wie man das programmiertechnisch löst, habe ich ...if (taster < 500)... geschrieben, da A2 auf Masse gezogen wird.

Geht das so? Denn eigentlich widersprechen sich die Regeln für ein und den selben Pin. Wenn es so nicht geht, wie macht man das richtig?

Nun zu meiner zweiten Frage:

Wie baut man da jetzt einen "Countdown" ein, so dass Pin 10 für die vorgegebene Zeit High wird?

Hier der aktuelle Stand ohne "Countdown"

Code:
int licht;
int taster;

void setup () {
  pinMode(10, OUTPUT);
}

void loop() {
  licht = analogRead(1);
  taster = analogRead(2);
  
  if (licht < 500) {
    digitalWrite(10, HIGH);
  }
  else {
    digitalWrite(10, LOW);
  }
  
  if (taster < 500) {
    digitalWrite(10, HIGH);
    }
  else {
    digitalWrite(10, LOW);
  }
  
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.02.2015, 07:35 (Dieser Beitrag wurde zuletzt bearbeitet: 19.02.2015 08:01 von Corvus.)
Beitrag #2
RE: Programmieranfänger benötigt Hilfe
Da es sich bei einem Taster um ein digitales Signal handelt, wäre hier digitalRead zwar sinnvoller, aber das war ja nicht deine Frage.
Code:
void loop() {
  licht = analogRead(A1); // (Analoge Pins mit "A")
  if (licht < 500) {
    digitalWrite(10, HIGH);
  }
  else {
    taster = analogRead(A2); // Taster nur aktiv, wenn hell
    if (taster < 500) {
      digitalWrite(10, HIGH);
      delay(10000); // 10 Sekunden warten
    }
    digitalWrite(10, LOW);
  }  
}
gruß lorenz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.02.2015, 12:37
Beitrag #3
RE: Programmieranfänger benötigt Hilfe
Vielen Dank für die Zeilen!!! Jetzt glaube ich es verstanden zu haben, wie das in "else" eingebaut werden muss.

Ich habe es mit dem von Dir vorgeschlagenen digitalRead auf 3 probiert. Das klappt nicht

Code:
int licht;
int taster;

void setup () {
  pinMode(10, OUTPUT);
}

void loop() {
  licht = analogRead(A1);
  taster = digitalRead(3);
  
  if (licht > 700) {
    digitalWrite(10, HIGH);
  }
  else {
    
    if (taster > 500) {
      digitalWrite(10, HIGH);
      delay(2000); // X Sekunden warten
    }
    
    digitalWrite(10, LOW);
  }
  
}

Drehe ich das auf A3, läuft alles, wie es soll.

Code:
int licht;
int taster;

void setup () {
  pinMode(10, OUTPUT);
}

void loop() {
  licht = analogRead(A1);
  taster = analogRead(A3);
  
  if (licht > 700) {
    digitalWrite(10, HIGH);
  }
  else {
    
    if (taster > 500) {
      digitalWrite(10, HIGH);
      delay(2000); // X Sekunden warten
    }
    
    digitalWrite(10, LOW);
  }
  
}

Was mache ich falsch?

Angeschlossen ist der Taster übrigens so:
http://arduino.cc/en/uploads/Tutorial/button_schem.png

Das passte mit meinen Kabeln und freien Pins grad besser als es über Masse zu schalten.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.02.2015, 13:18
Beitrag #4
RE: Programmieranfänger benötigt Hilfe
Hi,
laut Deinem Schaltplan ist der Taster auf D2 und nicht D3. Das ist mal der erste Fehler. Der zweite ist, dass das hier nicht zusammenpasst:
Code:
taster = digitalRead(3);
  ...  
    if (taster > 500) {
digitalRead liefert HIGH oder LOW zurück. LOW ist so ziemlich dasselbe wie 0 und HIGH ist irgendwas ungleich Null, aber möglicherweise < 500. Am besten funktioniert das so:
Code:
taster = digitalRead(3);
  ...  
    if (taster) {
Alles was ungleich Null ist, wird als logisch "wahr" behandelt.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.02.2015, 14:14 (Dieser Beitrag wurde zuletzt bearbeitet: 20.02.2015 14:15 von Gelegenheitsbastler.)
Beitrag #5
RE: Programmieranfänger benötigt Hilfe
Klingt eigentlich logisch, dass digital nur null oder eins sein kann. Danke für den Hinweis. Ich habe den Sketch jetzt gemäß Deinem Vorschlag geändert und siehe da, es läuft Smile

Jetzt ist es so, dass die Lampe angeht, wenn der Taster gedrückt wird, der digitale Pin also HIGH wird. Wie müsste die Zeile den aussehen, wenn ich es invertieren wollte? Also die Lampe angehen soll, wenn der Taster nicht gedrückt wird?

Dass die Pins bei mir etwas anders sind als in dem Bildchen das kann wohl sein. Es sollte auch eigentlich nur zur Veranschaulichung für denjenigen dienen, der nicht weiß, wie man so etwas beschaltet.

Den Wunsch aus Deiner Signatur werde ich erfüllen, sobald ich das alles vernünftig zusammen gebastelt habe. Bisher sieht der Aufbau noch recht wild aus, obwohl er funktioniert. Foto anbei.
Code:
int licht;
int taster;

void setup () {
  pinMode(10, OUTPUT);
}

void loop() {
  licht = analogRead(A1);
  taster = digitalRead(3);
  
  if (licht > 700) {
    digitalWrite(10, HIGH);
  }
  else {
    
    if (taster) {
      digitalWrite(10, HIGH);
      delay(2000); // X Sekunden warten
    }
    
    digitalWrite(10, LOW);
  }
  
}


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.02.2015, 15:01
Beitrag #6
RE: Programmieranfänger benötigt Hilfe
(20.02.2015 14:14)Gelegenheitsbastler schrieb:  Wie müsste die Zeile den aussehen, wenn ich es invertieren wollte? Also die Lampe angehen soll, wenn der Taster nicht gedrückt wird?
Hi,
dafür gibt es das logische "nicht". In C ist das "!", also
Code:
if (!taster) {
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 08:46
Beitrag #7
RE: Programmieranfänger benötigt Hilfe
Danke für die Info. Für einen Anfänger sieht so ein Sketch aus, als hätte jemand einen Sack Scrabble Steine ausgeschüttet Wink

Ich habe den Sketch etwas abgewandelt. Nun kann der Taster unabhängig vom Umgebungslicht genutzt werden.

Ich würde nun gerne eine weitere Funktion hinzufügen. Drückt man den Taster einmal, schaltet der Pin für 2 Sekunden auf HIGH. Drückt man den Schalter zweimal, soll der Pin für 10 Sekunden auf HIGH gehen.

Ich habe versucht hier so etwas zu finden wie eine "and" Verknüpfung, aber leider ohne Erfolg.

Wie programmiert man so etwas?

Hier übrigens die aktuelle Version, angepaßt an den ATtiny85. Leider funktioniert Serial.begin nicht mehr, daher ist es auskommentiert.

Code:
int licht;
int taster;

void setup () {
//  Serial.begin(9600);
  pinMode(0, OUTPUT);
}

void loop() {
  licht = analogRead(A1);
//  Serial.println(licht);
  taster = digitalRead(1);
  
  if (licht > 700) {
    digitalWrite(0, HIGH);
  }
  else {
     digitalWrite(0, LOW);
  }
  
   if (taster) {
      digitalWrite(0, HIGH);
      delay(2000); // X Sekunden warten
    digitalWrite(0,LOW);
  }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 09:59
Beitrag #8
RE: Programmieranfänger benötigt Hilfe
(21.02.2015 08:46)Gelegenheitsbastler schrieb:  .....

Hier übrigens die aktuelle Version, angepaßt an den ATtiny85. Leider funktioniert Serial.begin nicht mehr, daher ist es auskommentiert.

Hi,
kleiner Tipp am Rande. Hier mußt du SoftSerial benutzen, vielleicht hilft dir dieser Beitrag von ardu_arne weiter.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Hilfe: IR Remote Steuerung, MSGEQ7 + RGB-LED Streifen dastob 1 125 14.10.2016 21:40
Letzter Beitrag: hotsystems
Sad Ich brauche Hilfe Prosac 4 238 09.10.2016 18:39
Letzter Beitrag: Prosac
  at24c256 Hilfe Gandalf 6 249 29.08.2016 18:59
Letzter Beitrag: MKc
Smile Progammier Neuling Codeschloss bittet um Hilfe Donalonso 2 288 27.08.2016 18:23
Letzter Beitrag: Binatone
  Hilfe gesucht. Webserver Statsiche und Dynamische HTMl Seite b3ta 11 454 22.08.2016 08:07
Letzter Beitrag: b3ta
  Hilfe: Mega2560 - ENC 28J60 - MYSQL Gandalf 1 181 28.07.2016 16:30
Letzter Beitrag: Gandalf
  Selbstfahrender Roboter Programm änderung hilfe ? arekklone 11 551 06.07.2016 14:59
Letzter Beitrag: Binatone
  Hilfe beim Arduino Shield reimundko 6 461 05.06.2016 11:28
Letzter Beitrag: rpt007
  Brauche etwas Hilfe bei der Umsetzung einer Idee raspido 3 538 23.04.2016 10:26
Letzter Beitrag: rkuehle
  Hilfe bei RTC und SD baron007 21 1.595 13.03.2016 17:36
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste