Mit RC Empfänger Modi schalten

Ich bin mal wieder an ein Problem gestoßen.
Und zwar möchte ich mit meinem AUX Channel vom RC Empfänger durch verschiedene Modi schalten.

In diesem Sketch habe ich das mit einem Taster den wechsel von den Modi realisiert:

enum {ONMODE, BLINKMODE, GELB, OFFMODE}; // symbolische Konstanten für die Betriebsarten
int mode = OFFMODE;          // Beim Start LED aus

int blauPin   = 9;
int gelbPin1  = 6;
int gelbPin2  = 5;
int gelbPin3  = 4;
int gelbPin4  = 3;
int buttonPin = 7;

long interval = 500;           // interval at which to blink (milliseconds)

void setup() {
  pinMode(blauPin, OUTPUT);         // LED Blau
  pinMode(gelbPin1, OUTPUT);         // LED Gelb1
  pinMode(gelbPin2, OUTPUT);         // LED Gelb2
  pinMode(gelbPin3, OUTPUT);         // LED Gelb3
  pinMode(gelbPin4, OUTPUT);         // LED Gelb4
  pinMode(buttonPin, INPUT);        // Signal - Taster
}

boolean buttonPressed() // Taster abfragen auf drücken des Buttons
{
  static boolean lastButtonState;
  boolean buttonState=digitalRead(buttonPin);
  if (buttonState!=lastButtonState) // Status hat sich geändert
  {
    lastButtonState=buttonState;  // letzten Status merken
    if (buttonState==HIGH) return true; // Status hat sich auf "gedrückt" geändert
  }
  return false;
}

void loop() { // Loopfunktion nach dem EVA-Prinzip: Eingabe - Verarbeitung - Ausgabe
  // Eingabe (Taster abfragen)
  if (buttonPressed())
  {
    mode++; 
    if (mode>OFFMODE) mode=ONMODE;
  }
  // Verarbeitung
  int blaublinkState = LOW; // von OFFMODE ausgehen
  int blinkState     = LOW;
  int gelbblinkState = LOW;

  if (mode==ONMODE)
  blaublinkState = HIGH,
  gelbblinkState = HIGH;  // einschalten bei ONMODE

  else if (mode==BLINKMODE) 
  blaublinkState = (millis()/interval)%2,
  gelbblinkState = HIGH; // Blinkstatus bei BLINKMODE

  else if (mode==GELB) 
  gelbblinkState = (millis()/interval)%2,
  blaublinkState = HIGH;

  // Ausgabe
  digitalWrite(blauPin,blaublinkState);
  digitalWrite(gelbPin1,gelbblinkState);
  digitalWrite(gelbPin2,gelbblinkState);
  digitalWrite(gelbPin3,gelbblinkState);
  digitalWrite(gelbPin4,gelbblinkState);
  delay(5);  // kurzes delay zum Entprellen des Tasters
}

Nun möchte ich das ganze mit dem AUX realisieren.
Ich benutze die Werte bisher so. (Zum testen)

// AUX Test.ino

int AUX; //Variable AUX
int pin     = 11;
int pingelb = 6;
int pinblau = 9;

void setup() {
	pinMode(pin, INPUT);
	pinMode(pinblau, OUTPUT);
	pinMode(pingelb, OUTPUT);
}

void loop() {

	AUX = pulseIn(pin, HIGH); //PWM vom Empfänger messen AUX
	AUX = map(AUX, 1073, 1856, 0, 100); //Arbeitswerte erzeugen (die ersten beiden Werte aus min / max des Kanals ableiten)




	if (AUX >-50 && AUX <50)
{
digitalWrite(pinblau, HIGH);
}

else{
	digitalWrite(pinblau, LOW);
}

if (AUX >50 && AUX <150)
{
	for(int i=0; i<5; i++){
		        
		    
		digitalWrite(pinblau, HIGH);    
	    digitalWrite(pingelb, HIGH);
	    delay(500);
	    digitalWrite(pingelb, LOW);
	    delay(500);
	}
}


}

Die PWM Werte vom AUX schwanken ein wenig.
1073 +/- 1
1856 +/- 4

Daher funktionieren vergleiche nicht so gut (oder ich kenn DEN richtigen Befehl noch nicht)

Zwischen diesen beiden Werten kann ich hin und her schalten und möchte pro “umschalten” einen Modi wechseln. Quasi aus einem Schalter einen Taster machen :smiley:

Ich hoffe ihr könnt mir beim verschmelzen helfen, bzw. mein Problem lösen.

anbei noch ein Bild meines Aufbaus. Die beiden Kabel die ins Nichts gehen sind am Empfänger. (EDIT: Kann im Moment das Bild nnicht uploaden)

Gruß
Alex

Eine kleine Idee von mir:

Ist es möglich einen Bereich der schwankt als etwas zu definieren ?

Z.b.

AUX: 0-50 = 1
AUX: 50-100 = 0

Über If müsste das sicher gehen ?!
Aber es gibt bestimmt eine schönere Lösung.

Dann könnte ich einen “glatten” Vergleich machen. So hätte ich die Schwankung unterdrückt und könnte wie mit dem Taster arbeiten.

Gruß
Alex

Wick3d:
AUX: 0-50 = 1
AUX: 50-100 = 0

Über If müsste das sicher gehen ?!
Aber es gibt bestimmt eine schönere Lösung.

Dann könnte ich einen “glatten” Vergleich machen. So hätte ich die Schwankung unterdrückt und könnte wie mit dem Taster arbeiten.

Bisschen genauer sollte deine Vorgabe schon sein, was willst du bei 50 haben ?

Wenns glatt ist, würde ich int-Arithmetik vorschlagen

int aux;  
boolean result;
for (aux = 0; aux < 100 aux +=33)
{

    result = 1 - aux/50;  // 0 .. 49 = HIGH ; 50 .. 99 = LOW

    Serial.print (aux); Serial.print( " --> "); Serial.println (result? "TRUE = HIGH = 1":"FALSE = LOW = 0");
}

Der Test sollte 4 Beispiel-Zeilen ausgeben.

Kannst auch in passende Häppchen teilen und einen switch/case Verteiler bauen

b

yte step = aux/10;
switch (step) {
{
    case 0:
    case 1:
    case 2:
       Found 0_29();
       break;
    case 3:
    case 4:
      Found 30_49();  
      break;
    case 5:
    case 6:
    case 7:
      Found 50_79();
      break;
    default:
      Found 80_above();
      break; 
}

Eine Reihe von if, sauber untereinander geschrieben, ist aber auch gut lesbar.

Ich habe es eben nochmal versucht mit dem was ich kenne es um zu setzen.
Dies gibt mein gewünschhtes Ergebnis.

void loop() {

	AUX = pulseIn(pin, HIGH); //PWM vom Empfänger messen AUX
	AUX = map(AUX, 1073, 1856, 0, 100); //Arbeitswerte erzeugen (die ersten beiden Werte aus min / max des Kanals ableiten)


	if (AUX >-50 && AUX <50)
{
	signalAUX=0;
}

else{
	signalAUX=1;
}
	if (signalAUX!=lastAUX){
		lastAUX=signalAUX;
		digitalWrite(pingelb, HIGH);
		delay(1000);
		digitalWrite(pingelb, LOW);
	}
}

Aber deine Lösung wäre kompakter. Ich werde das mir mal genauer anschauen. Danke dafür.