INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Array mit Zähler steuern
13.11.2015, 16:24
Beitrag #9
RE: Array mit Zähler steuern
Bin jetzt schneller dazu gekommen das auszuprobieren als gedacht.
Der Vorschlag von Thorsten funktioniert. Vielen Dank dafür!!
Deshalb werd ich mich im Moment erstmal nicht mit Port-Registern auseinandersetzen. Aber trotzdem vielen Dank Klaus. Wird bestimmt irgendwann noch interessant für mich.

Aber da ich ja auch was lernen will bei der ganzen Sache wärs super wenn ihr mir noch erklären könntet warum's jetzt funktioniert.
Mir ist einfach nicht klar woher die Leds den Befehl HIGH bzw. LOW nehmen. Das hab ich ja nirgends angegeben.

Dankeschön und schöne Grüße
Ferdi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.11.2015, 16:54
Beitrag #10
RE: Array mit Zähler steuern
(13.11.2015 16:24)ferdi schrieb:  Bin jetzt schneller dazu gekommen das auszuprobieren als gedacht.
Der Vorschlag von Thorsten funktioniert. Vielen Dank dafür!!
Deshalb werd ich mich im Moment erstmal nicht mit Port-Registern auseinandersetzen. Aber trotzdem vielen Dank Klaus. Wird bestimmt irgendwann noch interessant für mich.

Aber da ich ja auch was lernen will bei der ganzen Sache wärs super wenn ihr mir noch erklären könntet warum's jetzt funktioniert.
Mir ist einfach nicht klar woher die Leds den Befehl HIGH bzw. LOW nehmen. Das hab ich ja nirgends angegeben.

Dankeschön und schöne Grüße
Ferdi

---
digitalWrite(LedsButtons[j], j==i);

das Ergebnis von "j==i" ist entweder TRUE oder FALSE und das hat "zufällig" den gleichen Wert wie HIGH oder LOW.
ich halte es trotzdem für keinen guten Stil das so zu schreiben.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.11.2015, 17:27
Beitrag #11
RE: Array mit Zähler steuern
(13.11.2015 16:54)Pit schrieb:  digitalWrite(LedsButtons[j], j==i);

das Ergebnis von "j==i" ist entweder TRUE oder FALSE und das hat "zufällig" den gleichen Wert wie HIGH oder LOW.
ich halte es trotzdem für keinen guten Stil das so zu schreiben.
Hi,
ich glaube nicht einmal, dass HIGH und TRUE denselben Wert hat. (Ich bin jetzt aber zu faul, um nachzuschauen.) Bei digitalWrite kommt es aber nur darauf an, ob's 0 oder nicht 0 ist, und das ist bei TRUE und FALSE definitiv der Fall.
Anyway, mann kann es auch expliziter so schreiben:
Code:
digitalWrite(LedsButtons[j], j==i ? HIGH : LOW);
Allerdings dürfte das ein paar Taktzyklen länger dauern.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.11.2015, 19:20
Beitrag #12
RE: Array mit Zähler steuern
(13.11.2015 16:54)Pit schrieb:  ich halte es trotzdem für keinen guten Stil das so zu schreiben.

also, was man teilweise so an C-Code liest, ist das IMO absolut perfekter, wunderschöner Programmierstil!
Smile

Code:
#include "stdio.h"
#define e 3
#define g (e/e)
#define h ((g+e)/2)
#define f (e-g-h)
#define j (e*e-g)
#define k (j-h)
#define l(x) tab2[x]/h
#define m(n,a) ((n&(a))==(a))

long tab1[]={ 989L,5L,26L,0L,88319L,123L,0L,9367L };
int tab2[]={ 4,6,10,14,22,26,34,38,46,58,62,74,82,86 };

main(m1,s) char *s; {
    int a,b,c,d,o[k],n=(int)s;
    if(m1==1){ char b[2*j+f-g]; main(l(h+e)+h+e,b); printf(b); }
    else switch(m1-=h){
        case f:
            a=(b=(c=(d=g)<<g)<<g)<<g;
            return(m(n,a|c)|m(n,b)|m(n,a|d)|m(n,c|d));
        case h:
            for(a=f;a<j;++a)if(tab1[a]&&!(tab1[a]%((long)l(n))))return(a);
        case g:
            if(n<h)return(g);
            if(n<j){n-=g;c='D';o[f]=h;o[g]=f;}
            else{c='\r'-'\b';n-=j-g;o[f]=o[g]=g;}
            if((b=n)>=e)for(b=g<<g;b<n;++b)o[b]=o[b-h]+o[b-g]+c;
            return(o[b-g]%n+k-h);
        default:
            if(m1-=e) main(m1-g+e+h,s+g); else *(s+g)=f;
            for(*s=a=f;a<e;) *s=(*s<<e)|main(h+a++,(char *)m1);
        }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.11.2015, 12:35
Beitrag #13
RE: Array mit Zähler steuern
Also bei dem letzten Beispiel bin ich jetzt komplett raus :-)

