Piezosummer und Schrittmotor

Hallo zusammen,

wir haben einer Schaltung mit einem Schrittmotor, Feuchtigkeitssensor und einem Taster zusammen gebastelt und den Code dazu mit Hilfe dieses Forum geschrieben.

Jetzt wollten wir zusätzlich einen Summer/Piepser reinbauen der ein Lied dazu Spielt wenn der Motor dreht.

Sprich: Der Summer spielt so lange die Musik bis er nicht mehr dreht.

Also haben wir unseren bestehenden Sketch genommen, einen aus dem I-Net gefunden Sketch für den Mario-Themen-Song und diese zusammen gewürfelt.

Soweit so gut, naja ehr weniger.

Der Summer spielt fröhlich weiter ohne die Funktion „Motor Stop“ zu berücksichtigen.

Hier mal der zusammengewürfelte Code vielleicht kann uns ja einer von euch Helfen wo bzw. was wir nicht beachtet haben bzw wo unsere Fehler ist.

#include <Stepper.h>

int SPMU = 32;
int messwert = 0;
int speakerPin = 7;
const int tasterPin = 11;
bool Freigabe = true;
bool Freigabe1 = false;
bool tasterStatus;

int length = 295; // the number of notes
char notes[] = "EE E CE G  g  C  g e  a b ia gEGA FG E CDb C  g e  a b ia gEGA FG E CDb  GNFR E uaC aCD GNFR E 1 11   GNFR E uaC aCD L  D C   CC C CD EC ag  CC C CDE  CC C CD EC ag  EE E CE G  g  C  g e  a b ia gEGA FG E CDb C  g e  a b ia gEGA FG E CDb EC g u aF Fa  bAAAGFEC ag  EC g u aF Fa  bF FFEDCe ec  "; // a space represents a rest
float beats[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, //Page 1
                2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 4, //Page 2
                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, //Page4
                1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, //Page 5
                1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1.3, 1.3, 1.3, 1, 1, 1, 1, 1, 1, 2 }; //Page 6
                
int tempo = 95;

void playTone(int ton1, int duration) {
  for (long i = 0; i < duration * 1000L; i += ton1) {
    tone(speakerPin, ton1);
    delayMicroseconds(ton1);
  }
  noTone(speakerPin);
}

void playNote(char note, int duration) {
//                        c    c#   d    d#   e    f    f#   g    g#   a    a#   b
  char names[] = { ' ',  '!', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'D', 'E', 'F', 'G', 'A', 'B', 'i', 'N', 'R', 'u',  '1', 'L', 'k'}; // [i = b flat] [N = G flat] [R = D#] [u = g#] [1 = C oct. 5] [L = E flat]
  int tones[] =  {   0, 1046, 138, 146, 155, 164, 174, 184, 195, 207, 220, 233, 246, 261, 293, 329, 349, 391, 440, 493, 523, 587, 659, 698, 783, 880, 987, 466, 740, 622, 415, 1046, 622u, 227};
  
  // play the tone corresponding to the note name
  for (int i = 0; i < 34; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);
    }
  }
}

Stepper myStepper(SPMU, 2, 3, 4, 5);

void setup() {
  Serial.begin(9600);
  pinMode (tasterPin, INPUT);
  pinMode (speakerPin, OUTPUT);
  myStepper.setSpeed(1000);
}

void loop() {
  messwert = analogRead(A4);
  
  Serial.print(F("Feuchtigkeits-Messwert:")); 
  Serial.println(messwert);
  if ((messwert > 100) && Freigabe) {  
    Serial.print(F("dreht positiv Start ... "));
    myStepper.step(2048);
    if (F("dreht positiv Start ... ")){
       for (int i = 0; i < length; i++) {
    if (notes[i] == ' ') {
      delay(beats[i] * tempo); // rest
    } else {
      playNote(notes[i], beats[i] * tempo);
    }
    
    // pause between notes
    delay(tempo / 2); 
  }
    }
    Serial.println(F("Stop"));
     if (F("Stop")){
      noTone(speakerPin);
     }
    Freigabe = false;
    Freigabe1 = true;
  }
  
  tasterStatus = digitalRead(tasterPin);
  
  if ((tasterStatus == HIGH ) && Freigabe1) {
    Serial.print(F("dreht negativ Start ... "));
    myStepper.step(-2048);
    Serial.println(F("Stop"));
    Freigabe1 = false;
    Freigabe = true;                 
}
}

