SENSOR SOUND accendi spegni luci  battimano H

Ciao a tutti , volevo porre un quesito che pensavo di risolvere da solo INVECE.... magari per molti di voi e' una stupidata.....
Ho realizzato tramite il microfono amplificato dell'interfono della moto l' arduino e un relay un sistema per accendere le luci o qualsiasi altro apparecchio collegatovi . Giungo al problema :
lo sketch che uso mi permette di accendere la luce e tutto perfetto pero' devo farla spegnere tramite delay...(quindi a tempo) io vorrei che al battito delle mani prima accendo e in un secondo momento sempre battendo le mani spengo . vi posto lo sketch
:cry: :cry: :cry:

int analogInput = 3;
int LEDpin = 13;

// variable to store the value
int value = 5;

// a threshold to decide when the LED turns on
int threshold = 10
;

void setup(){

// declaration of pin modes
pinMode(analogInput, INPUT);
pinMode(LEDpin, OUTPUT);
delay(0); // waits for a second

}

void loop(){
// read the value on analog input
value = analogRead(analogInput);

// if value greater than threshold turn on LED
if (value > threshold) digitalWrite(LEDpin, HIGH),delay(0); else digitalWrite(LEDpin,LOW),delay(19000);}

grazie mille in anticipo ::slight_smile:

Così dovrebbe funzionare ! Fammi sapere. CIAO

int analogInput = 3;
int LEDpin = 13;
boolean statoLuce = LOW;

int value = 5;
int threshold = 10;

void setup(){

pinMode(analogInput, INPUT);
pinMode(LEDpin, OUTPUT);

}

void loop(){
value = analogRead(analogInput);
if (value > threshold)
{
if (statoLuce == LOW) {statoLuce = HIGH}
else {statoLuce = LOW}
}
digitalWrite(LEDpin, statoLuce);
}

ciao Ambrogio

potrebbe funzionare, ma se hai un suono lungo prima accendi e poi spegni, poi accendi ecc.

la logica deve essere:

leggere entrata

piccolo ritardo di qualche milisecondo

se segnale e luci spente e variabile segnale LOW {accendi luce
memorizzare che variabile segnale High}

se segnale e luci accese e variabile segnale LOW {spegni luce
memorizzare che variabile segnale High}

aspettare che il segnale sia via e mettere variabile segnale LOW}

In questo modo la luce viene acceso solo nel passagio da LOW a HIGH del segnale.

Descrizione un po astratta ma tommytom82x prova di scrivere un codice. se hai problemi ti aiuteró.

Ciao Uwe

GRAZIE RAGAZZI MA HO QUALCHE PROBLEMA NELL 'INSERIRE IL CODICE DAL PROGRAMMA DI ARDUINO ALLA VERIFICA ME LO BLOCCA ??? SOLUZIONI ??
GRAZIE ANCORA
HO PROVATO A SISTEMARLO COSI MA NON FUNZIONA PIU' NULLA NEAANCHE CAMBIANDO I VAL DEL SENSORE BHAAAA ....

int analogInput = 3;
int LEDpin = 13;
boolean statoLuce = LOW;

int value = 5;
int threshold = 10;

void setup(){

pinMode(analogInput, INPUT);
pinMode(LEDpin, OUTPUT);

}

void loop(){
value = analogRead(analogInput);
if (value > threshold)

if (statoLuce = LOW , statoLuce = HIGH);
else (statoLuce = LOW);

digitalWrite (LEDpin, statoLuce);
}

Hai dimenticato di mettere le parentesi graffe dentro ai 2 IF

l'if è così strutturato:

IF(condizione)
{
ciò che devi eseguire se è verificata la condizione
}

Nella pagina Reference sul sito di arduino è spiegato tutto molto bene:
http://arduino.cc/en/Reference/Else

praticamente verrebbe così:

int analogInput = 3;
int LEDpin = 13;
boolean statoLuce = LOW;
boolean sopraSoglia = FALSE;

int value = 5;
int threshold = 10;

void setup(){

pinMode(analogInput, INPUT);
pinMode(LEDpin, OUTPUT);

}

void loop()
{
value = analogRead(analogInput);
if (value > threshold)
{
sopraSoglia = TRUE //Memorizzo che ho superato la soglia
}
if (sopraSoglia == TRUE && value < threshold) //Se ho superato la soglia e sono ritornato sotto la soglia
{
sopraSoglia = FALSE; //Riazzero la variabile che ho usato
if (statoLuce = LOW) //Se la luce era spenta
{
statoLuce = HIGH; //Accendila
}
else
{
statoLuce = LOW; //Spegnila
}
}
digitalWrite (LEDpin, statoLuce);
}

Ambrogio sei fantastico ed hai una gran pazienza , solo che io ho copiato e incollato pari pari il codice come me l'hai dato e la verifica di arduino è sempre negativa mi da degli errori , in particolare questi....

