Generátor zvuku a ovládání tlačítkem

Odpovědět
Venda
Příspěvky: 12
Registrován: 05 pro 2018, 17:59
Reputation: 0

Generátor zvuku a ovládání tlačítkem

Příspěvek od Venda » 14 říj 2020, 23:41

Dobrý večer,
prosím o nakopnutí, je to vlastně myšoplaš, který generuje periodicky dokola frekvence 5-22KHz s krokem po 100Hz, to mi funguje. Ale aby bylo možné používání v přítomnosti lidí, tak potřebuji abych mohl stiskem tlačítka posunout spodní hranici frekvence. To znamená, že když už neuslyším pískání, které by mě rušilo, tak stisknu tlačítko, například na právě "hrající" frekvenci 14,5KHz a další generování frekvence bude v rozsahu 14,5 - 22KHz, opět stále dokola i po uvolnění tlačítka. K resetování by došlo až po odpojení myšoplaše od napájení. Velice děkuji za radu, třeba i za nasměrování na projekt, kde se podobné řešilo.

void loop(){

buttonState = digitalRead(Tlacitko);

//F1=5kHz, generuj postupně frekvence 5,1KHz - 22KHz, krok je 100Hz
tone (2,F1);
delay(50);
noTone(2);
delay(50);
F1 = F1 + 100;
delay (50);
Serial.println (F1);
// při překročení 22KHz skoč na 5KHz
if (F1 > 22000){
F1 = 5000;
//delay(10);

//po stisku tlačítka při určité frekvenci,
//zajisti aby se generoval zvuk od této "určité" frekvence až do 22KHz,
//stále dokola, i po uvolnění tlačítka
}
//if (buttonState = HIGH) {
//F1 = 15000;

}

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Generátor zvuku a ovládání tlačítkem

Příspěvek od gilhad » 15 říj 2020, 04:01

Pouzivej tag code (na to je to tlacitko </>) a hned to bude lip citelne.

Ja bych si na zacatku (jeste pred setup()) definoval promenne omezujici rozsah a promennou pro aktualni hodnotu (takze by se vzdy po zapnuti nachazely ve stejnem defaultnim stavu)

Kód: Vybrat vše

int minTone=5000;
int maxTone=22000;
int actTone=0; // pri prvnim pruchodu loop se stejne nejdriv nastavi na dolni mez, kdybych ji chtel snizit, nebudu to tu muset delat na dvou mistech
a v loop() bych proste zvysoval o 100 tu promennou actTone, porovnal to s mezema a pripadne oriznul, pak zahral zvuk, otestoval tlacitko (a pripadne upravil dolni mez) a sel na dalsi pruchod loop

Kód: Vybrat vše

void loop(){
  actTone += 100; // prictu stovku pri kazdem pruchodu loop
  if (actTone< minTone) {actTone=MinTone;} // osetri inicializaci a pripadne dalsi kejkle ve vylepsene verzi programu
  if (actTone> maxTone) {actTone=MinTone;} // osetri preteceni rozsahu
  tone(2,actTone);
  delay(50);
  noTone(2);
  if (digitalRead(BUTTON_PIN) == LOW) { minTone=actTone;}; // pri stisknuti posunu dolni mez na aktualni hodnotu
}
  // nekde musim nadefinovat ten BUTTON_PIN a taky ho nastvit pro cteni a pripojit na nej fyzicky tlacitko a zajistit, aby se v pustenem stavu nastavila hodnota jina nez ve stisknutem a upravit tu podminku. Ja pouzivam INPUT_PULLUP a tlacitko proti zemi, ale moznosti je mnoho

Venda
Příspěvky: 12
Registrován: 05 pro 2018, 17:59
Reputation: 0

Re: Generátor zvuku a ovládání tlačítkem

Příspěvek od Venda » 15 říj 2020, 08:45

Díky moc za pomoc, snad jsem to pochopil, doufám, odpolko budu pokračovat,

Venda
Příspěvky: 12
Registrován: 05 pro 2018, 17:59
Reputation: 0

Re: Generátor zvuku a ovládání tlačítkem

Příspěvek od Venda » 15 říj 2020, 20:12

Ještě se tě prosím tě zeptám, viděl jsem tento příkaz
note (2, 4000, 5000);
s tím, že 2 je PIN, 4000 je frekvence a 5000 je doba hraní, ale ať jsem zadal jakoukoliv dobu hraní tak to vždycky jen píplo a musím ji nastavovat funkcí delay, nevíš co dělám blbě, díky moc.

Jinak mi to maká, velice ti děkuji.

Kód: Vybrat vše

#include <SoftwareSerial.h>

const int Tlacitko = 11; 
const int ledPin = 10;
int buttonState = 0; 

int minTone=5000;
int maxTone=22000;
int actTone=0; // 

   

void setup() {



  
  Serial.begin(9600);
    pinMode(Tlacitko, INPUT);
    pinMode(ledPin, OUTPUT);
    Serial.println ("startuju");  
    tone(2, 600);
        delay(250);
        tone(2, 800);
        delay(300);
        tone(2, 1000);
        delay(350);
        tone(2, 1100);
        delay(400);
        noTone(2); 
        delay(5000);
        tone(2, 1100);
        delay(300);
        tone(2, 1000);
        delay(250);
        tone(2, 800);
        delay (350);
        tone(2, 600);
        delay(300);
        noTone(2);     
}

void loop(){
buttonState = digitalRead(Tlacitko);
  actTone += 100; // prictu stovku pri kazdem pruchodu loop
  if (actTone< minTone) {actTone=minTone;} // osetri inicializaci a pripadne dalsi kejkle ve vylepsene verzi programu
  if (actTone> maxTone) {actTone=minTone;} // osetri preteceni rozsahu
  tone(2,actTone);
  delay(100);
  noTone(2);
  
  if (digitalRead(Tlacitko) == HIGH) { minTone=actTone;}; // pri stisknuti posunu dolni mez na aktualni hodnotu
  Serial.println (actTone);
  //delay(10);


}
  

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Generátor zvuku a ovládání tlačítkem

Příspěvek od gilhad » 15 říj 2020, 21:06

Precti si dokumentaci

https://www.arduino.cc/reference/en/lan ... d-io/tone/

(tone(a,b,c) neblokuje, takze kdyz ho jednou zavolas, tak nastavi veci a hned skonci a "ono to samo" hraje dal, dokud bud neuplyne ta doba, nebo to neukoncis noTone(), nebo nezmenis frekvenci. Coz bez tech delay udelas hned dalsim prikazem ...)

Venda
Příspěvky: 12
Registrován: 05 pro 2018, 17:59
Reputation: 0

Re: Generátor zvuku a ovládání tlačítkem

Příspěvek od Venda » 16 říj 2020, 11:48

Díky ti, už to tlačím do hlavy.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 10 hostů