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
Programm übersichtlich gestalten
24.01.2015, 16:20
Beitrag #1
Programm übersichtlich gestalten
Hallo, ich hätte gerne eine Rat für übersichtlicheres Programmieren.
Ich übe mit Kapazitiven Sensoren - 12 stk und auf einer Sd-Karte ligende wav-Dateien.
Mit einem Button sollen / werden verschiedene wav-Datei Sets aktiviert.
Mein jetziges Programm funktioniert, aber wenn man dann 10 wav-Dateien Sets dazu
schreibt wird das ganz ja richtig lang. Gibt es eine übersichtlichere Methode ?
Habe versucht den Teile mit den jeweiligen wav-Sets als ekstra Datei dem Hauptprogramm anzuhängen, hat nicht hin gehauen,
da ich ein wenig neu bin kan ich den Fehler nicht erkennen.

Wie könnte man das machen ?

Mit freundlichen Gregor - Dänemark

Versuchs Aufbau :
Arduino Uno
Kapazitiven Sensoren = alufolie so wie hier CapSense
R = 10M ohm
Button mit internal pull-up
Sd-Karte nur lesen

Hier mein code ist halt ein wenig lang :

Code:
#include <SD.h>                      // need to include the SD library

#define SD_ChipSelectPin 10  ///using this digital pin for button, but for som reason the SD-card still needed do not change!!

#include <TMRpcm.h>           //  also need to include this library...Wav files

#include <SPI.h>

TMRpcm tmrpcm;   // create an object called : tmrpcm for use in this sketch

//-------button--------------------------------
// this constant won't change:
const int  buttonPin = 10;    // the pin that the pushbutton is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

//--------------------------------

#include <CapacitiveSensor.h>

// 10 megohm resistor
CapacitiveSensor   cs_8_A0 = CapacitiveSensor(8,A0); // analog output = Ax
CapacitiveSensor   cs_8_A1 = CapacitiveSensor(8,A1);  
CapacitiveSensor   cs_8_A2 = CapacitiveSensor(8,A2);
CapacitiveSensor   cs_8_A3 = CapacitiveSensor(8,A3);
CapacitiveSensor   cs_8_A4 = CapacitiveSensor(8,A4);
CapacitiveSensor   cs_8_A5 = CapacitiveSensor(8,A5);
CapacitiveSensor   cs_8_2 = CapacitiveSensor(8,2);
CapacitiveSensor   cs_8_3 = CapacitiveSensor(8,3);
CapacitiveSensor   cs_8_4 = CapacitiveSensor(8,4);
CapacitiveSensor   cs_8_5 = CapacitiveSensor(8,5);
CapacitiveSensor   cs_8_6 = CapacitiveSensor(8,6);
CapacitiveSensor   cs_8_7 = CapacitiveSensor(8,7);



void setup() {

  // -------- button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(10, INPUT_PULLUP); // internal pull-up


  //-----Speaker----https://github.com/TMRh20/TMRpcm/wiki -----

  tmrpcm.speakerPin = 9; //Lautsprecher
  tmrpcm.volume(1);
  tmrpcm.quality(0);

  //-----SD-Card
  if (!SD.begin(SD_ChipSelectPin)) {  // see if the card is present and can be initialized:
    return;   // don't do anything more if not
  }

  Serial.begin(9600);
}  



void loop() {

  long start = millis();
  long X0 =  cs_8_A0.capacitiveSensor(30);
  long X1 =  cs_8_A1.capacitiveSensor(30);
  long X2 =  cs_8_A2.capacitiveSensor(30);
  long X3 =  cs_8_A3.capacitiveSensor(30);
  long X4 =  cs_8_A4.capacitiveSensor(30);
  long X5 =  cs_8_A5.capacitiveSensor(30);
  long X6 =  cs_8_2.capacitiveSensor(30);
  long X7 =  cs_8_3.capacitiveSensor(30);
  long X8 =  cs_8_4.capacitiveSensor(30);
  long X9 =  cs_8_5.capacitiveSensor(30);
  long X10 =  cs_8_6.capacitiveSensor(30);
  long X11 =  cs_8_7.capacitiveSensor(30);

  serialPrint(millis() - start,X2);

  //-------Button-----------------------------

  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter; HIGH = buttonpressed
    if (buttonState == LOW) {
      // if the current state is LOW then the button wend OFF, if HIGH then the button wend ON
      buttonPushCounter++;

      //button - max count then 0
      if(buttonPushCounter==3)
      {
        buttonPushCounter=0;
      }

      // debouncing
      delay(250);
      //Serial
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    }
    else {
      // if the current state is LOW then the button
      // wend from on to off:
     Serial.println("off");
    }
  }
  // save the current state as the last state,
  //for next time through the loop
  lastButtonState = buttonState;



