• Die Forumsregeln und Nutzungsbedingungen findet ihr in der Navbar unter Impressum !
    Bitte unbedingt beachten!
    Wie überall im Leben gibt es Spielregeln, so auch hier!
    Die Datenschutzerklärung zum DSGVO findet ihr ebenfalls in der Navbar unter Datenschutzerklärung !
    Hinweis nach DSGVO :
    Es ist hier keinerlei Angabe erforderlich. Alle Angaben in diesem Bereich sind öffentlich sichtbar und werden freiwillig gemacht. Mit einem Eintrag in diesem Bereich erkenne ich dieses an, und bestätige die Datenschutzerklärung zur DSGVO für das Forum gelesen zu haben.

    Danke
  • Hallo Gast, beschränke dich hier bitte auf den Bereich der Elektronik. Die Fahrzeuge oder Gebäude, wo diese Elektronik eingebaut wird bitte in dem passenden Fachbereiich behandeln. Auch wenn Teile des Projektes dadurch im Forum doppelt vorhanden sind! Danke.

Arduino einfaches Schaltmodul

markusstn

Well-known member
VIP Unterstützt modelltruck.net 2024
Registriert
16.12.2014
Beiträge
2.137
Hallo zusammen bräuchte mal eure Hilfe,

möchte gerne mit einen Arduino Zusatzbeleuchtung schalten.
Bis jetzt hab ich es schon geschafft das ich die interne LED eingeschalten bekomme, aber das ausschalten geht nicht

Hier mal der Sketch

// Controllerpins
const int CH_2_PIN = 11;
const byte al = 13;
// Parameters
const int deadzone = 20;

void setup() {
Serial.begin (9600);
pinMode (al, OUTPUT);
}
void loop() {
int ch_2 = pulseIn(CH_2_PIN, HIGH, 25000);
Serial.println(pulseToPWM(ch_2));
delay (5);
}
// Convert RC pulse
int pulseToPWM(int pulse)
{
if ( pulse > 980)
{
pulse = map(pulse, 980, 2000, -500, 500);
pulse = constrain(pulse, -500, 500);
}
else
{
pulse = 0;
}
if ( abs(pulse) <= deadzone) {
pulse = 0;
}



// Switch Output

if ( pulse >= 490)
{ digitalWrite ( al, HIGH);}

return pulse;
}


nur bekomme ich die LED jetzt nicht mehr aus.
An der Funke hab ich auf einen Kanal 4 Taster belegt 1= 100% , 2= 75%, 3=50%, 4=25% Ausschlag +/-
Im Serial Monitor sieht man die Werte, wenn ich die einzelnen Taster drücke, ändern sich die Werte.
Mit den Werten wollte ich dann, die Ausgänge des Arduino schalten, damit hätte mann dann mit 4 Taster 8 Schaltfunktionen.
Taster 1 vor drücken Licht an, wieder Taster 1 vor drücken Licht aus. So ist der Plan.