sketch_nov07a:5: error: 'FALSE' was not declared in this scope
sketch_nov07a.cpp: In function 'void loop()':
sketch_nov07a:22: error: 'TRUE' was not declared in this scope
sketch_nov07a:23: error: expected `;' before '}' token
sketch_nov07a:24: error: 'TRUE' was not declared in this scope
sketch_nov07a:26: error: 'FALSE' was not declared in this scope

grazie ancora . ;D

ah si scusa ... mi sono dimenticato un ";"

sopraSoglia = TRUE ;

e poi i "false" e "true" li devi scrivere in minuscolo

Così non da errori di compilazione, però non l'ho potuto provare perchè non ho l'hardware collegato. Fammi sapere, al max se non funziona ancora lo risolviamo insieme.

CIAO

int analogInput = 3;
int LEDpin = 13;
boolean statoLuce = LOW;
boolean sopraSoglia = false;

int value = 5;
int threshold = 10;

void setup(){

pinMode(analogInput, INPUT);
pinMode(LEDpin, OUTPUT);

}

void loop()
{
value = analogRead(analogInput);
if (value > threshold)
{
sopraSoglia = true; //Memorizzo che ho superato la soglia
}
if (sopraSoglia == true && value < threshold) //Se ho superato la soglia e sono ritornato sotto la soglia
{
sopraSoglia = false; //Riazzero la variabile che ho usato
if (statoLuce = LOW) //Se la luce era spenta
{
statoLuce = HIGH; //Accendila
}
else
{
statoLuce = LOW; //Spegnila
}
}
digitalWrite (LEDpin, statoLuce);
}

IN TEMPO REALE: NIENTE DA FARE MA ORA STO PROVANDO A CAMBIARE I VALORI AL SENSORE ......... :o
NON SI PUO' AGGIUNGERE LE COSE CHE MANCANO AL PRIMO CODICE CHE AVEVO POSTATO? (CHE FUNZIONA BENE) .....
TI spiego perche mi sto incaponendo, avevo pensato di mettere un vecchio cellulare vicino al sensore e di collegarci la caldaia di casa cosi prima di tornare dal lavoro basta uno squillo e via in caso contrario pero' posso anche spegnerla...... :stuck_out_tongue:

Ma in che senso non funziona ? Non commuta mai ?!? Il programma commuta l'uscita quando il valore rilevato supera la soglia e poi ritorna al di sotto della soglia.

Se non funziona mi viene da pensare che non superi mai la soglia oppure che non vada mai al di sotto. Se hai impostato una soglia di 5 ma rilevi un valore che va dai 20 ai 100 giustamente non lo vedrai mai commutare.

Prova ad uploadare questo programma, serve per trasmettere ogni 100mS i valori che stai rilevando dal tuo sensore. Apri il serial monitor dall'IDE di Arduino e leggi i valori che rilevi, quando c'è silenzio e quando batti le mani. Così puoi sapere a che valore impostare la soglia. Se per esempio rilevi 20 quando c'è silenzio e 100 quando batti le mani, puoi impostare 50.

int analogInput = 3;

int value = 5;

void setup(){

pinMode(analogInput, INPUT);
Serial.begin(9600);

}

void loop()
{
value = analogRead(analogInput);
Serial.print(value);
delay(100);
}

Mi fai sentire una scarpa in materia ;D ;D ;D ;D ;D
il serial monitor mi da' solo una seria di aaaaaaaaaaaaa che anche se cambio i valori scorrono in avanti senza alcuna variazione nella velocità
(mi sale lo sconforto ....... :-[ :-[)

imposta la seriale 9600... probabilmente è quello che non funziona
in basso a destra nel serial monitor apri la tendina e metti 9600

dal monitor escono una serie di 11111112222222111111122222 col silenzio e 5 6 oppure 9 al battito delle mani

E non ti funziona ?!? Strano ... a quanto è impostato il valore di soglia ? Prova ad impostare threshold a 4. Se rilevi 1 o 2 e poi 5,6,7,8 o 9 quando batti le mani significa che la soglia la oltrepassi, e appena torni al di sotto lo stato dell'uscita dovrebbe cambiare. Non vedi il led 13 cambiare di stato ?

ho abbassato la soglia come mi hai detto ma non cambia nulla il led non si muove proprio,non è che il valore anzicche' essre 1 2 1ecc è 121? e tra l'altro quando carico lo sketch il led rimane spento anche il relay ma la luce è accesa ...... sta diventando una questione personale e mi spiace disturbare anche te ...
a questo punto non so come avevo fatto prima con lo sketch che usavo che al primo tentativo è andata bene (solo fortuna)

Ma se ricarichi il vecchio sketch ti funziona come prima ? E' per capire se è un problema hardware oppure software. Come hai collegato il relè ?

Potresti provare a collegare un potenziometro da almeno 4,7kOhm come partitore di tensione all'ingresso analogico al posto del microfono (5V e GND agli estremi e il pin centrale al tuo ingresso) e ruotando il potenziometro in un senso e poi nell'altro dovresti veder commutare l'uscita.

ma questo lo devo provare con il vecchio sketch ( che funziona ancora ...) o con quello che mi hai fatto tu ?

ho provato con entrambi ma non sono sicuro che il potenziometro sia quello giusto ... dietro c'ò la sigla A50K..... son un po' ignorante....

Dovrebbe essere da 50 KOhm, va benissimo.

Provalo con entrambi. Il potenziometro serve per simulare il segnale del tuo microfono, siccome non sono sicuro di quali valori ti da il microfono, ci colleghi il potenziometro al suo posto così puoi ottenere tutti i valori che vuoi da 0 a 5V cioè da 0 a 1024. Infatti se apri il serial monitor con il programma che ti ho dato leggerai tutti i valori che ti ho detto.

Ormei è dventata una questione personale anche per me ! :smiley:

il mio arduino è impazzito non prende piu' i comandi ....
non termina di caricare gli sketch e da questo errore >:(

avrdude: stk500_recv(): programmer is not responding