Theremin, Programm im Programm möglich?, Tonleiter

Hallo, kann ich bei Arduino ein Programm im Programm starten.

Das Programm macht jetzt den gewünschten Ton. Wenn ich auf den Button im Pin 2 drücke.

PROGRAMM 1 :

int d = 2;
int buzzerPin = 8;
int val;

void setup ()
{
Serial.begin(9600);

pinMode(d,INPUT);
pinMode(buzzerPin,OUTPUT);
}

void loop () {

snd(1700,val);
Serial.println('d');
}

void snd (int inp, int vib) {
digitalWrite(buzzerPin,HIGH);
delayMicroseconds(inp+vib);
digitalWrite(buzzerPin,LOW);
delayMicroseconds(inp);
}

Und dieser Ton also dieses Programm soll dann starten wenn der Wert unter 50 ist. Bei diesem Programm

PROGRAMM 2:

int btnPin = 2;
int buzzerPin = 8;
int echoPin = 12; // SRF05 echo pin (digital 2)
int initPin = 13; // SRF05 trigger pin (digital 3)
unsigned long pulseTime = 0; // stores the pulse in Micro Seconds
unsigned long distance = 0; // variable for storing the distance (cm) we'll use distance as a switch for the speaker
//setup
void setup() {
pinMode(buzzerPin, OUTPUT); //set speaker pin to output
pinMode(btnPin, INPUT); //set pushbutton pin to input
pinMode(initPin, OUTPUT); // set init pin 3 as output
pinMode(echoPin, INPUT); // set echo pin 2 as input
Serial.begin(9600); // start the serial port
}
// execute
void loop() {

if (digitalRead(btnPin) == HIGH) //only play when the button is pressed
{
digitalWrite(initPin, HIGH); // send 10 microsecond pulse
delayMicroseconds(10); // wait 10 microseconds before turning off
digitalWrite(initPin, LOW); // stop sending the pulse
pulseTime = pulseIn(echoPin, HIGH); // Look for a return pulse, it should be high as the pulse goes low-high-low
distance = pulseTime/58; // convert the pulse into distance (cm)
// make the sound.
// check the distance, if over 50cm make no sound - send no signal
if (distance < 50) {

// DA SOLL JETZT DAS ANDERE PROGRAMM STARTEN BZW. DER TON AUS DEM ERSTEN PROGRAMM KOMMEN

Serial.println(distance); // print the distance value to the serial port
delay(50); // delay for 50 milliseconds before starting again...
}
}
}

Ich möchte eine Art Theremin bauen. Oder hat wer schon ein fertiges Programm? Grüße Franz

Du kannst nur ein einziges Programm in den Arduino laden, zwei gleichzeitig geht nicht. Aber benenn doch die Funktionen des zweiten Programms einfach um und füg sie zum ersten Programm dazu.

Wie meinst du das mit dem umformen? Bin arduino anfänger also vll könntest du mir weiterhelfen. Grüße

Nicht nur Arduino Anfänger, sondern generell Programmier-Anfänger würd ich sagen :wink:
Übernimm die Variablendeklarationen aus Programm 2 in Programm 1. Dann den Inhalt der Setup Routine aus Programm 2 in die Setup Routine von Programm 1. Ausgenommen Serial.begin, das wäre ja sonst doppelt.
Dann übernimmst die die komplette Funktion loop aus Programm 2 in Programm 1. Du musst sie aber umbenennen, well zwei Funktionen mit gleichem Namen in einem Programm nicht vorkommen dürfen. Du kannst sie einfach loop_2 nennen, besser wäre aber, Du gibst der Funktion einen sinnvollen Namen. Und dann ruf die Funktion einfach aus deiner loop Funktion auf.

Ok. ich versuche es ma... könntest du noch sagen wie man dann die loop funktion aufruft? danke schonmal

Die Loop Funktion brauchst du nicht aufrufen, weil sie sich selbst beim Starten des Arduinos auruft.

Du solltest ein paar von den leichten Tutorials machen, und nicht jede Frage hier beantworten lassen, die superleicht im Playground gelöst werden könnte.

int d = 2;
int buzzerPin = 8;
int val;
int btnPin = 2;
int echoPin = 12; // SRF05 echo pin (digital 2)
int initPin = 13; // SRF05 trigger pin (digital 3)
unsigned long pulseTime = 0; // stores the pulse in Micro Seconds
unsigned long distance = 0; // variable for storing the distance (cm) we'll use distance as a switch for the speaker
//setup

void setup ()
{
Serial.begin(9600);
pinMode(d,INPUT);
pinMode(buzzerPin, OUTPUT); //set speaker pin to output
pinMode(btnPin, INPUT); //set pushbutton pin to input
pinMode(initPin, OUTPUT); // set init pin 3 as output
pinMode(echoPin, INPUT); // set echo pin 2 as input

}
// execute