Wie kann man if ( pulse >=einen Wert von 490-500< eingeben, ich bräuchte wenn der Wert zwischen 490-500 ist ,dann soll der Arduino schalten

das ausschalten
if ( al HIGH & pulse >= 490)
{ digitalWrite ( al, LOW);}

irgendwie funktioniert das aber nicht, kann mir da einer von Euch mal helfen :frage:frage

:thx schon im Vorfeld
 
Moin Markus,

Was genau meinst du mit 100%, 75%, 50% und 25%? Auf einen Proportionalkanal abgebildet wäre dann
- ganz unten 0% - keine Aktion
- halber Weg zur Mitte - 25% - Schalter 1
- Mitte - 50% - Schalter 2
- Halber weg von Mitte nach oben - 75% - Schalter 3
- ganz oben - 100% - Schalter 4

Habe ich das so richtig verstanden?

Wenn ja, würde ich es etwas anders gestalten:
- Totzone ist die Mitte
- Schalter 1 halber Weg nach unten
- Schalter 2 ganzer Weg nach unten
- Schalter 3 halber Weg nach oben
- Schalter 4 ganzer Weg nach oben

Der Vorteil ist dass du diese Logik auch falls benötigt auf einem normalen Proportionalkanal oder einem 2 Wege Taster verwenden kannst.

Das Licht geht nicht aus weil dein Code nur einschaltet, aber nicht wieder aus. Ich nehme mal an dass es sich hier um einen Testaufbau handelt.

Code:
	// Switch Output

	if ( pulse >= 490)
	{
		digitalWrite ( al, HIGH);
	}
	else
	{
		digitalWrite ( al, LOW);
	}
Dies schaltet bei einem Wert ab 490 an und darunter wieder aus.

BTW: Coder sind faul, es geht auch so:

Code:
		digitalWrite ( al, (pulse >= 0));

Aber bitte nicht angewöhnen.... :hfg

Was du machen möchtest ist ja eine Memory Funktion. Dazu musst du dir dann auch den jeweiligen Status merken und schalten.
 
Hallo Markus,

es gibt schon zwei fertige Projekte hier im Forum:

eins von Winni - das ist sehr umfangreich

und eins von mir - das hat ein paar Funktionen weniger

Beide Programme sind durchgehend kommentiert, wirf doch mal einen Blick rein.
 
Moin Markus,

Was genau meinst du mit 100%, 75%, 50% und 25%? Auf einen Proportionalkanal abgebildet wäre dann
- ganz unten 0% - keine Aktion
- halber Weg zur Mitte - 25% - Schalter 1
- Mitte - 50% - Schalter 2
- Halber weg von Mitte nach oben - 75% - Schalter 3
- ganz oben - 100% - Schalter 4

Habe ich das so richtig verstanden?

Wenn ja, würde ich es etwas anders gestalten:
- Totzone ist die Mitte
- Schalter 1 halber Weg nach unten
- Schalter 2 ganzer Weg nach unten
- Schalter 3 halber Weg nach oben
- Schalter 4 ganzer Weg nach oben

Der Vorteil ist dass du diese Logik auch falls benötigt auf einem normalen Proportionalkanal oder einem 2 Wege Taster verwenden kannst.

Das Licht geht nicht aus weil dein Code nur einschaltet, aber nicht wieder aus. Ich nehme mal an dass es sich hier um einen Testaufbau handelt.

Code:
	// Switch Output

	if ( pulse >= 490)
	{
		digitalWrite ( al, HIGH);
	}
	else
	{
		digitalWrite ( al, LOW);
	}
Dies schaltet bei einem Wert ab 490 an und darunter wieder aus.

BTW: Coder sind faul, es geht auch so:

Code:
		digitalWrite ( al, (pulse >= 0));

Aber bitte nicht angewöhnen.... :hfg

Was du machen möchtest ist ja eine Memory Funktion. Dazu musst du dir dann auch den jeweiligen Status merken und schalten.

:thx Peter für deine Hilfe,

Also die Schalter sind so eingerichtet,
Der 1. Hat einen Ausschlag von 100% in beide Richtungen
Der 2. 75%
Der 3. 50%
Und der 4. 25%
Alles auf einen Kanal gelegt
Es sind Taster mit Null Stellung

Ja es ist ein Test Aufbau, wollte mir nur eine günstiges schaltmodul bauen. Mit nachgeschalteten ULN2803 .

Danke für den Tipp mit der memory Funktion, da muss ich noch mal nach schauen wie das geht.
 
Hallo Markus,

es gibt schon zwei fertige Projekte hier im Forum:

eins von Winni - das ist sehr umfangreich

und eins von mir - das hat ein paar Funktionen weniger

Beide Programme sind durchgehend kommentiert, wirf doch mal einen Blick rein.

:thx Bert für die Hilfe,

Das von Winni benutze ich schon, brauch nur noch ein paar mehr Schaltausgänge in meinem Projekt.

Ich wollte das mit dem schalten etwas anders lösen und zwar über den Ausschlag des jeweiligen Kanals. So Ähnlich wie bei dem Sound modul das ich im Traktor drin hab, da ist der Ausschlag in vier Teile unterteilt A B C D .

Wenn alles so klappt wie ich es mir vorstelle, dann hätte ich ein günstiges schaltmodul, das nicht mal 5 EUR kostet. Mann könnte die 13 Ausgänge des Arduino und zwei ULN2803 dahinter schalten. Das sollte reichen für die Beleuchtung an diversen Fahrzeugen.
 
Ich glaub das mit dem programmieren is net mein Ding,

komm hier nicht weiter , die Led schaltet immer nur ein und nicht aus :sauer

im Netz finde ich auch keine Erklärung wie das geht mit dem Wert merken usw. , kann mir da mal einer von euch nen link schicken ( da wo ich das auch versteh wie das geht) :cry
 
Moin Markus,

wenn du Lust hast schau doch mal in diesen Thread >>>Klick mich<<<.

Diese Methode hat den Vorteil dass der loop() nicht durch das Lesen eines Servosignals geblockt wird.

Ich habe gerade mal ein bisschen gebastelt und eineMethode rund um die oben beschriebene Lesemethode gestrickt.

Der Sketch unterstützt 8 Schaltausgänge geschaltet über deine 4 Taster. Drückst du den Taster kürzer als 1 Sekunde schaltest du die Ausgänge 0-3, länger als 1 Sekunde die Ausgänge 4-7. Das Servosignal wird auf Pin 2 gelesen. Die LED an Ausgang 13 leuchtet solange ein Taster gedrückt ist. Du müsstest nur noch die Methode GetSwitchStatus() anpassen um den korrekten SwitchStatus Wert zu bekommen.

Code:
volatile	uint8_t		LastInterruptState					= PIND;

//	Variablen fuer die Geschwindigkeit
volatile	uint16_t	ReceivedSpeedValues[4]				= {1500, 1500, 1500, 1500};
volatile	uint16_t	ReceivedSpeedValuesSum				= 6000;
volatile	uint8_t		ReceivedSpeedValuesIndex			= 0;

volatile	uint32_t	LastSpeedChange						= micros();
volatile	uint16_t	LastSpeedValue						= 0;


void SpeedPositionInterrupt() 
{
	uint32_t    nMicros		= micros();
	uint16_t    nDifference  = (uint16_t)(nMicros - LastSpeedChange);

	if ( (nDifference > 900) && ( nDifference < 2100))
	{
		ReceivedSpeedValuesSum							-= ReceivedSpeedValues[ReceivedSpeedValuesIndex];
		ReceivedSpeedValues[ReceivedSpeedValuesIndex]	 = nDifference;
		ReceivedSpeedValuesSum							+= nDifference;
		ReceivedSpeedValuesIndex						 = ( ( ReceivedSpeedValuesIndex + 1 ) & 0x03 );	//	Index erhoehen und ggf. von 4 auf 0 springen
		nDifference										 = ( ReceivedSpeedValuesSum >> 2 );	//	durch 4 teilen

		LastSpeedValue  = nDifference;
	}
	LastSpeedChange	= nMicros;
}

ISR(PCINT2_vect)
{
	uint8_t	PinState	= PIND;
	uint8_t	PinChanges	= PinState ^ LastInterruptState;

	if (PinChanges & (1<<PCINT18))
		SpeedPositionInterrupt();

	LastInterruptState	= PinState;
}

//	Es gibt 2 schalterbaenke
//	Index 0 - 3 - Werden geschaltet bei Tastendruck unter 1 Sekunde
//	Index 4 - 7 - Werden geschaltet bei Tastendruck ueber 1 Sekunde
int8_t	OutputStatus[8] ={LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};

//	Hier die gewuenschen Ausgabepins eintragen
int8_t	OutputPin[8]	= {4, 5, 6, 7, 8, 9, 10, 11};



//	 Wichtig !!! Die Statuswerte ausserhalb des Center muessen die Werte 0-3 behalten, sie werden weiter unten als Indexe verwendet
#define SwitchStatus_High		0
#define SwitchStatus_MiddleHigh	1
#define SwitchStatus_MiddleLow	2
#define SwitchStatus_Low		3
#define SwitchStatus_Center		100

#define Pin_StatusLED			13

uint32_t	StatusHasLeftTheCenter	= 0;
int			LastSwitchStatus		= SwitchStatus_Center;

void setup() 
{
	Serial.begin(115200);

	PCICR |= (1 << PCIE2);
	//	Es wird das Sevosignal an PIN 2 gelesen
	PCMSK2 |= ( ( 1<<PCINT18));

	sei();

	pinMode(Pin_StatusLED, OUTPUT);
	digitalWrite(Pin_StatusLED, LOW);

	for(int index = 0; index < sizeof(OutputPin); index++)	
	{
		pinMode(OutputPin[index], OUTPUT);
		digitalWrite(OutputPin[index], OutputStatus[index]);
	}
}


void loop() 
{
	Serial.println(LastSpeedValue);

	int SwitchStatus = GetSwitchStatus(LastSpeedValue);
	if ((SwitchStatus != SwitchStatus_Center) && (LastSwitchStatus == SwitchStatus_Center))
	{
		//	Ein Taster wurde gedrueckt, wir merken und die aktuelle Zeit
		StatusHasLeftTheCenter	= millis();
	}
	if ((SwitchStatus == SwitchStatus_Center) && (LastSwitchStatus != SwitchStatus))
	{
		//	Der Taster ist wieder in die Mitte gewandert, also ist der vorherige State interessant um die Funktion auszuloesen

		//	Nun pruefen wir wie lange der Taster gedrueckt wurde
		uint8_t		index = LastSwitchStatus;
		uint32_t difference = millis() - StatusHasLeftTheCenter;

		if (difference > 200)
		{
			//	Die Schwelle von 200ms ist um ein Polling abzufangen
			if (difference > 1000)
				index += 4;	//	Der Taster war laenger als 1 Sekunde gedrueckt, also nehmen wir die 2 Schalterbank

			//	erst schalten wir den Memorywert um
			OutputStatus[index] = OutputStatus[index] == LOW ? HIGH : LOW;
			//	und dann schalten wir den Ausgang
			digitalWrite(OutputPin[index], OutputStatus[index]);
			//	und die gemwerkte Zeit wieder loeschen
		}
		StatusHasLeftTheCenter	= 0;
	}
	LastSwitchStatus = SwitchStatus;
	digitalWrite(Pin_StatusLED, SwitchStatus == SwitchStatus_Center ? LOW : HIGH);

	delay(200);
}

int GetSwitchStatus(uint16_t servoValue)
{
	if (servoValue < 1100)	return SwitchStatus_Low;
	if (servoValue < 1300)	return SwitchStatus_MiddleLow;
	if (servoValue < 1600)	return SwitchStatus_Center;
	if (servoValue < 1800)	return SwitchStatus_MiddleHigh;

	return SwitchStatus_High;
}

Solltest du Fragen haben, einfach melden... ;)
 