//- 1. set of wav files

  if (buttonPushCounter % 3 == 0) {
  
    updateMelody(X0);
    updateMelody1(X1);
    updateMelody2(X2);
    updateMelody3(X3);
    updateMelody4(X4);
    updateMelody5(X5);
    updateMelody6(X6);
    updateMelody7(X7);
    updateMelody8(X8);
    updateMelody9(X9);
    updateMelody10(X10);
    updateMelody11(X11);
    
  
  }

//--- 2. set of wav files

  if (buttonPushCounter % 3 == 1) {  

  
    updateMelody12(X0);
    updateMelody13(X1);
    updateMelody14(X2);
    updateMelody15(X3);
    updateMelody16(X4);
    updateMelody17(X5);
    updateMelody18(X6);
    updateMelody19(X7);
    updateMelody20(X8);
    updateMelody21(X9);
    updateMelody22(X10);
    updateMelody23(X11);
    

  }




}

//-----------Wav-Files-------



void updateMelody(long value)
{    
  if(value >163800) {
    //delay(25); // tidforsinkelse p.g.a bedere kontakt 221000/200000

      tmrpcm.play("1.wav");
  }

}



void updateMelody1(long value) {
  if(value >163800) {

    tmrpcm.play("2.wav");
  }

}

void updateMelody2(long value)
{    
  if(value >1600) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("3.wav");
  }

}

void updateMelody3(long value)
{    
  if(value >162800) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("4.wav");
  }

}

void updateMelody4(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("5.wav");
  }

}

void updateMelody5(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("6.wav");
  }

}

void updateMelody6(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("7.wav");
  }

}

void updateMelody7(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("8.wav");
  }

}

void updateMelody8(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("9.wav");
  }

}

void updateMelody9(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("10.wav");
  }

}
void updateMelody10(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("11.wav");
  }

}
void updateMelody11(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("12.wav");
  }

}


void updateMelody12(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("13.wav");
  }

}

void updateMelody13(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("14.wav");
  }

}

void updateMelody14(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("15.wav");
  }

}
void updateMelody15(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("16.wav");
  }

}
void updateMelody16(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("17.wav");
  }

}
void updateMelody17(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("18.wav");
  }

}
void updateMelody18(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("19.wav");
  }

}
void updateMelody19(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("20.wav");
  }

}
void updateMelody20(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("21.wav");
  }

}
void updateMelody21(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("22.wav");
  }

}
void updateMelody22(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("23.wav");
  }

}
void updateMelody23(long value)
{    
  if(value >163000) {
    //delay(50); // tidforsinkelse p.g.a bedere kontakt

    tmrpcm.play("24.wav");
  }

}


