Hi wendtdir,
ich hatte grade mal wieder Lust auf C++ schreiben. Daher hab ich deinen Code mal umgebaut und ein paar grundlegende Programmierregeln umgesetzt.
Was ich da gemacht habe, und warum? - Das darfst du dir gerne selber erarbeiten
.
Code:
#include <LiquidCrystal.h>
#include <IRremote.h>
const byte ANALOG_PIN_TEMP = 0;
const byte PIN_MOVEMENT = 2;
const byte PIN_RECEIVER = 3;
const byte PIN_LED_GREEN = 11;
const byte PIN_LED_RED = 12;
enum {CODE_TASTE1 = 16724175,
CODE_TASTE2 = 16743045};
const int MESSAGE_EINDRINGLING_DURATION = 3000;
LiquidCrystal lcd(4,5,6,7,8,9);
IRrecv irrecv(PIN_RECEIVER);
volatile boolean movementDetected = false;
void setup() {
lcd.begin(16,2);
lcd.clear();
pinMode(PIN_MOVEMENT, INPUT);
pinMode(PIN_LED_GREEN, OUTPUT);
pinMode(PIN_LED_RED, OUTPUT);
digitalWrite(PIN_LED_RED, LOW);
digitalWrite(PIN_LED_GREEN, LOW);
irrecv.enableIRIn();
Serial.begin(9600);
Serial.println("Start");
}
void ISR_OnMovement() {
movementDetected = true;
}
void printEindringling() {
lcd.setCursor(0, 0);
lcd.print("Eindringling");
lcd.setCursor(0, 1);
lcd.print("erkannt");
}
void printTemperatur(float celsius) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temperatur:");
lcd.setCursor(0,1);
lcd.print(celsius,0);
lcd.setCursor(3,1);
lcd.print("Grad");
}
float analog2celsius(float analogValue) {
float voltage = analogValue*5000/1023 - 500;
float celsius = voltage / 10;
return celsius;
}
void loop() {
decode_results results;
static unsigned long detectionMoment = -MESSAGE_EINDRINGLING_DURATION-1;
if (movementDetected) {
digitalWrite(PIN_LED_RED, HIGH);
printEindringling();
Serial.println("1");
detectionMoment = millis();
movementDetected = false;
}
if (irrecv.decode(&results)) {
irrecv.resume();
switch(results.value) {
case CODE_TASTE1:
digitalWrite(PIN_LED_GREEN, HIGH);
attachInterrupt(0, ISR_OnMovement, RISING);
Serial.println("2");
break;
case CODE_TASTE2:
digitalWrite(PIN_LED_GREEN, LOW);
detachInterrupt(0);
Serial.println("3");
break;
}
}
boolean messageTimeExpired = millis()-detectionMoment > MESSAGE_EINDRINGLING_DURATION;
if (messageTimeExpired ) {
digitalWrite(PIN_LED_RED, LOW);
float celsius = analog2celsius(analogRead(ANALOG_PIN_TEMP));
printTemperatur(celsius);
detectionMoment = millis()-MESSAGE_EINDRINGLING_DURATION-1; // Meldung nach 49 Tagen vermeiden
}
}
Lesezeichen