:thx:thx:thx und noch mal :thx Peter,
Ich weiß nicht wie du das immer machst, ich sitze den ganzen Tag und schaue und suche. Bin dann auch nicht schlauer als vorher, der Tag ist rum und ich hab nichts geschafft, außer das mein Kopf raucht und ich richtig :sauer bin und die ganze Sche.... an die Wand klatschen könnte. Bei dir geht's so, tipp tipp und schon is es fertig :sabber, so was werd ich mein ganzes Leben net zusammen bringen. Für so einen Sketch brauch ich zwei Jahre lang :poff und verstehen du das dann immer noch nicht :frage:frage
 
Moin Markus,

ich bin Software Entwickler von Beruf mit einem Hang zur Elektronik. Mit Programmierung beschäftige ich mich seit 35 Jahren, da sollte das fluppen... ;)

Geh einfach den Weg der kleinen Schritte und du wirst sehen wie die Erfolge kommen. Du darfst am Anfang einfach nicht zu viel erwarten.

Ich hatte die vielen Lehrstunden in der Bearbeitung von Metall wie Alu und Messing und da stehe ich auch erst am Anfang. Metallbearbeitung ist nicht ohne Grund eine Gruppe von Lehrberufen.

Gib dir Zeit und frage. Wenn du nicht weiter kommst einfach fragen und/oder posten, dafür ist ein solches Forum da. Manchmal brauchst man nur einen kleinen Denkanstoß oder Tipp und es geht weiter. Google ist gut und schön aber es bringt gar nichts wenn du die passenden Schlagworte nicht hast.