Ob das ganze jetzt schön programmiert ist oder nicht kann ich nicht beurteilen. Aber so lange das passiert was ich will bin ich happy. Also danke dafür!

Ich wollte jetzt in meinen Code noch eine weitere Funktion einbauen bei der ich eigentlich gedacht hab "das ist ganz einfach und ich krieg das alleine hin", aber dem ist wohl doch nicht so und jetzt bräuchte ich nochmal Hilfe. (Wird wahrscheinlich auch nicht das letzte Mal gewesen sein)

Also hier mal mein (momentan) kompletter Code:
Code:
int controlChange = 176; //MidiBefehl Kanal1

// 4Fader
int FaderPin[] =          {A0,A1,A2,A3};
int smoothFader[] =       {0, 0, 0, 0};
int controllerNummer[] =  {20,21,22,23};
int controllerWert[] =    {0 ,0, 0 ,0};
int controllerWertAlt[] = {0 ,0, 0 ,0};
int FaderWert[] =         {0 ,0, 0 ,0};

int i = 0;  //Zaehler für Faderabfrage

// 4Leds für Fader
int LedsFader[] =  {2,3,4,5};
int FaderValue[] = {0,0,0,0};

//4 Buttons
int ButtonsPIN[] =   {39, 40, 41, 42};
int Buttons[] =      {LOW,LOW,LOW,LOW};
int ButtonsAlt[] =   {LOW,LOW,LOW,LOW};

int y = 0; //zaehler für Buttons

//4Leds für Buttons
int LedsButtons[] = {50,51,52,53};

//Timer für ButtonsLeds                Led1  Led2 Led3  Led4
unsigned long previousMillisLeds[] =  {0,   0,    0,    0};
unsigned long ZeitLeds[] =            {10000,15000,20000,25000};

//Debounce Buttons
long ButtonTime =     0;
long ButtonDebounce = 30;

//MIDIBefehle für Buttons
//int dataByte1[] =     {40, 41, 42, 43};   // Note

//Leds Backgroundbeleuchtung und Warnung

int LedBG1 = 68;
int LedBG2 = 69;

unsigned long previousMillisLedsBGStart[] = {0,0,0,0};




void setup() {

  Serial.begin(9600);

  //Eingänge Buttons
  pinMode(39, INPUT_PULLUP);
  pinMode(40, INPUT_PULLUP);
  pinMode(41, INPUT_PULLUP);
  pinMode(42, INPUT_PULLUP);

  //Ausgänge Leds
  pinMode(50, OUTPUT);
  pinMode(51, OUTPUT);
  pinMode(52, OUTPUT);
  pinMode(53, OUTPUT);  

  pinMode(68, OUTPUT);
  pinMode(69, OUTPUT);
}



void loop() {
  
  //FaderAbfrage
  for (i = 0; i < 4; i++) {
    FaderWert[i] = analogRead(FaderPin[i]);
    smoothFader[i] = 0.6 * smoothFader[i] + 0.4 * analogRead(FaderPin[i]);
    controllerWert[i] = map(smoothFader[i],0,1023,0,127);

    if (controllerWert[i] != controllerWertAlt[i]) {
      Serial.write(controlChange);
      Serial.write(controllerNummer[i]);
      Serial.write(controllerWert[i]);

    controllerWertAlt[i] = controllerWert[i];
    }    
  }

  for (i = 0; i < 4; i++) {
    FaderValue[i] = analogRead(FaderPin[i]);
    FaderValue[i] = map(FaderValue[i],0,1023,0,255);

    analogWrite (LedsFader[i], FaderValue[i]);
  }
  
  //ButtonAbfrage
  for (y = 0; y < 4; y++) {
    Buttons[y] = digitalRead(ButtonsPIN[y]);

    
    if (Buttons[y] == LOW && ButtonsAlt[y] == HIGH && millis()-ButtonTime > ButtonDebounce) {
     MIDIsenden(144,y+40,127);
     switchOnOnlyOne(y);
     ButtonsAlt[y] = Buttons[y];
     ButtonTime = millis();
    }


    if (millis()-previousMillisLeds[y] > ZeitLeds[y]) {
      digitalWrite(LedsButtons[y], LOW);
      previousMillisLeds[y] = millis();
      ButtonsAlt[y] = Buttons[y];
    }
    
    if (Buttons[y] == HIGH && ButtonsAlt[y] == LOW && millis()-ButtonTime > ButtonDebounce) {
      MIDIsenden(144,y+40,0);
      previousMillisLeds[y] = millis();
      ButtonsAlt[y] = Buttons[y];
      ButtonTime = millis();
    }
  }
}