Danke schon mal für eure Hilfe.

Hier noch die Einzelnen Sketches:

/* This example uses a piezo speaker to play melodies.  It sends
 * a square wave of the appropriate frequency to the piezo, generating
 * the corresponding tone.
 *
 * The calculation of the tones is made following the mathematical
 * operation:
 *
 *       timeHigh = period / 2 = 1 / (2 * toneFrequency)
 *
 * where the different tones are described as in the table:
 *
 * note 	frequency 	period 	timeHigh
 * c 	        261 Hz 	        3830 	1915 	
 * d 	        294 Hz 	        3400 	1700 	
 * e 	        329 Hz 	        3038 	1519 	
 * f 	        349 Hz 	        2864 	1432 	
 * g 	        392 Hz 	        2550 	1275 	
 * a 	        440 Hz 	        2272 	1136 	
 * b 	        493 Hz 	        2028	1014	
 * C	        523 Hz	        1912 	956
 *
 * http://www.arduino.cc/en/Tutorial/Melody
 */
    
int speakerPin = 8;

int length = 295; // the number of notes
char notes[] = "EE E CE G  g  C  g e  a b ia gEGA FG E CDb C  g e  a b ia gEGA FG E CDb  GNFR E uaC aCD GNFR E 1 11   GNFR E uaC aCD L  D C   CC C CD EC ag  CC C CDE  CC C CD EC ag  EE E CE G  g  C  g e  a b ia gEGA FG E CDb C  g e  a b ia gEGA FG E CDb EC g u aF Fa  bAAAGFEC ag  EC g u aF Fa  bF FFEDCe ec  "; // a space represents a rest
float beats[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, //Page 1
                2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 4, //Page 2
                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, //Page4
                1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, //Page 5
                1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1.3, 1.3, 1.3, 1, 1, 1, 1, 1, 1, 2 }; //Page 6
                
int tempo = 95;

void playTone(int ton1, int duration) {
  for (long i = 0; i < duration * 1000L; i += ton1) {
    tone(speakerPin, ton1);
    delayMicroseconds(ton1);
  }
  noTone(speakerPin);
}

void playNote(char note, int duration) {
//                        c    c#   d    d#   e    f    f#   g    g#   a    a#   b
  char names[] = { ' ',  '!', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'D', 'E', 'F', 'G', 'A', 'B', 'i', 'N', 'R', 'u',  '1', 'L', 'k'}; // [i = b flat] [N = G flat] [R = D#] [u = g#] [1 = C oct. 5] [L = E flat]
  int tones[] =  {   0, 1046, 138, 146, 155, 164, 174, 184, 195, 207, 220, 233, 246, 261, 293, 329, 349, 391, 440, 493, 523, 587, 659, 698, 783, 880, 987, 466, 740, 622, 415, 1046, 622u, 227};
  
  // play the tone corresponding to the note name
  for (int i = 0; i < 34; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);
    }
  }
}

void setup() {
  pinMode(speakerPin, OUTPUT);
}

void loop() {
  for (int i = 0; i < length; i++) {
    if (notes[i] == ' ') {
      delay(beats[i] * tempo); // rest
    } else {
      playNote(notes[i], beats[i] * tempo);
    }
    
    // pause between notes
    delay(tempo / 2); 
  }
}
#include <Stepper.h>

int SPMU = 32;
int messwert = 0;
int Pieps = 7;
const int tasterPin = 11;
bool Freigabe = true;
bool Freigabe1 = false;
bool tasterStatus;