Kopf hoch, das wird schon... :ok
 
Hi, Peter

Hier mal alles von Funke und Serial Monitor

100%

20191222_203822.jpg

20191222_203612.jpg

Andere Richtung

20191222_203825.jpg

20191222_203631.jpg

75%

20191222_203828.jpg

20191222_203636.jpg

Andere Richtung

20191222_203830.jpg

20191222_203642.jpg

50%

20191222_203833.jpg

20191222_203646.jpg

Andere Richtung

20191222_203837.jpg

20191222_203652.jpg

Und 25%

20191222_203840.jpg

20191222_203704.jpg

Andere Richtung

20191222_203843.jpg

20191222_203710.jpg

Wie muss ich das jetzt noch einstellen :frage

hab grad gemerkt das die Bilder nicht zusammen passen, oh man :sauer
 
Hi Markus, der Dateimanager vertauscht die Reihenfolge der Bilder.
In solchem Fall würde ich die Bilder mit dem Grafiksymbol einzeln einsetzen dann passt es garantiert.
Da Peter dir da schon weitgehend hilft und das programieren besser beherscht als ich, halte ich mal etwas zurück.
 
Machen wir es auf die alte Art mit Papier und Stift :ok

20191222_212139.jpg

Ich hoffe das du meine Schrift lesen kannst? :hfg[DS][/DS]
 
