Problema con Tone e Break in Loop

Ciao a tutti ho un problema.
Devo far fare beep a uno speaker della tv quando cambia una condizione IF nel Loop ma se metto Break non me lo accetta e se non metto uno stop suona infinito...

 if ( results.value == 0x832 ||  results.value == 0x32 ||  results.value == 0x1006F ||  results.value == 0x6F ){ //se il tasto GIALLO su uno dei telecomandi viene premuto
    tone(speaker, 1000); 
    delay (100); 
    noTone (speaker);
    digitalWrite(relay, LOW);   // diseccita relè NC (abilita alimentazione TV)
    break;

errore: 36: error: break statement not within loop or switch

Break serve per uscire dai cicli do, while e for ma non dai cicli if.
http://arduino.cc/en/Reference/Break

Non è chiaro quel che vuoi fare, spiegati meglio.

(PS: il codice si include con il tag CODE e non con il tag QUOTE)

Ho corretto Leo. :wink: Avevo capito che per codici corti era meglio il copia forum. Ho di nuovo sbagliato uff... pardon!

avessi letto prima il reference non avrei scritto sta cavolata in effetti! come al solito la sera scrivo cose senza senso.... già mi capita di giorno ma di sera peggio!

Dunque il problema è che in quell'IF vorrei che l'altoparlante emettesse un singolo beep al verificarsi della condizione ma solo per una volta non in loop.... ora mi è venuto in mente un sistema per farlo fuori in un IF dedicato solo all'altoparlante mediante lettura di un valore stoccato in una variabile ma fai finta di nulla... come poso risolvere in maniera ottimale? al massimo ti faccio vedere come ho teoricamente risolto in maniera un po' complicata e forse anche sprecona in termini di spazio di sketch.

Devi usare una semplice variabile di stato. La poni a 0 ad inizio loop, poi al verificarsi della condizione (quindi con if vero), controlli anche se la variabile è ancora a 0: se lo è, emetti il beep e la poni ad 1. In questo modo, al successivo if testato vero, il beep non viene più riemesso.

Ovviamente devi anche mettere, in caso ti serva, un modo o una condizione per resettare (rimetterla a 0) quella variabile. Se ti serve far risuonare il beep, insomma.

Grande Giove!!! [cit.] Allora l'ho pensata bene! era quello al quale ho accennato pocanzi, chissà perchè a volte mi vengono le idee dopo aver sbagliato.... Grazie Leo! :wink:

ecco qui, ora funziona alla grande, era così che intendevi Leo?

// SPEGNIMENTO TV IN BLOCCO CON FIRMWARE IN FREEZE 27/02/2014

#include <IRremote.h>

int beep_status; // variabile stoccaggio valore per emissione segnale sonoro

const int led = 13;
const int speaker = 10;
const int relay = 2;
const int ricevitoreIR = 12; 

IRrecv irrecv (ricevitoreIR); // crea "instance" di 'irrecv'
decode_results results;


void setup()
{
  Serial.begin(9600); // mostra codice IR su monitor seriale
  irrecv.enableIRIn(); // abilita la ricezione IR
  pinMode(2, OUTPUT);
  pinMode(10, OUTPUT); 
  pinMode(12, INPUT);
  pinMode(13, OUTPUT);
  beep_status=1;
  
  tone (speaker, 800); //suoneria di ripristino alimentazione di rete dopo mancanza di tensione
  delay (50);
  noTone (speaker); 
  tone (speaker, 1000);
  delay (50);
  noTone (speaker); 
  tone (speaker, 1200);
  delay (50);
  noTone (speaker); 
  tone (speaker, 1000);
  delay (50);
  noTone (speaker);
  tone (speaker, 800);
  delay (50);
  noTone (speaker); 
  tone (speaker, 1000);
  delay (50);
  noTone (speaker); 
  tone (speaker, 1200);
  delay (50);
  noTone (speaker); 
  tone (speaker, 1000);
  delay (50);
  noTone (speaker);
  tone (speaker, 800);
  delay (50);
  noTone (speaker); 
  tone (speaker, 1000);
  delay (50);
  noTone (speaker); 
  tone (speaker, 1200);
  delay (50);
  noTone (speaker); 
  tone (speaker, 1000);
  delay (50);
  noTone (speaker);
  tone (speaker, 800);
  delay (50);
  noTone (speaker); 
  tone (speaker, 1000);
  delay (50);
  noTone (speaker); 
  tone (speaker, 1200);
  delay (50);
  noTone (speaker); 
  tone (speaker, 1000);
  delay (50);
  noTone (speaker);
  tone (speaker, 800);
  delay (50);
  noTone(speaker);
  
}
void loop()
{
  
  if (irrecv.decode(&results)) // se viene ricevuto un segnale IR decodificalo
  {
    Serial.println(results.value, HEX); // mosta sul monitor seriale il valore ricevuto in esadecimale (HEX) per eventuali verifiche
    irrecv.resume(); // attendi un altro nuovo valore
  }
 
  if ( results.value == 0x832 ||  results.value == 0x32 ||  results.value == 0x1006F ||  results.value == 0x6F) //se il tasto GIALLO su uno dei telecomandi viene premuto
  { 
    if (beep_status == 0)
    {
      tone (speaker, 800); // emetti tono di abilitazione alimentazione
      delay (50);
      noTone (speaker); 
      delay (1000);
      tone (speaker, 800);
      delay (50);
      noTone (speaker); 
      delay (1000);
      tone (speaker, 800);
      delay (50);
      noTone (speaker); 
      delay (1000);
      tone (speaker, 1400);
      delay (600);
      noTone (speaker);        
      beep_status=1; //cambia la condizione per far cessare il suono al prossimo loop  
    }     
    digitalWrite(relay, LOW);   // diseccita relè NC (abilita alimentazione alla scheda TV)
  } 
  if ( results.value == 0x834 ||  results.value == 0x34 ||  results.value == 0x70 ||  results.value == 0x10070 ) //se il tasto BLU su uno dei telecomandi viene pemuto
  {  
    if (beep_status == 1)
    {
      tone (speaker, 800); // emetti tono di disabilitazione alimentazione
      delay (50);
      noTone (speaker); 
      delay (1000);
      tone (speaker, 800);
      delay (50);
      noTone (speaker); 
      delay (1000);
      tone (speaker, 800);
      delay (50);
      noTone (speaker); 
      delay (1000);
      tone (speaker, 300);
      delay (600);
      noTone (speaker); 
      tone (speaker, 200);
      delay (600);
      noTone (speaker); 
        
      beep_status=0;
    } 
    digitalWrite(relay, HIGH);   // eccita relè NC (disabilita alimentazione alla scheda TV)
  }
}

PS. purtroppo ho dovuto modificare il file della libreria IR perchè mi andava in conflitto il timer1 come suggerito da te in una guida che ho golosamente mangiato :wink:

Sì può andar bene.

Merçì! :wink: