Das mit den Interrupts ist ein echt haariges Thema. Scheint aber die Lösung zu sein. Ich habe einen Interrupt eingebaut und seit dem funktioniert auch die IF Bedingung. Natürlich kommt jetzt wieder ein ABER. Wenn die Unterbrechung durch eine Bewegung verursacht wird, leuchtet meine LED und mein Text wird ausgegeben. Leider wird dann die Routine nicht abgebrochen. Ich denke, es liegt an dem Befehl
Code:
if (irrecv.decode(&results))
.
Mein Interrupt lässt solange die LED leuchten und den Text erscheinen, bis wieder ein Befehlt über die IR-Schnittstelle gesendet wird, er soll aber automatisch zurückkehren nach z.B. 10 Sekunden und die Temperatur wieder anzeigen. Was auch interessant ist, wenn ich einfach nur den zweiten Case durch Druck auf die zugehörige Taste auslöse, wird mir die Temperatur angezeigt, aber ich kann den ersten Case nicht mehr starten.
So ist momentan mein Code aufgebaut:
Code:
#include <LiquidCrystal.h>
#include <IRremote.h>
int receiverpin = 3;
IRrecv irrecv(receiverpin);
decode_results results;
LiquidCrystal lcd(4,5,6,7,8,9);
float sensor = 0;
float celsius = 0;
float voltage = 0;
volatile int bewegungsstatus=0;
volatile int bewegung=2;
int ledg=11;
int ledr=12;
//unsigned long zeit=millis();
void setup() {
lcd.begin(16,2);
lcd.clear();
pinMode(bewegung, INPUT);
pinMode(ledg, OUTPUT);
pinMode(ledr, OUTPUT);
irrecv.enableIRIn();
Serial.begin(9600);
attachInterrupt(0, sehdich,CHANGE);
}
void sehdich()
{
bewegungsstatus=digitalRead(bewegung);
if (bewegungsstatus==HIGH)
{
lcd.setCursor(0,0);
lcd.print("Eindringling");
lcd.setCursor(0,1);
lcd.print("erkannt");
digitalWrite(ledr, HIGH);
digitalWrite(ledg, LOW);
Serial.println("1");
}
}
void translateIR()
{
switch(results.value)
{
case 16724175:
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temperatur:");
lcd.setCursor(0,1);
lcd.print(celsius,0);
lcd.setCursor(3,1);
lcd.print("Grad");
digitalWrite(ledr, LOW);
digitalWrite(ledg, HIGH);
Serial.println("2");
}
break;
case 16743045:
lcd.clear();
noInterrupts();
lcd.setCursor(0,0);
lcd.print("Temperatur:");
lcd.setCursor(0,1);
lcd.print(celsius,0);
lcd.setCursor(3,1);
lcd.print("Grad");
digitalWrite(ledr, LOW);
digitalWrite(ledg, HIGH);
Serial.println("3");
break;
}
}
void berechnung()
{
sensor = analogRead(0);
voltage = (sensor*5000)/1024;
voltage = voltage - 500;
celsius = voltage/10;
}
void loop()
{
if (irrecv.decode(&results))
{
irrecv.resume();
berechnung();
translateIR();
}
}
Wäre die Lösung etwas wie eine Art Goto last Case? Das ich in der ISR einen Befehle einbaue wie Goto Sprungmarke Case 16724175?
Warum kann ich, wenn ich den zweiten Case "Temp-Messung Standalone" aufrufe nicht erneute den erweiterten Fall mit Bewegungssensor aufrufen? Void Loop () müsste doch immer wieder durchlaufen werden, somit müsste die Abfrage nach einem IR Code immer erfolgen und die Funktion translateIR ebenfalls immer durchgeführt werden.
Lesezeichen