Hi Markus, der Dateimanager vertauscht die Reihenfolge der Bilder.
In solchem Fall würde ich die Bilder mit dem Grafiksymbol einzeln einsetzen dann passt es garantiert.
Da Peter dir da schon weitgehend hilft und das programieren besser beherscht als ich, halte ich mal etwas zurück.

:thx Winni
Das hatte ich gemacht, leider ist mir der Fehler unterlaufen, hab die Bilder durcheinander gebracht.
 
Nur eine Sache zu deiner Frage wegen dem merken des Wertes. Ich will es mal simpel erklären.

Ich habe zwei Ausgänge, dargestellt von zwei Sandhügeln. Ist der Sandhügel aufgeschüttet (Ausgang = ein) setze ich eine grüne Flagge (1) drauf, ist der Sandhügel abgetragen (Ausgang = aus) setze ich eine rote Flage (0) drauf.
Ich kann natürlich so auch die Flage auf jeden beliebigen anderen Wert setzen. z.B. 0, 25, 50, 75, 100
So kann ich im Sketch schreiben:

Ausgang_a einschalten
Ausgang_a_flag = 1

Ausgang_a ausschalten
Ausgang_a_flag = 0

Statusabfrage:
If Ausgang_a_flag == 1
Reaktion

oder :
If Ausgang_a_flag == 0
Reaktion

So habe ich es im Prinzip in meinem ganzen Lichtanlagen-Sketch gemacht.
Ist vielleicht nicht die perfekte Programmiermethode, aber sehr übersichtlich.

Oder:

Ausgang_a einschalten
Ausgang_a_flag = 1

Ausgang_a ausschalten
Ausgang_a_flag = 0

Statusabfrage:
If Ausgang_a_flag == 1
Reaktion

else
andere Reaktion
 
Moin Markus,

ich habe den Code entsprechend modifiziert. In der letzten Funktion ermittle ich den Bereich. Dabei gehe ich quasi von unten nach oben. Ich habe nicht auf genaue Werte geprüft, da diese immer leicht schwanken. Also bin ich beim Vergleich immer etwas drüber und frage ob der Wert kleiner ist. So kann ich Schwankungen ausgleichen. Man könnte auch 7 mal fragen ob der Wert größer einer unteren Schwelle und kleiner einer oberen Schwelle ist, aber das ist nicht notwendig. Wichtig bei meiner Prüfungsmethode ist nur dass du kontinuierlich von unten nach oben gehst.

Hier mein geänderter Code. Ich habe die Konstanten mal umbenannt, so passen sie besser zu deiner Schaltung an der Funke.

Code:
volatile	uint8_t		LastInterruptState					= PIND;

//	Variablen fuer die Geschwindigkeit
volatile	uint16_t	ReceivedSpeedValues[4]				= {1500, 1500, 1500, 1500};
volatile	uint16_t	ReceivedSpeedValuesSum				= 6000;
volatile	uint8_t		ReceivedSpeedValuesIndex			= 0;

volatile	uint32_t	LastSpeedChange						= micros();
volatile	uint16_t	LastSpeedValue						= 0;


void SpeedPositionInterrupt() 
{
	uint32_t    nMicros		= micros();
	uint16_t    nDifference  = (uint16_t)(nMicros - LastSpeedChange);

	if ( (nDifference > 900) && ( nDifference < 2100))
	{
		ReceivedSpeedValuesSum							-= ReceivedSpeedValues[ReceivedSpeedValuesIndex];
		ReceivedSpeedValues[ReceivedSpeedValuesIndex]	 = nDifference;
		ReceivedSpeedValuesSum							+= nDifference;
		ReceivedSpeedValuesIndex						 = ( ( ReceivedSpeedValuesIndex + 1 ) & 0x03 );	//	Index erhoehen und ggf. von 4 auf 0 springen
		nDifference										 = ( ReceivedSpeedValuesSum >> 2 );	//	durch 4 teilen

		LastSpeedValue  = nDifference;
	}
	LastSpeedChange	= nMicros;
}

