Problem mit Zeitsteuerung - achtung Anfänger ;-)

Hallo Leute,

Ich habe vorhin premiere gefeiert, und das erste mal mit dem Uno gespielt.

Die erste Lektion mit der blinkenden Led hat soweit geklappt (wäre auch wohl peinlich wenn nicht...) aber als ich danach einen Schalter einbinden wollte um zwischen zwei Leds hin und her zu schalten bekam ich vom compiler immer die Fehlermeldung, dass eine 'else Abfrage' immer ein vorhergehendes if benötigt.

Anbei der Code, der eigentlich auch dem Beispiel im Buch entspricht.

int ledPin1 = 13;
int ledPin2 = 12;
int schalter = 2;
void setup()
{
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(schalter, INPUT);
digitalWrite(schalter, HIGH);
}
void loop(){
int val = digitalRead(schalter);
if (val == HIGH); {
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin1, HIGH);
}
else {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
}
}

Hinter die 'digitalwrite high' einer Led möchte ich noch eine Blinkfunktion setzen, die ich aber zur Fehlersuche gelöscht habe.
Sieht jemand wo ich die Tomaten auf dem Augen habe, ich finde den Fehler nicht?!?

Danke

Das Problem ist das Semikolon hinter "if (val == HIGH)"

richtig wäre:

int ledPin1 = 13;
int ledPin2 = 12;
int schalter = 2;
void setup()
{
 pinMode(ledPin1, OUTPUT);
 pinMode(ledPin2, OUTPUT);
 pinMode(schalter, INPUT);
 digitalWrite(schalter, HIGH);
}
void loop(){
 int val = digitalRead(schalter);
 if (val == HIGH) {
   digitalWrite(ledPin2, LOW);
   digitalWrite(ledPin1, HIGH);
 }
 else {
  digitalWrite(ledPin1, LOW);
 digitalWrite(ledPin2, HIGH);
 }
}

Gruß
Andreas

Hallo Andreas,

Das ist ja mal ein Support, meine 5 Unos kommen ja schließlich auch von euch siehe hier: http://arduino.cc/forum/index.php/topic,81493.0.html

Danke für die Hilfe, werde es morgen gleich testen.

So,

danke der Hilfe von Andreas funktioniert meine Schaltung nun soweit wie sie soll, ich bin begeistert wie easy das ist!
Nun wünsche ich mir, das wenn der Schalter auf LOW geht, die Blinkfolge ausgelöst wird bis der Schalter wieder auf HIGH geht was ja funktioniert, zusätzlich würde ich aber gerne noch einen Summer für 1000-2000ms ansprechen, jedoch immer nur einmal im Falle von LOW am Schalter.

Hat jemand einen Vorschlag?
In rot habe ich markiert was -meiner Meinung nach- schon mal notwendig wäre, jedoch bin ich mir nicht sicher wie ich den Summer für 1000ms z.B. auf HIGH setze, und danach überspringe wenn der Schalter auf LOW geht.

Hier der soweit funktionierende Code.

int ledPin1 = 13;
int ledPin2 = 12;
int schalter = 2;
[color=red]int summer = 3;[/color]
void setup()
{
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(schalter, INPUT);
  [color=red]pinMode(summer, OUTPUT);[/color]
  digitalWrite(schalter, HIGH);
}
void loop(){
  int val = digitalRead(schalter);
  if (val == LOW) { 
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin1, HIGH);
    [font=Verdana][color=red]digitalWrite(summer, HIGH);[/color][/font]
    delay(500);
  digitalWrite(ledPin1, LOW);
  delay(50);
  digitalWrite(ledPin1, HIGH);
  }
  else {  
   digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, HIGH);
  }
}

Danke

So, lesen bildet, ich denke mit "for" und einem delay von 1000 sollte es klappen wie ich mir vorstelle.

Oder gibt es Gegenstimmen?

Hallo Leute,

tja wieder ans Reiß(Gedanken)Brett, meine Ideee funktioniert so leider nicht :frowning:
Ich habe es anfangs mit delay probiert, aber das stört meine Blinkfrequenz der LED, anschließend habe ich die "for" Schleife integriert, und der Summer sollte beim drittten Programmdurchlauf aus gehen, macht er aber einfach nicht...

So lange der Schalter auf High ist, ertönt der Summer (temporär simuliert durch eine LED)

Habt ihr dazu einen Vorschlag für mich?
Hier mein Code:

