Hallo ich hab über längeren Zeitraum mir einen Code erarbeitet, wenn ich diesen nun versuche auszuführen geht einfach nichts. Kann mir vielleicht jemand sagen wo ich ansetzten soll oder hat gar eine direkte Lösung. Hab praktisch null Erfahrung und aktuell steh ich echt auf dem Schlauch.
RCSwitch mySwitch;
const int ledPin = 11;
const int ledPin2 =12;
bool ledStatus = false;
bool received177 = false;
bool received88 = false;
unsigned long startTime = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
mySwitch.enableReceive(0);
}
void loop() {
if (mySwitch.available()) {
int data = mySwitch.
getReceivedValue
();
if (data == 177) {
received177 = true;
}
if (data == 88) {
received88 = true;
}
mySwitch.resetAvailable();
}
if (received177 && received88) {
if (!ledStatus) {
startTime = millis();
digitalWrite(ledPin, HIGH);
ledStatus = true;
}
if (millis() - startTime >= 500) {
digitalWrite(ledPin, LOW);
ledStatus = false;
received177 = false;
received88 = false;
//ohne den nachfolgenden Teil macht er bis dahin was er soll.
delay(15000);
} else if (ledStatus && (received177 || received88)) {
digitalWrite(ledPin2, HIGH);
delay(1000);
digitalWrite(ledPin2, LOW);
}
}
}
Natürlich möchte ich den „zweiten“ Teil auch nutzen. Vielleicht hat auch jemand einen Tipp wie ich eine Pause im „ersten“ Teil zwischen dem Empfang der Daten und Ausführung des einschalten realisieren kann.
Das Ganze läuft aktuell auf einem Nano Klon als Empfänger und zwei digisparks als Sender.
Vielen Dank vorab.
Wenn ich irgendetwas vergessen habe versuche ich alles nach meinem Wissen zu beantworten.
Grundsätzlich würde ich behaupten, dass dein code etwas kompliziert geschrieben ist, wie es "besser" / "einfacher" geht wird dir bestimmt noch jemand sagen.
Aber du schreibst, das dein Nano Daten senden und empfangen soll...
Wenn dem so sein sollte, macht er dies an der Stelle mit dem delay von 15 Sekunden aber mit Sicherheit nicht. Ein delay bedeutet absoluten Stillstand und in der Zeit macht dein Microcontroller rein gar nichts.
Sprich wenn du willst das er was macht, solltest du dich dringend drum kümmern, dass die delays verschwinden.
evil17, danke für deine schnelle Antwort. Vielleicht hab ich das falsch ausgedrückt.
Wenn ich den Code nach dem Delay lösche funktioniert es bis dahin. Das Delay dient dafür das keine Aktion in der Zeit möglich ist, um ein direktes auslösen von Teil zwei zu verhindern z.B wenn man einen der Taster weiterhin gedrückt hält. Hoffe man versteht das irgendwie.
Drück mal STRG-T in der IDE.
Dann siehst Du die Einrückungen.
Warum?
Darum:
ergibt bei mir
if (received177 && received88)
{
if (!ledStatus)
{
startTime = millis();
digitalWrite(ledPin, HIGH);
ledStatus = true;
}
if (millis() - startTime >= 500)
{
digitalWrite(ledPin, LOW);
ledStatus = false;
received177 = false;
received88 = false;
//ohne den nachfolgenden Teil macht er bis dahin was er soll.
delay(15000);
}
else if (ledStatus && (received177 || received88))
{
Die letzte Bedingung ist von der ersten abhängig.
Wenn in der ersten beide received117 und received 88 true sind, ist es unsinnig im elseif auf received177 ODER received88 true zu prüfen.
Was soll den der Code machen? Ich sehe keinerlei Kommentare....
RCSwitch mySwitch;
const int ledPin = 11;
const int ledPin2 =12;
bool ledStatus = false;
bool received177 = false;
bool received88 = false;
unsigned long startTime = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
mySwitch.enableReceive(0);
}
void loop() {
if (mySwitch.available()) {
int data = mySwitch.
getReceivedValue
();
if (data == 177) {
received177 = true; //sender eins
}
if (data == 88) {
received88 = true; //sender zwei
}
mySwitch.resetAvailable();
}
if (received177 && received88) { //wenn beide ihr "ok" gegeben haben wird led1 für 0,5 sekunden high geschaltet.
if (!ledStatus) {
startTime = millis();
digitalWrite(ledPin, HIGH);
ledStatus = true;
}
if (millis() - startTime >= 500) {
digitalWrite(ledPin, LOW);
ledStatus = false;
received177 = false;
received88 = false;
//lasse ich den nachfolgenden teil weg wird der obere teil schon einmal ausgeführt wie gewünscht.
delay(15000); //pause da ein direktes auslösen durch zu langes drücken einer der sender verhindert werden soll.
} else if (ledStatus && (received177 || received88)) {// wenn die erste Aktion ausgeführt wurde und einer der beiden sender erneut gedrückt wird soll led2 für 1sekunde high geschaltet werden.
digitalWrite(ledPin2, HIGH);
delay(1000);
digitalWrite(ledPin2, LOW);
//ab hier soll dann alles wieder auf anfang.
}
}
}
So hoffe es ist jetzt besser nachvollziehbar.
Schnell zusammen gefasst:
LED1 an wenn 177 und 88 empfangen wurden.
Led2 an wenn led1 an war und 177 oder 88 erneut empfangen wurden.
Was ist das Kritierum für "Led2 an wenn led1 an war und 177 oder 88 erneut empfangen wurden."
oder in anderen Worten: "wie lange muss die LED1 erloschen gewesen sein um LED2 wegen 177 oder 88 einzuschalten?"
Wenn Du in der IDE auf BEARBEITEN - Für Forum kopieren gehst, kommt alles mit.
Dann einfach nur im Post einfügen.
Hinweis: Du darfst keinen Code in der IDE markiert haben.