ISR(PCINT2_vect)
{
	uint8_t	PinState	= PIND;
	uint8_t	PinChanges	= PinState ^ LastInterruptState;

	if (PinChanges & (1<<PCINT18))
		SpeedPositionInterrupt();

	LastInterruptState	= PinState;
}

//	Es gibt 2 schalterbaenke
//	Index 0 - 3 - Werden geschaltet bei Tastendruck unter 1 Sekunde
//	Index 4 - 7 - Werden geschaltet bei Tastendruck ueber 1 Sekunde
int8_t	OutputStatus[8] ={LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};

//	Hier die gewuenschen Ausgabepins eintragen
int8_t	OutputPin[8]	= {4, 5, 6, 7, 8, 9, 10, 11};



//	 Wichtig !!! Die Statuswerte ausserhalb des Center muessen die Werte 0-3 behalten, sie werden weiter unten als Indexe verwendet
#define SwitchStatus_100PercentHigh		0
#define SwitchStatus_75PercentHigh		1
#define SwitchStatus_50PercentHigh		2
#define SwitchStatus_25PercentHigh		3

#define SwitchStatus_25PercentLow		4
#define SwitchStatus_50PercentLow		5
#define SwitchStatus_75PercentLow		6
#define SwitchStatus_100PercentLow		7

#define SwitchStatus_Center				100

#define Pin_StatusLED					13

uint32_t	StatusHasLeftTheCenter	= 0;
int			LastSwitchStatus		= SwitchStatus_Center;

void setup() 
{
	Serial.begin(115200);

	PCICR |= (1 << PCIE2);
	//	Es wird das Sevosignal an PIN 2 gelesen
	PCMSK2 |= ( ( 1<<PCINT18));

	sei();

	pinMode(Pin_StatusLED, OUTPUT);
	digitalWrite(Pin_StatusLED, LOW);

	for(int index = 0; index < sizeof(OutputPin); index++)	
	{
		pinMode(OutputPin[index], OUTPUT);
		digitalWrite(OutputPin[index], OutputStatus[index]);
	}
}


void loop() 
{
	Serial.println(LastSpeedValue);

	int SwitchStatus = GetSwitchStatus(LastSpeedValue);
	if ((SwitchStatus != SwitchStatus_Center) && (LastSwitchStatus == SwitchStatus_Center))
	{
		//	Ein Taster wurde gedrueckt, wir merken und die aktuelle Zeit
		StatusHasLeftTheCenter	= millis();
	}
	if ((SwitchStatus == SwitchStatus_Center) && (LastSwitchStatus != SwitchStatus))
	{
		//	Der Taster ist wieder in die Mitte gewandert, also ist der vorherige State interessant um die Funktion auszuloesen

		//	Nun pruefen wir wie lange der Taster gedrueckt wurde
		uint8_t		index = LastSwitchStatus;
		uint32_t difference = millis() - StatusHasLeftTheCenter;

		if (difference > 200)
		{
			//	Die Schwelle von 200ms ist um ein Polling abzufangen

			//	erst schalten wir den Memorywert um
			OutputStatus[index] = OutputStatus[index] == LOW ? HIGH : LOW;
			//	und dann schalten wir den Ausgang
			digitalWrite(OutputPin[index], OutputStatus[index]);
			//	und die gemwerkte Zeit wieder loeschen
		}
		StatusHasLeftTheCenter	= 0;
	}
	LastSwitchStatus = SwitchStatus;
	digitalWrite(Pin_StatusLED, SwitchStatus == SwitchStatus_Center ? LOW : HIGH);

	delay(200);
}

int GetSwitchStatus(uint16_t servoValue)
{
	if (servoValue < 1000)	return SwitchStatus_100PercentLow;
	if (servoValue < 1150)	return SwitchStatus_75PercentLow;
	if (servoValue < 1300)	return SwitchStatus_50PercentLow;
	if (servoValue < 1400)	return SwitchStatus_25PercentLow;
	if (servoValue < 1550)	return SwitchStatus_Center;
	if (servoValue < 1650)	return SwitchStatus_25PercentHigh;
	if (servoValue < 1800)	return SwitchStatus_50PercentHigh;
	if (servoValue < 1900)	return SwitchStatus_75PercentHigh;

	return SwitchStatus_100PercentHigh;
}
 