int ledPin1 = 13;
int ledPin2 = 12;
int schalter = 2;
int summer = 11;
int i;
void setup()
{
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(schalter, INPUT);
  pinMode(summer, OUTPUT);
  digitalWrite(schalter, HIGH);
}
void loop(){
  int val = digitalRead(schalter);
  if (val == LOW) { 
    digitalWrite(ledPin2, LOW);
    for (i = 0; i < 3; i++); {
      digitalWrite(summer, HIGH);
    }
    digitalWrite(ledPin1, HIGH);
    delay(500);
  digitalWrite(ledPin1, LOW);
  delay(50);
  digitalWrite(ledPin1, HIGH);
  }
  else {  
   digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, HIGH);
  digitalWrite(summer, LOW);
  }
}

Hallo Jochen,
ich habs mal kurz überflogen.
Deine For Schleife bewirkt eigentlich gar nichts.
Du zählst eine Variable hoch und setzt den Summer auf high, du könntest i auch bis 10.000 hoch zählen lassen,
das wäre das gleiche.
Wenn ich dich richtig verstanden habe soll der Summer einmal gehen wenn der Schalter auf Low geht, ich würde da ein
flag einbauen:
Ich habs jetzt nur kurz hingeschrieben ohne Syntaxprüfung, sollte aber so gehen. Geht aber auch ohne delay, dann muss du mit millis() arbeiten.
Immer wenn der Schalter auf High ist, wird das flag gesetzt. Beim nächsten mal low verzweigt das Programm dann einmal in die if
Schleife, stellt den Summer für 1 Sekunde an und wieder aus.

int ledPin1 = 13;
int ledPin2 = 12;
int schalter = 2;
int summer = 11;
int flag,i;
void setup()
{
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(schalter, INPUT);
  pinMode(summer, OUTPUT);
  digitalWrite(schalter, HIGH);
  flag=0;
}
void loop(){
  int val = digitalRead(schalter);
  if (val == LOW) { 
   digitalWrite(ledPin2, LOW);
    if (flag==1){
      flag=0;
      digitalWrite(summer, HIGH);
      delay(1000);   
     digitalWrite(summer, LOW);    
   }
    digitalWrite(ledPin1, HIGH);
    delay(500);
  digitalWrite(ledPin1, LOW);
  delay(50);
  digitalWrite(ledPin1, HIGH);
  }
  else {  
  flag=1;    
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, HIGH);
  digitalWrite(summer, LOW);
  }
}

Hallo Maverick,

vielen Dank für die Hilfe!
Ich hab es zwar noch nicht verstanden was er nun macht, aber es klappt so wie gewünscht.
Ich habe noch den LEDPin1 zusammen mit dem Summer auf High gesetzt damit Summer und LED gleichzeitig an gehen in der ersten Sekunde, und danach startet meine Blinksequenz.

Super.

Jetzt kann ich in Ruhe anfangen mich durch die beiden Bücher zu arbeiten, hoffentlich bekomm ich die Kurve bald, im Moment stehe ich mir noch oft im Weg wenn ich einfach so versuche Programmcode einzubauen.

Danke Danke Danke :wink:

Hall Jochen,
dafür ist das Forum da.
Wenn du was nicht verstehst: fragen, fragen, fragen.
Gruß
Bernward

Hallo erstmal,

ich habe ein ähnliches Problem.

Und zwar möchte ich mit dem RTC DS3234 Modul erreichen zu bestimmten Zeiten eine LED zum Leuchten zu bringen.
Aber ich habe keine Ahnung wie ich das bewerkstelligen soll. Ich kann zwarr mittlererweile die Zeit anzeigen lassen (im Serial Monitor) aber ich weiß nicht wie ich da was einfügen soll.
Ich hätte an eine If abfrage gedacht aber so einfach ist das dann doch nicht weil ich nicht weiß nach was die fragen soll.

Vielen Dank schon mal im Voraus.

#include <SPI.h>
const int cs=10; //chip select

void setup() {
Serial.begin(9600);
RTC_init();
//day(1-31), month(1-12), year(0-99), hour(0-23), minute(0-59), second(0-59)
SetTimeDate(11,12,13,14,15,16);
}

