Policejní sirena

Odpovědět
patrikn1987
Příspěvky: 2
Registrován: 06 kvě 2018, 13:34
Reputation: 0

Policejní sirena

Příspěvek od patrikn1987 » 06 kvě 2018, 13:53

Přeji všem hezkou neděli.S arduinem jsem začal teprve nedávno a dnes jsem narazil na první problém.Syn mně poprosil o policejní sirénu na kolo.Je to maličkost,ale trochu jsem se do toho zamotal.Mělo by to fungovat asi tak,že bude houkat a blikat,ale syn si usmyslel že potřebuje ještě tlačítko,ktere když zmáčkne,tak zazní takový ten bzučák.Kód jsem našel na netu a teď ho potřebuji upravit tak,aby fungoval dle jeho představ.Zatim mi to moc nejde.Problém je v tom,že nevím jak to mám napsat,nebo upravit podmínku aby byl bzučák aktivní vždy když ho zmáčkne a pak dále pokračoval v kódu.Kód je zbytečně dlouhý,ale s tím už bych si poradil pomocí počítání cyklů ++ a tak dále.Jde mi jen o to aby to tlačítko bylo aktivní neustále během čtení.Snad mně pochopíte,jak píši,jsem začátečník. :) díky

Kód vypadá zatím takhle:

// Sirena della Polizia

int wait =2;
int wait1 =1;
int time =10;
int time1 =2;
int freq = 0;
int ledPin1 =2;
int ledPin2 =3;
int tonePin =8;
int buttonPin = A0;
const int toneFreq = 75;


void setup(){
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(tonePin, OUTPUT);
}