Nur eine Sache zu deiner Frage wegen dem merken des Wertes. Ich will es mal simpel erklären.

Ich habe zwei Ausgänge, dargestellt von zwei Sandhügeln. Ist der Sandhügel aufgeschüttet (Ausgang = ein) setze ich eine grüne Flagge (1) drauf, ist der Sandhügel abgetragen (Ausgang = aus) setze ich eine rote Flage (0) drauf.
Ich kann natürlich so auch die Flage auf jeden beliebigen anderen Wert setzen. z.B. 0, 25, 50, 75, 100
So kann ich im Sketch schreiben:

Ausgang_a einschalten
Ausgang_a_flag = 1

Ausgang_a ausschalten
Ausgang_a_flag = 0

Statusabfrage:
If Ausgang_a_flag == 1
Reaktion

oder :
If Ausgang_a_flag == 0
Reaktion

So habe ich es im Prinzip in meinem ganzen Lichtanlagen-Sketch gemacht.
Ist vielleicht nicht die perfekte Programmiermethode, aber sehr übersichtlich.

Oder:

Ausgang_a einschalten
Ausgang_a_flag = 1

Ausgang_a ausschalten
Ausgang_a_flag = 0

Statusabfrage:
If Ausgang_a_flag == 1
Reaktion

else
andere Reaktion

Moin Winni,

sehr gut erläutert, genau das geht uns Nerds meistens ab, etwas bildlich für Außenstehende zu erklären die nicht in unserer Wel auf Bits und Bytes zu Hause sind - was für uns täglich Brot ist. Bei vielen Dingen machen wir Berufsentwickler einfach und denken nicht darüber nach, denn es ist ja Standardkram.

Aber ich versuche mein Bestes mein Inselwissen möglichst verständlich und weit zu streuen.
 
:thx:thx:thx und noch mal :thx Peter,
Ich weiß nicht wie du das immer machst, ich sitze den ganzen Tag und schaue und suche. Bin dann auch nicht schlauer als vorher, der Tag ist rum und ich hab nichts geschafft, außer das mein Kopf raucht und ich richtig :sauer bin und die ganze Sche.... an die Wand klatschen könnte. Bei dir geht's so, tipp tipp und schon is es fertig :sabber, so was werd ich mein ganzes Leben net zusammen bringen. Für so einen Sketch brauch ich zwei Jahre lang :poff und verstehen du das dann immer noch nicht :frage:frage

Moin Markus,

bei mir geht das auch nicht mal eben so. Teile des Sketches kommt aus bereits bestehenden Projekten, da greife ich einfach auf funktionierende Teile bisheriger Projekte zurück. Ich habe mir auch erst vieles erarbeiten müssen und die Logiken ausdenken, so manche Stunde brütete ich über meinem Code und fragte mich warum diese besch... LED nicht so leuchtet wie ich das will.

Ich möchte dir noch eine eine Buchempfehlung mit auf den Weg geben:

"Die elektronische Welt mit Arduino entdecken" von Erik Bartmann - ISBN 978-3-89721-319-7. Es ist mit 35€ zwar nicht günstig, aber jeden Cent wert. Es erklärt sehr anschaulich den Einstieg in die Programmierung und vermittelt auch elektronische Grundlagen sehr bildlich und wunderbar verständlich.

Gerade bei den elektronischen Teilen habe ich auch viel experimentiert und vieles geht einfach bei mir, aber wenn Leute wie Winni darauf schauen würden wäre ich wahrscheinlich einen Kopf kürzer. Ich bin kein Experte im Lesen und Auswerten von Datenblättern einzelner Komponenten und in der Einschätzung von Wechselwirkungen, dazu fehlt mir einfach die Ausbildung.

Einfach mutig machen und wenn etwas nicht klappt, dann fragen. So mache ich es auch immer. Nur wer fragt dem kann auch geholfen werden. Das sagte schon die Sesamstraße : "Wer nicht fragt bleibt dumm"... :D
 
:thx euch beiden,

Winni :thx für die Erklärung mit den Hügeln, jetzt hab ich es halb wegs verstanden

Peter :thx für den fertig Sketch, hab grad mal getestet geht alles so weit, nur muss ich länger als 1 Sekunde den Schalter halten sonst geht's nicht. Hier mal der Versuchsaufbau