void MIDIsenden(int statusByte, int dataByte1, int dataByte2) {  
    Serial.write(statusByte);   //NoteOn Kanal1
    Serial.write(dataByte1);    //Note (40,41,42,43)
    Serial.write(dataByte2);    //Anschlagsstärke (0 oder 127)
}


void switchOnOnlyOne(int z) {
  for(int j = 0; j < 4; j++)
    digitalWrite(LedsButtons[j], j == z);
}

so jetzt habe ich noch 2 Leds (die an Pin 68 und 69) hinzugefügt und will, dass diese 2 Leds immer 5Sekunden bevor die leuchtende "LedsButtons" (die ich ja über "ZeitLeds" steuere) ausgeht als Warnung für diese verbleibenden 5Sekunden blinken.

Also hab ich mir gedacht ich schreibe einfach folgende Funktion:
Code:
void Blinken() {
  int a = 0;
  boolean value = LOW;
  unsigned long previousMillisLedsBG = 0;
  unsigned long interval = 250;

  if(a<20)
    if(millis()-previousMillisLedsBG > interval) {
      previousMillisLedsBG = millis();
      value =! value;
      digitalWrite(LedBG1, value);
      digitalWrite(LedBG2, value);
      a++;
      }
}

und dann mach ich in meinen Loop noch eine weitere if-Schleife:
Code:
if(millis()-previousMillisLedsBGStart[y] > ZeitLeds[y]-5000) {
      Blinken;
      previousMillisLedsBGStart[y] = millis();
    }

dann passiert aber genau mal gar nichts.

hab jetzt schon alles mögliche ausprobiert (wie Ichs schreibe und auch wohin) zum Beispiel ins void switchonlyone oder in die erste if-schleife. hab auch probiert das Ganze nicht als extra Funktion sondern direkt in den Loop zu schreiben …….
Aber es funktioniert nie so wie Ichs haben will. Entweder tut sich gar nichts oder es funktioniert nur einmal oder es hört nicht mehr auf zu blinken oder es blinkt komplett unregelmäßig…. also auf alle Fälle nicht so wies soll.

Also ich setzte all meine Hoffnungen in euch ;-)

Danke und Grüße

Ferdi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.11.2015, 12:44
Beitrag #14
RE: Array mit Zähler steuern
Code:
void Blinken() {
  static boolean value = LOW;
  static unsigned long previousMillisLedsBG = 0;
  unsigned long interval = 250;

    if(millis()-previousMillisLedsBG > interval) {
      previousMillisLedsBG = millis();
      value =! value;
      digitalWrite(LedBG1, value);
      digitalWrite(LedBG2, value);
      }
  
}

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.11.2015, 13:32 (Dieser Beitrag wurde zuletzt bearbeitet: 18.11.2015 14:07 von ferdi.)
Beitrag #15
RE: Array mit Zähler steuern
Hilft leider nichts Thorsten.

also die Funktion an sich funktioniert. wenn ich sie am Anfang oder Ende meines Loops setzte blinken die Leds. Nur wenn ich die Funktion in eine If-Schleife setzte (egal ob ich eine neue mache oder in eine der bereits bestehenden) leuchten die Leds dauerhaft.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.11.2015, 14:28
Beitrag #16
RE: Array mit Zähler steuern
Hi,
versuchst Du die Funktion "Blinken" tatsaechlich so aufzurufen?
Code:
Blinken;
Das geht natuerlich nicht. Dieser Ausdruck gibt einfach nur die Adresse, an der die Funktion steht zurueck. Richtig ist
Code:
Blinken();
Das ist C++ und nicht Perl oder so.
Gruss,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Servo über Temperatur steuern querkopf71 2 12 Heute 18:59
Letzter Beitrag: querkopf71
  Ein als "const" deklariertes Array übergeben Retian 5 126 08.11.2016 18:39
Letzter Beitrag: Tommy56
  Zähler Uwe1475 14 1.433 03.09.2016 20:45
Letzter Beitrag: Uwe1475
  Arduino Steuern über eigne Homepage b3ta 8 400 16.08.2016 11:07
Letzter Beitrag: Pit
  PWM-Lüfter mit Adafruit Motor-Shield steuern? phischmi 9 450 22.07.2016 18:06
Letzter Beitrag: phischmi
  "Nichtlineare" Zähler Turbo-S 13 670 20.07.2016 19:38
Letzter Beitrag: Turbo-S
  Steuern von 4 Servo mittels eines Taster und eines Potis Jackie09 17 757 16.07.2016 11:43
Letzter Beitrag: Binatone
  String-Array füllen? torsten_156 9 445 08.07.2016 20:07
Letzter Beitrag: amithlon
  Messwerte in Array speichern ArduinoMega2560 2 419 07.06.2016 16:30
Letzter Beitrag: SkobyMobil
  DC Motor in beide Richtungen steuern WIMunios 5 646 24.03.2016 12:04
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste