N mal blinken vor nächster Funktion

Hallo Arduino Forum User

Heute brauch ich mal Hilfe von Euch.

Ich möchte in einer Switch Auswahl zuerst eine LED n mal aufleuchten lassen und dann die LED nach der jeweiligen Funktion ansteuern. Das alles möchte ich ohne delay() machen um andere Funktionen aufrufen zu können.

Der Modus wird über einen Taster (mit capsense) weitergeschaltet.

switch(modus)
  {
  case 1:
     blink(1)
     funktion1()
     break;
   case 2:
     blink(2)
     funktion2()
     break;
  case 3:
     blink(3)
     funktion3()
     break;  
...
}

[EDIT] besser erklährt[/EDIT]

Ungetestet, könnte von der Idee her aber klappen, bzw. sollte die in die richtige Richtung führen.

switch(modus)
{
	case 1:
	modus += led_blink(10, 100);
	break;

	case 2:
	//..
}
int8_t led_blink(uint8_t count, uint32_t time)
{
	static uint32_t last_millis;
	static uint8_t _count;
	static int8_t led_state;

	if(_count == 0) count = _count;

	if(millis() - last_millis > time)
	{
		last_millis = millis();
		led_state = !last_state;
		_count--;
		if(_count == 0) return 1;
		digitalWrite(LED, led_state);
	}
}

Hallo Uwe,

hab noch mal eben im Atmel Studio gebastelt. Passte bei mir sogar ins Projekt :wink:
Funktion solltest du problemlos, falls überhaupt erwünscht, auf "Arduino Style" umbauen können.

Der Code ist getestet und funktioniert. Sobald die Led 10mal getoggelt (10mal an + 10mal aus) ist, übergibt sie 1/true als Rückgabewert. Entsprechend geht die Switch-Anweisung einen Schritt weiter. (break in Case 1 beabsichtig weggelassen, würde aber auch mit gehen). Zum testen, ob die Funktion auch ein 2. mal ordentlich gestartet werden kann, lasse ich in bei default nach einer gewissen Zeit diese erneut starten.

/*
* t85_led_ws2812b.c
*
* Created: 26.08.2014 00:49:46
*  Author: sschultewolter
*/

#define F_CPU		8E6

#define LED_PORT	PORTB
#define LED_DDR		DDRB
#define LED_L1		(1 << PB3)
#define LED_L2		(1 << PB4)
#define LED_R1		(1 << PB2)
#define LED_R2		(1 << PB1)

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

volatile uint32_t millis;

ISR (TIMER0_COMPA_vect)
{
	millis++;
}

int8_t leds_left_blink(int8_t repeat, uint16_t interval)
{
	static int8_t _repeat;
	static uint32_t last_millis;
	
	if(_repeat <= 0) _repeat = repeat*2;	// Initialisierung
	
	if(millis - last_millis >= interval)
	{
		last_millis = millis;
		LED_PORT ^= LED_L2;					// LED togglen
		if(--_repeat <= 0) return 1;		// Anzahl an Wiederholungen erreicht
	}
	return 0;
}

int main(void)
{
	LED_DDR = (LED_L1 | LED_L2 | LED_R1 | LED_R2);
	
	TCCR0A = (1<<WGM01);
	TCCR0B |= (1<<CS01 | 1<<CS00);
	OCR0A = 124;
	TIMSK |= (1<<OCIE0A);
	sei();
	
	while(1)
	{
		static uint32_t last_millis;
		static int modus;
		
		switch(modus)
		{
			case 0:
			modus += leds_left_blink(5, 500);
			break;
			
			case 1:
			last_millis = millis;
			modus++;
			
			default:
			LED_PORT ^= LED_L1;
			if(millis - last_millis > 5000) modus = 0;
			break;
		}
	}
}

Ups

Hatte gedacht den Topic nicht aufgemacht (verschickt) zu haben :~ :~ :~ Hatte geglaubt ihn gelöscht zu haben.

Wie so oft wenn man um Hifle schreibt, hat man das Problem schon so aufgearbeitet, daß man selbst eine Lösung gefinden hat. Ich benutze eine WS2812LED zu 8mm mit der FastSPI_LED Bibliothek und einen Taster mit Capsense-Bibliothek

Meine Lösung ist:
Die Blinkfunktion:

void blink(byte number_blink)
	{
        if (status_blink == 0)
		{
		previous_millis_blink = millis();
                set_color_led(0, 255, 255, 255);  // GRB for WS2812LED set white	
                FastSPI_LED.show();
                LED_blink_status = 1;
                number_blink_aktual = number_blink;
		status_blink = 1; 

		}
	if(millis() - previous_millis_blink > interval_blink)   
		{         
		if(LED_blink_status == 0)
			{
                        if(number_blink_aktual <= 0 )  // stop blinking
				{
				status_blink = 0 ;
				LED_blink_status = 0 ;
				status_blink_aktive = 0 ;
				return;
				}  
			set_color_led(0, 255, 255, 255);  // GRB for WS2812LED set white
			}
		else
			{
			set_color_led(0, 0, 0, 0);  // GRB for WS2812LED set off  
			number_blink_aktual --;			
			}
		LED_blink_status = !LED_blink_status;
		FastSPI_LED.show();
		previous_millis_blink = millis();
		}
	}

Den Switch Teil:

