Hallo an alle,
ich bin dabei mir für meine Wohnzimmerlampe eine Lampensteuerung zu bauen welche über 433 MHz angesteuert wird.
Leider hänge ich gerade beim hoch und runter Dimmen fest, weil mein arduino jedes mal einfriert könnt ihr mir da helfen, habe schon den ganzen Tag nach einer Lösung gegooglet.
Problembeschreibung Freeze:
Wenn ich auf der Fernbedienung den Knopf zum dimmen Drücke wird der Befehl erkannt und der Arduino springt zum Abschnitt --> brightness:
In diesem Programmabschnitt soll bei gehaltener Dimmtaste schnell gedimmt werden, bei mehrfachem Drücken wird der Wert nur um jeweils 1 subtrahiert. Sobald der Wert auf 200 Abgesunken ist wird der arduino immer langsamer und friert ein.
Wenn ich den Code in diesem Abschnitt auskommentiere ---> kein freeze
Nach einem Reset geht alles wieder. Wenn ich den Aufbau mit Tastern realisiere funktioniert alles.
Hat irgendjemand eine Idee?
Hier der Code:
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
// Variables:
// IO Pins
int SpotPin = 9;
int AmbiPin = 10;
// 433 Variables
int SpotTgl = LOW;
int AmbiTgl = LOW;
int SpotSet = LOW;
int AmbiSet = LOW;
int NumBttn;
int OkBttn = LOW;
int SpotInc = LOW;
int SpotDec = LOW;
int AmbiInc = LOW;
int AmbiDec = LOW;
// Others
int SpotState = HIGH;
int SpotBrghtns = 255;
int AmbiState = HIGH;
int AmbiBrghtns = 255;
int BttnRlsd = HIGH;
long LastBttnPrss = 0;
long LastInc = 0;
// Changable Values
long BttnTmt = 300;
long IncSpd = 10;
long FadeAmnt = 5;
void setup() {
pinMode(SpotPin, OUTPUT);
pinMode(AmbiPin, OUTPUT);
Serial.begin(9600);
mySwitch.enableReceive(0); // Receiver on inerrupt 0 => that is pin #2
}
void loop() {
// 433 MHz Empfang
if (mySwitch.available()) {
long value = mySwitch.getReceivedValue();
// Positive Flanke: Knopf gerade gedrückt
if (millis() - LastBttnPrss > BttnTmt) {
BttnRlsd = HIGH;
}
else {
BttnRlsd = LOW;
}
LastBttnPrss = millis();
mySwitch.resetAvailable();
Serial.print("Received ");
Serial.print( mySwitch.getReceivedValue() );
Serial.print(" / ");
Serial.print( mySwitch.getReceivedBitlength() );
Serial.print("bit ");
Serial.print("Protocol: ");
Serial.println( mySwitch.getReceivedProtocol() );
// Auswertung Funksignale
if (value == 1064981) {
SpotInc = HIGH;
goto brightness;
}
if (value == 1064980) {
SpotDec = HIGH;
goto brightness;
}
if (value == 1048596) {
AmbiInc = HIGH;
goto brightness;
}
if (value == 1048597) {
AmbiDec = HIGH;
goto brightness;
}
if (value == 1052693) {
SpotTgl = HIGH;
goto toggles;
}
if (value == 1052692) {
AmbiTgl = HIGH;
goto toggles;
}
if (value == 4373) {
SpotSet = HIGH;
}
if (value == 4372) {
AmbiSet = HIGH;
}
if (value == 16661) {
OkBttn = HIGH;
}
if (value == 1045) {
NumBttn = 1;
}
if (value == 1044) {
NumBttn = 2;
}
if (value == 17429) {
NumBttn = 3;
}
if (value == 17428) {
NumBttn = 4;
}
if (value == 5141) {
NumBttn = 5;
}
if (value == 5140) {
NumBttn = 6;
}
if (value == 21525) {
NumBttn = 7;
}
if (value == 21524) {
NumBttn = 8;
}
if (value == 277) {
NumBttn = 9;
}
if (value == 276) {
NumBttn = 0;
}
}
else {
goto output;
}
toggles:
// Toggle Switches
if (BttnRlsd == HIGH) { // Nur abarbeiten wenn ein Knopf gerade gedrückt wurde
// Spot Toggle
if (SpotTgl == HIGH) {
if (SpotState == HIGH) {
SpotState = LOW;
}
else {
SpotState = HIGH;
}
}
// Ambi Toggle
if (AmbiTgl == HIGH) {
if (AmbiState == HIGH) {
AmbiState = LOW;
}
else {
AmbiState = HIGH;
}
}
}
// Reset Variable
SpotTgl = LOW;
AmbiTgl = LOW;
goto output;
brightness:
// Spot Helligkeit hoch und runter dimmen
// Spot
if (SpotInc == HIGH && SpotBrghtns < 255) {
if (BttnRlsd == HIGH) {
SpotBrghtns = SpotBrghtns + 1;
}
else {
SpotBrghtns = SpotBrghtns + 5;
}
}
if (SpotDec == HIGH && SpotBrghtns > 0) {
if (BttnRlsd == HIGH) {
SpotBrghtns = SpotBrghtns - 1;
}
else {
SpotBrghtns = SpotBrghtns - 5;
}
}
Serial.println(SpotBrghtns);
SpotInc = LOW;
SpotDec = LOW;
output:
// Schreibe Ausgangshelligkeit an Pin
// Spot
if (SpotState == HIGH) {
analogWrite(SpotPin, SpotBrghtns);
}
else {
analogWrite(SpotPin, 0);
}
// Ambi
if (AmbiState == HIGH) {
analogWrite(AmbiPin, AmbiBrghtns);
}
else {
analogWrite(AmbiPin, 0);
}
}