void loop() {
Serial.println(ReadTimeDate());
delay(1000);
}
//=====================================
int RTC_init(){
pinMode(cs,OUTPUT); // chip select
// start the SPI library:
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE1); // both mode 1 & 3 should work
//set control register
digitalWrite(cs, LOW);
SPI.transfer(0x8E);
SPI.transfer(0x60); //60= disable Osciallator and Battery SQ wave @1hz, temp compensation, Alarms disabled
digitalWrite(cs, HIGH);
delay(10);
}
//=====================================
int SetTimeDate(int d, int mo, int y, int h, int mi, int s){
int TimeDate [7]={s,mi,h,0,d,mo,y};
for(int i=0; i<=6;i++){
if(i==3)
i++;
int b= TimeDate*/10;*
int a= TimeDate_-b10;_
_
if(i==2){_
_
if (b==2)_
_
b=B00000010;_
_
else if (b==1)_
_
b=B00000001;_
_
} _
_ TimeDate= a+(b<<4);*_

* digitalWrite(cs, LOW);*
* SPI.transfer(i+0x80);*
_ SPI.transfer(TimeDate*);
digitalWrite(cs, HIGH);
}
}
//=====================================
String ReadTimeDate(){
String temp;
int TimeDate [7]; //second,minute,hour,null,day,month,year
for(int i=0; i<=6;i++){
if(i==3)
i++;
digitalWrite(cs, LOW);
SPI.transfer(i+0x00);
unsigned int n = SPI.transfer(0x00);
digitalWrite(cs, HIGH);
int a=n & B00001111;
if(i==2){
int b=(n & B00110000)>>4; //24 hour mode*

* if(b==B00000010)
b=20;
else if(b==B00000001)
b=10;
TimeDate=a+b;
}
else if(i==4){
int b=(n & B00110000)>>4;
TimeDate=a+b10;

* }
else if(i==5){
int b=(n & B00010000)>>4;
TimeDate=a+b10;

* }
else if(i==6){
int b=(n & B11110000)>>4;
TimeDate=a+b10;

* }
else{
int b=(n & B01110000)>>4;
TimeDate=a+b10;

* }
}
temp.concat(TimeDate[4]);
temp.concat("/") ;
temp.concat(TimeDate[5]);
temp.concat("/") ;
temp.concat(TimeDate[6]);
temp.concat(" ") ;
temp.concat(TimeDate[2]);
temp.concat(":") ;
temp.concat(TimeDate[1]);
temp.concat(":") ;
temp.concat(TimeDate[0]);
return(temp);
}
[/quote]*

Das ist mein bisheriger Code ^^_

Ich kann zwarr mittlererweile die Zeit anzeigen lassen (im Serial Monitor) aber ich weiß nicht wie ich da was einfügen soll.
Ich hätte an eine If abfrage gedacht aber so einfach ist das dann doch nicht weil ich nicht weiß nach was die fragen soll.

Hallo Kana,
Ja, so einfach ist das dann doch nicht.

Der Code den du da gefunden hast, liest die Zeit in ein String Objekt. Das kann man zwar ausgeben, aber um rauszukriegen, ob die aktuelle Stunde nun 15 oder 16 ist, ( oder was immer du in deinem if abfragen willst), ist das dann doch nicht das einfachste. Und nicht empfehlenswert es überhaupt zu versuchen.

Ausserdem setzt dein Beispiel die DS3234 bei jedem Start auf 11.12.13 14:15:16
Der Vorteil einer RTC ist, dass sie nur ein Mal, nach Batteriewechsel, wieder gestellt werden muss.

( mal angenommen die fehlenden Eckigen Klammern liegen daran, dass das Ganze als Quote statt als Code markiert ist und somit [ i ] verschluckt )

Bau erstmal einen sketch, der 1. die Zeit nicht jedesmal falsch stellt, 2. Datum und Zeit vom Serial Monitor liest und damit die RTC stellt.
Zur Vereinfachung kannst du das auch in 2 sketche packen.
Oder noch einfacher: die zweite Funktion so programmieren, dass Datum und Zeit richtig gestellt werden, wenn du den sketch einmal genau zur richtigen Zeit startest. (D. h. wie jetzt, nur dass du nicht bis 11. Dezember warten musst)

Danach kannst du dich dran machen, eine Funktion zu schreiben, mit der die Zeit als Zahlen gelesen werden können.

Entweder eine Funktion void getTime( byte& h, byte& m, byte& s);
Oder 3 ähnliche Funktionen wie byte getHour(); usw.

Dazu musst du nur sehen, was ReadTimeDate() jetzt macht und das String-Zeug weglassen :wink:

Oder du suchst insgesamt nach passenderem Beispielcode ...

Vielen Dank Michael!

Ich habe jetzt einen ganz anderen Code, mit dem ich das RTC Modul nicht mehr benötige.

Jetzt habe ich alles vervollständigen können.

Danke nochmals für deinen Hilfe :wink:

LG Kana