void serialPrint(long atime, long X2){
  Serial.print(atime);
  Serial.print("\t");
  Serial.println(X2);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.01.2015, 18:33
Beitrag #2
RE: Programm übersichtlich gestalten
Hi,
ich würde zuerst mal die ganzen Sensoren in ein Array verpacken. Die ganzen X0...Xn ebenfalls. Dann kannst Du Deine Sensoren schonmal in einer for-Schleife abfragen.
Aus den ganzen updateMelody-Funktionen würde ich eine machen mit entsprechenden Parametern. Wenn Du das geschickt machst, dann kann man den Parameter für den Dateinamen innerhalb einer for-Schleife aus dem Schleifenindex und dem buttonPushCounter berechnen. Die unterschiedlichen Vergleichswerte würde ich auch in ein Array packen.
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
26.01.2015, 18:50
Beitrag #3
RE: Programm übersichtlich gestalten
Hallo Thorsten, dank für die antwort. Sie hilft mir ein wenig weiter, muss mich aber als neuling erstmal einmal mich dem Thema - Array und for-Schleife ein lesen und üben.

Hier das Bild vom aufbau:

   

Gruss Gregor
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.01.2015, 19:35
Beitrag #4
RE: Programm übersichtlich gestalten
Hi,
ich kann hier zwei interessante Sachen sehen:
1. Das mit den kapazitiven Sensoren kannte ich noch nicht.
2. Liest Du die SD-Karte nur mit ein paar Widerständen aus? Wie geht sowas?
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
27.01.2015, 08:00
Beitrag #5
RE: Programm übersichtlich gestalten
Hallo Thorsten ,
das mit der Sd-Karte habe hier gefunden, link - DIY Micro SD Shield for Arduino und dann durch try/error heraus gefunden,
das die Sd-Karte nur pin 11-12-13 braucht um zu lesen, aber pin 10 braucht damits funktioniert.

Das mit den kapazitiven Sensoren, habe ich auch zufällig gefunden, hier nochmal den link http://macherzin.net/CapSense, man könnte eigentlich alles nehmen das leitet. Ich habe hier selbstklebende kuppferstreifen benutzt, der erste versuch war mit alufolie.

Gruss Gregor
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2015, 12:29
Beitrag #6
Programm übersichtlich gestalten - so gelöst
Hallo, ich habe das jetzt so gelöst, das mit dem Array ist so teilweise gebraucht.
Ich habe Programmteile seperat und im Hauptprogramm darauf hingewiesen.
Das gibt mir dann die übersichtlichkeit die Ich brauche. Siehe Anhänge.
Die ganze Hauptprogramierung ist nicht mein verdienst, das waren klügere Köpfe.
Dank an Thorsten mit dem Array input.

Gruss aus Dänemark
Gregor


Angehängte Datei(en)
.ino  CapacitiveSensor_Array_1.ino (Größe: 2,71 KB / Downloads: 18)
.ino  playKeyPress.ino (Größe: 899 Bytes / Downloads: 20)
.ino  measureKeys.ino (Größe: 406 Bytes / Downloads: 18)
.ino  button.ino (Größe: 698 Bytes / Downloads: 22)
.ino  buttonPushCounter1.ino (Größe: 976 Bytes / Downloads: 15)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2015, 18:24
Beitrag #7
RE: Programm übersichtlich gestalten - so gelöst
Hi,
playKeyPress müsste auch kürzer gehen:

Code:
void playKeyPress()
{
   for(byte i = 0; i < 12; i++) {
       if (sensor[i] > threshold) {
            tmrpcm.play(String(i+1).concat(".wav"));
            break;
       }
   }
}

Ich habe das nicht ausprobiert, bin aber sicher, dass das Prinzip funktioniert.
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
29.01.2015, 20:01
Beitrag #8
RE: Programm übersichtlich gestalten
Hallo,
ich habs probiert, es gab folgende error :

Code:
playKeyPress.ino: In function ‘void playKeyPress()’:
playKeyPress.ino:44:50: error: invalid conversion from ‘unsigned char’ to ‘char*’ [-fpermissive]
In file included from CapacitiveSensor_Array_1.ino:23:0:
/home/gregor/sketchbook/libraries/TMRpcm/TMRpcm.h:31:7: error:   initializing argument 1 of ‘void TMRpcm::play(char*)’ [-fpermissive]
  void play(char* filename);
       ^

TMRpcm.h ist angefügt.

Habe deinen Code und das Prinzip auch verstanden, musste ein wenig suche und llesen über " String.concat "
Ich habe auch einig Wege versucht, die dann aber zu anderen Errors geführt haben oder nur ein wav Datei abgespielt haben auf allen Sensoren.
Über das " ‘unsigned char’ to ‘char*’ " habe ich auch gesucht, aber nicht so richtig was gefund was mir das erklärt hätte.

Gruss Gregor


Angehängte Datei(en)
.h  TMRpcm.h (Größe: 2,53 KB / Downloads: 63)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Fehler in meinem Programm Franz54 7 164 01.12.2016 23:58
Letzter Beitrag: hotsystems
  Selbstfahrender Roboter Programm änderung hilfe ? arekklone 11 550 06.07.2016 14:59
Letzter Beitrag: Binatone
  Werte an anderes Programm weiterleiten Typ 2 439 12.03.2016 23:28
Letzter Beitrag: Typ
  Programm Code Erweitern hugolost 8 664 01.01.2016 20:02
Letzter Beitrag: Bitklopfer
  Eingänge im Programm integrieren Phil94 21 1.851 06.12.2015 10:52
Letzter Beitrag: hotsystems
  Webserver abfragen mit einem Programm arduinofan 2 736 28.11.2015 15:54
Letzter Beitrag: arduinofan
  aus Arduino IDE Programm beim Upload starten PingPong 3 627 13.11.2015 15:38
Letzter Beitrag: PingPong
Brick Programm für Touchfeld als vereinfachtes Model mit Widerständen aufgebaut Jeff 1 420 08.11.2015 16:52
Letzter Beitrag: Jeff
  Graph-Programm arduinofan 3 543 31.10.2015 13:45
Letzter Beitrag: hotsystems
  Programm zum Beobachten von Messwerten Marduino_UNO 13 2.090 22.10.2015 12:29
Letzter Beitrag: Scherheinz

Gehe zu:


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