20191223_204429.jpg

Hatte nur ein wenig Startschwierigkeiten mit dem ULN2803 mein schaltbild das ich bei Winni Beleuchtung gepostet hatte war falsch am com darf kein Minus dran sonst leuchten die LED immer.
 
Moin Markus,

schön dass es geht. Eigentlich sollte nach 200ms Druck die Funktion schalten. Hast du mal dmit deinem Testprogramm geprüft ob evtl. in der Programmierung der Funke auch eine Verzögerung drin ist?

In der loop() Funktion am Ende ist noch ein Delay(200), ändere das doch bitte mal auf delay(20).
 
Hi Peter,

stimmt das so hier unten?

int GetSwitchStatus(uint16_t servoValue)
{
if (servoValue < 1000) return SwitchStatus_100PercentLow;
if (servoValue < 1150) return SwitchStatus_75PercentLow;
if (servoValue < 1300) return SwitchStatus_50PercentLow;
if (servoValue < 1400) return SwitchStatus_25PercentLow;
if (servoValue < 1550) return SwitchStatus_Center;
if (servoValue < 1650) return SwitchStatus_25PercentHigh;
if (servoValue < 1800) return SwitchStatus_50PercentHigh;
if (servoValue < 1900) return SwitchStatus_75PercentHigh;

return SwitchStatus_100PercentHigh;
}


hab das mal so umgeändert?

int GetSwitchStatus(uint16_t servoValue)
{
if (servoValue < 1000) return SwitchStatus_100PercentLow;
if (servoValue < 1150) return SwitchStatus_75PercentLow;
if (servoValue < 1300) return SwitchStatus_50PercentLow;
if (servoValue < 1400) return SwitchStatus_25PercentLow;
if (servoValue < 1550) return SwitchStatus_Center;
if (servoValue < 1650) return SwitchStatus_25PercentHigh;
if (servoValue < 1800) return SwitchStatus_50PercentHigh;
if (servoValue < 1900) return SwitchStatus_75PercentHigh;
if (servoValue < 2050) return SwitchStatus_100PercentHigh;
}

das mit der Sekunde halten ist nicht schlimm, für mich passt das so wunderbar :ok

:thx:thx:thx noch mal für Deine Hilfe
 
Moin Markus,

du kennst ja 9 Zustände. Wenn 8 geprüfte Zustände nicht zutreffen kann es ja nur noch der neunte sein, daher keine weitete Prüfung. Wenn du die neunte Prüfung so realisierst wie von dir vorgeschlagen musst du einen Wert definieren den die Methode in diesem Fall zurück liefert. Diese Methode MUSS einen Wert liefern. Es lommt also letztlich auf das gleiche raus.

Wenn dich die Sekunde nicht stört ist alles gut, es schützt evtl. auch vor Fehlauslösungen. Interessieren würde es mich aber doch. Kann es sein dass der Mixer so eingestellt ist dass der Wert nicht sofort gesetzt wird, sondern über eine Zeit wächst und wieder abfällt?

Ic JGG wünsche dir ein frohes Fest und weiter viel Spaß beim Basteln.
 
:thx Peter wünsch ich dir auch

Die Zeit wenn ich auf 20 ändere, dann kann ich nicht mehr einschalten . Es sind nur die vier Taster mit jeweils 100 % - 25% Gewichtung auf den Kanal 6 gelegt, sonst ist nichts weiteres eingestellt, kann später ja noch ein paar Details und Bilder evtl. a Video machen und einstellen.
 
Um diese Inhalte anzuzeigen, benötigen wir die Zustimmung zum Setzen von Drittanbieter-Cookies.
Für weitere Informationen siehe die Seite Verwendung von Cookies.
 
Hab heut mal weiter gebastelt,
der ULN 2803 mit IC Sockel muss ja irgendwie da mit drauf

Probeweise ins Plastik gefräst, auf Nummer sicher :hfg

20191228_141229.jpg

Passt

20191228_141238.jpg

Von unten

20191228_141248.jpg

Dann hab ich mich am Objekt gewagt

20191228_141306.jpg

Passt

20191228_141322.jpg

Ist noch genug Platz oben

20191228_141445.jpg

Jetzt nur noch diverse Leiterbahnen weg fräsen und alles verkabelt und löten :ok
 

Servonaut
Zurück
Oben Unten