Ho trovato in rete un antifurto con laser io lo ho modificato in modo da usarlo con degli interruttori, funziona tutto però non riesco a fare in modo che quando io attivo l'allarme suona e quando lo disattivo non suona niente.
Il software è questo:
// Numero del pin per il led/speaker
int pinLed = 13;
int pinLed2 = 10;
// Numero del pin del bottone
int pinBtn = 12;
int pinBtn2 = 11;
int pinBtn3 = 9;
// =====================================================
// ultimo output del bottone
int lastOut = 0;
// stato dell'allarme
int alert = 0;
// numero di rivelazioni
int riv = 0;
void setup()
{
pinMode(pinLed, OUTPUT);
pinMode(pinLed2, OUTPUT);
pinMode(pinBtn, INPUT);
pinMode(pinBtn2, INPUT);
pinMode(pinBtn3, INPUT);
Serial.begin(9600);
}
void loop()
{
// leggo lo stato del bottone
int btnStt = digitalRead(pinBtn);
// leggo lo stato del bottone2
int btnStt2 = digitalRead(pinBtn2);
int btnStt3 = digitalRead(pinBtn3);
// log rivelazione
Serial.println(btnStt2);
// se premo il bottone
if( btnStt == HIGH )
{
Serial.println("bottone reset premuto");
alert = 0;
riv = 0;
lastOut = 0;
}
// controllo se non è la prima rivelazione
if( riv > 0 )
{
// se l'allarme non è attivo
if( alert == 0 )
{
// spengo il led
digitalWrite(pinLed, LOW);
digitalWrite(pinLed2, HIGH);
Serial.println(btnStt2);
// se l'attuale rivelazione più tolleranza è inferiore all'ultima rivelazione
if( (btnStt2) > lastOut)
{
// scatta l'allarne
Serial.println("allarme attivato");
digitalWrite(pinLed2, LOW);
digitalWrite(pinLed, HIGH);
delay(1000);
digitalWrite(pinLed, LOW);
delay(1000);
alert = 1;
}
else
{
Serial.println("Variazione accetabile");
}
// Mi salvo l'ultima rivelazione
lastOut = btnStt2;
}
else
{
Serial.println("allarme già precedentemente attivato");
digitalWrite(pinLed, HIGH);
delay(800);
digitalWrite(pinLed, LOW);
delay(800);
}
}
else
{
Serial.println("Prima rivelazione");
}
// incremento il numero di rivelazioni
riv++;
}
Si capisce poco ma si potrebbe fare una cosa.
Se le tue intenzioni sono premere un pulsante per poi attivare l'allarme e far suonare e premere di nuovo per disattivare e sentire di nuovo il suono basterebbe fare:
int pulsante = 12;
int cicalino = 13;
int val = 0;
int stato = 0;
void setup()
{
pinMode(pulsante, INPUT);
pinMode(cicalino, OUTPUT);
}
void loop()
{
val = digitalRead(pulsante);
if(val == HIGH)
{
stato = stato + 1;
}
if(stato == 1)
{
digitalWrite(cicalino, HIGH);
delay(1000);
digitalWrite(cicalino, LOW);
delay(1000);
}
else
{
if(stato == 2)
{
digitalWrite(cicalino, HIGH);
delay(1000);
digitalWrite(cicalino, LOW);
delay(1000);
stato = 0;
}
}
}
GiovanniGigantino:
Si capisce poco ma si potrebbe fare una cosa.
Se le tue intenzioni sono premere un pulsante per poi attivare l'allarme e far suonare e premere di nuovo per disattivare e sentire di nuovo il suono basterebbe fare:
int pulsante = 12;
int cicalino = 13;
int val = 0;
int stato = 0;
void setup()
{
pinMode(pulsante, INPUT);
pinMode(cicalino, OUTPUT);
}
void loop()
{
val = digitalRead(pulsante);
if(val == HIGH)
{
stato = stato + 1;
}
if(stato == 1)
{
digitalWrite(cicalino, HIGH);
delay(1000);
digitalWrite(cicalino, LOW);
delay(1000);
}
else
{
if(stato == 2)
{
digitalWrite(cicalino, HIGH);
delay(1000);
digitalWrite(cicalino, LOW);
delay(1000);
stato = 0;
}
}
}
io vorrei far in modo che io premo un pulsante (pin13) è l'allarme si attiva e se uno preme il pulsante collegato al pin 12 scatta l'allarme. POi premo il pulsante collegato al pin13 e l'allarme si disattiva ma se premo il pulsante collegato al pin 12 non suona niente deve suonare solo se io per esempio premo di nuovo il pulsatne collegato al pin 13 e l'alalrme si riattiva .
Questo programma mi sembra più che adatto a quello che devi fare...
Ti elenco i pin
PIN:
Pulsante1 = serve per far suonare l'allarme se una persona lo attiva involontariamente(non so quale sensore vuoi usare)
Pulsante2 = serve per attivare o disattivare l'allarme
cicalino = fa il bip quando attivi o disattivi l'allarme
allarme = suona quando pulsante1 indica TRUE
Ho modificato un po il codice che ti hanno postato, prevedendo due "interruttori a livello di codice" che attivano uno l'allarme attivo-disattivo, e uno il suono suona-non suona...
Se vuoi adattarlo alle tue esigenze e provarlo, poi fammi sapere.
const int pulsante1 = 12; // Stato attivo o disattivo
const int pulsante2 = 13; // Pulsante attivazione allarme
const int allarme = 10;
int val1 = 0;
int val2 = 0;
int stato1 = 0; //Attivo disattivo
int stato2 = 0;//Allarme suona o non suona
void setup() {
pinMode(pulsante1, INPUT);
pinMode(pulsante2, INPUT);
pinMode(allarme, OUTPUT);
}
void loop() {
val1 = digitalRead(pulsante1);//Stato attivo o disattivo
val2 = digitalRead(pulsante2);// Allarme suona o non suona
if(val1 == HIGH)
{ if(stato1 ==0)// Funge da interruttore acceso spento
stato1=1;
else {
stato1=0;
stato2=0;
}
}
if(val2 == HIGH)
{
stato1=1;
}
if(stato2 == 1 && stato1==1)// Se stato1=Allarme attivo E stato2=Sensore attivo SUONA
{
/* Come in un allarme vero, dopo che viene attivato il sensore pulsante2, continua a suonare
finché non si disattiva l'allarme*/
/* Iserire un codice adatto a far suonare l'allarme*/
digitalWrite(allarme, HIGH);
delay(1000);
digitalWrite(allarme, LOW);
delay(1000);
}
else
{
digitalWrite(allarme, LOW);
}
}
Esisteva un piccolo errore in una linea di codice, che guardandolo avresti potuto intuire, ti posto la correzione.
Controlla che i pin siano quelli che usi nel circuito, vedi se la pausa di 100 ms faccia emettere suono o altrimenti modifica, dovrebbe funzionare o comunque se capisci il codice ti dovrebbe portare alla soluzione, perché poi il divertimento di arduino penso sia proprio farsi il codice da soli
int val1 = 0;
int val2 = 0;
int stato1 = 0; //Attivo disattivo
int stato2 = 0;//Allarme suona o non suona
void setup() {
pinMode(pulsante1, INPUT);
pinMode(pulsante2, INPUT);
pinMode(allarme, OUTPUT);
}
void loop() {
val1 = digitalRead(pulsante1);//Stato attivo o disattivo
val2 = digitalRead(pulsante2);// Allarme suona o non suona
if(val1 == HIGH)
{ if(stato1 ==0)// Funge da interruttore acceso spento
stato1=1;
else {
stato1=0;
stato2=0;
}
}
if(val2 == HIGH)
{
// stato1=1; qui bisognava cambiare stato2
stato2=1;
}
if(stato2 == 1 && stato1==1)// Se stato1=Allarme attivo E stato2=Sensore attivo SUONA
{
/* Come in un allarme vero, dopo che viene attivato il sensore pulsante2, continua a suonare
finché non si disattiva l'allarme*/
/* Iserire un codice adatto a far suonare l'allarme*/
digitalWrite(allarme, HIGH);
delay(100);
digitalWrite(allarme, LOW);
delay(100);
}
else
{
digitalWrite(allarme, LOW);
}
}
Si giusto non me ne ero accorto che c'era stato 1 apposto di stato 2 come variabile.Si adesso funziona grazie mille adesso ci aggiungo il cicalino e vedo se riesco ad adattarci anche il display con la scritta disattivato o attivato