Go Down

Topic: N mal blinken vor nächster Funktion (Read 3448 times) previous topic - next topic

uwefed

Aug 26, 2014, 12:34 am Last Edit: Aug 26, 2014, 02:16 am by uwefed Reason: 1
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.

Code: [Select]

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]

sschultewolter

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

Code: [Select]

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

case 2:
//..
}


Code: [Select]

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);
}
}
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

sschultewolter

Hallo Uwe,

hab noch mal eben im Atmel Studio gebastelt. Passte bei mir sogar ins Projekt ;)
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.

Code: [Select]

/*
* 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;
}
}
}
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

uwefed

#3
Aug 26, 2014, 02:12 am Last Edit: Aug 26, 2014, 02:18 am by uwefed Reason: 1
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:
Code: [Select]
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:
Code: [Select]

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:
Code: [Select]
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

sschultewolter

Viele Wege führen nach Rom.

Finde dein doch schon recht komplex, aber wenn die funktioniert, ist doch gut.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Scotch

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.
Quote
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

uwefed

#6
Aug 26, 2014, 07:51 am Last Edit: Aug 26, 2014, 07:57 am by uwefed Reason: 1
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

Scotch

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,
https://www.youtube.com/watch?v=fv-bmD-Fwpk

uwefed

#8
Aug 26, 2014, 09:44 pm Last Edit: Aug 27, 2014, 08:05 am by uwefed Reason: 1
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  ;) ;) ;) )
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

uwefed

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

sschultewolter

Warten wir mal die beleuchtete Version in Milchglasoptik ab ;) 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.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

SkobyMobil

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

uwefed


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

Go Up