void loop () {

snd(1700,val);
Serial.println('d');
}

void snd (int inp, int vib) {
digitalWrite(buzzerPin,HIGH);
delayMicroseconds(inp+vib);
digitalWrite(buzzerPin,LOW);
delayMicroseconds(inp);
}

void loop_2() {

if (digitalRead(btnPin) == HIGH) //only play when the button is pressed
{
digitalWrite(initPin, HIGH); // send 10 microsecond pulse
delayMicroseconds(10); // wait 10 microseconds before turning off
digitalWrite(initPin, LOW); // stop sending the pulse
pulseTime = pulseIn(echoPin, HIGH); // Look for a return pulse, it should be high as the pulse goes low-high-low
distance = pulseTime/58; // convert the pulse into distance (cm)
// make the sound.
// check the distance, if over 50cm make no sound - send no signal

}}

soweit so gut. wo kommt die if bedingung hin? bei loop?

Mein Ratschlag haste wohl nich gelesen?

Soweit, so nich gut.

Es gibt nur ein loop.

void loop ()

{

irgendwas auslesen

if (irgendwas)

{blablabla}

else

{anderes blablabla}

}

http://arduino.cc/en/Reference/Else

ich habe sie doch aber umbenannt wie mir geraten wurde

Du kannst sie einfach loop_2 nennen, besser wäre aber, Du gibst der Funktion einen sinnvollen Namen.

Schön und gut, dann heisst sie halt um noch mehr Verwirrung zu stiften "loop_2 - aber du rufst sie nicht auf.

Siehe Arduino.cc Reference.

Ja danke für die Hilfe, ich habe schon gelesen bei Arduino.cc wie ein Programm aufgebaut ist. Da ich aber nun die 2 Programme vereinen möchte hilft mir die Hilfe da nicht wirklich weiter. Also um zusammenzu fassen. Es gibts ein setup und ein loop. If und else Befehle kommen in den loop teil. Mein Problem ist jetzt wo ich void loop_2 parken soll. Ich vermute in den loop teil,klar. Wie sollte es den richtig aussehen deiner Meinung nach?

int d = 2;
int buzzerPin = 8;
int val;
int btnPin = 2;
int echoPin = 12; // SRF05 echo pin (digital 2)
int initPin = 13; // SRF05 trigger pin (digital 3)
unsigned long pulseTime = 0; // stores the pulse in Micro Seconds
unsigned long distance = 0; // variable for storing the distance (cm) we'll use distance as a switch for the speaker
//setup

void setup ()
{
Serial.begin(9600);
pinMode(d,INPUT);
pinMode(buzzerPin, OUTPUT); //set speaker pin to output
pinMode(btnPin, INPUT); //set pushbutton pin to input
pinMode(initPin, OUTPUT); // set init pin 3 as output
pinMode(echoPin, INPUT); // set echo pin 2 as input

}
// execute

void snd (int inp, int vib) {
digitalWrite(buzzerPin,HIGH);
delayMicroseconds(inp+vib);
digitalWrite(buzzerPin,LOW);
delayMicroseconds(inp); }

void loop () {

if (digitalRead(btnPin) == HIGH) //only play when the button is pressed
{

digitalWrite(initPin, HIGH); // send 10 microsecond pulse
delayMicroseconds(10); // wait 10 microseconds before turning off
digitalWrite(initPin, LOW); // stop sending the pulse
pulseTime = pulseIn(echoPin, HIGH); // Look for a return pulse, it should be high as the pulse goes low-high-low
distance = pulseTime/58; // convert the pulse into distance (cm)
// make the sound.
// check the distance, if over 50cm make no sound - send no signal

if (distance < 50) {
snd(1700,val);// DA SOLL JETZT DAS ANDERE PROGRAMM STARTEN BZW. DER TON AUS DEM ERSTEN PROGRAMM KOMMEN
Serial.println('d');
Serial.println(distance); // print the distance value to the serial port
delay(50); // delay for 50 milliseconds before starting again...
}}}

Ich weiß nicht ob das jetzt stimmt aber ich bekomme einen Ton aber nicht den richtigen.... also es ist kein bleibender ton, sondern es klingt wie ein schlechtes Maschinengwehr ;D. Abhilfe schafft?

Erklär doch bitte was du machen willst. Du hast also irgendwie Teile von Code, von denen du keine Ahnung hast irgendwoher kopiert, und schreibst blind drin rum. Dein Beispiel ist voll von Variablen und Aufrufen die nichts mit dem "Knopf" Beispiel zu tun haben.

Welcher Wert soll unter 50 fallen? Ein Button hat nur HIGH und LOW

Dieses Forum ist nicht ein "rentacoder" Forum, sondern zur Hilfestellung bei definitiven Problemen gedacht.

du gehst also so vor:

void loop ()

{

irgendwas auslesen

if (irgendwas)

{

ton1();

}

else

{
ton2()
}

}

ton1()

{

hier kommt der code für ton1 rein

}

ton2();

{

hier kommt der code für ton2 rein

}

Ok!
Ich habe einen Ultraschallsensor mit dem Arduino verbunden. Und möchte gern genau den Ton wie aus de Programm 1 damit erzeugen. Also wenn distance unter 50 ist soll dieser Ton von Programm 1 kommen.

Naja, dann passt ja mein Beispiel perfekt.

Auslesen, Wert vergleichen, Funktion aufrufen.

Ok! Ja soweit war ich vorhin auch. Ich habe immer noch das problem das es nach Maschienengwehr klingt. Der Ton kommt schon an der richtigen Stelle und ändert sich. Was kann einen sauberen Ton wie bei Programm 1 erzeugen, bzw wo liegt mein feher?

hier der code:

int buzzerPin = 8;
int val;
int btnPin = 2;
int echoPin = 12; // SRF05 echo pin (digital 2)
int initPin = 13; // SRF05 trigger pin (digital 3)
unsigned long pulseTime = 0; // stores the pulse in Micro Seconds
unsigned long distance = 0; // variable for storing the distance (cm) we'll use distance as a switch for the speaker
//setup

void setup ()
{
Serial.begin(9600);
pinMode(buzzerPin, OUTPUT); //set speaker pin to output
pinMode(btnPin, INPUT); //set pushbutton pin to input
pinMode(initPin, OUTPUT); // set init pin 3 as output
pinMode(echoPin, INPUT); // set echo pin 2 as input

} // execute

void loop () {

digitalWrite(initPin, HIGH); // send 10 microsecond pulse
delayMicroseconds(10); // wait 10 microseconds before turning off
digitalWrite(initPin, LOW); // stop sending the pulse
pulseTime = pulseIn(echoPin, HIGH); // Look for a return pulse, it should be high as the pulse goes low-high-low
distance = pulseTime/58; // convert the pulse into distance (cm)
// make the sound.
// check the distance, if over 50cm make no sound - send no signal

if (digitalRead(btnPin) == HIGH) //only play when the button is pressed
{

if (distance < 50) {
ton(1700,val);
}

else {
ton(1915,val);
}}}

void ton (int inp, int vib) {
digitalWrite(buzzerPin,HIGH);
delayMicroseconds(inp+vib);
digitalWrite(buzzerPin,LOW);
delayMicroseconds(inp); }

Hm, du delayst ja um den Wert "inp + vib"

Was sind diese Werte, also vib scheint ja der wert vom Sensor zu sein, aber was ist inp?

Was passiert wenn du da manuell Werte reinhackst?

hier der code wo ich die idee der töne her habe. ich schau ma was ich mit den werten rumspielen kann

int c = 4;
int d = 5;
int e = 6;
int f = 7;
int g = 8;
int a = 9;
int b = 10;
int c2 = 11;
int buzzerPin = 2;
int val=0;
int potPin=2;
void setup () {
Serial.begin(9600);
pinMode(c,INPUT);
pinMode(d,INPUT);
pinMode(e,INPUT);
pinMode(f,INPUT);
pinMode(g,INPUT);
pinMode(a,INPUT);
pinMode(b,INPUT);
pinMode(c2,INPUT);
pinMode(buzzerPin,OUTPUT);
}
void loop () {
val=map(analogRead(potPin),0,1024,0,500);
if (digitalRead(c)==1){
snd(1915,val);
Serial.println('c');
}
if (digitalRead(d)==1){
snd(1700,val);
Serial.println('d');
}
if (digitalRead(e)==1){
snd(1519,val);
Serial.println('e');
}
if (digitalRead(f)==1){
snd(1432,val);
Serial.println('f');
}
if (digitalRead(g)==1){
snd(1275,val);
Serial.println('g');
}
if (digitalRead(a)==1){
snd(1136,val);
Serial.println('a');
}
if (digitalRead(b)==1){
snd(1014,val);
Serial.println('b');
}
if (digitalRead(c2)==1){
snd(956,val);
Serial.println('h');
}

}

void snd (int inp, int vib) {
digitalWrite(buzzerPin,HIGH);
delayMicroseconds(inp+vib);
digitalWrite(buzzerPin,LOW);
delayMicroseconds(inp);
}

Du hast keine Ahnung was du da machst. Schreib den Code von Grund auf selbst, und such dir das benötigte zusammen, wenn du Fragen dazu hast, kannst du die gerne stellen, aber so helf ich zumindest nicht mehr.

"Ich hab Teile von ner Waschmaschine, nem Rasenmäher und nem Toaster - helft mir ein Auto zu bauen, ich hab aber keine Ahnung was das für Teile sind."