void loop() {

int buttonState = digitalRead(buttonPin);
if (buttonState==LOW){

tone(tonePin, toneFreq);
}
else
{

for(freq = 600; freq < 1500; freq += 1) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait);
}
for(freq = 1500; freq > 600; freq -= 1) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait);
}
for(freq = 600; freq < 1500; freq += 1) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait);
}
for(freq = 1500; freq > 600; freq -= 1) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait);
}
for (freq = 600; freq < 1500; freq += 1) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait);
}
for (freq = 1500; freq > 600; freq -= 1) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait);
}
for(freq = 600; freq < 1500; freq += 1) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait);
}
for(freq = 1500; freq > 600; freq -= 1) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait);
}
for(freq = 600; freq < 1500; freq += 1) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait);
}
for (freq = 1500; freq > 600; freq -= 1) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait);
}
for(freq = 600; freq < 1500; freq += 1) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait);
}
for(freq = 1500; freq > 600; freq -= 1) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait);
}
for(freq = 600; freq < 1500; freq += 1) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait);
//druha//////////////////////////////////////////////////////
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for(freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for (freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for (freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for(freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for (freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for(freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for(freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for(freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for (freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for(freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for (freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for (freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for (freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for (freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for(freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for(freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for(freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for (freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for (freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for(freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for(freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);
}
for(freq = 1500; freq > 600; freq -= 5) {// valore iniziale, valore limite low, decremento
tone(tonePin, freq, time1);
digitalWrite(ledPin1,HIGH);
digitalWrite(ledPin2,LOW);
delay(wait1);
}
for(freq = 600; freq < 1500; freq += 5) { // valore iniziale, valore limite high, incremento
tone(tonePin, freq, time1); // Pin del piezo, frequenza, durata
digitalWrite(ledPin1,LOW);
digitalWrite(ledPin2,HIGH);
delay(wait1);

}
}
}

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

Re: Policejní sirena

Příspěvek od gilhad » 06 kvě 2018, 17:30

Kod je priserny a pokud ho syn pouzije na pozemni komunikaci, porusuje zakon.

https://zakony.kurzy.cz/361-2000-zakon- ... ragraf-41/
(10) V provozu na pozemních komunikacích je zakázáno neoprávněně užívat zvláštních výstražných světel a zvláštního zvukového výstražného znamení, které užívá vozidlo s právem přednostní jízdy, nebo je napodobovat.

posjirka
Příspěvky: 14
Registrován: 05 srp 2017, 22:12
Reputation: 0

Re: Policejní sirena

Příspěvek od posjirka » 06 kvě 2018, 21:01

jak píše gilhad použití sireny/blikače není moc kompatibilní se zákony ČR. aby ses pak nedivil ...
co se týká kódu, tak to co máš tomu se říká "špage'ták", ale nic si z toho nedělej, každý něják začínal :)

psát to za tebe nebudu,ale jestli chceš nakopnout správným směrem rád pomůžu.
Podle kódu a popisu potřebuješ tyhle funkce:
- po spuštění se sepne siréna, která 7x udělá pomalý tónový přeběh nahoru a dolu
- pak 18x rychlý přebeh nahoru/dolu
- kdykoliv stiskneš tlačítko tak se program přeruší a spustí se trvalý zvuk bzučáku

jestli jsem to pochopil správně tak je to klasický příklad 2 paralelních funkcí v reálném čase.

není to ale pro úplné začátečníky- je třeba pár věcí pochopit. třeba to, že zbytečným opakování stejných 5 řádků děláš z kódu nepřehledný zmatek.
nejdřích bych být tebou zkusil ten kod smrsknout. Teď to zabírá cca 330 řádků a myslím, že 50 řádků by stačilo. Použij více smyček do sebe (dvojnásobné "for") abys nemusel opakovat stejné kusy kodu. Stačí 1 podmínka program ví zda máš odečítat nebo přičítat (je číslo dělitelné 2 ?)
ono ti pak dojde jak to udělat abys splnil všechyn podmínky. je třeba si to v klidu promyslet sepsat a zamyslet se nad algoritmem.

ted k tomu problému:
No jelikož arduino neumí multitasking musíš to udělat jedním ze 2 způsobů:
1. v hlavní smyčce (loop) necháš běžet sirénu a tlačítko s bzučákem dáš jako podprgram spuštěný tzv. přerušením (
https://arduino8.webnode.cz/news/lekce- ... -tlacitka/
https://uart.cz/271/arduino-a-preruseni/
http://navody.arduino-shop.cz/zaciname- ... citko.html )
To znamená, že když stiskneš tlačítko Arduino to zjistí, přeruší program a vykoná funkci co chceš, pak pokračuje v hlavním programu dál. Pozor reaguje na stisk a spustí se jednorázově, takž musíš ošetřit aby z podprogramu nevypadl dřív než pustíš tlačítko.

2. vše nacpeš do hlavní smyčky (loop) Jednotlivé etapy programu rozdělíš do časových úseků (etapa 1, 3, 5, 7, 9, 11, 13 pomalý náběh, etapa 2, 4, 6, .. pomalý skluz, ....). Na začátek dáš podmínku, že když stiskenš tlačítko tak bude bzučák, jinak vykonává jednotlivé etapy porgramu.
celou smyčku necháš běžet dokola. Uvnitř použiješ funkce millis
https://www.arduino.cc/reference/en/lan ... me/millis/
https://arduino.cz/arduino-zaklady-blik ... kce-delay/
http://www.pistek.eu/blog/2013/08/15/ar ... ni-millis/
či na konec dáš "delay(1);" a odpočítáš si jednotlivé kroky.

patrikn1987
Příspěvky: 2
Registrován: 06 kvě 2018, 13:34
Reputation: 0

Re: Policejní sirena

Příspěvek od patrikn1987 » 07 kvě 2018, 15:04

Diky moc za odpovědi a odkazy,koukám že musím ještě hodně nastudovat.Co se týče zákona,tak žijeme v malém městě a nehodlám stavět nějakou obrovskou a hlucnou sirenu(spíš takové blikátko),aby měli děti radost.Tak doufám že to nebude tak horké když potkáme pány policisty..Každopádně se stím poperu a popřípadě se podělím o výsledek.Zatím diky

Odpovědět

Kdo je online

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