Stepper myStepper(SPMU, 2, 3, 4, 5);

void setup() {
  Serial.begin(9600);
  pinMode (tasterPin, INPUT);
  pinMode (Pieps, OUTPUT);
  myStepper.setSpeed(1000);
}

void loop() {
  messwert = analogRead(A4);
  
  Serial.print(F("Feuchtigkeits-Messwert:")); Serial.println(messwert);
  if ((messwert > 100) && Freigabe) {  
    Serial.print(F("dreht positiv Start ... "));
    if (F("dreht positiv Start ... ")){
      digitalWrite(Pieps, HIGH);
    }
    myStepper.step(16384);
    Serial.println(F("Stop"));
    if (F("Stop")){
      digitalWrite(Pieps, LOW);
    }
    Freigabe = false;
    Freigabe1 = true;
  }
  
  tasterStatus = digitalRead(tasterPin);
  
  if ((tasterStatus == HIGH ) && Freigabe1) {
    Serial.print(F("dreht negativ Start ... "));
    if (F("dreht negativ Start ... ")){
      digitalWrite(Pieps, HIGH);
    }
    myStepper.step(-16384);
    Serial.println(F("Stop"));
    if (F("Stop")){
      digitalWrite(Pieps, LOW);
    }
    Freigabe1 = false;
    Freigabe = true;                 
}
}

Schneller Blick: if (F("Stop")){} bitte nochmal überdenken. In den runden Klammern muß eine Bedingung stehen.

Das aufgezeigte Problem kommt öfters vor:
if (F("dreht positiv Start ... ")){
if (F("dreht negativ Start ... ")){

usw.
Grüße Uwe

???

Mit Uwe seiner Aussage können wir leider gar nichts anfangen. :frowning:

agmue:
Schneller Blick: if (F("Stop")){} bitte nochmal überdenken. In den runden Klammern muß eine Bedingung stehen.

Was meinst du damit, wir haben es noch mal mit anderen sachen probiert und am Code etwas verändert, leider ohne erfolg.

Irgendwie muss das anders geschrieben werden, das die Melodie nur spielt wenn der Motor dreht leider haben wir es noch nicht raus wo und mit welchen befehl :frowning:

Ihr wist doch was das für eine schwere Geburt war den anderen Sketch zu schreiben :slight_smile: :o :confused:

In der Referenz steht: if (conditional), wobei eine Bedingung meist ein Vergeich ist: if (someVariable > 50). Man kann eine Variable mit einer Konstanten oder einer Variablen vergleichen, das Ergebnis ist dann true oder false. Bei true wird die geschweifte Klammer ausgeführt, bei false die geschweifte Klammer hinter else, wenn vorhanden.

F("Stop") ist Text, also weder true noch false, weshalb der Compiler eigentlich meckern müßte. (Die Toleranz des Compilers sei mal nicht das Thema hier.)

agmue:
F("Stop") ist Text, also weder true noch false, weshalb der Compiler eigentlich meckern müßte.

Vielleicht eine Warnung, aber abgesehen davon dass man das mit einer String Konstante macht ist das rein von der Syntax her ein völlig legitimer Vergleich. C String Variablen sind Zeiger. Daher wird abgefragt ob der Zeiger ungleich NULL ist, was immer true ist.

Von der Funktion her ist es natürlich unsinnig.

F("Stop"') ist ein pointer auf einen sogenannten _FlashStringHelper.
Der nur dazu da ist, das F-Makro zu ermöglichen und damit Schreibarbeit zu sparen gegenüber PSTR()

Mit if(x) kann man fast jedes x auf ==0 oder !=0 abfragen.

Das ist (in der Regel "leider") so bei C und damit auch bei C++, und spart bei pointern Schreibarbeit zu Lasten der Klarheit.

if(F("Stop")) ist natürlich dasselbe wie if(true) und kann schon vom Compiler entsorgt werden.