switch (Mode_Counter) 
			{
			case 0:
				Rainbow_manual();
				break;
			case 1:
				if(status_blink_aktive == 1)
					{
					blink(1);
					}			
				break;
			case 2:                                          // Automatic Rainbow
				if(status_blink_aktive == 1)
					{
					blink(2);
					}
				else
					{
					Rainbow_automatic();	
					}				
				break;
			case 3:
				if(status_blink_aktive == 1)
					{
					blink(3);
					}
				else
					{
                                        Rainbow_automatic_fast();
                                        }  
				break;
....

und der Moduswechsel:

if ((mean_capsense > limit_capsense + hysteresis_capsense) && (status_capsense == 0)) // fist time capacitive sensor on
			{
			digitalWrite(CONTROL_LED_PIN_13,HIGH);  // status LED to see if Capsense is set.
			if(status_manual == 0) 
				{
				Mode_Counter++;
				status_blink_aktive =1;                   // set blink aktive
				}
....

sschultewolte Danke für Deine Bemühungen.
Meine Version ist etwas komplizierter als Deine wobei ich bei meiner Version sicher bin daß sie funktioniert weil ausprobiert.
Grüße Uwe

Viele Wege führen nach Rom.

Finde dein doch schon recht komplex, aber wenn die funktioniert, ist doch gut.

Moin Uwe,
da ich hier auch hin und wieder mit dem WS2812 arbeite würde ich mich freuen wenn Du Dein Projekt mal komplett vorstellen würdest. Kann man ja noch etwas daraus lernen.

Aus diesem Satz werde ich nicht ganz schalu.

Ich benutze eine WS2812LED zu 8mm mit der FastSPI_LED Bibliothek und einen Taster mit Capsense-Bibliothek

WS 2812, FastSPI_LED und Capsens-Bib. ist soweit klar aber was sollen die 8mm aussagen?

Gruß Ingo

Es gibt die WS2812 auch in einem 8mm LED Gehäuse. Laut Datenblatt auch im 5mm Gehäuse.

zB bei http://www.watterott.com/de/WS2812-8mm-LED
Aber Achtung. Die haben gegenüber der SMD Variante eine andere Reihenfolge der Daten für die Farbe. Die SMD version braucht RGB, die LED-Version GRB. (bezogen auf die Reihenfolge der Bits die übertragen werden). Ein Sketch für die SMD Version mit der LED Version WS2812 wird falsche Farben anzeigen.

Grüße Uwe

Ahhh du hast die einzelnen LED's
Das mit RGB und GRB habe ich in einem Scetch schon mal gelesen.
Ich habe bei mir die SMD LED Stripes mit 60 St./m als Ambiente Beleuchtung für meine TV Wand.
Diese kann ich (wenn ich es endlich mal umbaue) per WiFi vom Handy steuern.
Z.Z. läuft es noch mit der IR Fernbedinung.
Als APP / Schnitstelle habe ich die NetIO App von David Eickhoff im Einsatz.
http://netio.davideickhoff.de/de/

Gruß Ingo
PS Hier eine kleine Demo,

Am 26 September wird in Bozen die lange Nacht der Forschung organisiert.
http://langenachtderforschung.it/de
Die TIS mit ihrem Fablab wird auch eine Station sein
https://tis.bz.it/de/events/lange-nacht-der-forschung-1
und Interessierte können sich eine beleuchteten Plexiglaswürfel bauen.

Zuschnitt mit Laserschneider 3mm MilchPlexiglas

1 Leonardo
1 WS2812 8mm LED
1 LM35 Temperatursensor, kriminell von 2 Pins versorgt ( soll halt einfach sein :wink: :wink: :wink: )
1 ein tilt-Sensor (den ich noch nicht habe und darum im sketch noch nicht vorkommt
1 kapazitiver Sensor mit einem 3,3MOhm und 100pF Kondensator und capsense

Foto folgt demnächst und der angehängte Sketch ist auch noch auszufeilen.
Tis wird auch noch eine Presentation online stellen.

NB. I moment funktioniert der angehängte Code nur habe ich probleme mit der Capsense Bibliothek daß sie am anfang falsche Tastendrücke gibt und sich das nach ca 5 minuten legt.
Grüße Uwe

luna_capsense__WS2812LED14.ino (16.5 KB)

Und hier ein Foto des Prototypen. Das Gehäuse wird noch in milchigen Plexiglas gemacht. Für den Prototypen war nur durchsichtiges in Greifweite.

Grüße Uwe

Warten wir mal die beleuchtete Version in Milchglasoptik ab :wink: Könnte mir das gut vorstellen.
Hab sowas noch vor für einen Tisch. Bei dem sollen 64 Felder verbaut werden. Die Ihre Farbe bei Berührung ändern. Derzeit nur in Planung. Muss sehen, dass man die Sensoren später nicht sieht. Über Drucktaster kann ichs nicht lösen da dieser Wasserdicht sein soll.

Hallo,
bei der Verdrahtung wäre eine MargarineSchachtel besser gewesen- so ein schönes Gehäuse- und...
manmanman!
Gruß und Spaß
Andreas

SkobyMobil:
Hallo,
bei der Verdrahtung wäre eine MargarineSchachtel besser gewesen- so ein schönes Gehäuse- und...
manmanman!
Gruß und Spaß
Andreas

Andreas Du hast 2 Sachen übersehen:
Prototype und Milchplexiglas.
Du weißt, daß man bei Prototypen das nehmen muß was man bekommt. Die Pins der LED waren schon gebogen und darum mußten sie gekreuzt an der Versorgung angeschlossen werden.

Viele Grüße Uwe